From f4c54c712d53e3cd90455d4595565ba78c9b50c1 Mon Sep 17 00:00:00 2001 From: Xuan Sang LE Date: Fri, 11 Aug 2017 01:58:46 +0200 Subject: [PATCH] base gui --- Gruntfile.js | 62 - Makefile | 84 + package-lock.json | 1048 - package.json | 32 - src/antos.coffee | 52 +- src/build.json | 47 - src/core/apis/api.coffee | 16 +- .../apis/handlers/InBrowserHandler.coffee | 3 - src/core/gui/BaseApplication.coffee | 21 + src/core/gui/gui.coffee | 85 +- src/core/gui/schemes/dm.html | 8 + src/core/gui/schemes/test.html | 24 +- src/core/gui/tags/afx-app-window.js | 159 + src/core/gui/tags/afx-button.js | 15 +- src/core/gui/tags/afx-hbox.js | 58 + src/core/gui/tags/afx-list-view.js | 29 + src/core/gui/tags/afx-menu.js | 20 +- src/core/gui/tags/afx-sys-panel.js | 13 +- src/core/gui/tags/afx-vbox.js | 55 + src/core/gui/themes/antos/afx-app-window.css | 73 + src/core/gui/themes/antos/afx-button.css | 20 + src/core/gui/themes/antos/afx-dock.css | 24 + src/core/gui/themes/antos/afx-menu.css | 85 + src/core/gui/themes/antos/afx-sys-panel.css | 19 + src/core/gui/themes/antos/antos.css | 151 +- src/core/gui/themes/antos/ubuntu-regular.css | 4 +- src/core/gui/themes/antos/wallpaper.jpg | Bin 0 -> 1736567 bytes src/define.coffee | 7 +- src/index.html | 10 +- src/libs/ace/ace.js | 19560 ++++++ src/libs/ace/ext-beautify.js | 334 + src/libs/ace/ext-chromevox.js | 540 + src/libs/ace/ext-elastic_tabstops_lite.js | 274 + src/libs/ace/ext-emmet.js | 1223 + src/libs/ace/ext-error_marker.js | 6 + src/libs/ace/ext-keybinding_menu.js | 170 + src/libs/ace/ext-language_tools.js | 1956 + src/libs/ace/ext-linking.js | 61 + src/libs/ace/ext-modelist.js | 209 + src/libs/ace/ext-old_ie.js | 502 + src/libs/ace/ext-searchbox.js | 509 + src/libs/ace/ext-settings_menu.js | 663 + src/libs/ace/ext-spellcheck.js | 71 + src/libs/ace/ext-split.js | 246 + src/libs/ace/ext-static_highlight.js | 161 + src/libs/ace/ext-statusbar.js | 53 + src/libs/ace/ext-textarea.js | 560 + src/libs/ace/ext-themelist.js | 62 + src/libs/ace/ext-whitespace.js | 206 + src/libs/ace/keybinding-emacs.js | 1181 + src/libs/ace/keybinding-vim.js | 5598 ++ src/libs/ace/mode-abap.js | 214 + src/libs/ace/mode-abc.js | 261 + src/libs/ace/mode-actionscript.js | 267 + src/libs/ace/mode-ada.js | 87 + src/libs/ace/mode-apache_conf.js | 356 + src/libs/ace/mode-applescript.js | 271 + src/libs/ace/mode-asciidoc.js | 342 + src/libs/ace/mode-assembly_x86.js | 186 + src/libs/ace/mode-autohotkey.js | 235 + src/libs/ace/mode-batchfile.js | 223 + src/libs/ace/mode-bro.js | 327 + src/libs/ace/mode-c9search.js | 287 + src/libs/ace/mode-c_cpp.js | 487 + src/libs/ace/mode-cirru.js | 203 + src/libs/ace/mode-clojure.js | 307 + src/libs/ace/mode-cobol.js | 94 + src/libs/ace/mode-coffee.js | 392 + src/libs/ace/mode-coldfusion.js | 2567 + src/libs/ace/mode-csharp.js | 495 + src/libs/ace/mode-css.js | 699 + src/libs/ace/mode-curly.js | 2535 + src/libs/ace/mode-d.js | 513 + src/libs/ace/mode-dart.js | 689 + src/libs/ace/mode-diff.js | 139 + src/libs/ace/mode-django.js | 2565 + src/libs/ace/mode-dockerfile.js | 492 + src/libs/ace/mode-dot.js | 410 + src/libs/ace/mode-drools.js | 457 + src/libs/ace/mode-eiffel.js | 128 + src/libs/ace/mode-ejs.js | 2999 + src/libs/ace/mode-elixir.js | 494 + src/libs/ace/mode-elm.js | 299 + src/libs/ace/mode-erlang.js | 1002 + src/libs/ace/mode-forth.js | 290 + src/libs/ace/mode-fortran.js | 423 + src/libs/ace/mode-ftl.js | 1182 + src/libs/ace/mode-gcode.js | 86 + src/libs/ace/mode-gherkin.js | 163 + src/libs/ace/mode-gitignore.js | 52 + src/libs/ace/mode-glsl.js | 564 + src/libs/ace/mode-gobstones.js | 922 + src/libs/ace/mode-golang.js | 406 + src/libs/ace/mode-graphqlschema.js | 206 + src/libs/ace/mode-groovy.js | 980 + src/libs/ace/mode-haml.js | 1547 + src/libs/ace/mode-handlebars.js | 2593 + src/libs/ace/mode-haskell.js | 372 + src/libs/ace/mode-haskell_cabal.js | 134 + src/libs/ace/mode-haxe.js | 379 + src/libs/ace/mode-hjson.js | 346 + src/libs/ace/mode-html.js | 2480 + src/libs/ace/mode-html_elixir.js | 3059 + src/libs/ace/mode-html_ruby.js | 3016 + src/libs/ace/mode-ini.js | 155 + src/libs/ace/mode-io.js | 246 + src/libs/ace/mode-jack.js | 339 + src/libs/ace/mode-jade.js | 2129 + src/libs/ace/mode-java.js | 935 + src/libs/ace/mode-javascript.js | 789 + src/libs/ace/mode-json.js | 319 + src/libs/ace/mode-jsoniq.js | 2619 + src/libs/ace/mode-jsp.js | 1388 + src/libs/ace/mode-jsx.js | 404 + src/libs/ace/mode-julia.js | 296 + src/libs/ace/mode-kotlin.js | 786 + src/libs/ace/mode-latex.js | 224 + src/libs/ace/mode-lean.js | 281 + src/libs/ace/mode-less.js | 819 + src/libs/ace/mode-liquid.js | 1184 + src/libs/ace/mode-lisp.js | 105 + src/libs/ace/mode-live_script.js | 481 + src/libs/ace/mode-livescript.js | 271 + src/libs/ace/mode-logiql.js | 310 + src/libs/ace/mode-lsl.js | 335 + src/libs/ace/mode-lua.js | 424 + src/libs/ace/mode-luapage.js | 2978 + src/libs/ace/mode-lucene.js | 70 + src/libs/ace/mode-makefile.js | 404 + src/libs/ace/mode-markdown.js | 2865 + src/libs/ace/mode-mask.js | 1786 + src/libs/ace/mode-matlab.js | 256 + src/libs/ace/mode-mavens_mate_log.js | 160 + src/libs/ace/mode-maze.js | 284 + src/libs/ace/mode-mel.js | 256 + src/libs/ace/mode-mips_assembler.js | 235 + src/libs/ace/mode-mipsassembler.js | 196 + src/libs/ace/mode-mushcode.js | 674 + src/libs/ace/mode-mysql.js | 160 + src/libs/ace/mode-nix.js | 631 + src/libs/ace/mode-nsis.js | 305 + src/libs/ace/mode-objectivec.js | 725 + src/libs/ace/mode-ocaml.js | 414 + src/libs/ace/mode-pascal.js | 198 + src/libs/ace/mode-perl.js | 373 + src/libs/ace/mode-pgsql.js | 1500 + src/libs/ace/mode-php.js | 12856 ++++ src/libs/ace/mode-pig.js | 303 + src/libs/ace/mode-plain_text.js | 25 + src/libs/ace/mode-powershell.js | 411 + src/libs/ace/mode-praat.js | 468 + src/libs/ace/mode-prolog.js | 364 + src/libs/ace/mode-properties.js | 73 + src/libs/ace/mode-protobuf.js | 577 + src/libs/ace/mode-python.js | 265 + src/libs/ace/mode-r.js | 301 + src/libs/ace/mode-razor.js | 2845 + src/libs/ace/mode-rdoc.js | 205 + src/libs/ace/mode-rhtml.js | 2779 + src/libs/ace/mode-rst.js | 249 + src/libs/ace/mode-ruby.js | 491 + src/libs/ace/mode-rust.js | 272 + src/libs/ace/mode-sass.js | 434 + src/libs/ace/mode-scad.js | 407 + src/libs/ace/mode-scala.js | 975 + src/libs/ace/mode-scheme.js | 225 + src/libs/ace/mode-scss.js | 586 + src/libs/ace/mode-sh.js | 441 + src/libs/ace/mode-sjs.js | 1006 + src/libs/ace/mode-smarty.js | 2606 + src/libs/ace/mode-snippets.js | 199 + src/libs/ace/mode-soy_template.js | 2819 + src/libs/ace/mode-space.js | 160 + src/libs/ace/mode-sparql.js | 313 + src/libs/ace/mode-sql.js | 103 + src/libs/ace/mode-sqlserver.js | 437 + src/libs/ace/mode-stylus.js | 462 + src/libs/ace/mode-svg.js | 1568 + src/libs/ace/mode-swift.js | 382 + src/libs/ace/mode-swig.js | 1099 + src/libs/ace/mode-tcl.js | 376 + src/libs/ace/mode-tex.js | 152 + src/libs/ace/mode-text.js | 1 + src/libs/ace/mode-textile.js | 142 + src/libs/ace/mode-toml.js | 146 + src/libs/ace/mode-tsx.js | 891 + src/libs/ace/mode-turtle.js | 289 + src/libs/ace/mode-twig.js | 2664 + src/libs/ace/mode-typescript.js | 872 + src/libs/ace/mode-vala.js | 669 + src/libs/ace/mode-vbscript.js | 199 + src/libs/ace/mode-velocity.js | 2762 + src/libs/ace/mode-verilog.js | 104 + src/libs/ace/mode-vhdl.js | 110 + src/libs/ace/mode-wollok.js | 905 + src/libs/ace/mode-xml.js | 664 + src/libs/ace/mode-xquery.js | 2631 + src/libs/ace/mode-yaml.js | 289 + src/libs/ace/snippets/abap.js | 7 + src/libs/ace/snippets/abc.js | 38 + src/libs/ace/snippets/actionscript.js | 164 + src/libs/ace/snippets/ada.js | 7 + src/libs/ace/snippets/apache_conf.js | 7 + src/libs/ace/snippets/applescript.js | 7 + src/libs/ace/snippets/asciidoc.js | 7 + src/libs/ace/snippets/assembly_x86.js | 7 + src/libs/ace/snippets/autohotkey.js | 7 + src/libs/ace/snippets/batchfile.js | 7 + src/libs/ace/snippets/bro.js | 7 + src/libs/ace/snippets/c9search.js | 7 + src/libs/ace/snippets/c_cpp.js | 138 + src/libs/ace/snippets/cirru.js | 7 + src/libs/ace/snippets/clojure.js | 97 + src/libs/ace/snippets/cobol.js | 7 + src/libs/ace/snippets/coffee.js | 102 + src/libs/ace/snippets/coldfusion.js | 7 + src/libs/ace/snippets/csharp.js | 7 + src/libs/ace/snippets/css.js | 974 + src/libs/ace/snippets/curly.js | 7 + src/libs/ace/snippets/d.js | 7 + src/libs/ace/snippets/dart.js | 90 + src/libs/ace/snippets/diff.js | 18 + src/libs/ace/snippets/django.js | 115 + src/libs/ace/snippets/dockerfile.js | 7 + src/libs/ace/snippets/dot.js | 7 + src/libs/ace/snippets/drools.js | 26 + src/libs/ace/snippets/eiffel.js | 7 + src/libs/ace/snippets/ejs.js | 7 + src/libs/ace/snippets/elixir.js | 7 + src/libs/ace/snippets/elm.js | 7 + src/libs/ace/snippets/erlang.js | 167 + src/libs/ace/snippets/forth.js | 7 + src/libs/ace/snippets/fortran.js | 7 + src/libs/ace/snippets/ftl.js | 7 + src/libs/ace/snippets/gcode.js | 7 + src/libs/ace/snippets/gherkin.js | 7 + src/libs/ace/snippets/gitignore.js | 7 + src/libs/ace/snippets/glsl.js | 7 + src/libs/ace/snippets/gobstones.js | 41 + src/libs/ace/snippets/golang.js | 7 + src/libs/ace/snippets/graphqlschema.js | 39 + src/libs/ace/snippets/groovy.js | 7 + src/libs/ace/snippets/haml.js | 27 + src/libs/ace/snippets/handlebars.js | 7 + src/libs/ace/snippets/haskell.js | 89 + src/libs/ace/snippets/haskell_cabal.js | 7 + src/libs/ace/snippets/haxe.js | 7 + src/libs/ace/snippets/hjson.js | 7 + src/libs/ace/snippets/html.js | 835 + src/libs/ace/snippets/html_elixir.js | 7 + src/libs/ace/snippets/html_ruby.js | 7 + src/libs/ace/snippets/ini.js | 7 + src/libs/ace/snippets/io.js | 69 + src/libs/ace/snippets/jack.js | 7 + src/libs/ace/snippets/jade.js | 7 + src/libs/ace/snippets/java.js | 247 + src/libs/ace/snippets/javascript.js | 202 + src/libs/ace/snippets/json.js | 7 + src/libs/ace/snippets/jsoniq.js | 68 + src/libs/ace/snippets/jsp.js | 106 + src/libs/ace/snippets/jsx.js | 7 + src/libs/ace/snippets/julia.js | 7 + src/libs/ace/snippets/kotlin.js | 7 + src/libs/ace/snippets/latex.js | 7 + src/libs/ace/snippets/lean.js | 7 + src/libs/ace/snippets/less.js | 7 + src/libs/ace/snippets/liquid.js | 7 + src/libs/ace/snippets/lisp.js | 7 + src/libs/ace/snippets/live_script.js | 7 + src/libs/ace/snippets/livescript.js | 7 + src/libs/ace/snippets/logiql.js | 7 + src/libs/ace/snippets/lsl.js | 1239 + src/libs/ace/snippets/lua.js | 28 + src/libs/ace/snippets/luapage.js | 7 + src/libs/ace/snippets/lucene.js | 7 + src/libs/ace/snippets/makefile.js | 11 + src/libs/ace/snippets/markdown.js | 95 + src/libs/ace/snippets/mask.js | 7 + src/libs/ace/snippets/matlab.js | 7 + src/libs/ace/snippets/maze.js | 16 + src/libs/ace/snippets/mel.js | 7 + src/libs/ace/snippets/mips_assembler.js | 7 + src/libs/ace/snippets/mipsassembler.js | 7 + src/libs/ace/snippets/mushcode.js | 7 + src/libs/ace/snippets/mysql.js | 7 + src/libs/ace/snippets/nix.js | 7 + src/libs/ace/snippets/nsis.js | 7 + src/libs/ace/snippets/objectivec.js | 7 + src/libs/ace/snippets/ocaml.js | 7 + src/libs/ace/snippets/pascal.js | 7 + src/libs/ace/snippets/perl.js | 354 + src/libs/ace/snippets/pgsql.js | 7 + src/libs/ace/snippets/php.js | 384 + src/libs/ace/snippets/pig.js | 7 + src/libs/ace/snippets/plain_text.js | 7 + src/libs/ace/snippets/powershell.js | 7 + src/libs/ace/snippets/praat.js | 7 + src/libs/ace/snippets/prolog.js | 7 + src/libs/ace/snippets/properties.js | 7 + src/libs/ace/snippets/protobuf.js | 7 + src/libs/ace/snippets/python.js | 165 + src/libs/ace/snippets/r.js | 128 + src/libs/ace/snippets/razor.js | 10 + src/libs/ace/snippets/rdoc.js | 7 + src/libs/ace/snippets/rhtml.js | 7 + src/libs/ace/snippets/rst.js | 29 + src/libs/ace/snippets/ruby.js | 935 + src/libs/ace/snippets/rust.js | 7 + src/libs/ace/snippets/sass.js | 7 + src/libs/ace/snippets/scad.js | 7 + src/libs/ace/snippets/scala.js | 7 + src/libs/ace/snippets/scheme.js | 7 + src/libs/ace/snippets/scss.js | 7 + src/libs/ace/snippets/sh.js | 90 + src/libs/ace/snippets/sjs.js | 7 + src/libs/ace/snippets/smarty.js | 7 + src/libs/ace/snippets/snippets.js | 16 + src/libs/ace/snippets/soy_template.js | 7 + src/libs/ace/snippets/space.js | 7 + src/libs/ace/snippets/sparql.js | 7 + src/libs/ace/snippets/sql.js | 33 + src/libs/ace/snippets/sqlserver.js | 76 + src/libs/ace/snippets/stylus.js | 7 + src/libs/ace/snippets/svg.js | 7 + src/libs/ace/snippets/swift.js | 7 + src/libs/ace/snippets/swig.js | 7 + src/libs/ace/snippets/tcl.js | 99 + src/libs/ace/snippets/tex.js | 197 + src/libs/ace/snippets/text.js | 7 + src/libs/ace/snippets/textile.js | 37 + src/libs/ace/snippets/toml.js | 7 + src/libs/ace/snippets/tsx.js | 7 + src/libs/ace/snippets/turtle.js | 7 + src/libs/ace/snippets/twig.js | 7 + src/libs/ace/snippets/typescript.js | 7 + src/libs/ace/snippets/vala.js | 193 + src/libs/ace/snippets/vbscript.js | 7 + src/libs/ace/snippets/velocity.js | 36 + src/libs/ace/snippets/verilog.js | 7 + src/libs/ace/snippets/vhdl.js | 7 + src/libs/ace/snippets/wollok.js | 91 + src/libs/ace/snippets/xml.js | 7 + src/libs/ace/snippets/xquery.js | 68 + src/libs/ace/snippets/yaml.js | 7 + src/libs/ace/theme-ambiance.js | 182 + src/libs/ace/theme-chaos.js | 156 + src/libs/ace/theme-chrome.js | 128 + src/libs/ace/theme-clouds.js | 95 + src/libs/ace/theme-clouds_midnight.js | 96 + src/libs/ace/theme-cobalt.js | 113 + src/libs/ace/theme-crimson_editor.js | 118 + src/libs/ace/theme-dawn.js | 108 + src/libs/ace/theme-dreamweaver.js | 141 + src/libs/ace/theme-eclipse.js | 98 + src/libs/ace/theme-github.js | 103 + src/libs/ace/theme-gob.js | 112 + src/libs/ace/theme-gruvbox.js | 82 + src/libs/ace/theme-idle_fingers.js | 96 + src/libs/ace/theme-iplastic.js | 121 + src/libs/ace/theme-katzenmilch.js | 121 + src/libs/ace/theme-kr_theme.js | 104 + src/libs/ace/theme-kuroir.js | 61 + src/libs/ace/theme-merbivore.js | 95 + src/libs/ace/theme-merbivore_soft.js | 96 + src/libs/ace/theme-mono_industrial.js | 107 + src/libs/ace/theme-monokai.js | 105 + src/libs/ace/theme-pastel_on_dark.js | 108 + src/libs/ace/theme-solarized_dark.js | 88 + src/libs/ace/theme-solarized_light.js | 91 + src/libs/ace/theme-sqlserver.js | 138 + src/libs/ace/theme-terminal.js | 114 + src/libs/ace/theme-textmate.js | 129 + src/libs/ace/theme-tomorrow.js | 108 + src/libs/ace/theme-tomorrow_night.js | 108 + src/libs/ace/theme-tomorrow_night_blue.js | 106 + src/libs/ace/theme-tomorrow_night_bright.js | 121 + src/libs/ace/theme-tomorrow_night_eighties.js | 108 + src/libs/ace/theme-twilight.js | 109 + src/libs/ace/theme-vibrant_ink.js | 94 + src/libs/ace/theme-xcode.js | 88 + src/libs/ace/worker-coffee.js | 2157 + src/libs/ace/worker-css.js | 8760 +++ src/libs/ace/worker-html.js | 11605 +++ src/libs/ace/worker-javascript.js | 12528 ++++ src/libs/ace/worker-json.js | 2396 + src/libs/ace/worker-lua.js | 3632 + src/libs/ace/worker-php.js | 4302 ++ src/libs/ace/worker-xml.js | 3887 + src/libs/ace/worker-xquery.js | 58351 ++++++++++++++++ src/packages/NotePad/Makefile | 33 + src/packages/NotePad/main.coffee | 10 + src/packages/NotePad/main.css | 3 + src/packages/NotePad/package.json | 12 + src/packages/NotePad/scheme.html | 16 + 394 files changed, 275370 insertions(+), 1438 deletions(-) delete mode 100644 Gruntfile.js create mode 100644 Makefile delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 src/build.json create mode 100644 src/core/gui/BaseApplication.coffee create mode 100644 src/core/gui/schemes/dm.html create mode 100644 src/core/gui/tags/afx-app-window.js create mode 100644 src/core/gui/tags/afx-hbox.js create mode 100644 src/core/gui/tags/afx-list-view.js create mode 100644 src/core/gui/tags/afx-vbox.js create mode 100644 src/core/gui/themes/antos/afx-app-window.css create mode 100644 src/core/gui/themes/antos/afx-button.css create mode 100644 src/core/gui/themes/antos/afx-dock.css create mode 100644 src/core/gui/themes/antos/afx-menu.css create mode 100644 src/core/gui/themes/antos/afx-sys-panel.css create mode 100644 src/core/gui/themes/antos/wallpaper.jpg create mode 100755 src/libs/ace/ace.js create mode 100755 src/libs/ace/ext-beautify.js create mode 100755 src/libs/ace/ext-chromevox.js create mode 100755 src/libs/ace/ext-elastic_tabstops_lite.js create mode 100755 src/libs/ace/ext-emmet.js create mode 100755 src/libs/ace/ext-error_marker.js create mode 100755 src/libs/ace/ext-keybinding_menu.js create mode 100755 src/libs/ace/ext-language_tools.js create mode 100755 src/libs/ace/ext-linking.js create mode 100755 src/libs/ace/ext-modelist.js create mode 100755 src/libs/ace/ext-old_ie.js create mode 100755 src/libs/ace/ext-searchbox.js create mode 100755 src/libs/ace/ext-settings_menu.js create mode 100755 src/libs/ace/ext-spellcheck.js create mode 100755 src/libs/ace/ext-split.js create mode 100755 src/libs/ace/ext-static_highlight.js create mode 100755 src/libs/ace/ext-statusbar.js create mode 100755 src/libs/ace/ext-textarea.js create mode 100755 src/libs/ace/ext-themelist.js create mode 100755 src/libs/ace/ext-whitespace.js create mode 100755 src/libs/ace/keybinding-emacs.js create mode 100755 src/libs/ace/keybinding-vim.js create mode 100755 src/libs/ace/mode-abap.js create mode 100755 src/libs/ace/mode-abc.js create mode 100755 src/libs/ace/mode-actionscript.js create mode 100755 src/libs/ace/mode-ada.js create mode 100755 src/libs/ace/mode-apache_conf.js create mode 100755 src/libs/ace/mode-applescript.js create mode 100755 src/libs/ace/mode-asciidoc.js create mode 100755 src/libs/ace/mode-assembly_x86.js create mode 100755 src/libs/ace/mode-autohotkey.js create mode 100755 src/libs/ace/mode-batchfile.js create mode 100755 src/libs/ace/mode-bro.js create mode 100755 src/libs/ace/mode-c9search.js create mode 100755 src/libs/ace/mode-c_cpp.js create mode 100755 src/libs/ace/mode-cirru.js create mode 100755 src/libs/ace/mode-clojure.js create mode 100755 src/libs/ace/mode-cobol.js create mode 100755 src/libs/ace/mode-coffee.js create mode 100755 src/libs/ace/mode-coldfusion.js create mode 100755 src/libs/ace/mode-csharp.js create mode 100755 src/libs/ace/mode-css.js create mode 100755 src/libs/ace/mode-curly.js create mode 100755 src/libs/ace/mode-d.js create mode 100755 src/libs/ace/mode-dart.js create mode 100755 src/libs/ace/mode-diff.js create mode 100755 src/libs/ace/mode-django.js create mode 100755 src/libs/ace/mode-dockerfile.js create mode 100755 src/libs/ace/mode-dot.js create mode 100755 src/libs/ace/mode-drools.js create mode 100755 src/libs/ace/mode-eiffel.js create mode 100755 src/libs/ace/mode-ejs.js create mode 100755 src/libs/ace/mode-elixir.js create mode 100755 src/libs/ace/mode-elm.js create mode 100755 src/libs/ace/mode-erlang.js create mode 100755 src/libs/ace/mode-forth.js create mode 100755 src/libs/ace/mode-fortran.js create mode 100755 src/libs/ace/mode-ftl.js create mode 100755 src/libs/ace/mode-gcode.js create mode 100755 src/libs/ace/mode-gherkin.js create mode 100755 src/libs/ace/mode-gitignore.js create mode 100755 src/libs/ace/mode-glsl.js create mode 100755 src/libs/ace/mode-gobstones.js create mode 100755 src/libs/ace/mode-golang.js create mode 100755 src/libs/ace/mode-graphqlschema.js create mode 100755 src/libs/ace/mode-groovy.js create mode 100755 src/libs/ace/mode-haml.js create mode 100755 src/libs/ace/mode-handlebars.js create mode 100755 src/libs/ace/mode-haskell.js create mode 100755 src/libs/ace/mode-haskell_cabal.js create mode 100755 src/libs/ace/mode-haxe.js create mode 100755 src/libs/ace/mode-hjson.js create mode 100755 src/libs/ace/mode-html.js create mode 100755 src/libs/ace/mode-html_elixir.js create mode 100755 src/libs/ace/mode-html_ruby.js create mode 100755 src/libs/ace/mode-ini.js create mode 100755 src/libs/ace/mode-io.js create mode 100755 src/libs/ace/mode-jack.js create mode 100755 src/libs/ace/mode-jade.js create mode 100755 src/libs/ace/mode-java.js create mode 100755 src/libs/ace/mode-javascript.js create mode 100755 src/libs/ace/mode-json.js create mode 100755 src/libs/ace/mode-jsoniq.js create mode 100755 src/libs/ace/mode-jsp.js create mode 100755 src/libs/ace/mode-jsx.js create mode 100755 src/libs/ace/mode-julia.js create mode 100755 src/libs/ace/mode-kotlin.js create mode 100755 src/libs/ace/mode-latex.js create mode 100755 src/libs/ace/mode-lean.js create mode 100755 src/libs/ace/mode-less.js create mode 100755 src/libs/ace/mode-liquid.js create mode 100755 src/libs/ace/mode-lisp.js create mode 100755 src/libs/ace/mode-live_script.js create mode 100755 src/libs/ace/mode-livescript.js create mode 100755 src/libs/ace/mode-logiql.js create mode 100755 src/libs/ace/mode-lsl.js create mode 100755 src/libs/ace/mode-lua.js create mode 100755 src/libs/ace/mode-luapage.js create mode 100755 src/libs/ace/mode-lucene.js create mode 100755 src/libs/ace/mode-makefile.js create mode 100755 src/libs/ace/mode-markdown.js create mode 100755 src/libs/ace/mode-mask.js create mode 100755 src/libs/ace/mode-matlab.js create mode 100755 src/libs/ace/mode-mavens_mate_log.js create mode 100755 src/libs/ace/mode-maze.js create mode 100755 src/libs/ace/mode-mel.js create mode 100755 src/libs/ace/mode-mips_assembler.js create mode 100755 src/libs/ace/mode-mipsassembler.js create mode 100755 src/libs/ace/mode-mushcode.js create mode 100755 src/libs/ace/mode-mysql.js create mode 100755 src/libs/ace/mode-nix.js create mode 100755 src/libs/ace/mode-nsis.js create mode 100755 src/libs/ace/mode-objectivec.js create mode 100755 src/libs/ace/mode-ocaml.js create mode 100755 src/libs/ace/mode-pascal.js create mode 100755 src/libs/ace/mode-perl.js create mode 100755 src/libs/ace/mode-pgsql.js create mode 100755 src/libs/ace/mode-php.js create mode 100755 src/libs/ace/mode-pig.js create mode 100755 src/libs/ace/mode-plain_text.js create mode 100755 src/libs/ace/mode-powershell.js create mode 100755 src/libs/ace/mode-praat.js create mode 100755 src/libs/ace/mode-prolog.js create mode 100755 src/libs/ace/mode-properties.js create mode 100755 src/libs/ace/mode-protobuf.js create mode 100755 src/libs/ace/mode-python.js create mode 100755 src/libs/ace/mode-r.js create mode 100755 src/libs/ace/mode-razor.js create mode 100755 src/libs/ace/mode-rdoc.js create mode 100755 src/libs/ace/mode-rhtml.js create mode 100755 src/libs/ace/mode-rst.js create mode 100755 src/libs/ace/mode-ruby.js create mode 100755 src/libs/ace/mode-rust.js create mode 100755 src/libs/ace/mode-sass.js create mode 100755 src/libs/ace/mode-scad.js create mode 100755 src/libs/ace/mode-scala.js create mode 100755 src/libs/ace/mode-scheme.js create mode 100755 src/libs/ace/mode-scss.js create mode 100755 src/libs/ace/mode-sh.js create mode 100755 src/libs/ace/mode-sjs.js create mode 100755 src/libs/ace/mode-smarty.js create mode 100755 src/libs/ace/mode-snippets.js create mode 100755 src/libs/ace/mode-soy_template.js create mode 100755 src/libs/ace/mode-space.js create mode 100755 src/libs/ace/mode-sparql.js create mode 100755 src/libs/ace/mode-sql.js create mode 100755 src/libs/ace/mode-sqlserver.js create mode 100755 src/libs/ace/mode-stylus.js create mode 100755 src/libs/ace/mode-svg.js create mode 100755 src/libs/ace/mode-swift.js create mode 100755 src/libs/ace/mode-swig.js create mode 100755 src/libs/ace/mode-tcl.js create mode 100755 src/libs/ace/mode-tex.js create mode 100755 src/libs/ace/mode-text.js create mode 100755 src/libs/ace/mode-textile.js create mode 100755 src/libs/ace/mode-toml.js create mode 100755 src/libs/ace/mode-tsx.js create mode 100755 src/libs/ace/mode-turtle.js create mode 100755 src/libs/ace/mode-twig.js create mode 100755 src/libs/ace/mode-typescript.js create mode 100755 src/libs/ace/mode-vala.js create mode 100755 src/libs/ace/mode-vbscript.js create mode 100755 src/libs/ace/mode-velocity.js create mode 100755 src/libs/ace/mode-verilog.js create mode 100755 src/libs/ace/mode-vhdl.js create mode 100755 src/libs/ace/mode-wollok.js create mode 100755 src/libs/ace/mode-xml.js create mode 100755 src/libs/ace/mode-xquery.js create mode 100755 src/libs/ace/mode-yaml.js create mode 100755 src/libs/ace/snippets/abap.js create mode 100755 src/libs/ace/snippets/abc.js create mode 100755 src/libs/ace/snippets/actionscript.js create mode 100755 src/libs/ace/snippets/ada.js create mode 100755 src/libs/ace/snippets/apache_conf.js create mode 100755 src/libs/ace/snippets/applescript.js create mode 100755 src/libs/ace/snippets/asciidoc.js create mode 100755 src/libs/ace/snippets/assembly_x86.js create mode 100755 src/libs/ace/snippets/autohotkey.js create mode 100755 src/libs/ace/snippets/batchfile.js create mode 100755 src/libs/ace/snippets/bro.js create mode 100755 src/libs/ace/snippets/c9search.js create mode 100755 src/libs/ace/snippets/c_cpp.js create mode 100755 src/libs/ace/snippets/cirru.js create mode 100755 src/libs/ace/snippets/clojure.js create mode 100755 src/libs/ace/snippets/cobol.js create mode 100755 src/libs/ace/snippets/coffee.js create mode 100755 src/libs/ace/snippets/coldfusion.js create mode 100755 src/libs/ace/snippets/csharp.js create mode 100755 src/libs/ace/snippets/css.js create mode 100755 src/libs/ace/snippets/curly.js create mode 100755 src/libs/ace/snippets/d.js create mode 100755 src/libs/ace/snippets/dart.js create mode 100755 src/libs/ace/snippets/diff.js create mode 100755 src/libs/ace/snippets/django.js create mode 100755 src/libs/ace/snippets/dockerfile.js create mode 100755 src/libs/ace/snippets/dot.js create mode 100755 src/libs/ace/snippets/drools.js create mode 100755 src/libs/ace/snippets/eiffel.js create mode 100755 src/libs/ace/snippets/ejs.js create mode 100755 src/libs/ace/snippets/elixir.js create mode 100755 src/libs/ace/snippets/elm.js create mode 100755 src/libs/ace/snippets/erlang.js create mode 100755 src/libs/ace/snippets/forth.js create mode 100755 src/libs/ace/snippets/fortran.js create mode 100755 src/libs/ace/snippets/ftl.js create mode 100755 src/libs/ace/snippets/gcode.js create mode 100755 src/libs/ace/snippets/gherkin.js create mode 100755 src/libs/ace/snippets/gitignore.js create mode 100755 src/libs/ace/snippets/glsl.js create mode 100755 src/libs/ace/snippets/gobstones.js create mode 100755 src/libs/ace/snippets/golang.js create mode 100755 src/libs/ace/snippets/graphqlschema.js create mode 100755 src/libs/ace/snippets/groovy.js create mode 100755 src/libs/ace/snippets/haml.js create mode 100755 src/libs/ace/snippets/handlebars.js create mode 100755 src/libs/ace/snippets/haskell.js create mode 100755 src/libs/ace/snippets/haskell_cabal.js create mode 100755 src/libs/ace/snippets/haxe.js create mode 100755 src/libs/ace/snippets/hjson.js create mode 100755 src/libs/ace/snippets/html.js create mode 100755 src/libs/ace/snippets/html_elixir.js create mode 100755 src/libs/ace/snippets/html_ruby.js create mode 100755 src/libs/ace/snippets/ini.js create mode 100755 src/libs/ace/snippets/io.js create mode 100755 src/libs/ace/snippets/jack.js create mode 100755 src/libs/ace/snippets/jade.js create mode 100755 src/libs/ace/snippets/java.js create mode 100755 src/libs/ace/snippets/javascript.js create mode 100755 src/libs/ace/snippets/json.js create mode 100755 src/libs/ace/snippets/jsoniq.js create mode 100755 src/libs/ace/snippets/jsp.js create mode 100755 src/libs/ace/snippets/jsx.js create mode 100755 src/libs/ace/snippets/julia.js create mode 100755 src/libs/ace/snippets/kotlin.js create mode 100755 src/libs/ace/snippets/latex.js create mode 100755 src/libs/ace/snippets/lean.js create mode 100755 src/libs/ace/snippets/less.js create mode 100755 src/libs/ace/snippets/liquid.js create mode 100755 src/libs/ace/snippets/lisp.js create mode 100755 src/libs/ace/snippets/live_script.js create mode 100755 src/libs/ace/snippets/livescript.js create mode 100755 src/libs/ace/snippets/logiql.js create mode 100755 src/libs/ace/snippets/lsl.js create mode 100755 src/libs/ace/snippets/lua.js create mode 100755 src/libs/ace/snippets/luapage.js create mode 100755 src/libs/ace/snippets/lucene.js create mode 100755 src/libs/ace/snippets/makefile.js create mode 100755 src/libs/ace/snippets/markdown.js create mode 100755 src/libs/ace/snippets/mask.js create mode 100755 src/libs/ace/snippets/matlab.js create mode 100755 src/libs/ace/snippets/maze.js create mode 100755 src/libs/ace/snippets/mel.js create mode 100755 src/libs/ace/snippets/mips_assembler.js create mode 100755 src/libs/ace/snippets/mipsassembler.js create mode 100755 src/libs/ace/snippets/mushcode.js create mode 100755 src/libs/ace/snippets/mysql.js create mode 100755 src/libs/ace/snippets/nix.js create mode 100755 src/libs/ace/snippets/nsis.js create mode 100755 src/libs/ace/snippets/objectivec.js create mode 100755 src/libs/ace/snippets/ocaml.js create mode 100755 src/libs/ace/snippets/pascal.js create mode 100755 src/libs/ace/snippets/perl.js create mode 100755 src/libs/ace/snippets/pgsql.js create mode 100755 src/libs/ace/snippets/php.js create mode 100755 src/libs/ace/snippets/pig.js create mode 100755 src/libs/ace/snippets/plain_text.js create mode 100755 src/libs/ace/snippets/powershell.js create mode 100755 src/libs/ace/snippets/praat.js create mode 100755 src/libs/ace/snippets/prolog.js create mode 100755 src/libs/ace/snippets/properties.js create mode 100755 src/libs/ace/snippets/protobuf.js create mode 100755 src/libs/ace/snippets/python.js create mode 100755 src/libs/ace/snippets/r.js create mode 100755 src/libs/ace/snippets/razor.js create mode 100755 src/libs/ace/snippets/rdoc.js create mode 100755 src/libs/ace/snippets/rhtml.js create mode 100755 src/libs/ace/snippets/rst.js create mode 100755 src/libs/ace/snippets/ruby.js create mode 100755 src/libs/ace/snippets/rust.js create mode 100755 src/libs/ace/snippets/sass.js create mode 100755 src/libs/ace/snippets/scad.js create mode 100755 src/libs/ace/snippets/scala.js create mode 100755 src/libs/ace/snippets/scheme.js create mode 100755 src/libs/ace/snippets/scss.js create mode 100755 src/libs/ace/snippets/sh.js create mode 100755 src/libs/ace/snippets/sjs.js create mode 100755 src/libs/ace/snippets/smarty.js create mode 100755 src/libs/ace/snippets/snippets.js create mode 100755 src/libs/ace/snippets/soy_template.js create mode 100755 src/libs/ace/snippets/space.js create mode 100755 src/libs/ace/snippets/sparql.js create mode 100755 src/libs/ace/snippets/sql.js create mode 100755 src/libs/ace/snippets/sqlserver.js create mode 100755 src/libs/ace/snippets/stylus.js create mode 100755 src/libs/ace/snippets/svg.js create mode 100755 src/libs/ace/snippets/swift.js create mode 100755 src/libs/ace/snippets/swig.js create mode 100755 src/libs/ace/snippets/tcl.js create mode 100755 src/libs/ace/snippets/tex.js create mode 100755 src/libs/ace/snippets/text.js create mode 100755 src/libs/ace/snippets/textile.js create mode 100755 src/libs/ace/snippets/toml.js create mode 100755 src/libs/ace/snippets/tsx.js create mode 100755 src/libs/ace/snippets/turtle.js create mode 100755 src/libs/ace/snippets/twig.js create mode 100755 src/libs/ace/snippets/typescript.js create mode 100755 src/libs/ace/snippets/vala.js create mode 100755 src/libs/ace/snippets/vbscript.js create mode 100755 src/libs/ace/snippets/velocity.js create mode 100755 src/libs/ace/snippets/verilog.js create mode 100755 src/libs/ace/snippets/vhdl.js create mode 100755 src/libs/ace/snippets/wollok.js create mode 100755 src/libs/ace/snippets/xml.js create mode 100755 src/libs/ace/snippets/xquery.js create mode 100755 src/libs/ace/snippets/yaml.js create mode 100755 src/libs/ace/theme-ambiance.js create mode 100755 src/libs/ace/theme-chaos.js create mode 100755 src/libs/ace/theme-chrome.js create mode 100755 src/libs/ace/theme-clouds.js create mode 100755 src/libs/ace/theme-clouds_midnight.js create mode 100755 src/libs/ace/theme-cobalt.js create mode 100755 src/libs/ace/theme-crimson_editor.js create mode 100755 src/libs/ace/theme-dawn.js create mode 100755 src/libs/ace/theme-dreamweaver.js create mode 100755 src/libs/ace/theme-eclipse.js create mode 100755 src/libs/ace/theme-github.js create mode 100755 src/libs/ace/theme-gob.js create mode 100755 src/libs/ace/theme-gruvbox.js create mode 100755 src/libs/ace/theme-idle_fingers.js create mode 100755 src/libs/ace/theme-iplastic.js create mode 100755 src/libs/ace/theme-katzenmilch.js create mode 100755 src/libs/ace/theme-kr_theme.js create mode 100755 src/libs/ace/theme-kuroir.js create mode 100755 src/libs/ace/theme-merbivore.js create mode 100755 src/libs/ace/theme-merbivore_soft.js create mode 100755 src/libs/ace/theme-mono_industrial.js create mode 100755 src/libs/ace/theme-monokai.js create mode 100755 src/libs/ace/theme-pastel_on_dark.js create mode 100755 src/libs/ace/theme-solarized_dark.js create mode 100755 src/libs/ace/theme-solarized_light.js create mode 100755 src/libs/ace/theme-sqlserver.js create mode 100755 src/libs/ace/theme-terminal.js create mode 100755 src/libs/ace/theme-textmate.js create mode 100755 src/libs/ace/theme-tomorrow.js create mode 100755 src/libs/ace/theme-tomorrow_night.js create mode 100755 src/libs/ace/theme-tomorrow_night_blue.js create mode 100755 src/libs/ace/theme-tomorrow_night_bright.js create mode 100755 src/libs/ace/theme-tomorrow_night_eighties.js create mode 100755 src/libs/ace/theme-twilight.js create mode 100755 src/libs/ace/theme-vibrant_ink.js create mode 100755 src/libs/ace/theme-xcode.js create mode 100755 src/libs/ace/worker-coffee.js create mode 100755 src/libs/ace/worker-css.js create mode 100755 src/libs/ace/worker-html.js create mode 100755 src/libs/ace/worker-javascript.js create mode 100755 src/libs/ace/worker-json.js create mode 100755 src/libs/ace/worker-lua.js create mode 100755 src/libs/ace/worker-php.js create mode 100755 src/libs/ace/worker-xml.js create mode 100755 src/libs/ace/worker-xquery.js create mode 100644 src/packages/NotePad/Makefile create mode 100644 src/packages/NotePad/main.coffee create mode 100644 src/packages/NotePad/main.css create mode 100644 src/packages/NotePad/package.json create mode 100644 src/packages/NotePad/scheme.html diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 2a4d400..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,62 +0,0 @@ -module.exports = function (grunt) { - - //console.log(grunt.file.readJSON('src/build.json')) - var buildconf = grunt.file.readJSON('src/build.json') - // Project configuration. - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - uglify: { - options: { - banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' - }, - build: { - src: 'build/htdocs/<%= pkg.name %>.js', - dest: 'build/htdocs/<%= pkg.name %>.min.js' - } - }, - coffee: { - compile: { - files: { - 'build/htdocs/<%= pkg.name %>.js': buildconf.coffee - } - } - /*, - glob_to_multiple: { - expand: true, - flatten: true, - cwd: 'src/', - src: ['*.coffee'], - dest: 'build/htdocs/', - ext: '.js' - }*/ - }, - copy: { - main: { - files: buildconf.copy - }, - }, - concat: { - tags: { - src: buildconf.tags, - dest: 'build/htdocs/resources/tags/antos_tags.js' - }, - themes:{ - src:buildconf.themes, - dest:'build/htdocs/resources/themes/antos/antos.css' - } - }, - clean: ['build/htdocs/*'] - }); - - // Load the plugin that provides the "uglify" task. - grunt.loadNpmTasks('grunt-contrib-uglify'); - // coffee support - grunt.loadNpmTasks('grunt-contrib-coffee'); - // Default task(s). - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-contrib-concat'); - - grunt.registerTask('default', ['coffee']); - grunt.registerTask('build', ['coffee:compile', 'copy:main', 'concat:tags', 'concat:themes']); -}; \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..48e2a92 --- /dev/null +++ b/Makefile @@ -0,0 +1,84 @@ + + +BUILDDIR = build/htdocs +BLUE=\033[0;34m +NC=\033[0m + +coffees= src/define.coffee\ + src/core/apis/api.coffee\ + src/core/apis/handlers/InBrowserHandler.coffee\ + src/core/gui/gui.coffee\ + src/core/gui/BaseApplication.coffee\ + src/antos.coffee + +tags= src/core/gui/tags/afx-button.js\ + src/core/gui/tags/afx-menu.js\ + src/core/gui/tags/afx-sys-panel.js\ + src/core/gui/tags/afx-apps-dock.js\ + src/core/gui/tags/afx-app-window.js\ + src/core/gui/tags/afx-vbox.js\ + src/core/gui/tags/afx-hbox.js\ + src/core/gui/tags/afx-list-view.js + +antos_themes = src/core/gui/themes/antos/font-awesome.css\ + src/core/gui/themes/antos/ubuntu-regular.css\ + src/core/gui/themes/antos/hermit-light.css\ + src/core/gui/themes/antos/antos.css\ + src/core/gui/themes/antos/afx-button.css\ + src/core/gui/themes/antos/afx-menu.css\ + src/core/gui/themes/antos/afx-sys-panel.css\ + src/core/gui/themes/antos/afx-dock.css\ + src/core/gui/themes/antos/afx-app-window.css + + +packages = NotePad + +main: build_coffee build_tag build_theme schemes libs packages_builds + - cp src/index.html $(BUILDDIR)/ + +#%.js: %.coffee +# coffee --compile $< + +build_coffee: + - echo "$(BLUE)=======Building coffee files=======$(NC)" + - mkdir $(BUILDDIR)/scripts + - rm $(BUILDDIR)/scripts/antos.js + for f in $(coffees); do (cat "$${f}"; echo) >> $(BUILDDIR)/scripts/antos.coffee; done + coffee --compile $(BUILDDIR)/scripts/antos.coffee + - rm $(BUILDDIR)/scripts/antos.coffee + + +libs: + - echo "$(BLUE)=======Copy lib files=======$(NC) + - cp -rf src/libs/* $(BUILDDIR)/scripts + +schemes: + - echo "$(BLUE)=======Copy schemes files======= $(NC)" + - mkdir -p $(BUILDDIR)/resources/schemes + - cp src/core/gui/schemes/* $(BUILDDIR)/resources/schemes + +build_tag: + - echo "=======$(BLUE)Building tag files=======$(NC)" + -mkdir $(BUILDDIR)/resources + -rm $(BUILDDIR)/resources/antos_tags.js + - for f in $(tags); do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/antos_tags.js; done + +build_theme: antos_themes_build + + +antos_themes_build: + - echo "=======$(BLUE)Building themes name: antos=======$(NC)" + -mkdir -p $(BUILDDIR)/resources/themes/antos + - for f in $(antos_themes); do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/themes/antos/antos.css; done + -mkdir -p $(BUILDDIR)/resources/themes/antos/fonts + - cp -rf src/core/gui/themes/antos/fonts/* $(BUILDDIR)/resources/themes/antos/fonts + - cp src/core/gui/themes/antos/wallpaper.jpg $(BUILDDIR)/resources/themes/antos/ + + +packages_builds: + - mkdir $(BUILDDIR)/packages + - for d in $(packages); do (cd src/packages/$$d; make);done + - for d in $(packages); do ( test -d $(BUILDDIR)/packages/$$d || mkdir -p $(BUILDDIR)/packages/$$d && cp -rf src/packages/$$d/build/* $(BUILDDIR)/packages/$$d/);done + - for d in $(packages); do ( test -d src/packages/$$d/build && rm -r src/packages/$$d/build ); done +clean: + rm -rf $(BUILDDIR)/* \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 9f1206a..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1048 +0,0 @@ -{ - "name": "antos", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "0.2.9" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "coffee-script": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", - "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "5.0.15" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "grunt": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz", - "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=", - "dev": true, - "requires": { - "coffee-script": "1.10.0", - "dateformat": "1.0.12", - "eventemitter2": "0.4.14", - "exit": "0.1.2", - "findup-sync": "0.3.0", - "glob": "7.0.6", - "grunt-cli": "1.2.0", - "grunt-known-options": "1.1.0", - "grunt-legacy-log": "1.0.0", - "grunt-legacy-util": "1.0.0", - "iconv-lite": "0.4.18", - "js-yaml": "3.5.5", - "minimatch": "3.0.4", - "nopt": "3.0.6", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" - }, - "dependencies": { - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", - "dev": true, - "requires": { - "findup-sync": "0.3.0", - "grunt-known-options": "1.1.0", - "nopt": "3.0.6", - "resolve": "1.1.7" - } - } - } - }, - "grunt-contrib-clean": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", - "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", - "dev": true, - "requires": { - "async": "1.5.2", - "rimraf": "2.6.1" - }, - "dependencies": { - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.0.6" - } - } - } - }, - "grunt-contrib-coffee": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-1.0.0.tgz", - "integrity": "sha1-2u6wSVTxTihovMm6bq+RBf3C2kw=", - "dev": true, - "requires": { - "chalk": "1.0.0", - "coffee-script": "1.10.0", - "lodash": "4.3.0", - "uri-path": "1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", - "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", - "dev": true - }, - "chalk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz", - "integrity": "sha1-s89O0P9Tl8mcdbj2edsvUoMfltw=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "1.0.3", - "strip-ansi": "2.0.1", - "supports-color": "1.3.1" - } - }, - "has-ansi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz", - "integrity": "sha1-wLWxYV2eOCsP9nFp2We0JeSMpTg=", - "dev": true, - "requires": { - "ansi-regex": "1.1.1", - "get-stdin": "4.0.1" - } - }, - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - }, - "strip-ansi": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", - "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", - "dev": true, - "requires": { - "ansi-regex": "1.1.1" - } - }, - "supports-color": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz", - "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=", - "dev": true - } - } - }, - "grunt-contrib-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", - "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "source-map": "0.5.6" - } - }, - "grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "file-sync-cmp": "0.1.1" - } - }, - "grunt-contrib-uglify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-3.0.1.tgz", - "integrity": "sha1-/etfk4pMgEL46Grkb2NVTo6VEcs=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "maxmin": "1.1.0", - "uglify-js": "3.0.27", - "uri-path": "1.0.0" - } - }, - "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", - "dev": true - }, - "grunt-legacy-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz", - "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=", - "dev": true, - "requires": { - "colors": "1.1.2", - "grunt-legacy-log-utils": "1.0.0", - "hooker": "0.2.3", - "lodash": "3.10.1", - "underscore.string": "3.2.3" - } - }, - "grunt-legacy-log-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", - "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "lodash": "4.3.0" - }, - "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - } - } - }, - "grunt-legacy-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", - "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", - "dev": true, - "requires": { - "async": "1.5.2", - "exit": "0.1.2", - "getobject": "0.1.0", - "hooker": "0.2.3", - "lodash": "4.3.0", - "underscore.string": "3.2.3", - "which": "1.2.14" - }, - "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - } - } - }, - "gzip-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", - "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", - "dev": true, - "requires": { - "browserify-zlib": "0.1.4", - "concat-stream": "1.6.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "maxmin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", - "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "figures": "1.7.0", - "gzip-size": "1.0.0", - "pretty-bytes": "1.0.4" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.1.0" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "3.0.27", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz", - "integrity": "sha512-HD8CmxPXUI62v5tweiulMcP/apAtx1DXGcNZkhKQZyC+MTrTsoCBb8yPAwVrbvpgw3EpRU76bRe6axjIiCYcQg==", - "dev": true, - "requires": { - "commander": "2.11.0", - "source-map": "0.5.6" - } - }, - "underscore.string": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", - "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", - "dev": true - }, - "uri-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", - "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index cb2e52d..0000000 --- a/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "antos", - "version": "0.0.1", - "description": "Web-based OS", - "main": "src/antos.js", - "scripts": { - "test": "test" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/lxsang/antos.git" - }, - "keywords": [ - "OS", - "jquery", - "riot" - ], - "author": "Xuan Sang LE", - "license": "MIT", - "bugs": { - "url": "https://github.com/lxsang/antos/issues" - }, - "homepage": "https://github.com/lxsang/antos#readme", - "devDependencies": { - "grunt": "^1.0.1", - "grunt-contrib-clean": "^1.1.0", - "grunt-contrib-coffee": "^1.0.0", - "grunt-contrib-concat": "^1.0.1", - "grunt-contrib-copy": "^1.0.0", - "grunt-contrib-uglify": "^3.0.1" - } -} diff --git a/src/antos.coffee b/src/antos.coffee index 79f5100..fa0632f 100644 --- a/src/antos.coffee +++ b/src/antos.coffee @@ -1,46 +1,6 @@ -# run the code -_API = this.OS.API -_GUI = this.OS.GUI -this.OS.boot() -_GUI.loadTheme "antos" -scheme = null -_API.resource "schemes/test.html", (x) -> - return null unless x - scheme = $.parseHTML x - ($ "#wrapper").append scheme - riot.mount $ "#button", $ "#wrapper" - osmenu = {child:[ - {text:"",icon:"fa fa-circle", child:[ - {text:"About"}, - {text:"System Preferences", icon:"fa fa-commenting"}, - {text:"Applications",child:[{text:"Terminal"},{text:"Text edit"}]}, - {text:"Logout"} - ]} - ], - onselect: (item)-> console.log item} - appmenu = {child:[ - {text:"Text edit", child:[ - {text:"About"}, - {text:"Preferences"}, - {text:"Exit"} - ]}, - {text:"File",child:[ - {text:"Open"},{text:"Save"}]} - ], - onselect: (item)-> console.log item} - systray = {child:[ - {text:"Sun 22:57 6 August 2017"}, - {text:"",icon:"fa fa-search"}, - {text:"",icon:"fa fa-commenting"} - - ], - onselect: (item)-> console.log item} - - riot.mount ($ "#syspanel", $ "#wrapper"),{osmenu:osmenu,appmenu:appmenu,systray:systray} - - docks = {items:[ - {icon:"fa fa-cogs"}, - {icon:"fa fa-life-ring"}, - {icon:"fa fa-cubes"} - ]} - riot.mount ($ "#sysdock", $ "#wrapper"), docks \ No newline at end of file +_GUI = self.OS.GUI +_API = self.OS.API +_APP = self.OS.APP +this.onload = () -> + console.log "Booting the os" + self.OS.boot() \ No newline at end of file diff --git a/src/build.json b/src/build.json deleted file mode 100644 index dfc7b0a..0000000 --- a/src/build.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "coffee": [ - "src/define.coffee", - "src/core/apis/api.coffee", - "src/core/apis/handlers/InBrowserHandler.coffee", - "src/core/gui/gui.coffee", - "src/antos.coffee" - ], - "copy": [{ - "expand": true, - "flatten": true, - "src": [ - "src/libs/*", - "src/index.html" - ], - "dest": "build/htdocs/" - }, - { - "expand": true, - "flatten": true, - "src": [ - "src/core/gui/schemes/*" - ], - "dest": "build/htdocs/resources/schemes" - }, - { - "expand": true, - "flatten": true, - "src": [ - "src/core/gui/themes/antos/fonts/*" - ], - "dest": "build/htdocs/resources/themes/antos/fonts" - } - ], - "tags":[ - "src/core/gui/tags/afx-button.js", - "src/core/gui/tags/afx-menu.js", - "src/core/gui/tags/afx-sys-panel.js", - "src/core/gui/tags/afx-apps-dock.js" - ], - "themes":[ - "src/core/gui/themes/antos/font-awesome.css", - "src/core/gui/themes/antos/ubuntu-regular.css", - "src/core/gui/themes/antos/hermit-light.css", - "src/core/gui/themes/antos/antos.css" - ] -} \ No newline at end of file diff --git a/src/core/apis/api.coffee b/src/core/apis/api.coffee index 0c49aa8..2229a97 100644 --- a/src/core/apis/api.coffee +++ b/src/core/apis/api.coffee @@ -1,6 +1,3 @@ -#define the base API functions -self = this -_API = self.OS.API self.OS.API = # the handler object could be a any remote or local handle to # fetch user data, used by the API to make requests @@ -16,11 +13,14 @@ self.OS.API = _API.request 'config', (result) -> console.log result - resource: (resource,callback) -> - path = "resources/#{resource}" - $.get path + get:(p,c)=> + $.get p .done (data) -> - callback(data) + c(data) .fail -> alert "cannot get data" - callback(null) + c(null) + resource: (resource,callback) -> + path = "resources/#{resource}" + _API.get path,callback + diff --git a/src/core/apis/handlers/InBrowserHandler.coffee b/src/core/apis/handlers/InBrowserHandler.coffee index 84e0133..a37b57d 100644 --- a/src/core/apis/handlers/InBrowserHandler.coffee +++ b/src/core/apis/handlers/InBrowserHandler.coffee @@ -1,6 +1,3 @@ -self = this -_API = self.OS.API - self.OS.API.handler = request: ( query ) -> $.ajax {} \ No newline at end of file diff --git a/src/core/gui/BaseApplication.coffee b/src/core/gui/BaseApplication.coffee new file mode 100644 index 0000000..a754590 --- /dev/null +++ b/src/core/gui/BaseApplication.coffee @@ -0,0 +1,21 @@ +class BaseApplication + constructor: (@name) -> + @observable = riot.observable() + init: -> + #first load the scheme + path = "packages/#{@name}/scheme.html" + @scheme = _GUI.loadScheme path,@observable + #if(!scheme) bug repporter go here + @event() + event: -> + #implement by subclasses + on: (e,f) -> @observable.on e,f + trigger:(e,d) -> @observable.trigger e,d + open:-> + #implement by subclasses + data:-> + #implement by subclasses + update:-> + #implement by subclasses + +this.OS.GUI.BaseApplication = BaseApplication \ No newline at end of file diff --git a/src/core/gui/gui.coffee b/src/core/gui/gui.coffee index bfcef21..4e4bb9e 100644 --- a/src/core/gui/gui.coffee +++ b/src/core/gui/gui.coffee @@ -1,7 +1,3 @@ - -self = this -_GUI = self.OS.GUI -_API = self.OS.API self.OS.GUI = tagPath: "resources/tags/" init: () -> @@ -10,14 +6,77 @@ self.OS.GUI = data: "#{_GUI.tagPath}/tags.json" self.OS.API.request query, ()-> - loadScheme: (name, call) -> - path = _GUI.tagPath + name + ".html" - $.getScript path - .done (script, status) -> - call(script, status) - .fail (jqxhr, settings, exception) -> - _GUI.systemReport exception + loadScheme: (path, obs) -> + _API.get path, (x) -> + return null unless x + scheme = $.parseHTML x + ($ "#desktop").append scheme + riot.mount ($ scheme), {observable:obs} + scheme loadTheme: (name) -> path = "resources/themes/#{name}/#{name}.css" - $ "", { rel: "stylesheet", type: "text/css", href: path} - .appendTo "head" \ No newline at end of file + $ "head link#ostheme" + .attr "href", path + launch: (app) -> + if not _APP[app] + # first load it + path = "packages/#{app}/main.js" + $.getScript path + .done (e,s) -> + #launch + _app = new _APP[app] + _app.init() + console.log "Fist time loading "+app + .fail (e,s) -> + #BUG report here + console.log "bug report" + else + # now launch it + _app = new _APP[app] + _app.init() + initDM: -> + _API.resource "schemes/dm.html", (x) -> + return null unless x + scheme = $.parseHTML x + ($ "#wrapper").append scheme + #riot.mount $ "#button", $ "#wrapper" + osmenu = {child:[ + {text:"",icon:"fa fa-circle", child:[ + {text:"About"}, + {text:"System Preferences", icon:"fa fa-commenting"}, + {text:"Applications",child:[{text:"Terminal"},{text:"Text edit"}]}, + {text:"Logout"} + ]} + ], + onmenuselect: (item)-> + console.log item + _GUI.launch "NotePad" + } + appmenu = {child:[ + {text:"Text edit", child:[ + {text:"About"}, + {text:"Preferences"}, + {text:"Exit"} + ]}, + {text:"File",child:[ + {text:"Open"},{text:"Save"}]} + ], + onmenuselect: (item)-> console.log item} + systray = {child:[ + {text:"Sun 22:57 6 August 2017"}, + {text:"",icon:"fa fa-search"}, + {text:"",icon:"fa fa-commenting"} + + ], + onmenuselect: (item)-> + console.log item + } + + riot.mount ($ "#syspanel", $ "#wrapper"),{osmenu:osmenu,appmenu:appmenu,systray:systray} + + docks = {items:[ + {icon:"fa fa-cogs"}, + {icon:"fa fa-life-ring"}, + {icon:"fa fa-cubes"} + ]} + riot.mount ($ "#sysdock", $ "#wrapper"), docks \ No newline at end of file diff --git a/src/core/gui/schemes/dm.html b/src/core/gui/schemes/dm.html new file mode 100644 index 0000000..0b74e0e --- /dev/null +++ b/src/core/gui/schemes/dm.html @@ -0,0 +1,8 @@ + + + +
+ +
+
+
diff --git a/src/core/gui/schemes/test.html b/src/core/gui/schemes/test.html index 2ec1076..1446de5 100644 --- a/src/core/gui/schemes/test.html +++ b/src/core/gui/schemes/test.html @@ -1,10 +1,16 @@ + + + + - - -
- -
- - -
-
+ + + +
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore + magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
Test
+
+
+
\ No newline at end of file diff --git a/src/core/gui/tags/afx-app-window.js b/src/core/gui/tags/afx-app-window.js new file mode 100644 index 0000000..58efa57 --- /dev/null +++ b/src/core/gui/tags/afx-app-window.js @@ -0,0 +1,159 @@ + +
+
    +
  • +
  • +
  • +
  • { apptitle }
  • +
+
+
+ +
+
+
+ + + \ No newline at end of file diff --git a/src/core/gui/tags/afx-button.js b/src/core/gui/tags/afx-button.js index a98e830..25fb8a1 100644 --- a/src/core/gui/tags/afx-button.js +++ b/src/core/gui/tags/afx-button.js @@ -1,16 +1,21 @@ - \ No newline at end of file diff --git a/src/core/gui/tags/afx-hbox.js b/src/core/gui/tags/afx-hbox.js new file mode 100644 index 0000000..7fcd61a --- /dev/null +++ b/src/core/gui/tags/afx-hbox.js @@ -0,0 +1,58 @@ + +
+ +
+ +
\ No newline at end of file diff --git a/src/core/gui/tags/afx-list-view.js b/src/core/gui/tags/afx-list-view.js new file mode 100644 index 0000000..416b226 --- /dev/null +++ b/src/core/gui/tags/afx-list-view.js @@ -0,0 +1,29 @@ + +
    +
  • + +
  • +
+ +
\ No newline at end of file diff --git a/src/core/gui/tags/afx-menu.js b/src/core/gui/tags/afx-menu.js index 56a85d4..d54f56f 100644 --- a/src/core/gui/tags/afx-menu.js +++ b/src/core/gui/tags/afx-menu.js @@ -6,27 +6,31 @@ { text } - +
  • \ No newline at end of file diff --git a/src/core/gui/tags/afx-vbox.js b/src/core/gui/tags/afx-vbox.js new file mode 100644 index 0000000..890fd5c --- /dev/null +++ b/src/core/gui/tags/afx-vbox.js @@ -0,0 +1,55 @@ + +
    + +
    + +
    \ No newline at end of file diff --git a/src/core/gui/themes/antos/afx-app-window.css b/src/core/gui/themes/antos/afx-app-window.css new file mode 100644 index 0000000..7d0902c --- /dev/null +++ b/src/core/gui/themes/antos/afx-app-window.css @@ -0,0 +1,73 @@ +afx-app-window div.afx-window-wrapper{ + border:1px solid #a6a6a6; + /*box-shadow: 1px 1px 1px #cbcbcb;*/ + box-shadow: 1px 1px 1px #9f9F9F; + border-radius: 5px; + background-color:#e7e7e7; + padding:0; + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} +afx-app-window{ + /*width: 600px; + height: 400px;*/ +} + +afx-app-window ul.afx-window-top{ + margin: 0; + padding: 0; + width: 100%; + padding:0; + height: 20px; + border-bottom: 1px solid #a6a6a6; +} +afx-app-window ul.afx-window-top li{ + list-style: none; + margin-left: 3px; + margin-top:4px; + +} +afx-app-window ul.afx-window-top .afx-window-close,.afx-window-minimize,.afx-window-maximize{ + width: 11px; + height: 11px; + border-radius: 10px; +} +afx-app-window ul li.afx-window-close{ + background-color: #Fc605b; + float:left; +} +afx-app-window ul li.afx-window-minimize{ + background-color: #fec041; + float:left; +} +afx-app-window ul li.afx-window-maximize{ + background-color: #35cc4b; + float:left; +} + +afx-app-window ul li.afx-window-title{ + margin-top:1px; + float:none; + overflow: hidden; + padding-left: 5px; + padding-right: 5px; + text-align: center; +} + +afx-app-window div.afx-window-content +{ + overflow: hidden; + width: 100%; + background-color: white; + flex-grow: 1; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} + +afx-app-window div.afx-window-grip{ + height: 10px; + width: 10px; + background-color: transparent; +} \ No newline at end of file diff --git a/src/core/gui/themes/antos/afx-button.css b/src/core/gui/themes/antos/afx-button.css new file mode 100644 index 0000000..7380275 --- /dev/null +++ b/src/core/gui/themes/antos/afx-button.css @@ -0,0 +1,20 @@ +afx-button button{ + outline: none; + padding: 4px; + border: 1px solid #a6a6a6; + background-color: white; + color: #414339; + border-radius: 6px; + font-family: "Ubuntu"; + font-size: 13px; +} + +afx-button button[disabled]{ + color: #a6a6a6; +} + +afx-button button:active { + background-color: #2786F3; + color: white; + border: 1px solid #dedede; +} \ No newline at end of file diff --git a/src/core/gui/themes/antos/afx-dock.css b/src/core/gui/themes/antos/afx-dock.css new file mode 100644 index 0000000..a29f06e --- /dev/null +++ b/src/core/gui/themes/antos/afx-dock.css @@ -0,0 +1,24 @@ +afx-apps-dock{ + float: left; + bottom: 3px; + top: 3px; + width: 32px; + background-color:#e7e7e7; + position: absolute; + padding:2px; + padding-top: 5px; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + border:1px solid #a6a6a6; + overflow: hidden; + box-shadow: 1px 1px 1px #9f9F9F; +} +afx-apps-dock afx-button button{ + width: 32px; + height: 32px; + font-size: 19px; + margin-bottom: 0px; + border:0; + background-color: transparent; + +} \ No newline at end of file diff --git a/src/core/gui/themes/antos/afx-menu.css b/src/core/gui/themes/antos/afx-menu.css new file mode 100644 index 0000000..b6bb14f --- /dev/null +++ b/src/core/gui/themes/antos/afx-menu.css @@ -0,0 +1,85 @@ + +afx-menu { + position:relative; + display:inline-block; + /*z-index: 100000;*/ +} +afx-menu a{ + text-decoration: none; + width: 100%; + height: 100%; + color: #414339; + display: inline-block; + width: 100%; + height: 100%; +} +afx-menu ul{ + padding:0; + margin: 0; +} +afx-menu afx-menu ul { + padding: 0; + border:1px solid #a6a6a6; + border-radius: 5px; + border-top-left-radius: 0px; + /*box-shadow: 2px 2px 2px #cbcbcb;*/ + box-shadow: 1px 1px 1px #9f9F9F; + background-color: #e7e7e7; +} +afx-menu ul > li{ + list-style:none; + margin:0; + position: relative; + float: left; + padding:3px; + padding-left: 5px; + padding-right: 5px; +} +afx-menu afx-menu { + top:100%; + left:0; + position: absolute; + display:none; +} +afx-menu afx-menu i{ + margin-right: 5px; +} +afx-menu afx-menu li{ + float:none; + width: 150px; +} +afx-menu afx-menu afx-menu{ + top:-4px; + left: 100%; +} + +afx-menu li:hover { + background-color: #2786F3; +} +afx-menu li:hover > a { + color: white; +} + +afx-menu li:hover > afx-menu +{ + display: block; +} +afx-menu li.afx-corner-fix{ + height: 3px; + padding: 0; + margin: 0; + background-color: transparent; +} +afx-menu li.afx-corner-fix:hover{ + background-color: transparent; +} + +afx-menu afx-menu .afx-submenu:before { + content: "\f054"; + font-family: "FontAwesome"; + font-size: 10px; + left:93%; + color: #414339; + position:absolute; + top:25%; + } diff --git a/src/core/gui/themes/antos/afx-sys-panel.css b/src/core/gui/themes/antos/afx-sys-panel.css new file mode 100644 index 0000000..d9208fb --- /dev/null +++ b/src/core/gui/themes/antos/afx-sys-panel.css @@ -0,0 +1,19 @@ + +afx-sys-panel div{ + width: 100%; + height: 23px; + margin:0; + padding: 0; + background-color: #e7e7e7; + border-bottom: 1px solid #9c9C9C; + box-shadow: 1px 1px 1px #9F9F9F; + } + +afx-sys-panel .afx-panel-os-stray{ + float:right; +} + +afx-sys-panel .afx-panel-os-stray afx-menu afx-menu{ + top:-4px; + left: -100%; +} \ No newline at end of file diff --git a/src/core/gui/themes/antos/antos.css b/src/core/gui/themes/antos/antos.css index 61fa9da..cef5bf6 100644 --- a/src/core/gui/themes/antos/antos.css +++ b/src/core/gui/themes/antos/antos.css @@ -5,6 +5,8 @@ html,body{ font-size: 13px; width: 100%; height: 100%; + background-image: url(wallpaper.jpg); + background-size: cover; } #wrapper{ margin: 0; @@ -12,129 +14,6 @@ html,body{ min-height:100%; overflow:hidden; } -afx-button button{ - outline: none; - padding: 4px; - border: 1px solid #a6a6a6; - background-color: white; - color: #414339; - border-radius: 6px; - font-family: "hermitlight"; - font-size: 13px; -} - -afx-button button[disabled]{ - color: #a6a6a6; -} - -afx-button button:active { - background-color: #2786F3; - color: white; - border: 1px solid #dedede; -} - -afx-menu { - position:relative; - display:inline-block; - z-index: 100000; -} -afx-menu a{ - text-decoration: none; - width: 100%; - height: 100%; - color: #414339; - display: inline-block; - width: 100%; - height: 100%; -} -afx-menu ul{ - padding:0; - margin: 0; -} -afx-menu afx-menu ul { - padding: 0; - border:1px solid #a6a6a6; - border-radius: 5px; - border-top-left-radius: 0px; - box-shadow: 2px 2px 2px #cbcbcb; - background-color: white; -} -afx-menu ul > li{ - list-style:none; - margin:0; - position: relative; - float: left; - padding:3px; - padding-left: 5px; - padding-right: 5px; -} -afx-menu afx-menu { - top:100%; - left:0; - position: absolute; - display:none; -} -afx-menu afx-menu i{ - margin-right: 5px; -} -afx-menu afx-menu li{ - float:none; - width: 150px; -} -afx-menu afx-menu afx-menu{ - top:-4px; - left: 100%; -} - -afx-menu li:hover { - background-color: #2786F3; -} -afx-menu li:hover > a { - color: white; -} - -afx-menu li:hover > afx-menu -{ - display: block; -} -afx-menu li.afx-corner-fix{ - height: 3px; - padding: 0; - margin: 0; - background-color: transparent; -} -afx-menu li.afx-corner-fix:hover{ - background-color: transparent; -} - -afx-menu afx-menu .afx-submenu:before { - content: "\f054"; - font-family: "FontAwesome"; - font-size: 10px; - left:93%; - color: #414339; - position:absolute; - top:25%; - } - -afx-sys-panel div{ - width: 100%; - height: 23px; - margin:0; - padding: 0; - background-color: #f6F6F6; - border-bottom: 1px solid #9c9C9C; - box-shadow: 2px 2px 2px #cbcbcb; - } - -afx-sys-panel .afx-panel-os-stray{ - float:right; -} - -afx-sys-panel .afx-panel-os-stray afx-menu afx-menu{ - top:-4px; - left: -100%; -} .afx-clear{ clear:both; @@ -150,30 +29,6 @@ afx-sys-panel .afx-panel-os-stray afx-menu afx-menu{ top: 24px; } -afx-apps-dock{ - float: left; - bottom: 3px; - top: 3px; - width: 32px; - background-color:#f6F6F6; - position: absolute; - padding:2px; - padding-top: 5px; - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; - border:1px solid #a6a6a6; - overflow: hidden; - box-shadow: 2px 2px 2px #cbcbcb; -} -afx-apps-dock afx-button button{ - width: 32px; - height: 32px; - font-size: 19px; - margin-bottom: 0px; - border:0; - background-color: transparent; - -} #desktop{ position: absolute; top:3px; @@ -181,5 +36,7 @@ afx-apps-dock afx-button button{ margin: 0; left: 40px; right: 0; + user-select:none; + cursor: default; padding:0px; } \ No newline at end of file diff --git a/src/core/gui/themes/antos/ubuntu-regular.css b/src/core/gui/themes/antos/ubuntu-regular.css index 8ba8ff6..8dc082e 100755 --- a/src/core/gui/themes/antos/ubuntu-regular.css +++ b/src/core/gui/themes/antos/ubuntu-regular.css @@ -31,8 +31,8 @@ @font-face { font-family: 'Ubuntu'; - src: url('ubuntu-italic-webfont.woff2') format('woff2'), - url('ubuntu-italic-webfont.woff') format('woff'); + src: url('fonts/ubuntu-italic-webfont.woff2') format('woff2'), + url('fonts/ubuntu-italic-webfont.woff') format('woff'); font-weight: normal; font-style: italic; diff --git a/src/core/gui/themes/antos/wallpaper.jpg b/src/core/gui/themes/antos/wallpaper.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c0f0fcf790cfb6ff7deb6837978f68da1e51614 GIT binary patch literal 1736567 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

      abWPioOrR`@7}eKS(+zQJ=euImTRm zed7Ld9cHjtVqWT8H=`x`&nm(%UP`YyVwabqwYeke>A_nMa_;0&f18!culG*Z+_6h% zkRJwsK0+T(HUDr_nZwRJT1k#*{@pW275dK?FY(~60!JMWn(CePMON@@4CWGdePzGR zKyta}Ni#A%eukn==F)lEd^33)|J_k|KJ|xW?W6nUAag(egu0M&!^Xfue{nmWmQ(S_ z2UqCDPVJiyKlJ=lvFX|FNjQTh1q7yrJ!y`+Hb%dhOsP zX{qD&v-jGSZy)|?2^L&e5tH2(sAx=x_wGoN6D=N_O{ZLLPnLI~l1;Od>KYU; z_?5!Y@ZzCrkvaw|x2C;TT3cPev6v=;Dx4}CeD^x7DUa#XHMa&QhK9omYlFKUo66kj z)>&N77q{NCef1lVPv_=@n6MunsPQ&_Zs%sU`u4aKLd70&2I)A$N0zp$N!|R1tv2f( z7c&U<4wtVH=+*czu6(%gJ~Q;r(>-IW8;+3Y_FJi<+#_URZBQY5_qx{AXwyE4`)v9q z^o9PJFIn8_=sQF6y-a3~kqQilWikkMqLzH~o8PSmk3H;Uzx~LADA2n&Es_de7M z7IeS`u2tNuof}~D8IQgfGiOjy>V5TI-Nfa`gTyD~vBj3Y64e{p+)B_ZzZ{CJBELJ- zb6e^D7B+|O-B6CN7irs+o847&Qzr^zF&f;FbWR(@TIKj)Mz z@n3cLcgf;rNBP??E77c;&`)}@gt0#3rD2Yzk+x_pnb1)gp z^NdC<^VE#Ij!hQ6GWp?mI3&HzNt2IIcKb1J?2qQ$v@~Bsfec<%Mbfv+-V!v|xf`sk z3Orl~LZ225304e7;X2`~GmY6)N}spZk}_tCKghUuDyu$yMDK;TXBL&aqF3&!yYC&+(MjvvEB+tQMe z3YjGqXf+76;*O}|YIV0u*-{T@!|z^})3-d)H!u?82RX^+ByZ}<*q}W2&VOSQpa)y11D3a05+^wcygSq zta5qg-}ugUEB53u{)GA4d?r~n;ad>bk#2)T{K_wrv176`i1nj3ai(uY2A5i{PhEP~ zMwAoukv@q$y)p8>hna-RY+8jSLXSO$c46r>_E<&Wbe-E~svi5d@=(F=3{s4R;WxV) zkGrsY*c|cJ<{xbvX`9(KnN;(7uyJu-x@Uw;^RgY%eC-{<0Bii1BH`XnX7?*a`TQF^ zAdpvz^+{>EWRE~g$P?@V4fyXifKm8rp78L|6NR5F?XIhBUpP3` zGsi5%$lljf#_rAxVH0+S7bX6x_yI3ZJ8IX|IPrDQ>-`*}ekY7Qi-$XIz7M9Y zx+j5k5VD8eaHjpkk+x;o`05Y*%@jd32rmKj4NUjImMM!52Pdza9z~2uvd0L=fzHJS zIBpC9{ZFB44fF-f?O+lO0uo>_aH1jEwQM5#e^;QjnMAfoI?o3+a)B+-{3=k$NJ4HP z02AFXrsgIEZ7{41w;z*;=$#B_5AH3|uz{eKARLUElu9*x9fcF^mfVNyQtRUw#+*6G z7aK#+)2L$n{TFpQy{sb%g!UKmIv!CuaL9mBr_UEf0>+&6ojPMTE07D7GQYids}bab zl=z^@MLZpJe2Rg-8K6+SU})t4VTODtptXaG_1b$bMF3?CwXRDQsGE!EJj@TdFOBF< zc%pdHMK=UDd!_I91IZswcn;0IxpLkV2$IscY1pRv{;WRe-RF%~RU)KU6KZ?V$Kp6x; z5?uzFQ`;4n9t7)k$CiiDEaZ;)WvwB}$r{Y@{Y4;>5&Ix{w zq@h@;KLiu$+Sb9uo$c@xRWzTUF%lhUw|osXct zDqiaa^jpECX=3eXjzn3vGPr~a-4)L~$t(WF@UcBf z)V5FMKkw4HS{jQYa7_(WbOTb{oLU_jzQ$_mFWLaYBC{38F|;`=Ag2t*{!rjh{(sXi z-rLAmz%4>)tVA+QEfgNbtP2b)PKNRPW3c?E#F#WS-ZjJX9<2X;k#im^2E_Bk3TgCe z+7J9wE>=r){bKm$5^r`K5F0}&v40&H4pN?GyYM=4;3{n)F}%1{t!uva2yo@J4esrl zAf`|4V!$XxVlkODW|}wyKmAvzirE(QVvuJ)F}7l1~FhM0l?2qBFg&M3b(-;Gh7~vAl|sz2IYC zG&H@HyZTr=VQS=2tohjhHxcxFit7ea>xKnZnw?ufiaHp64oxVaQb1G=t6{$C%|YlA z!{=~4kY%SXm|ZD~^#ywB7{Q)+vy_G8m~%)_4{x0eB4{GJjNWOy!Cj_9=D}3Aa3W%m zKYQq;uid|>Zs@2BOUjq%jpgVy5JF&_U?s4i20d{3Uhu)>7%e4QWY>?|j<+VSY5-yD z5~!qA#}(k;w|@NkE&%}jIsH;oh1q%_JfVm9qCuPxtM@)m7P_=0Vi;4>wX4=`6zvk2 z=kWNEYPc^dt~NW0dPoRa(H)reIH!;Q35^fOks(tq%Lk3BG?;;FtiEc~VPeNwSb$6>BS}2G~O|8hn zFczxC3a}Pm>dO;VNECZgXxqgVFLUCfrP2!mgN*pTWcPp1G45y~Dic53^M-Gh7#X=Z zE4X0>9(#7;>flb!KY_X=n?VU$hCB~iBDB|Gd*P%7&$b!@koJ84O|m)EcU5)o4uK4o z$4M~}Tg;{D`Po6=I*mnXfhWz7n_fg`>>%Hh%m-CAg+%guwQqpMRO0_b%~-$FdU++3 zOkc+3>pus9>*rR|HL!w*gO!gQc59b{Du0R6KbwAg6fqd0_>+1iFI?dyE{CR?H~OCX z0}&)6fVdFO*lx5i_~L`$naFO#aRC>aoRw%pY(*}xfbu&30tiVbj8+a)Tz>A5rOgJ} zP~S+<_j4yE#-Fv4Dwiq_NNQubGuASwCq>1693{#dAVCCD{Ae+_-e3t> z99k_}C=m7G>@5Ch>(3(W{j z3|8Q_g~_5is5#t$ycMMyJ}H&P!A9;D(s|yEYzaDs0^&eeBMFV2%}O|Ad+atPfPaxd zFet>fF+G}H1xT^;;tx%rxm7rCrOOMQ0cS|wy&gI(qC%hOS}rO}3eB0Z$-M{n@Gk_{ z1IPvcvyISpCi|~v$M?h<=a85}|Hz)lS0_03)!6WcFt+mo+{Mbk+j@~{(iG2cKdiZ{ z`rLzR%;20}*3Rju*oxl6sO++$t zL_~kl9DD|&mTttqcTEW4ra~E&6tDfc(s{00WIl$+1ldF&s;NP}hJ=8z1}Zsh8d8je zQeA+LpmNH2GhI=UOnD(Oyu!WQMPQNWHgHe?D^Cn7<%{2h1mSDJfdZZX<%@x%vE|Aj z**&6S8pLzK4u-z)Dez;07t4A>3xik`)X>i{t`(SN#Os>|Mxkv_OQN8Zg>0@ewx+q+ zy`8E|!~*kEv%w1Qn?DjhoC}D#4GUaq!nA+q`l1hvNW|6*V-~gxELjvwr1{fJp_ySA z{d*Z4n$uilqoSy&+all6-WQug3)>g^@i|UfT9g?>k~m&~81v>+M<|E$8_C&*Hba0+ zE?AkAYs7GjR+79VNd{!i2~L0vNc7D(1jt>)%R)Wz`pZMSE*XihnPpL65!ZI1b@ec+ zjHrcpoERk~OE}A*22z9#T|>aDLg!OhJ?ySFCOTy)jRXU`R{{(Hh+jzJ=#rukl7w5| zn+Jm)B6BZQXw)HxNo8EmM>-mPz8roih$MMgJA`mIJo!&%M?08tUS%riJ_~V>c%7hw zo76NSE%t1niOw_SxlNJHN{7j@oOZkis<6qi(&cd7uz1C$u&T~ansFEATLI;-k*#KFnSS`^Pj+t zrY0=H1@nSgBVuZG5FWw}+~&U)&`a#a=Ima&Z$afl>XCr4Uds~T%pPLyZl1)6QR`N} z%>n(&lwSW@L+Gp%@0vaZ9%!|MtUO`?I3%)7&|8&;)_&(Ge|jNf1P*-Ep!)n~{#JNGL*^+e$t;5hW?q>p!n2oF zEQoQaoYtXTM5RFaP^U(NoISNd5vFm5TG(5bpsF6Oi(1JUy}aS2?QSj7@5m7yyyyE=21eyiOZFjF~w6wPhOPRd0yh+#W?H3gQs;ezq~8IZ0kj0 z8kd(h8%3+gKE_hE4O-A#n5KO7mM^Blul(t@;Nv#P)oijVjL2O1DT7hGmFw|n)^GCW z=#8G*A46~mgSYAPJ98hTT2k!(K6wt1wzq|XyA`GNQL=}P?G*pEH$zWLn(-?5-V&Vw z*2=k;OU~bKJiIyD_4n@J1OP)McLIdxJ{lA^ADll824>pQM*Y{Xz)${ZuI%=18oa8) zlFe3r`1(YbOL8nI9!-4fBK<7GWc$&k?`fT~_$If)-cQz+s=pWR`n?z@{FQp#=bL;> zBdaaison-oa6;w7kNmfV?2h>iuyAo%V#t*i!e^iJY zN(RdtnKuf7It_@sPICg~v17{{BO70K%Oy0e{3;Gpdt}?f+~~1;9qvjbHelH206G$} zgT(oG^b67-JhWz)L*4qt+8Q-{djlXgG3(VZlvtZS;4#h5&pQXP~ zcy|8g{n{S!-3Rf_``DrF)4Z*pdCBd~TN{7#5lrc&O*s46SFM=qCnvN>X~gf4GCOFK=8S8aEamG|a2{*d8RgNqLlX-E3T z+P}spK59}6e%H%v#&mu7!eu!}zqF#aN*GhII@Cn+d+3>^)W*+_HY2k29&vGx(+n4> z6O+Q)wud*bhrPUcEtxUNCi3m6e^KT~L63DpO?+=lRGYz!^#e|#*yc-1rJI=^|LmF? z9}2P8Qc4HLOweUnH$Kz8-l!m2d7WL>^b)mW(>iv{vvgjvZKGDst_aiz)j9+wSYbTp zWFE5=@l{#Allc(ZR4!AkX+)mP@XyUe;WzY|x~{zzRK~)tUVahrl2B%wp8b0y@OSD{ z6aMg&Wq>{Deh6-+4w8EuWuiR$r$kr;>SV23L?zBo;n-B?1EI^1S5^7hR9Smq*P69= zF|-6#-1{z5V930Y%vjSM;@I@}?;=C?8@hM;&?n~07ZRJ%9~;7-Y=+&ov5&fT|ja9HBAZk=Qh zpYj^NJy34+v0Z^aoa^d2QT{T0K`gbk+DLl8WxHRc>kvg$2UKPlL23`nMFz zd&#-O>=7X&3ychr@8dC#Zw|;G)l7-$Qz>Hza&fBXxCcK z{VCBSWYPUfhMe@4{G;5~ExLa<+>O&hte96BIK9`Z-)r=Tm>9Elq5lZc1b^_fZf@N+ zX=CjQZEGUc`f)_pLDd*4t-eb)?kC$=GP^%AeEIRX!H#a+0T*`NUk>f=qa8H=>2Swr zx-OyLI8N7l#P77Y)HKN3<>qUL%-MC%e4;mFJXBF!!K5g;wJDjS&75P9f9!taJFoP9 zNa(v$ox>%8HuV&$H$9fziv{U7*bwRiljzQ|0xh%j2Bwad38d zkU>cq`%P!XcK_=8{Hwo%%=dM<`zlu6{V86qt5FRtY!aU5khG9czB)DbkXdGW(7V87 z=&^h%FaCYoyOw4-k^^@WPbE z(uO9nqST!HmIe8;eW57F7|z%}g~Yy=>#t?B%bzbf=|8yB*}oUX+55Z1(*L(rQg7j8 z`d1Z+XKK#MJsDnudtdJ+JmB|e5SPps8 zyjQB>Q;CK6g&T&&QikE(Pkl9Z+~}V$1ovsbSS7PM+BccI;aC5NIlU=$R6E7Y)1@{s z-~*dwtLc_TIY)4f$J{WrfB`1PSU%rnhT!ijp(XKmAzvfdLz}l5vERBoh0X| zfFKrdaie)JZL@in`-iKa@0Uy8n9YB!)sH{2{Hcsl<$2uWg@ zdujaD$r3$l$prWz-ezH^yi~C1e}Kihn5v*#{ucAhOce<%UD-)!jdu1f4fvpVGxH|Gz6d9sW@>28nacpvwdh89*jzGUTs9{A>1Q{*B)9aplQP?9gf48_9kB z@h<%Fqm#_$-`)qw2aXT_d_ajETZKu0<4a3Uk$lhd-cLLl*?W8j0WjyR<{wBm`&jke zSxf6Y_3v|)4;9>fH8B4SzFlzG$cjIWJWkF_zWHSTde%9>m=3-QvU-S07k9;Tcjd}I zN}f2(pEh3@=`{LbHS)f}!5nkh_+@+D+G9^kg%CN~#jP5%xsQDZQvew14gdgL1ehR- z3qU9`=r6N_0Z4BxIX zXSPr@8ig`u>R1(y=7eL*6 zp(ffGAQiwCDJMcSW}}{cPe{l4>PHuA?FAFwB5<`jgM~B`Jm{hor8qMqP5UXP!DsyN zwe+ki96WTeq>C7X(5$ZTd0!OfrQD?@|DHFu=@o<9HYSDC+a#8cF}q}T?@{t( zkNKP+NJ?2~2(kgd9`~7FwnkN%&dH#0Nw=d6g|?%iRLw`UYb#wJg5_hhugGD()-U9X zT4_~uDh>_=mi+e*Ku|{=XFCV-T=UtsZlsy(qD0k{;A#`HQ7-zOvI^7vq4{z~+zU;K zb=uIvLs4i2jZu<;J)whokUJ){4rDzCcX3U998{;$QUM9rp@d9AqB(0464wOusG6S# zg9iaBiW87#Wr93_<_D2S4JLhvs}-e=Db;I*;*~;pcaPv8QiPoM{GWp76|C znns8!I_6!eA-5L_=cC*rrX~;Udja?yb;_?T+DuJ+jBgTrH~|VsCn(8W>l4|-A9vp2 z)H#i=nQ9TgP}2Zg%dU~f?HS+Je-J!^fnvS8hetXEJ*9Rjl#*MdSNG5bYY=8~XpUr} zv0<7vUgg%>8}3O-I@k8h+f@2GUkoj|1mN9Qi0H--BS}otYMD9)9tZ!`#!Ir+%iQyz z-~vriDVuxNJl-IV6v>FC9Za1!)1p@u5+rjf>Jxo~<9$#5FlX8{{%Y-&NN*!tBQ|V3 zzZN_W;YLgeUI_Ga8`=0_Fa4y?pwyC(AjB3+Z7e88l}UI;A?|3{Ejva#+$uW;FG^U= zy#^D(=VH%c0}mu-=<9utoE z0%lL!a5Wbfj&)qw*Ap_vjDV1nHRqYEx1x-QZW_7eUHKTLQ5NpCVLa29sB z30@PqsEv^WS=`;qQ|&=K(jLJzxln{sWR)LT$sHRIApH7a;^ph8{KIx5+eeksIkAOZgBb-9II*Z*9aDMd za^U*ZtLHH-1rb}#J%{)JbNj^G#&O1JKa@WqE5q6ahsjIHw~;1--bM(hZ;XE-gK!d| zsd?!F0k20~hyGbh#+S8THkLCcr5>WlCKR`hv%EvNN?&9%qXcodeSO3bRA^6ko!u2v z+chKk55urG`?3LOxZV7%e36X%EXlVW2lqNNBQCX$JM!^+lrd|K-!{u(9CVL!1IwIF zII-XvN z(XJ@G7U))F<@Q=KdeHw;)msPX{EF@x+7ga4-rzu#T_1qxv?$2EzxklURbei)EJ+~= z4dPzlHRw-A316FW?-b*?XxImAxX^>1N(bbiM&y;x+md%hP^lHK4Hk-C_{Az9-62E_ z7n1eOV=r28#{XA)Nnt|1b5x3oH7!O9Bc;^}sRUhFI1GW(Q#Xx5&23ABgT|3VpXfne z`7e?-$dg*3+bb)-NNZF5JljByn8k~Zpser5ZRW4iu&5#fc^;Q_GEWkVk%RPj6Z&2F zOKRLP|KL%P7?~FX964A@;G;64V=DnfHZ^Y{FEL877yyI+os1lkPK_FQ0en#gyT7@F z%)mtrxBT8ix?R{$kx<Os{Voz{H<%Exs!sr5K`eyozs`2FVy;- zM$Tj@&4AOno z^IV~CvO^~djKOJ_)9@n$yBPS$SJLd^$*NI+*0k-AuG9Nu$WlBgY!FBqM&EtQqjLq1 z2$3GgFiz`~Q@Cn{unJ9h!LCB7yts0xr&|9D{ozyR1|3!P!Ftg-aDUJH!)o8XK;E{x zPHk^QsZN~s^%}q{^08)E8Z9QR=b5kp9US~L!ccy2y_oFI0%3~o>FT7#cJw0uCnL}* zD9Up!MCM9FNStmk3=!uv-h?A>Sbmg?>z(E~;d>QX&`J%b7U%^Cu;38k*FH^#K7E7H zKYL_3XGv{^*9sH40%gRszE3K*5oJq?ffF2X;}@pIsds3HhnX95TEs?BxWAyC{4?k$ zswDoJ=%V&w+cf9&0_z{u;Rm+$mA%FZx*tgR#4&xcHR_B^@e5 zLJ!v*W5k=aLvCul^b$;x_swBZAnip+NUuW6&_+|m`Wg%EC2C#3QOyK14yl5P-OARf zn1 zfomq&lEt`&`C#I^w zS_FtiSKoAo+#}gqS;(0;yXBP`VFLv3=7FFC=yIq=T7ln}2riHun?$(27t|R9qRyOKucV7vUz4Y< zBs6in$u-Vs{!~0zh^dQ1KIRql3LRoULDunfQAeS2v(E`u6%`Vu7zA6z1ZyHSB+f@u zukv$KCj5#XV&Dta`X`Mtsy~+Cv5SYslbTf&GbW?M_0vX){-uk6h zSMBR^?LCxW0Uh&akiw6`RB5jt95wR*A=vIG&#}MX;ifQx3Be0r890Qq>DqqI{j>B~6*im5BwTwJywF(Twr%+`H;`8ik`jMB zKJsM4PT=)LWy^Azv2~~CjP@QQn8b98AHn*WuK4BOqIn?)I?EReT^FUD8Gdf(><~Xv zGK8X9oFS7k+}k%Ilp=pFM=SHgqbhu8ek~1oy8diJaHlCqRUcN=>83q%y55v&&(Na# z#BzCX$@!Zy^1+;ifnfl zTOM5KAcc&0_cqDXW$$rii%ERRG^=>`KKonq^{d>F6w4pU*XQM+v65=c=ourD7lOmW z-pb4y8T(PsZ{51^)+N9^`c<2wT&i%4#U1UY<@z7RL_fNX{_V|+mjV>bTqb|WDfP95 zwcW`Y-LuguHy$Bv<$Q6kO!}%w1_?89U}^5zjzz_XqR=W@KStKgMd#m7P>-G%-d|n$ z@D=9wOZS$x^B}VqUEG$n?yz3XJfq8-d$L3?c2U1q zH&pMUT4*Iy$j$Xnm;Q>@ZEy|JsWZ!|tW{Z?^zSe7$Y$bQ+Bs85 zmR>{MCqrJA ze2N!~Eg!8bgw2b?cEr;DROfH@4Smw`6 zPF4y3=lN3&>ct_qpX9nTZJeXP?I>qsjs4Zn?FNKK2&3ZJUThI2u4uOYqB=H4n^anW z+@SNx3Ehf(;0#y!HG#{IGd**2^BoQ%m_Dq0Dh>E$DThxP7GU~DU!g4gOHo)#%KVli z4JUpith}}H?T%STZ)x2mjThy z*z7&sF@Qg)pg)iVPTG*v3eFueI7VobW%YymR0) z{QKFjUup+>OrJ_Ew=&FTuXZc0huwIc!r+sbSuSa=4SA67cF~hzqhMXa+~w{Q@saz2 z{`4vv=1Xs-rj2Gpq(f-vx&}r!=dn#6-2zmEuzy}>e4>Gb2R(HwEmu_v6-kO6$Luy? z@hJf>LtQr!u@$*g!>m~hrjsL&D8Hxaszbf|rkw!bQP?o(R4E>%NJpT%A0IyP+01<- zGS@LmLt}~Y_gdn{p;5}l*Xq0~4z})gxXf4To_@;E=?7sI&4ri!#h#CMtUo4}KN-05 z`Nq!jkZq~8yJm=)f8zb@vI?Hx9 z{rR;Yn=3uq%S%(l%9DvIF5cV{3G0_lUqxOcLo>jEJe8d zsu?pT_p9b{cZy?Y?d|LzEXzKaYu9OcT8h(FXMUEfZCs8RVDjJ1obIIWRoU$K=!x#x z4U!eRqr~-eX zE-zXm_bl2wXg}BgRr5*Baq^$)CDhj_85pDlN_<p zyPr$aL_E6d=Hv1EZdI4*_KMpjk3re1t8s5koQ>53PnL3VlJ za=-PXm#|7)^1qFZ+PuB5MGZL=w>8LMLjAJ3gFAL!UAdAJK&2B{^Y(^%W9T-^7|S+$ zYWow_Nh`s-zO!e4CLiLvJe-&zmo>gsGwwXslVX?Cud6VX79HHr-RcEf&b2-NAagO* zf;aUgPEI*%uI+9i-OLkfLg_F0^PKYNoF@klavWrw-aPdx^|D=d$|bjN;w-Xgm(Df` zp*8^J#yXN#>ks6Xm!82kKIahTrLEnU4{x6Gsry(duZEPK(XR0Q-JP~RD_;g9EHK3L zG8hfEpE_1%lY4Y#4eF2W=d}AXwo!&X+lZOwYMr+%!!-7rZ{%tz?4T<(*6*$749<%> zqB$Cd&!}#Ciki^9my9sF{Psbm=hE1#O4@*gj`EIr@B_rCgSNv};j!DL%FN)azob=I z+(iY6^j~$Hvfm-v7kg^5`VW$E{`?>(&dQ48R8KiR052zS~1FvUWD3((Q0v6Jc zDsPksK4bzaAco2cqjB~QFD84qAKr<+sRs0!QPor*%&wHdiiZa`@+n`bg0ubr`d+ba zLz;mwlaIyDz)HLgcOE4ZVtu1nBc2_Jw?t_|%q1BXRY^Tdif?qQZ~P{1fUX!;VHA-5 zDSF|6AXQ%n_LJy=GaxztPH2X56gT4MRyI`tQxB&p&N4i$xm2V)r4N4p=PBx`0 z9(LuE`t?PXM0mjnIkGl(Eu>T918ysV83h%s6d2Q2<^C+dORL&MP)>es;0fXuKVOnp z)wD4|J@Pk4Dt{ghca(IEw$HJqbWaa%r?-(lT zIX%(q1EK?<>VtX7|6iFWoKP#&@o*<4J)oiLu?$>CJMm=!L-B*`PMj+}b4HvhWRvCF z7==F@_nZN3gB2|X3f5l>ISsXt43g=fR0kyk{UNqbQO4G!1AO*q$FFU8-lD5WN0XEx zA0vZI2l%_L3+Eg67S2Jhg!f{hPXwt$q=2}bxF`W@g|c$0Qhi`k|{rev%*O4!$K z-i7SohjI2VsV+GXU|IO+HAj6^x)=>Xi{GJKcZHJ<;$yfL2}J}r-=&#H!)P)~`xt>A z08AXdTvMFNpmn56-%1#VMTyrNQRJgx;KEZ$kO^pXRbZuD`A{6uXZ#JW{~&Ae1_wH| z=IGGoGPP%}NF%Ye(%LDS(nbMhK@S96=dE$}Ff9yYm!j}JYNg`F5fMI!E^k1+Jp~l0 z=(niOSU2#dmHL?PE1*!u&AVbVyQn$z6Wwh9_yPQTMl39F&LOGZ-Rz0_I$rH4$p$yW zU(^T4@HvU>*bMOkJ~N9m&PHFayqyvy8keN0+1Sa?u3Nl!c~lHFZ7W()q#2sSbLuyr zm{Fq~)2PV@PH{X>;D1csHvU*CE=7!?&1iWazlV2{(-%$OHXzMNsS9GVj|4c=luGc7 z^}a!M*1BZC^A?MgimRxIO~UlEx9Z+5)@IweD*q4C)-;@puBdBgPTb1rsaP17U9`fv zZ#n7Dq{fne&YwJf%!70{wP5oD*EkAsDGG>2-Y+Ae@lzjdskEkPrQ|}X>A#LUVd1ip z?MMbG2bWy5dExXX+a>sq=7y`jvig|?wI2{fF$pxA9?DL)&d>@=@DgNz`$2`yS3&G2 z_h_By-GO0CQv7Sm(G0|yt%PP&^iDQ}$Jc&Lp3#&kUmuwdzi6p7$?*XK9}yr}vgpvD z)dAj@*Y|1iIrIM#-N0nNxqr^8`ix7k|+d0~+D~ zYe!&98P_QM1q}SERA3j@2X4QCwU7Bip_~dm*r-J^kWb}x&J?7q?v_<|i;Ix>)6g?j zH1NKfxGl(zzM|VHe}DpC7ME1j8Cp@#wwTP11pzDrV+Zac(OgRKT?2xzh%hLUEK}7P z;lsG03X2kCSRI!G`_{yqTJ#%+p>!~r&q=^c=g1&gki^4j(QeU>@SF!`R9mXa_`fk| zw5AV!Z#wC63DUfL78!e09#V{MH~lZ+y$HdGJ0%y@$_>yPszOV9i`OJ#fpV0RDVYe` z!T=piOEj7_<5sU0>qh~HDYqYhy@igAVi5zu zyP@S^as(QKs60Rc+~V=fr;H^MCS6hmY-7Vh8>u~3}=hEfIldl_Hv4*69ac5W#^yUZB*ay0lxmZ9mqbB#P@!aZXh9mJnhE^v~$=n zmbra>EZAmeAfl=VpRtIzWCB3r1*;u@Q_qK5opgiCL2Z;|dT>3u;Z$+F7|tOu1?937 zi-P7{5dbtpYA4fNw3#eDPEMhH?%HDDHGE_}6VBA8OBfHw&w(jApX^qN2v`{z(a zz8XaIXu}KoBY1fM{O&*EdH~4H;aGT-z9k3%k;OP;;M!(35e`pqIYzh)F;x`I&fO}B zcR_|L!O>+zAY`Sqv~polVbR*D1>xgt*|0v@tP^WEVMA1F{FVUG*B zAD2B6-oInAI);4A%9B%!tfwj#u0%Q+ai>Nb5rLNsx{=>`T!Lhh;LPzUG+H!c&GOS4 z!_RM|_V%MAVVtypTYs(-Ny#Ux%lkGtEFFa2CvdUEJm@#j;Tu(*6Im(Lm#qiZFL&3&5O}{dvF*_19oUf%24pVW~ zbwWTBup?|!UUCK%ZW4@7mb4bY^ab3XH=poo!>~ld##NX+dRj2o%&WV#Mh>g#0f=WR ztN@?es|`O+L71_JT~(VlJFL(LI?aF+*Maprt9LaS=3f~7s^*(+$sABI?7lS&o$lO8 z6ZAtgl9_Rcuy&D27Qqw*-kETjjqfD9)QAh^6^%Vy3)f9_E#dq$oTr<%G~;h?#zHSp zdGXdxKhXOPryE93WGr%HByy5S^|mV9oC1xT65G&bt;8ynF0m6Vi4CYxa|%c1%^>cJ zq9=N%G(j&M#k*Hd^?N5J1I&c@cgsP|0XPU>gsEvWP0b>V1t$`A1POvupVrTQ>pZ7g z1iwwI#en5`i-K~MzS5W{VAWt288$ejW8z9>OEXu_F*0`RwpjjFw))0%BbRHxNtOMD zUC6{qlNi1FwVTwnQ0YcQ665whM|TF)$!XC~@_lbverFTywBl&_@ZkB0yDaT1&!DCq zL2~hk$$t>xfm4bTD^LpGTRye4vBqtCG)dgy|84?#z}~l;4kDVqA9IhbV^2kuD+eu% zdUsAWX)8}7uax#aNgMgGef<3}`Kbn-|@(hwK!KrB~$V?j5%T`QStlIi4<@ zm4y&mzsG+BH=S+x^h4|$Wm9JF8xp*BipJqQ`;>5yh-Liu715;`pn2v#g`g<+UZuLHLhMRfP_QOV_rtC zx({kcPbB?$+Is8Fm+92yvz3nz$*DEvKtU^Y`PY7q&z0znZ7p4^Wi#`lXP-*A2@OiG zDsIxHLto^%DQ{#t2!G) zTZ|Q3eREH}hD`C4see=D$8TGI;XJV200DPrCe7G5@K@tQ_xu(%TL3<#0UEyXou-#nqh;-#qZb zt$j)4QW23LULBnF9?2>!YbbYjN!^ zH^Xa0vn5uzOr9_cU^{U~m4#W51*4&ni3OZ+V@#MJBV=|BXRR zJY5W!D9)I=z7e-NErHNsmkoyK*12g#C z<)Fj+OR1hWy0^0yJ}x)^?A54kKQcdbY5!QEK=(_y`_&AH{w7U>`F$tPu4Mf92jTwE z8?^pJGXz{Yj{ZS~B|x!wwdCjhBg^g^swwYyheu6i{ZcFLoaj*m>puv6wTxL^w&aG% z=5u8d+v}_atoHUAUn8$seY>=HK&Z1f;XUB8Ej2zByAqwd_Iu#RbM}z5=E$Y`oItPB zTxju$%xK=iACux8m#J#jfRuv{a&NQCB+rgVge%xM zqM}OCNyf@kO;ocxGWvP99Y^FNVKK{9#K({R5-lz9p>?I&9@R39v=f6fXKA%P1mbV1 z0lS*Nk83pezSD$%XL+K4o9i9U-R|x026@BWqZhin6PE`IRfgsHmM1yQ9Jy}^ zZ{B(r5n>WuuFUW-TU|s3-la|Uc}w|m!OqeFTk`h$-m$0R6D8Z|BjUZqy%~u-jt^u{ zH4pVqrF+tc9gv8RL_^5{5*cAZ+pC&7B4B--IQeQ0b|M4_X2(bia%EMN_ye)JUJ$ zBuFK1wLh%AG0X#zj;OH=s*(QTSVUBpeyJm7`~9%e!hGR3&aS|#^l$l>Fxl<(Z7-h6 zwA_5H%2pgWA1lfeCZ0!;xvz|Kko~~zbICy?v-)>)wQVoI^BMFLb#}F&pTKzOojeX~ zh&0Cgy{2q;y1a#f!AABj0o`r!o|?ot@e=QM+RLY^p{HXFe_7xDed;w4{}|mmK_MnK z%X(7dKd5@mLS@3JQKW?P&arxGSYN+Idl%d6=TU>Ut?z@I{aHSuHWQNx+T=tQFZ2bC z=(iuvWNv*CFVd5t$zl}I^`_L15v{c=Axyi!{}v|dc^AnF6?M`zq$w{$uF-rU|Dcdftq^`0NfPZc zu*AP4+4dt2BkEkfo7$gq+x(gBq-*Owjp0Cn_TWf`rV$ex$!pd)?@XMk*S(@2X@(fR zs-rty)=8svrM8&u%fgW=6OI#|^&Eo_SiC%K`6#n{DjsMM-NR?DJC;wO1SwQGV6h`S zuU=-BMjn2pEm1soT~G|muVrhR@E>UxejKf!kz7PbexDxURrf&ey+3!^wh-pv=3t=~ zyk}decgCXeAY?J#iTrO(1xSm?M zbtC0I5j^MCoqw@brt`$Tolbtqckh8g8gm@c?ZTJ+Uy##7B8%~3vEpxjP-boihUD!D$0usvOTmd)Nh%5 zCNuTTK9TFZxDJ}&ZUi5c{%x#a>tjYB;Mke{wiXp4{>gauckrB*oYM8{DqIePYL~EP zW&aMk-6l7Mj1rPf_Uuvq=G}=b)yFG0gYm^HA6|3|cFq_7oXj{dtFCzgbFyyR9N#@7 zRwdg})S499{ML9g1e!5s(7}DL+iz7av^)Jf{CW^Bm_2sEcIL)YmfAv0g4tS2BX0Dn zG}le-K6hzEl=<`;|L+y>Q&^az{Ju6j)@u@(+@Do{V|E8^6W$4{}eB;#Vpz zEm9dqFzh@<`ivDvoxV&1h6Z)HekgYfaM{+E6<5xMa`uR@O^;q(@e~RVf>T$p1}|e4Mx|zOo9I=8@R&cPE(KQx6rr2aBv=nvJ@S?Fjr@J|Esj$x z!dQJr5Q2( zsv>b5hl4vi<;|zbB|#O7b$7YTQHPE^SUBB&pJ!Gp?*JF~ZP!Ry37=dPCn-`>c4iVKHrc@+mn6r9- zlV%~PgtNXdvW=~ep~a*n$ar1+_$mS?Zs=MJBOmagw{BF-=+)BxPY0v_>BBYuZK}1# zoBBI~)$zg%V;q#X1{lc9%owIbvNhY9Iul7UVby~68omRJVML%d8O?&Fl&X5QpS%%N z@uiEVO>^;{$(q-nF}^0tMam))grG`x7$Un>TfdaXFCloKxq#RzfMX-I@RI&l{~-Ep z%oHf7da^4oA0nbWza!^o&p0O2$@REr7#V=)f|)oSG^79B>j|kQ5o^vU<^tOw0z-auj}ZRFN{WI^lFF zWf#~*xE-aA3Yt^RGM%TU9Gv2@wX=L+oB%Rq6;F%+a18;J$t_uGK2oldJCFrK)>GCQ;W|CD$SAZto1zbG(EvXk_ zLND1T@}i-CN#m9-9_s+Iz|JWt#b>+Wzxr3=&~Yh}#uA*)ahpu68CZW57Hu+Q_ovanl>&8TyNiV{rh7Y1Usb>=2BXm(?cmQ&JXX#;jmpZbfc#0=b(4K#gDa zw2Ys!_~=Gq-*1jef6Q(3{MV9?z+<4%nc_-=3YzsVfD=86MLl^+W#PE`az0B^Y7=ah zmsvGVa5NXblLjQHRZK|{d!!XRSC?8cGPDRm)PY=CN5d2s@PGbWk>)ZWs5g_Et-LC&p;72)=Dy{U5iT#FtF`K^_ezNA zmMV{Ds3aw#Z^*%wo(NbkKb|pHD$#w$7?lQBA}eZpMgzjJPtX)=tm-A`NjY=DRa1P9 z+H1i)o}76h)TyQubi=4gPRMIO`JJnQGJ5}SS@m9Fu%FqlCJ}n4+X%vGH6}GY%}xh~ z{n-h;9*h8T$;&OCSSA1(eju@h3n>O&BwS#c5LbN1Yp_f{czk=zPgV(f%)}N@z-rvvXn*CkhWmsu==1xLy?$h^|zf z0Uwt%-kq8upF3u(4s|a@3r`vQ7fb+nbPUHiBny}Xq1l0Dpk6+%(Puo0WlkV3i{&Ll z(smEnQs%$ap%XXh-YF8JK0v|UvD>o+6e^*h-GX^QtNLpxhN; zSHPW_ewA*h1ZmT1tIE!M>*=J*kJ56((1&IQ_1_FXUpFWUg^E<54!zAxq3U}VYM1$`4jWY)8#p|01`NK3Yqb->f zfw=cNZ*#gpg809+e}0I+0AqJ1ccve_QB#HrzK|XzZyMXih94m5kUn1()nveJ(L+(4lzj%2zzd$e-NlXeg*NI zO+lxLQm9g%aYgWs#A27TU>5EkAW-Tj6*(bC%cc4jz%4q=1ihoX4y7l5bt^kmr%^Cx zs7@m!bkue5*&a@UE4R_i0PRh@68%tLV^_wRChzl5XSB005T`IH3k zE(izDX*&i)q+RSp3IX(E8EqvhFj%4~(|tKU02{nihD@+2kG>Dm%oVs`7*hk|CBt8?s`ri;G?vJLRD_42Ou*>7>1EdMDm~dU@t}OcksedU_Bq$ zM+6PAp_oq%M(7nhjB{u+U(Fn^d#;XX-T>uY$VDKmU#S8G>-;LyU9i+r9`;N@80hxj zOEioPzi53@QrIQR{Y?Ve?OCuC!O4Rq63_z0>tg*orO|V0*-A06(uZciTtZI-enwn8 zP_XarKuG}7GW9ax+u^!PWlGwMq5Q&QpdM3D+KGf^U_lD}-@VZkGKffsfG(8v$PT!MxI3g2{Q-80SI^-zgNaba2^M`G3W|(p`qCLeU=X%#_+iy>_B+ zO$*=ib+Y%?l2F3pkkbxB9Gv)aN!TgEIzb&#ey(Mhz>RgALOux_%IRkU(Lc5mrQy-1 zW}bn}%_Pa-LhZ(T`TdPEUCC#j4ah@HpkPFvrCJ80v4*UytCU`!`pS^*g%v6lfLp91 z(flWP1In*8fsR5#3@S%d==mu`A{~f#M^I^il2DCgn##U8{S*z_1rr8sPIWz-2y{aD zj{R+nz9ptpMb}V;zraHr#SW>YZ%drG#V(@{b z>?^)6gYH(6!w`J)44sztlLbEEndzEi($!eqsg9#iJ1<{Qg-H={+Gcm5YV5Fa&aS={ zk?v^oTAU!4ouAHO_;MDMzb)c-X$Li*k_?(t;O`gQ=R(1$=kk|$qq*x&3UA2k|AX|) zw=)z!-p^f2HeuYYKaBoi?Ag!{1d?A;Ug z6G7W4kIJd5BhePK#kkM6?%Q&yR{R`YY|l{*4moS-APgE%%6?%!m8cq+`sgZqbK_cu zK_VlCQV89|9r^fm>zG?650|r$Zx>e=%|CyR!5s*h1U}Wl5_F>{@y8TPA;q3PzCj}l zKRDXYL#&VA+3#6rr+@CZPt_vlkY`lv4E&9moLs``J zzQuX_-qC|kZ-UK(I6nCJSnfTF$3K!ibhsjI{dAdXA?TCbo)J&z!+3*+V-ebK?i}4x z^PhEvf(#tGU+P`AG|5}iN_94qNFF>l*6od-Mh9g64j9u#=|J z^X-s^kx&iF@P(tCwZ!jVBE0OC^CL9de@yx91;snXt*v%PeEDSa=PE_mZY}XQ<42yX zZu;4;ISjD9(hU|NcaQNm)7ftItn%B?g!-HBEU^4ZU{Q;-1i7t`Xk}wqWdRq}-#4!Y zZ?!uH9Lx2_UuS=i>GR8V$M3a`tflP36H&>yNw=eLi%Zf80sNTR4_`TZvbBW4xF$$c z^ac7xncVf>2bW$w3w*FQL(A0KcL}f?r)edp0#A)g4B1Ax{Jgl&2Wz9y6G$_?PjAvF zm_=$dit8u5-zp)N*7j!j86K5v%{PnlX-a>1NA^|5IAV0Ct@&VB+uLQpZ$oop^N)qw zpEWM6;l8f@n>iu8zFsbC1xwUBtiwK{Yg+uManhd!Kc-0|nY$qj1>e86@%ALi99X{b zR5JKX;+`9AWo|w}^s}XG{tnzzJD$*SAKm?O=~RfeyZezx_jdUxx2zcH+00t*+>h?q zUst|sP-qm(WJxAY)eHl-p)bciZoOW1{U}WF{aipj+nklk5IcLrKghtUl^HWM?Hb|Dju7|w ziucd22`%@BcCdutO5EcVnIg|^e-@5?tGL7G_eA`D7WuL(4MqlCwM-8q8z-99eJy1GQ5yiz02H74PKh}_P%fb1KA~kK7aq^tJAQ9;w5wB#mJ&)B7gZyw#cqWLAueU3h9v!C;aC449==QG8z(2) zjI%@!Qa?GbBqcYfij3+fN;F~`eYfUSA9&l4_CPl|Zs!m}?U#8JmRL3vYExc&zH8p> zZ!gF1gj=xKKx8cj+u~_xyjfzkqAg#>AfMmYBaw@=#`Lv5cxn*+D*d{e!OvrnIQca| zs2d$!hv~V96ZzC%k~m~*zpnmstNn_Xuw3+N-lfDRf0z?XY-FQ|0&Fdw)Cg~v`#x{z zaUqy6z+O{77(EU0Kd#vh`owho=OT>q$Hdr!+HWlcQc7-T%TvtzK{mI{dlfMCn~$&m z5Wjyn#q%NLz4GmvgWb_}8I3NfF~^5phmjCAy=?iKEw4x#BQ5VJiJAMK8`z*_cAO=A z{`y^P8zfl=$GjY{2-0Mdx_wN8Yu@e0#N#|;0k(X8_tME^ll-|$>T2H;q^wdE^CDlo zRl#d$qN;Y)As`=3o)6yNdBn=#U&Ax+Io1?>^}KS%YLuyyPydx<-lg@_;z?KWA+e<) zvV9@l)a9E`<+tH!V#JX3p`coYN!zNDyI(h7eNl8veCVm#UpC~_uxkBzvcw?*oMMA6 zeSD^(aE*uV(4w-B`cbSMyzugyTt4yjpBv$90g`;o5;Iiy%}ei1ir`Ot#XnIW#q9-H zG`GW}!~uce;jh)D^*uW$8b*0(78vRkLYy?Q*4 zLde9U2J*IM*v)U@J;NpY13b0*Pbs$T z&R>Iw`LpYIYd;XLS<@iAHS-VE&x|#?ADQ6re)Pf#gc_gs*DBNga-Y{~J`o1EyM+vBNwWFD_ZWL9qQuH#Zk4J@Ni!PvoN2o@wF(~oMcuu|{@ahfPRZXwS!3WY zoo9Sg2o4Q(6D@LKFn+aL_@Z$5kk=Fj%^Fl(DyHhSEcVyW+&n8Mse*F3&_S*E8Y$Pc=|6RiCd5cEoLGw2r zZM{?W?+K4;DayKE%M$)Uet$SO3kue^x?CzsW9bvWfA>iDsC(&aF9+HD_wy?~+rRW= zHrtdkj>_9#USFJF8m-kiT)T86c_I`%rzCoYe}Y=j>~8+FH>G=f7>Ba-@EPkL+U|?u zuBkj8K4A};GF^ua21KFPzvLxeHET{^I5tn?Fa2T~ zG98k8(xH0lbU?0DpcmK_XT9I?{d{DULv1HM{|~B^)0#c?n*H9fTuKMoKgguOKoDu) zJ&vT+tqVPN2BjGsDJwwPeNp_wJRx;}_A%yZj_G&)Zzmn#!+e4ek^WR#KzRK+;bLji zaE)Y+s|X2;xeXl1c+)iaBmrMqP&T+wj=V9qXHAv!etadzU@g z```<)1e4m(jR1fXMKS;nJ@OJby9tOGpzA_fjX9m_wAjseKqKjdOtdsp4vFNtZ+laG zfe}4>#$ALu?yGglMq+!?9| zSalK#CxTXUf|ncrsKy2{me3?pt-uBPSv>ajQ>{k@zECVe@^Li_Wxi(H`zAd85@5C% zVQk70a8jzXmK0Pz5UxYtTFpf{F(nE;ILX_uH!ekNy(n!kRKc2&hHVq(}-6T-nu7D1|`7urvs4HaVAH9sjmInG1%E&7w0MrJIMm>EBdiqe~o z^w-0eRGW0OX-zZDk$UD253&puN1I}K%la9>5DG1%CI56{Wgor!qQ`B_StrFfsnGG; zp-KJ?{Yt};6mB4$);GsTV6+p;UELLp1VRQ3A1)c?;(Jp#{C%pomanm3#j_;&Rl-w> zd}yOrsjP;+7a=@u?9hBZ&ZoFWc%n9CT6OQs(0SRNOvW!R+5ULD8s4!n1wf&~rO^IS z9RMXeL(BsT4I#tuik65%dUAi9{nxCpGsEY8nZ?86Mddk5rfZR2{hBmf^r`f9qu*@s zw51CCOB(A0aL9aa(3MpjX}tpc(p4Y|20Kn5bKFP^m(TU{FfT*0Ot1_c!=rQ^=g11j z5Vn+~(S>QQ%b=#($Nzv*7pjw0u`pD4M}+{uoxps3SWT0ZF*M{T^fHy(5F|oGG@fTD zAx2nG#Vi+7l%7`gg}}?09!S8z7{;&&gc+pF;V%mFQCLz3_Hj?YNg)`X8Fu+|mjvSm zaMML0>jgYL^gxZXs1B>T0orby5O7om99^&t4dN;X#bizhk8o%1%Njs`D5f-(L!7>B&8|6pDLshhVwVh zlOi1fwK3+MQyh(ZInvCGZH^KsUV|FLuk341^dWKn8f$d)<#%eheW^Z1!%1W5F+-kr33!P~F%o2|n3(n=QEPU36zcb2 z#Y>E`x^W~+IAl?Xg_M0_l}CS%msfYy{3VIHn5&c5T2{D)rZn|6O)Kr1JD8Zv|J9UD z1S{(pl+`m6!8t;5k<#@va-;UrIxvC(3!P2|`1C6a=pK{oUHb2`;-4YA7{M#XK7wvm z>S~siKylvEh=Gz`-+V&M_Y)$()ieG90ipM4j@WDIQs_1=cCp-@lY)! z6i@0%FH5NdnrfV4Rg?l;Frd0)m2*Muo|O9f919@(uIjMO>SNz*0h)rWAix{I3OX-< zGjLS5yer-mXJz0zS`{|Rdt)OvdAE8fyHO9zXA5P)mSlPSQOy9hIteB)8w8D5#2E*g zU+Y3!qYA6Tks|9UFDm^4x~TzEdKHZs-@O3}8KDMN8VW^yst!{)g_WEo1xHz{`1@e! zC{V}`?Vo;#^h5IvQj{4b@Onl?8Kn3jw6LC}ochR8&aHSzkq+47D32H|w8>H;a4LPy z7Y=7m$TtN=>z8WXNtG*GirX-8 z4CHwz2%RSF8#8mc8g1y(2hoU9%r~wQ9u%W*eai!Xr&H9+4HYI1B$K0cV3GJkCGimp z;E}Q6-R*opwsOMU1p|)1T-(NcDB2ckIKfFI@E?Q+M9l_<)%(v%w+fP-GMlKLt8>X= z^INrJZOyQajK384?pnA9m5JZ!R^3S*>O<1aDTdRLqI&7(`Sww?9I?&3~f7;e>kA)b`Q5k^l8cE_ejSby(h|W|2P9 z%DpD8pbjAv;!A;OAGm#AgRFRU4BWHfyh52QJT6dlF~|uK#RANnR9ZObolGbarV4tc zYzzIm1{EB?87W|)5}g@_{}sfs))$^|VHh$Au7h1gC&=1>nO2H>XCcJw$B zV?wbYNF3vy0QR~2PS#6IM^Qdhe-d;fRn2xP%+Cn<9l*VCWJ`4B|2MoUgQ`dLzU3`S zAXf&;vrNz@_l%u%nbUzK7!$muQiPZuq~K8%hFH$K*qVisi;qNpEMuO-h_L@jxr{ef=BztL%PNZ)M`nX?h=9rqn#?9< z_Bm)FSKf75W|*4gLE_17{0+b8M_+sv>kEO;WV3J>E>nC?9)mCJ8uj6$l4{$?u=EVm^&db*b zSFP-u#x(F@b#qG=l31g$T)87qwflm`>iJk>ipfl~A1oNmop)6Xu%3 zTLE8fMJeMlF6d6AJR@6-jlZE@il^dTSnAKY!My1`=ztk)S{sYlKDOA?bbg8gU#GpN z#oVtEB6k>)jDC|L*vOaA6}jN%D>vS_@dF9WPKNi~i`3pyrO35%-%Dw=o$plOk3CjD zW1{&wXIfD%_m*y=zZmq^1If_m-c`<{Sm`=O*R|ubX}{(QG|(uC-N#;!Do!eCmcDJz zVzx72H54~)`^5J!`>fWxqtl$<_UI||_Z-2RQD@t&a(ts|dilK*@iu2!rImmnFYW%3 ztnN5ZaEw`vl$E)uKWEZ-djHgYcjlXD#1H!%{+=GhjU?(-t90yQ?_bf?_3h@1 zT}oK+xWAjtkx-2{EwnMgWAmMm6~T6jO)dmF>YF{48*6Ityu%ql<1ine*vF%5El#DX zH=+5iUl;6UNd6vJvHUqi7y8~gRX7d}Yw?;3#vOU7ZoIwTD(3~Zv^SM|&%R3k_^aqt zmVI*#EIn5LgNS0kE-H>sC#V%#4ct;*YX5p=d2&mPaKHM)dx#q(C`Xs@Xl5%m#>oCn z^%P6qkCb%fy?50|97p_KNA?k|J09}0_)hXBlr%}+#=Gaadv9+3I_%nclWTBP$)s55Z)+@9F({O3awfmCKzDDIl zByAYy<72tGt;pYHr?QUDNVS}nF3qS3#VyV_cI#ud-@8j^s6%tVV85{LF8z|>`)>L+ z)p$j|{g9e<^|-v))`Y32+}x1OyrQ;`MLOsF`SgORWcT5nZefCWS4QSY?r-Z6tItAd zS}of-=Vd)YlH6npu4=;acmA5nxhx8GmZ+v_ABD20p08T#Wcb=^P5!8e7jYHicrLy| z{#+q<%1zv{n!4n2f)lFsDz5w0y7y&g9+@k4+qDxaW<=zEL=PUw)7ty$nvqAIti4du z6{X=5f2797MM=yq&#>{PMAScDLL(PCD9QF19VMmR<*?FZ4^k=zJsJ3+#4ZBCU?cveWN)lmrm)DCCqv|L9)`Dj# zPp-NsF#Zw_vfV1Uh0owNy8Bf!GH-(Lt{#=>a+KW~javo6&LeB5C$HIgD{|wy zm$Xe!4Wc#fnp#wLT29AXdqgUgjbbN<0cPxjVA4=nGHGWz|Brs}TGv(k#?;2kT_Nw> z#+N^=?U^Xkx7dd<{Gu&+p7><<+fs_wv<7xy(RcS|V{UrZM8A*c?{HGKnn_J~d&~Fd zNd$2#xf;)mj(m&uue&SJ5~KFD$0E2j!-WQIm*F3Z$7DmGYYBuh&wiahucf#iLR)kG zu|=}-sFdx4n)>Wq%pHZ$Kj{+%CuCF4U38;}R)#pDNY3`GL=SIwkzYG9kFnz+&(hyD zV$tk+-=d7!7N;uS@%vP$LbHBm@+nv|`N82f9@nBfVN9!?n~U>^!78n%pd4al=ID zx|xI2j{V(|&YH#VX3M$}s?HOZ?IO|#FoFXmu?5WzOmlr71HVafDRJ%h12(!j$hf-Gr3QX zOM}fs;_)J{OSGwv%peST2m1g~Dv1%HkaTjHdlGr>H0yR^k9&IK+2wh+Qn8jlHdhkV z_h!m>+Gk^1ORLn1)IpMaMY?V6hC=$PP;E@hUpDi32Q8u@R>~xuHEVix?KF1wp^&!i z#ikl(mJA8X@hhTq_S(}nt~T4Z)`35(l13KnZ(>Rb>KqxgNoc#`r{-j6<0^;4hO>(* zVySh0_Ad3Nz#qWK8}#$a(*wzA_4|^#E+=g&_y|f~Nm8@z?Df~1Hhf6)?W(v0uUn6K zQr+Vyu1W`$FUI$*?f6+MR2?I)rMK1OaFskGhRF=4{9<}+AjZ|Nw9EBO)&WX(=Mm@e+-)!1=_9+dH;^m^lhA(@rTYl46 z)yvyofWkrWJhYYF!LUZ!vrm<TH{zASMcK6{vqn@e9 zp=G1rAhB%ZiHlbTyq?`}X?d2QogOx9HWTs;8V;GMy0Je`@*W~Z-4rcIu$PvA_Af9t z*I$_k4(o&%7}geByoP4`Cj?gI|1z>6V(~pNF(NgJ7H`=qJ9s^i^5%e_fphz>r4X~4 zPU%Pc7BgqGuLX_G|Iu`oaZQH(+aJA=V}z1!bV!$g)aZ~Hog$%>C@n}cN(HG&2*{A` zP8FoPQ4vr;xh){P@CoU0k{I_#MahV3DYna(1KofJfo0na92xsNd!P zYx>A0VuD~i>*o`n-t^oXJ)5?3Hm1$3dA~3?H~pJF6n@0)M)`+T+*LxsO>*0?)ds82 zk53!Ks>N}syK5Ipr8jB}E^J*L*>$_#JY(pU8ynUcXXPMjCH>46_97&xdQ+-!mKFUe zCy0Un6W%i7XxkVy`cx}Pg(dRZXh|O-MX-QG-tU#-qg=Ny-CqSQt5J@=SI4Zh5zkcLn88TjesbqfnGXMO+#^I0p=QFnB-*?VC zsva?!2rDh0tng6$EnjBQ^MUjT{kkoF8gW!^i}_IIe)7U2rutG!je8b|4oR1e}-x;?(gLty);r zOO`M|C7Lka@FLdP zu}|ZVmK2>liU(b}!8c!5OJL+_DIYbdQ)`;WV2n)TI}MTLH@Pa(LQDXMPsZigA{Ip+ zPkbMNSQ~oq1OE7@O_hbjs5g5+idT7fP$nskp+xdfjzj0Z~(_y&lNN)#8x} z%QnN!MELG)Rskhv`9z}+$H@G^QTSi6yE2?^O{`;%gIpOu&3s+JFyHn%n!0^E+H4b9 z|2@kBSg>XD;`q||OZui4>x>0~zJl0Q*IAFCtH$H%kiDdyWS?i2Tfr5C;$OrQZ_KnHadvM#$-O=Vkibx z6N4P^VzUC268!j5r>W(ZmQH6H@A4bq>O(+u5Y&{%;QWWpQ*w>GgrN6IqXyP*zn$a#OzT>hrz z(8w1BR8r=IEo_7gz(6=sKs#oFr-mn`2~4jY{Q-wx(4ZFn1~_luK4?+nxk*>Fr4^a* zDw1AmE;4PX6G%(g(yJSUzkwK~pZV<@*|H4#@kw_lp2lCWpVw1ZHO6;S{RrLJyMJhR#$Dt5T@!w z<)bBg_{xn%x{#%xqlcoo*SdIBhV!vpg=u{b+Oyh-mGXz?lHLMGd!~cBTyX?~oll~+ z3s+b}3{~9o#^n1e^6l$kZQJw(^nwbU3K%qd582+IZ{E9Cfmd^nfj@#J;Lu9`%3)z^w; zAO2()&jG;*XK;gD9nXnnkXVyADkaxH<1@(v510-C8v;3x7?%}>3eV!UTMoW3SIIa% z%Si!v?8k|M<@nJWfObSaP=R<$lV5 z^aPgz{sD1_x5PxYx6ibZe`6P2NMaAkiKGLkU6iNXAVX!?w8ZDZthDOHKR%T&m9T|5 ztrQRbdt_<@XlXk*F@J*ZEL3kz1wrFm0KX>(4m=q@{59W5LHK@9VI!?z=A;-L+XWz@ zKAgz?a5WylVIATF5N;RNWqx>e9tvtgzE0G%m4p?n(Ng30Qw*L)-4z%B!;(9{4#2Rh zxuMws%Ke279$EAO-I*CO5pP*_{8Ufl=bu`*d0lm!-DYr{uK8vhrB zRruHqoxDMe>&RNcn1S9li)8ua*@yackT$RkWz!^YlLop&yukLq{kxOMzYc3>1}EONDO@|_ucs9ZR6D94f~ zAkH*NRv=qgL>?_mj%6$Xiv8jY%7u^=>~JK&A~Y$MzFnClzH!%t2@pK#Wbyf+s~tAg zz(1rshbFtSsnX+Npqe|`0^phafj9g`(UZTvtNAQ5#SCIpe`DGXRUW7#Rnci523l#H z%6d3!EgM~cs$PuLbjV0Q3NaBx0L7nwF#oD&{YA8ReLxq$APwESYBb~LphT`tfp<73 zc;ppAg_McGpo;O$XSG(7+o>!_LZbYh%ER=%EU!EZ*!HA;YsqNz@qXZ5`{=cnns+;l;8J zJStVitU_yV!V+9lW?SG7d+t(v+7M8sEtkO43;5oNU>4q+jY$B8 z7s43Y1z(SIuf>r+ zBF>5gY^v}AnLB=ybPFZQy00@Hi49V_ev{nA%ZyK;39Jv|)^lEr6yAVxS)K0UF=*smA`_y`A|O+{?7}*KCTfoGZsRb<4ixq zKXRT6d2KT{YmDhqUaxP9@*0%96!~eAc+Xbg)noEeOpN6uvq^<>{T$~v35NW7dwBB5 z=Mrt5)}X@DLHW2(DAm^kMGS>cVRF2ZQT~QeUmFB(1*>wUN#`0N$RGcs0|X8`dqHsq zXxrH}?x%{f{L6`W>V*=mBO+CQoDk&qKR!&~`bIu^_dYyIPju4=*a$#1lU8iU!G{21S8o{X6w(jed;op(I$oA38~`gynPkgqb%AAz)n_K^@LxqfVTp6h$A@kv<9-SC*1@I^r zazfIQ5cie!R6S^WZYnlQS(E#6xpt2 z!Gf=U`b*@I19NuE=wvW%DBvArNgMR13v-**XVR%1C4|!@bQ=7?myg+F% z6$yMFuY+g^ho{){>V2%vx0=H|KHkWGWenM>`D6_LD!H0LHItfm_Zg5IzR%0B{E|lb zEIooK{Am)-x>a;*nxu1c+ZQ^YA@XPYJx%|mQtHgc^bNZG3r!KFlK$sx-~SrSe+ixK zXx4p9sqy3EB|){uZ#GxS>R)CNnD6APs`}$)avszd*VY`|G1X?5iHLN!nKj_rkfg?Q{jJxgZCJrPt z5~9-|epbr~W!f|xq!wqHc4hmF{Q8&uZ4o;&&<@$~|PJ=GrNJsct&^ zu?XfX88z-Kmib+{Sd~!mxzJ8Wc#gkiNJB2`xz3X0JI#LP2DZrG7P#NfS=nwz5I-X8 zaQ@P(O+_v4pw<^v_xnj674_c**u1`O`O6!^p6;QJ(a*lEQ~P7s7s;g7Yu%ewf3F9U z`Y8$QIxOX=7O;8mjeDEF?pd&7RY4leR2w|IeQC93_ss;dHbT*pD#m$n?WSDiY_EVG z)Ap>thO|^553}5F>soSU*`+};l?%VM!JzTE*B>i?8LU(`y3KrS_{jW7&=t8RI(IDE zE^JIGe7BgbZ!O*O&%gfIcVY$y|ABmbav!FD#P~ zjFeyt!fs_{D)7yEt*x>>Ddo=@k<4-7IsfW{epn*i_4V)Xk`7@==;t@ioqhI9W4=j0 zM*9C;dkTN-6E_oqkOOY#oB3AjqA@9eJJhoA$_BR~*1TodARkf~Xk+|(UWpcrh`Nq4 z>TOe)@2fl}OaJHj?i0suUS~iL2buo!>E&t}Tu+a$uvi`~r}5VJi*!0TYLAe+pxf`u zk?n|amxm7bLq6M(9g1`6KW=QT<2#?S@DdQ75hGlr@`7#B%KdsGq@X zW=^p75o{~X`gr!)%w@^M1_>{)TJ{U?ecc!mf0M3-8?9Pa$*Ymt$XwfRyC!MzM>U*_ z$z@&sCWA{>qc~y%qUKF}NZ{wNI^KQ!Xz9;&(ech|>PaD{^2X!E3T@$qW6`D+x{toM zBBeKqxu=@y?_XOEW*&{a!>X8sJPtQlsIo&MXUOi@hx?w~PyiY)G4u6z#^9!-QVV(sTZR+uBBMl{$%HQ>RNAGnN}1v zav&L@U@p9EwZi_HmQ+9cOnCI*W*LMk=43+Hw6{@*d$NQlAkOxkU+>`IkGt*XXe$C@ zVbg<=!zFz?;}hHRdB;2|uAYyx-olo+Rr!@2IdIfP(iuG!dI^6Zccrb~ajo3ewBHCu znt6J@F5B15K51X}TC0kXiRp3l&m-ihXZ8Jgo({~y4}HSc=Z}3{%={R$YbZ1oj!ew! zDLuU@7JgJ80#%;F+Nt{nyhu_`CA`LFhU?aK?tT?wGXJ}5xXbOc)5|X_-{u+HZt$i> z5xl>~c$q1C-x4AF=BM+*yN5be!xgmK@@_4&m3CH37sTu0<_7Ew3yBKHu^)5Uh;~~I z+@ILDP!;%c`~Tc}ys`4vz^K}xWp;DgiGX`-x^3@c@4)ZB&&3t`1#QU0rkhU&y&i34 zh>h7B&;DV%7wQ6Epf7y{;<$nxSJy}i1*O#RJ_WZv54@v^p+?Acf08ejE9lx)3gw{+*3920{3 z5rM}MisdikF!Y5}(`*LZn~z+&wQq?1Z3brN%9zTS%xzzV^t+7KUcVhybL>YNAPxaK z%Y?f6p2}MS+i6kG`LJ&Ub2pty)pkm3jfU^zn)zKsgcS_bMnPau=16kWF=LHCU$-vm zAfa!WehxQbW6P_$nK|%y*=U9N-dp9sqGChwb~_?9f@9N6DVR7#0jIF?#H11pM|PVa zDW|SbpEpv;h=oMgilPBIwlMVBf}&g`?%bqjQ|jfZMW*2hWnp`c^jTSB?z_z%*~u!S zmc-K1?rdn%GO|mr=r=$LS*1dMUkVM(>B%c;yCNVn&00CIJKP1$7}EAIsk>cM z2E*0A%_LR*#44y{1#~pBAOyVkhTEFrebkbs2aWXzHM_W=0)5%tdSeMHbK=Q`*w!dR z-aEc#VjstmG?5OnCzgHoYFo@XrY|1HiyQnlr{HgLZ&NfYrOIXbGo2Dc$S>9HAW7j~ z`L366R5c>`cDj6gm)EG+P@uoYhv8*+Tdo#5&cNGOZ+x99OaO6TlwqkWk^s+ZVJQzTpnhxTi_AE( zDU*-qA^ljc&Rl$pc#Ug^(`$f}?fLVglU>z+0Z*d-=>B?s_s+4`4NAM)q4#3m{|5r2 zW19O{P4q_L<)hteOC3MVW5aH|BXeC5q5N+Ap{C6<&lMAOTDx~4%y#YcpuR)$8v*2a z?>`WVpGvjOdv8{5%!&LWe1(ctEc`^}Z8f4w)-R!kZWexjSU#Q1}wO1s$99a_4n;c;nf*%0QJ2SUGjzB zH1;7zHo5M#B2EBEy>+>faBQjr@|K^*<3e)(AZX$mRA=%NJ%;W>sTR%wgM{e8!!Zzq z3_9g|WT1~BPEvkVzy$mls~f82$XsgAKFcFA@I_z_`VHEgP`2ob#H@07LSk8`DE8+Z zM^!%;sF*2aVU7@?sSg3<;(iMtz|;a|hb;!rCRR1X5XWKMF#Eq1uNE4PwSZqiI-elr zl>Zg8p!Cn{)BTvpeDiZ{$$slc>uhVB>+jNQBvlwLXF!b~CFcWzW=D!MNo(qYJO!wy z*T+Jjscp_PnFdaqpX(4`w&CT=>_bmNlIv#WN~=a*$Ih`T4z#`1QbrWiG-ntVjUrgd zF`ucP`Eu5neN}sSg88JiC`bJ+@@d++pb8>$bfFNV9JPr>k%{9~JRRH8P?+850zNYo zY2{Uw3ud8$HWFL+BASJK=}3S9i-x9o zlDHTo1sJ9IkvEbKY$Z@K28^pA(YTWMMI(vL!6c%+VgrMkSw%V_&yk@fGE5P_u$2l6Q={_Y7NFA z38<;6U8O39dAIcVb-F?1nkxzG8EqC0sJK8+EY;;S+0>s-*O`b!!EOS*K>YT);xk%g z3TTw$(Q)`Yon;r~Q3hluId2^*tdW{AT9de^gsH6WC~8+oZk-hA>K5e z!f7+@E zdz-UNBlx3~_OcJLB&yqIjK0|(Tiusd_X_`EyX?)z4U>=klHP_Ib-1$BJ*&n@JH+7D ziGh}G|3f4C#8QlvU2x*#oA6Eg@4g#TCc;woEpQL$9(sK>+Jj2qyV}dLW<8 z@XzB5hP)Afy?EcrY~YdJ*{<}_MIQ2-MynBm8nh|#G`Z(-b0i&#rYPMkEBpPtc;kEc zk(6>doEz}emb_smezFc|!5rkgeG%-)vx4Olvt&FQhL^k(w>RMrE_A26^EYvY%YAFK zB=1vs+y=0`0U{=N{8C;SoEW+@OPI|jjYh!L@X-61QAu6g_x2Mr?x*)PutD4hUdERW zg_FR(KI4%&$;If#gTP(uJ$SW=(yvwp~7~-hy{9Yf&<+24Qlr-%Irg?J>95)8QzK^ z-sW2bf06(MJ4fRTW;}n0*`ooML$Bi=pjPw+qUq21tv~@-UabiUI^|1ZA^IjrUf{_k zfhG@ISQvyxR)K4Y+XY1M3EMK{l?7NAKEzMpiW>pzfoMR-j%ge8bD^MUycd{z72<&! z0?+h7L3JW;sTfuyU=%v8m0`-)V0XmiTry!_xyoi@1`LSuR1k<=Q!6O;faifaUn`=4 zcR;>?gFHWiq=pb))a!yG*VUC`?y@=vF~pt{CNgUa(1DV1vizrcd|=S`9(i4-q3TwjO9hdH4sSf}xmQ05C_e)m9NNKNsG zY9oD~RJ!ago(a9N1W-V-3dSf>^b~otgL#dlkIEee@*d<_Ie5NL;K#5dr;*`K9A)Ts zK`etT+5SZuUWCW)#xMCr5u%Pc3+%^R1O`;^$=~FZ@K7ST&2blm51J)+>TW$GDxQT5 zy;!rulKQs`+*gt*3o2sb^v)r1Xrytk*J37a9ePi~k%-!)uRVQ_!IKrt%xtE`13o=v z715++*CTaGgfU*ayi_kHh5G$Oh3QPbeh)l?AG&c74eZhM@ZyWmGB^Ravz1j}1K0uM zEM6j0-X$$VY?LJUoET-1M#ta=P09gmcbkGk{t^NR3a-oyY_}+=u>)X{>d=ANCapa& zc#9=p#%Xg zhn)HUo=0r0hK2Ju=zVzf4N={Dd}un7rxM&|T%a9u6^=z|bZS{M5Vg{8!-nQIi}$?u z_|OPxU+^RoBT0xYQ?F)@;w-$FDxWR!AuN+ z?-OXzV57|B4P%caOXN7U(eMaB4#2{}2N^8M{M;%jQo)Oj!_@8OBv$FX0fl66>lK?r z5Kb)Wvu3~Yzv!I8iEh3Ql_5qJnn;-l-LS`e}lEsge4{tu*%;4ZPR0PB|= z9@ENv{dxMX&z@S+E((OE6<^sJjX?NsPJuD=uV!>w!8hMwUx66g3v@KSe)0L2CRcAstdk|kM!inMtj4amVib{=)FjZ3~ z&Q=D=23eXjlyF~uH#1WE0n2UEOiTALfzOKyR&~R~nL*OOAW^jitiAJd|muXu8KnYA$qWkT%XXCYmSLx4jh3E&(e7QPQNMynq zhu~OlDMLj400LVnD@}Wz=C2ycSvrXjMvG++1>6$l&y>?K)(^Z$c0De6$nkqr+I}Kj z9Q!hOkh#PrVw`JSvanSxQ9JF%bK9wT8!sfYw(5&`oIP#bJ+(+K#H*%K$r4qyjHLVm z1gF=eodt?>le$LdMd6vN@QjkHSia`1^;A6hCFRK(&r;|2NBIc?5=j~>CUWtQzmVh^ zMu{4(Gv=21O%*(ld@jZOTL-$%u$EV_OdW4oZ&pxe5mYKU%rY|MF$C}4ryTUF>=t3BBJNC&J2R9^e~Q{RdFnbn4rQp=_D78s28K>qxf393bBfre8d?ctJ2HPET)*uMu%VM7FR$IWK}tt?`xdXq;Ws^#O;Tr(?7XqJ#uvDv z=iW__WW3z@w;fYT;c{Ej)VSeaKBSDGST~C0Ll|2Tu93E%G#}h>2w(@jWR5)7XgtBU*!96Ap4| zw@ytDy1gvdi1Z7o>kph^r$MCPJu< z#;}~IpPdieqkhhHk0eg*_4X&ldxJR#KrJd9yZIPNx1f1s7kUtbploRXrDM1+J=^C# zS&~VP=%>P@oTjs?dD?NjRpm1)f#)66X1rvg#7Ta;NN?7oyFnM3x5XcebjiOk9ib{u zTv#nK_z%RbxFIO>E~$^(f{8OZ6~hgaH5Zna9LT@wPd|v+=@0g4A{vNJO;h>bY5oVI zrSTwSsQ>Wx`zPxXd!ez^3$HIk&Ai+lrHc(~7v<3$fiRZMCX=G=v~}deW6SRjyYtRO zhOoHpcY2=RzIpY$E3ulEgG(j4Cp^3E_#r?tKKWgk`erSKhH*2eXnb;d=6;Jsd+GC_ zsGHZr3FiE~WM$cP84E1zs0}&OQ50i$r-g`P_K^@71@qFrM;Q~!E|knnEY-4M!R!)R zbRUwgmG=A&bdLyA8H=Ftb$Ni%RPX5%vJ*%q7MDQCvVRO>Mem&R40xny!}WrymEu-J zmT%u8B#OZhZ(T^*o*N%6tyZxuvR3;%Z~UUOwn8Z+oXP9>+HuaWy4sFKd`_NSH#xw2 zlLt1YWH`ex-_L6Ky;yh;UzJ_Oq4*!j=G*QsfxYjHVkeSZKerU?Lnfz|OU&%re^3ny za|XT`p1dSkZt!~3cbCer1X}d355nO@Bp7`7iLrKPp8rPaZA%R?eKt|6p_>nHzk3aV zw50n>xycJ!F;7?Yh#0(R%IFog>C{z6s{#CFkT5%P(DBkmF1I(>_rqOlu}_MCqg-Fq zm;KZ8ji}qQ0}WoM)P;e4xqjf^nQ$LpclW|0iFAWv=a0QsRKT&BQ_9-^Pk2nwCi|6a z^XE|}d<}I9>BVO<#0S5R@D(O8SwF?{%BQbV??X8aIsaXDt$d#xpmwDRT?x#2>HNKC zY4z}jgG{|KKldo}rlig5=3iD{kjgxP!i5XcnSWmliVYmvWXq$E>KvAy5;}#F3xYE{En4qNMAIBrnMCS%?=sUa^|ac=Q8a^V?zxz&Wv@j}()Rps%scX`RY}q=b#fL4`1oc`PGI9N%z?SGnCLNo@Q+~wf z7oACSEL(GAhi!9n?u;3K=Wz>1n{_slmVv(<_g+A688gtY~lW zX;@tJ-S5>vC`U~HyIhmNrcBv<3ojcSAJE?u&8%~CKR{UWL;wF zQpgNo`8775l9)O5zDib_%|c57sH0<0yw>z0xv5ImLQBDbtD=O}`i5}Z%hfhY%6COp z`>NXCXMNm_{mAF!%g$8Q1qyKloJJ?MHq!f04>&8QYN?HzRPjwYZ7|g+Z6PFB<^7z` z&G_)-=a-#7J-=vnB*NxquOK*PMC-|p) z$!_sCy*oXjt@hoczByK1wvT zPWO%9@`6@VF1K^8)gOHv%jA#bji%n<@5k4c4vsUPF8J7_UUu{Xw9)P*%VB1a$NP8S z?_pc#9Ze-RcOg$spyx&hAu$S(c19iDV$A4D=9!U58qUdX2kN}4KKic62M{66+2 z`nW8z$3O~$2?Ps*cA-IHEv*W`MJ1Klf-XXJO2F#2%_!Du3q3MEIKS9z1hoq0scO1kn5j81~|Cr<6l+Od$%%ghZ-sg&gE{ zWXkx_kvJ<3`c?kAPKi>D7jbu}wlT#4)D9rsi$*M7qgUDaqx$-_GoO09esU5YC{Du0 zTG-w2V5LQf8UjF`l>h=%f{7UvjHSjd>MIw-@uAN;u_#jD?CD0 zr;q#Eka>4TkoAjUQ3@2thkmUL)CvezVB6g=3^vP|%w1m>jVcx+Tl-#@F5_$QJn@-Y zG_~jbq(Z2E+Ck2wz(i`eTpG;{ouq7IA8Gz8gBLL)?IuPL@yV1y>uF?$OwcD{@GAbfWyahtXu7=WMFF?$ zlmY@CAckEj60+!uI5Q5EP`oLgSOqOzo%Axj0VSlb6RKOre)yXk4X*^6GMzmzC1I{6 zD9YPd6qFHsPRq2lC`7iL9)K>73E)`1;ym1Fsyq+c7l)S_2`h{I7B4UdbPqv#kp3=U zOxrXTey;PwbJGCFQR;tB$ngN4$$e+Y{^$=&q0(B2iIMoYx|HHIoG1hTjcX2>x@tpy z_zdR~K)P2z6}?NDx<|z+s5vWm01vg#9*~PW6Qt-?D_)6>!?c<*PG9`k&5uZJYt#yM zZ>wY$Uw7S&=r9%HC`2v~c)Z;VN#-)a1LR=6zmefN!pOjFSdNxNC%IBI?|8FdV39Qk zMijRnm9A+jm(0TZg|4{HX>DpQn~Qc<@FSU>yNbPk8;v@39;+m`S=Y0@bR1^7dq~gI zR4NlUJy4X`JA5$CkFD~+cD`y?6~%Kuv~k1z$O-@)1!z(NbHhuxX>p4uLfeA`*Wl8v@uI~lexu^Ml^d?iBh-ptf0 z>baZr$<0xJ$h+^1t?ku zg_lxvof%JKOv;0qp$weMd{h=Z%1RA*ADjKx(rP|(=hAYbYJh_@HUyEyM*hqU^jaR! z7$y@#lW?PnHJQ*a09s9GE+bIY52jv0n>lSJU>hQ-DB4MMEwot$v|#4>U<*`?(c*vD zx0R0hlakETfaDi{Y{~~dP)7hoEA!oi7eW=vIp7sKmXqerde1-@ev`xZDvyq-w@0zy zRZL{@i|^?f*VZ$MwXiU^2A;=?rG_`5Xuv&I+sAS`bmrA*WHIn*^a!$~v4gV92q1{U zz&#{r2uQ%RKy%zJtO>%F_3#S6tZTSxV$_x6@-Znv!$Gqr_S#h!6OKky!O-N{4S>bL zB}`v-#Cn}M}G)e)>>B96}( z0olZ>KaYT-HNY%24X_m=(<$GRJ3CY^qUN!gr;rZqZpBG<#X4 zdzyd~g$5gkfZ$Cp&8d#sPw>M^-sspQ&?tKyO}DCGRd6ll8y?M&P-JidoiNL&k+=9) z&f>vqsV~&8c4Ylx01}3n?t0)PJwsH3Q@jHx%p{JkTO|^kjnWH=Mw=0;wl61bdc+Sp zVo#CvG8~K_A6DTF(qYGx4-0-YAL`A!9$WRkD|Uv;!89@R5)b7WoaKdDEAJF;RxtJ# zFPdX^hvwBr^B}8@(&-N`eY)Mr%h5#apewb$yj=`52=$z4c_fyd!P19`Fh$uuSrvQP7;5(qNUl>q5FOF z^hKOHS<@597kL`bHpJeCm1*j27YlK^;SvDZWll9~LS~lgG1cvMfpoWTpU9J(2LJJ= zgqBidO_m5W&&+IBIln!a5=QP-`yTC!?{I{eA=k0e1-mBxla?%ZeZ_NLnyOou&Ka3i zP#G-VFSpZpE}#1|Ld@E3Rb}>mskJEfWraq)K)UJKo7MDFo99$o>t!L9qTf$-Nj3tt zHk>t`wGokuAL4CRx{0)Oil&Q1_S%a4qD4xpOv#B2#^h4cdCWaBI;3l>%M6{gHfC?x z>FA|Z!3&A?hh~7IkzeC+=12q^M(X`gDM1=RhV~~Dr4=MW-K#j5g=^xPuw9GDR_|eqv|`e$!ekyT+~Of|LW4p|2Nl<&>c`bzhBr4PAJ0228B34brknmzFA7`a z*5S@>*sX1`JS-hNv-d0U&(q8^F{zb(!6q~7+k5*=dpD^$`Gy~Zu{>+>+^d}TQ*z-h z!@OnNruIWmEBs2=xbN7>K1}$t_n0e~n{)5`uwk{&M^SV&YPY!Ta=0sCAIC)KqCn2Z zwViJI=&rzX(tmtHWNi&HVhOZe0cc#5cl}I0yDxdICZ24+VRbYw^SjgID1X{nz9LOy ziK@$iW$JIkMznKK%8DXR*ZmB`&wc=mFOaKf{AlY<L&A{x0wpQR)e#Iz6;iOr3Tf9Te?N z=jH12d>61+{Ll0SGj1GvTh^QE$H&4rn<@VWm2at9pCvs5AI^qini`$USun&ck-Rqe zJIsEb0$w|&BHU|ZPv3Cw-yRgSC0E&-ApFdfs5%)^Oh(Ph>O-k?dJfhhvUanKKOdKD z5H3D-Bb~0=F(tc3I?}ilyck5iUB=jz$DF}yD1-9dt2vxt=|+&QZnw5d_}+`07oce` z)lWj4VM!bF^#M}*oo$?PR|ON+YE71MafV2zdh5vQU?i92gDo*5oD-9|C4oQtXDH>cabJ5C+Sbx0~CiY9?mQ{!uA<99(-{kIunZPrhHOn>G1 zMzD@OFMi~)op3Mw8*;5iK(_Vv8+P&%>oxcIcpjS2t+EEi1q9JswDOCx?HLwbLDkR@ zE#~nv0nex$?H@Q4^Cqn*W5=kM*ULC#KktonplXrqiv&4KYo= z6FFUTOCr<~J)yk$L!B(vM(e`7_MhBu7*lxoarj)we7Cwm4laDED_)G9q^+&@Fz1r% zna=ujzP%QaXa;LrRg6-AagW7C?|h!|(?OS2f(e?UXZ(i69usbiDWq6|RyPiHlgiQi z_dQ~Aq?p^^@s_&T8t_wlu4tv0erhg`)U}wHkco6qD$74So#l@uPh>B=*EX+b-V|sB zfv62~>JKM-snq{cDCie&3z&`SE*Ruh5pTJ6tZMNKe~EY?6ZSKInno-plr`JzxoZoM z7`g)B<~hAA29XDDwI4g+67M|QZXJ86H%dU3YxdvuiFkV_?Iw63CMeC!ja;kpxT^Z{;MEu(ib|{WCB&>f^n!R_!rpvDWtUjSw`(FEreaCUd z!*5jfp^&w+Ues9`lal?17b|W|flL~2|8~p;DkYCM^K<|-#20sp^xc=O1Rcu_QVBVn zE76JjOYfKD2wYM#wsk(#Xa6V~T{mU;@(CzL-=^N3{tMVRSYEj!n@bcAAiYmTq+Vo{ zK_MyH;eplK&l*(2U&RfPaV`dq+&jI#!eb>q;%)oR+UxLLlcdDEmWZZ^BF)9Xos;`H zJo=q|&nJI8_MgyWntB=}A|Il)?yK@-`VlVZoqeTRtnt#QJ%#NB8$`=ua!uF7H!Mje9Dx+6J_D?Ow0%~3R1d0!%y~}dEL2~(LyiRN$#^+&!4y^p zP^tu|+)L-a_B?gf61ryb_Uq9Dkp^4hgg+MPjF#V>jr2Ru_x%_hZTnlMs4ZUCq#OVD z0~;5N?N#}SQ*y1x&gZ&8;@Dt)$DB>_o&M$C^x@-xlaO$a?97dKh(Y4wu;A~`-Z68`rRAjiLKs%q*HZt5^V8(d925R znVEgPwTkOHOW4p4yVkThTrEUvvT*gMrnBn)e+r z!l2*m<*9L)XTb$91m~Q;=K>QlU~Sa<(UzPvB+LSla286lS6dLLNd{trJ|Y7TdUW3w zc(na}%^YeU3YYpuxaxqES%&Q3Z_Eb#GN<9ZnbRrAkk^4m6{%^qO!x%}{q zb!x>{^eNS6-CR_)tiG$sG( z#r2%&2ExiVqFycct5$2-wtT17yHt6S!fBNE*}j-R#G_z4klIyGzdh$g7}qVh&n?x) zjG3~p2#Ak%#&INkJ(9Y}|Mt-1^XPnHPZOGFzQluIa?{r8uQi~q0C|!yTY1}EV1&DF zJWjST5~eQ$0x5TR(T|tHZeX!4pdHrUFw=$|0gj1Hlk`z%r~v|8Cw-96mrHF1K>7aS&krRXg2u|R|T zlK>Z!x&oPGqPwOOk}Z`X90q-|uH4>bv6wQepV)?ewVz!NV#@rqNY&y~f_NV)TXFIu z4;P(X$y5$HL8{|vxob;y=472{Q)U{`7P%&AvuM7!BX*vB0ILEZVCEiwA zUI|iGuD9hijy5{-ZFFYlXU7yZ!-+N6t%-GMbIzG+If4vo5DDdZ)$twDO>~u-D&{O@qsHtnGlhwwthUWI)Xzb08 z`Y)62Hmm$%WYaz9@4c3{FyHi8KC9}}+rW85V8Z-YP2@FDR$y{T?(G<2K!3UQ`+WTS z>6djDQ3T|C-EfDRmQ_Tj^YUoDH~3qM}14`FFp@Y+}pERw!15P~VE zzfB#4JXw0iO0cM#nQl}Dn!rus)(6wddZJSTqUIQLC$O+}6f8xYgd`;sI9qMLin9*@ zf-g{Q3st&S71Dqm)E=vNBqqJOYG(j0$;2(pKo>k335O)N z!K1^F)wD3PbY2n}Kj{;2=0VKr?-x4^85d|N0-28>25)~ z#W6Y@-61GQ_W%)5Vx-dDjAnGFA}OhKiVBh=L_|~sKKJ4KyYKrC_IPX$VAr*s>zwPn z-mmxbrB-!^E#4sPe=&7bE@r6ha8Wq$d){osrGO_2{3 z4uNA4oW!~YV8ea`o#+gMDTV1+Xl>CkAYN4YJAnTP zy%B7HRFvz;%W2tF?qamlZ;s8yJu?HU zL^6st9P8`H~nf_D69y8@$5D>cJJP)dVaYgs3Q;PX>E@T!w?*uzIO~ zxalp;GCG~1^Q55>t#j#JI=m)kRvP`J!xT(I$)+CaP5@njI%bJac*12UA?-*Qr<+{E zBA)^AcrkV)Bdj8pGjJ;`he?nQt!`OfkKzyI*cr%`GO`!SKOFkU|5dT-x6!y*0J5xF ziix+hOi=4%)JcJ&F&Vx>Lx!kCZ)Diiw`fi~L;A3Dx@Y_3)1<5qE8eKnS zOdA?_YqN`MV+}S$ICWT?G-m5al18bE4UiX{#2QPuwK+mI`$9MD!TfMHKb?YqJUR=o z%wiy#qyQ#ImW;LmW)8UE!-|t$2N|Kkei)_$2!(WRLy4b?Isd2Fpq8QQ5yZ*qoth@q zE?o|D^|3Hlz5sZx4wfXyQSjxY(Xo~p-nCJd;LQjwem+(>Mr6_zco>$>NqTn_3?X?L z^XG<41E!BO{m$Ui=uMD}E)0LP0vN0|CRp9;_@O;R=~ zF(9+ii6CZycO2A9ZX}=^QJaJ?TWK~kxqwvqpS)=qAZ6Q(u5cpRM*o;%J_iSA9mPAx z`5w#&E|*wUQ>n~q=>hwU$rsfAUaiBO=QJhCAMGAwEl}SkG1%3~?5FA4sn%tZD7aPb zzCIKQJ~D~C-N?!6nAWbY*Iw~(Tk6mmz0rH=y_u~koth_p`KlU4Q@Re{#B!K~EU!7S zbxv~li0Vt}k@0ZtQhT1?f~yjH8gHPer?vysHQOV49EuNQ^uDrjV44*T354(K9jfL^ z!Xq~2(-+(z`>y=9Mn%X(qg`c8zX^4X2-joBD(T`K1%DMD0p~v+^Na>d4Es$mrNSs` z#Sm`6J?i4$20tjY&PSJ0n`V!nVHPHu?-IOO@T$-Z@S{D(Y)<~DEP->>Nn7BNR!tYW zl?!%ORPtbU=NMI1%&?Ab(HX{h#EH+m%BOhB)#a#7{=P41yevgFtcd)j{>ud|FA_76 z(7)-QSD;-g;o|A zjJLovbpvIGapz^goA}`QaZMz4?~cv{Pigxa_L7%YD_ickbCjF+98GbQ%q@_ZMe*gh zq|$QGP5lX_t^u$XC@E?M84(}^Bu$~Gd3QymjZm;XXlR5@*Xv0gm!%nE3He47VQ5$# zsm*$D1~IV+!431e@PC*IfjcMz6G4$E5>_yvh+%@d3J@AjqGoLWICTv$iI&T!K=b&6 zbt*s=4@TkTaPI~%;IFGkM>U3Hl|2pGB?z1iq7P|K{!t?9J)UuZ%LGt@ISFZ`n=_=9 zT?lUix+?#di>3aT3Ij!92B0VxVpiPO#ePPp@f5(5vB=^)3>P%&LmoqoOjxFKO}HI7 zZq#NG1C-#z$s{ei5kPNbSfl_#vr##?IwO?a0G2yeXD2$23Ep+mr30!>B@%4=xlpwz znz9;DT}1JL>m&XhAh4(qD!`q1NhFeGRLZlo5K+QFsTTncX5oAhP}FUpz%n<2XE)}1 z{Q5t6g2@^9zMn~!FeLZw_G5_x7%80;iUFs%N{fkkz8p;Hi45|j24PzFNR!{=<`9Fd zv;ty+jUF_JxVo8l_~j2Xz&E*=EmZyp$7V97%3#R}0nRQ=t{^oUu}UjAY9M73&cYt; zr1PXui_W?_^SFdql1X@0@p5AiKG)^ixEYDl1zzEs|iG!G6`5V>){oyO7BDMPE%6l@ThJr^{`BCsD z`tM)eb*52wjw~iJ;ZRf<9D?E?u!0s8bBh1PH3IZ7xcoRaP>#f>Ok16Npyf-*zzIN z7DW*bL6SsDFX(ASyh0Qk&mpJ0)i|kS%4cQrF2_(xc1zF0HZa3}~?l2<&LOkK=L9=J)O5%?d(!N7u< z;~c?8$GCQdB7z1(Gtap7Z&T-V;MKy%@=Fu&d|tg&X_*ZA$4fWZm65*4jr4s(d%V}W z^q#%fXue8j-I?z7Pa($uftGu|<%C)Qknq3I>mBFrRO7d9C&d=4I zeM9si9b0Y<9~8?2T)ZlbobP2wKg16QjJB+EKT%nlN-5un_xT@UC*jXdpC#nm&rO+I zy^XQ7{F8_^>bf}SHqr99Mk~7C{uFA;f*99DotXxlI9Ho#I;mp1z9DSVyH=u;Yl7o4 z3UdF*#h4TjhLul3B0ve%kY_KataCKO)_jK%o~0-eMV}uRxDBVKR^WLOLZDK=Pt&aX zgoFDr#*hDN>{4?Rr$gZw_G1(vM$qww9hKzwqV?FKn2V$0Bs6&)Xch>A;fe&Fj?a)r z=h@4ZiTzCHh-JE=1QUru!$#8gaaR%{+ydCR2WI90g89qr<&Y>o_(g9D$o9T?S?grS|d+)GNo+`BQZ1Xpy72bcWobbDR*Lezb+^`vf?^jXwYid zJo$*fdqHQ?wPYPWOW0l4wAr!MyfsIzB&8UfIL?Y9V#TLaUoQ7nz$xh%L!hWT3Ue(+ zequX`$YRB@Wfo4XO9AIJ6G&z;!v6bbjW4Tx)}qIlXjW_{rLOlNqCIzzyQE+Ei0(RB zT)2{6RI)`g{~&0~jNpi>Zk0$#{)R4e_wY%ToXA}?hTjXN)33~P!Zb{snaFJupVUgU z#n(vOjUq(}?`{J3w`!R`i0k>pC?qRfx?*ZDvA*tFqld@qTy_7_bhuCfIk91b zz`m-`Qt)acW{KCl^jBK+Gu6dx%QxHaljzE>cs6*7D#d>glvDDHvJ-aAoY9H)bXMC8 z^I8>VL?C~gY2>+NzVi53N!lT6SXQX3Zo43=aFxEYwb?w46zcxMKmXFy9k@!2ZKz=v zgUin5LHaHei}m3 z_4ZBeM2NM*lRCE~vD?!;85MG$>d{UCZ00`>epI|aF@BeIJHuIgDdR~&0j~XGl}3?D zmoOkgY~H6@|Fbs4AeV9VtV1s9=akg~do|BUmmJZwTzOxdz4u%71=3Dpd|`3Q9i1lrb~`kw_$)0l$$aM$oXO5^QAiu2?eVMI z_|g>;LppD2KYT%{K^@681@#tv_9tTrrPkfr+x_v|S(uBtohoHTR~@3!ha&b6<{HH1 z73q<^1x-^eJcIo9JIQ&a?EWtP8K<@mcb7=f5nbl6rAHaXh!6ge^3a>nVhb!CDPH8M_PByVJ2Lo-|Wh0CPQ%bKpJk%9gls>d9O#< zB-}^J2JLgbA;scFxBQtj)#t_vD@yM?ImS-hB000rz7?0MFWqU?oL5j-ikCFO#cMRi z5%G=ZS*&p}h7zmbUMtFS)G<+^o+MS3z@jYDT`OCW=aLf=sd^r}RPri!AhO_OQjccJ zzrH4`H%s+22U4_Esadi<`*>AVNDLcHMK<>}^YA2Vqt3cym$}xfUdIq}l6OUtvE^db zN8MAYk?-8~v_gWstik+Go>}(rQ6rWj*TR&3Eo{97=LdVR)wc_08x8r7nGiwoFBP&z z{-m=ck^k2CoFoS`Q<)HT{Ew#;1#qpt!t9lztG5v_!7XO}hKN1W+EVc^GiG zA0P|Y8FGgOGnxrWCq8&!Ojr4XUnYrc0>;q>KpfeqnR*5pMZ;#20^ zn7NImL=BzH1`(feXCLB>Ol*$G_z#5<%WL-l1Km$EXa)bM=)JLt+VD!J+YR?)C>dD9 zcCwyuBz(9ywezRP?|tI_NPGS#_6?iRm#BX9kXixGzXsWO-TsB}TKUNEwJY-=I^Wal zLhIW#8OQeS6|i0IfZZQ7{4mZncQNy_;XPlWRI4RC{FJV!-6k>)J4dKq`^#ECyCQn4 z)1O_BKW;(=JNxlee)yl+Jl9HQh4in&a_l0GCnZv*aizb&%qeNg1m6r_;QEbjR~+;u zj&FRBvq(c-I;L(0Flm}jbe5?iA=F64t1PP@=>Fjmn_Du0HV2DamCUkzg0`K{J5O`# zrT1`VEi`haav*oxUkv`*TYGFLSZ!9rXt3N~z=8BHpVj>NkiN$yRE!M9vrlCCQ0*%7 zk~?8+(lVVdY#{p}0aO}?C zVBHJG>?gNKisolP_+(6g=WzWus#$4qve_@vZOojFBplka49qlPvpbO)-R@&SKO8r< zlI{ho^`@Yy6x_PZ6Yn?>GHpsJ#UHJAbF>wY&L0xKF&8?CS05n@n-j3@G-u!rfBqEt zQ@W2P7Hi+q;T z!zou>K6ChSPFgAi&%(lyL1h}R(rGE-WOHKs!u-T??vHa!PF7~l{fB>T*D%45@N~a| z02}Xq-6xa-uO;<9JoWXD-hKFe{h3fJp0sa;pGY5#uRubw#>VkO1upd{$0NwK+{a|i#nI2WI}&{g77 zaxau#LC5y0x!bYT3u>9{oNSxC?hoXmsb3Ip7@S#scQzjy2B@ZAs@F}wcIME$cl>sco2 zKXcd)PC8$TX=>YqEUCsZws?LLy%qvE4gavm+jB~rFUH*)cX*`Qr4wZJjW>gancP>n z3nhSX=T3JTNrT^tw79`Fq!^(bIiKlXd)PRocxQHa04>j%frZy=0^)*yQW9&Hse&;eGWdB6@~HwiU<8urGZjk9pxRu3N4C zi<%d8odio+!>$F0-u8>yoNw72hZ|Sex?(?bCY-yF@b1^U3AdD;o*m@!4*wk~!_{n1 zpX@0e!1q(yH1{iqdAh!pd@io^(P?sMbw)ls@xkYN3`Nn1%TLU!YD6xCWkEKTt%tDG zpe=JZEDJ^IMu+-j{q$XYNvL3RH;W5U~vuu1CO+q#U*r>I*r0?C$H7$yp3&r2t zt15Vq_(K|nHD)dW5;GDM_8QeTFCe$bcZ>CG7L#&W?hQOI9*hj&NUKM28K~ft;QvaX zZpG1FY2^vR)!B4VtKnk_?QSe;O ze_WKm!`YomQs}r>EiLj~Y!|;XrExm_#NVC&pv20Pf_oE!g(P(u>m`!}4FwADCW=rn zGtR@KZ?&-?sqH%ppn@@K+RPRANFX@^1ilnoPlEl-#kZ%Qkgy9?F_^fBrrM6O8n>m5 zOXSS+H@7&ucQ%O0tOf}`U`pU2j-*;}_JFGJj3(EWNw|{pkQ1-S>+1T;b#*J??8sXF zi1)WK#aE5))*>nat@J}|-2}3F4D<+lu^o5(kUH5u;&Dx-(QNixhqr1N2?NN3xT?|~ z%!n&I6BdX}F3io*nIdBn?0pi+7`uH%H?Kb=J?E5@#G!>}+;`t8fJ4vCiX=|yikiB< z_+&|Cu4~I|Rr-Oz_$H!>8QV2k#o}0m^1S+GRre7>#DK>{5i=uyddE9NX@S95dT6a@*;M;#oeIc z!Ipd?K2+_QDC--eu}`fXtP+Y zQxta+*d8tHHOtej%=8Y4480ZgJL8h;>J?}=x?_B9ed#pVbikCMl=HMab~W-=SFzTI zxi8trxYwJ1@ZMW^Z+b_HeF`D!^!&^iKkYe8nxNR4kOZed`8`a1Y4U>kN|wLp{r!%+ z7Y~=NfBgP}x=eZ#(@}5@BFY}_ULOw_^>;hoOwANP^4idz4 zj98CqcWu}Vr`1#;mBx zmcHFjk85>go%aDwUqg^WNB9T|+|=(E#LIZOAo%?x$r;5laCp=sqnW*o;%Z%-<%%^V zcL=@+C%g&ZL+|0DwOvVN)gf^JA8Wq1)o*~}eQ94_KwU!x@gqsSX#}qtS3oful*JnS zPxttr25#m7nsVRK%D2quPQ{pUYV_;!%!3 zCY_!IQDB9dCwoECrBHhr^p?(OIe^$ou_DxQ+pwZUFW)Z#ae<=qlU?6=1#{T zUJzzr5gZ3{v1}|%=nL~I$#hg5beeh1cAzr9Z!(-rMUrY$?f!W1>3hIvA68FG)i%Sn<4itlpje!k69W}LQx@0C&c$mY))u!|;? zQ}WhwBkOs(5&K1_>6J(iPT>Mv`3iVd{*BaCrML6bFc~APgeJbjqiMovkT~-hL(>I7 z*l@q&C>LP(w_hM3M(wR=71E&*h?C-2c!vP^kU#>XFc&mGj+ABj3>F2v`8Om|7-{Qv z?|>QvnC}4yffFJGD8D*8W3ano&p3fP05|iL@%}3Gi5m+bqA$A3`BG8bNFkh30n+AW z#h2Yp#H7FB>{A+vqyjq704f1(izo`lp=vmx&S*r`quN+_M9k~Y7=wt}R(>v{uBJVV zqYE6WMtiu-okvO+_dtBKRD}|NOa(`cLCpsB3p`j=`TGOLc`Pi$3P2G6{sexG;3Mmq*_1^|r2c zUI6dZ7L-L(R7-w$YomB_JabTunpZ^Z*hl3-e~`*?!on1hd}-m{<5=Jy zX=`~)%bCyqa=)?R@F6OJny|4fzxddRd9~Qy`+;Ua0K+NIcyXFoMc(T@+`#;9SJ-_g zV|RVE%}QHp*S_T!4(;o+J(k=%2sTPbpviK(&SKhNwO~<|bZ>4uq_ZY8^>V)Tk^6i` z!HUCIO=~USE}l$tbR@SYwcuB(^kUa4v7(rKL>!r}L0jvWY&8{9tw}mPB<*H<_hA?d z83IFz9G=C&W(B9<7q_E#H@O{zo))BaC-XUKALdQ;{Elg++qSk9WLtl+ABh-pDQ?86 zh#S^V5-_cy^L9awKh5nhqB>1N=2L7uWd3bhi6h54P<<#ez1PYSM`Ce%P7=A0lXk%a z>EAM54GCUQpemsi5Fr2Kpy80o-&^6;&-A2jY96KZT)Fzwr*VV$I(#i4(5lKOe4feb z64cfE1z0gcbtL&KK^POhDSS3igHRm;&T(TZE_p$C+!(ycyz`feb}`VXank=^BW^+n zD7e8S%Kue{FCA7?^2!|JO3#*yD7#i#AfEFL+@My5lI=fKgdy1?1{yk%~qI%iQ434j(DOE?ROKcE14~Ak6GJ@pZjd&Ttt!#fY zAv10{FOa4uc^RV(qIi-@fX)pjTW1-7M<%|}v1yEVGKdMQ$Aq9aQ#)Ywat!=m=L?YK zJycOiYVkv5{>0SRqgJFbc-S0bqt^bIT0S`GDkLm|2UMB>uVN%MgXj?%j*b-^$*Eu# zb=SK?nsnQ)7!J*qiow;0rbVmf<&dVwTfLBr)3czwMAuC;TN`P_A^JX7C*uGlNH{~SN6Xv{a;9)tl=s7Sc6`M-K=ds? zoYFCY7v3ZYIcTPEG!YzAgho)<4HLNP?K2B(2I@WDA5%-1PDc}~pl)CnXd}-nHy%0I zq7j;G&vR`TOflhoaFgTZGQ?#Gz|h>VE~x*5oW&()7suX>MA{e)NC;}I~A5%gQ6$qNdiVoC9 z(0cKQb)>_LxSGKnNCF>cl5*|AC8Y^O23ddFZ)kZRt3T>~e^UO^Vp&@*P zfhKLA4A<6mg*2Vuh5Xmb{Tf&gYojvO1<@B5RsJ#ejO4OGYTqsW;a^5V?p@+jW+=z< zBjg?rw4`d9ElOQH4_h0;o6;+|kS@`;r5yj3(`&~pK0S`eRCV7ef}^?zVj}91#%iF= zJtG`MlJOXl_-%!$(=BBIw#Ca&w{Ez+rHI|e%dL^IH3+jGe`Q*%;va{rqNSI<=W&}| zU6FKtSIA8&hRu!ROh95A&w!J2X4skt4PeP?Vd#yor*8Iq_My`_O7Tr5r+3Vlm0~qi zFSWn^`p13OFPRVV#nJKT+zbu~J=5T(0o=7%C!Z;gvwSXH=O}9_0mz{j1h%uaA{q?$z=PmEcOORfie8)kGGtw`uxCMGi_1<5L))>HM=~c4?#6 zcPx3W_tPo_S>ZA8nQ)cYpU|{YBg*tCA$_Q$&3H@SLsL@~3g3O9U-=)5TIQac+}{z3 zPlnH)WA(es4-L~V0v=n`7>iUdm>Tw$0-Qi46UN>6&ofb*AE*0+e6q4B8HFv<+?W*u zBF*1IxvvYj4Z8f^57w~sd3ZUnzW=G4J}E+JKR*er36Z!R6*V%_GM*(Sr()XuMSQC@ zS~pCLsKi@T@gFbO+uOr;8j*%3PQR?aXb|Qvx*df*EBAV9GGVxSmBI5K)7%u1qHbeu z_*e6VPO)Fg5^^DF#5q;L<-Z;eKkL0a}%rr=K+`VYsr2Wc!B>)9j zdLDV{Q2IyyPmq7?6W6}ZTzaVwUD#y%lxZ*Xue}ItyJV;pc7No})Li~WgKz!^U!Eer zw~;^C(g1(Z=|2eNKM*8%^d2j@en4y7>bY(irX>~Sm6Z?Vl-WS^@&?*zfIZ!??=7D>*oX889tWPO6oBX3b3q3X2avx+)IcPpf-`^5( z{jk4OU*mO4DX@C$Z2@m&W|k(8$FsOgr{;R+IQCYVyHL94Glg-iUia86|HQLAWl z+UQTiv78NAW9#W3268A7m4vkz*5p&k&#aVf|v`E1S zrmw8%dz2TVp6hr+kPkg0yM;APzWVTQ8FLkv|ITgJ!gF(oxbt6dXgLquizuA$?UVmQM zKwfm*`_qa{l|$`RX~XV5vlG1$nz^4`;oXah9# zAaqHsNL}Kpu+NKkT~!({G16i5uKa7c+1r`S9TR z5j670!#ncA>#yhmBt5ejM=gsiX(Tkd>mWSlep)yIcZ|zn(W)9wGvCIZo5pqlR zQ&UvP{=3t5#Iku<%;2;rwGeomzv>koz0auHaeX~e5E5vaQ#XZ=h=D0$MoM}=^V+LY zHU6ou-}A0cl(Fa&o0aaP=5L#PX-t0oPX?Yaz^}GqMN^#@pAGETbdHVdMZh4> zdFnsQZBBjc#HkaPkcFslz9_ni^TA5>5&7o5PWJMZ>5x^b^ZLB~!oJ=={G{882VA;W z&i^=;nJHI3Cm7e%H(>izIYx?R{9ag#JafOcz5goj7xi`F=kp91ML9_7^kU8|?$)Mb zQ@#6bj%=pqH672Uq_cf5fT5g>gt3K4#XV{NdgFNm>*cw0-MI&kO}Cr8 zd~~yw*jwgDUM=1Z=J&0wzm}!sIo;ZXQ14vwi&g{yWu2JNwy*L+~>9UkwYzHLKqro zhrx!svr1Cc7s>v+oARsZ`r+Nvi;tSSbKkC6UaJwwo)LKkrR{Z@Kirg+51SK-OTrvI zG`>TDQx==1J8v|!!@5AiFlJz_xE)_Z!JnFGB8p*x#xByX9FZgd~NLS8`5u| z=XvWyDI`BSoY{UtuvzS8rd~uvaQp}HN$K{m*Sv?@^i7_88uEnScrO*5YRhq(zZ;t| zRw84~SQevAGf|RxDf!lT&15Q-hl+-(wc5wa6VH#j;H^eRoTmn>Kiew#%Nfs+a3@~_ z910h1^{7D+ZTUCms<#Qt+geKWDR7oC4;*Me>FR}P6rZ1&b^XS@m89h0S7W*TKnf}fAX#+&*(TJFFVp) zGTmLNEsXyC+Sfa7GmT4zBVd~>%WpDj%6kY1xgqsa2OQL7Rti6lKAVg7=nAt1=K;KKK#@`omn-#{rV_N%lfKmZCu#`>Rcnpbjn2PI*pd6MgF^YODcVsXPTFC z5T|Q5JUkYDaXd`6OVzD{u2W*#?JqRiH1&N8xGY~E!RD!E%q|{FwO(?Z?i9tdk|#W( z=%!SodnM2z7jjF5Xn)=RzV*<-=$S3EbM%7q5YC#BnQ(}emFBL>Nux9Kvs>4d2C&reh$MlpgG7NI`HVSQf1C!#mr6*YeDkK zlbGC}CEyP-;bkttD}mmoW@6-Mgfu@UP?N7`BjGF~A20U>*M6*-jIHEJ;f_IOjLF>> z-su#fG`>uyx-W_`k+~~5OBIc^l;ayTYu#MlQ5!k0p<~>BwH1EzUp9Oq_o^#4HFh61 z`=~)>KAYvuy5|Jxt=X8+Fe1{Lj>EGDU#TEds;$K_UjB?GQcgbP5&_U=31$u#yFj5@ zgs|Ws>Ul91X>QCTsh!rS7zN8>z?D+kwtg^!_Vr%SY6{@6=Jvw;3u?!|oghti4+_Ei z#TY&+a%bFe!XB|(=tA)U+*wK+Wh`McUVM0xoFM)|F#xf%rEN@SL&*~lis@jscG@o(@E%TXl3qo|$7vXDe%2vI^GP}O-aFCI_*LObxmQkG_1PKsi^m84%A z^tN?YyZgGDwz--d<*+rn4#PJ?5TgFE+Uo-y>l z-2d^#Q*G)s?wDlCErY)~Rlplt zFUny&Y#^eLc1s6>!gWd*kf7bWc?CEX@j+<-WWE7-Y~(mCJ?~dwbh8)WMqmxndq}4X z1|`yU{5-9IxgN;}Fqv@NHqMsOO0cmO27&_CpxVI*I5iVD^smc_x=5pV+)1IfhRIy4 z^MY_n_0bUSm~{}u1y@zucqU-R@sX4F!Au&bF*(+FTPbCbeHme4Wu6Qmw?6;)X+t1| z?@bAFerb{hW|T(lWgGp{+j64S*D_kA86~K0bxsX5&{-#ZVvrFc60qW0sUa`Sj6f<> zcQIr>Sq)#1Yd>rwdodP8f-P+da6G-nC^a~>8YQG=Qo`e2y6sJD$LKdJRee8fW%6+p zQ12_5lkdPYd24`}`(?!nb#|#Of)u<^@LA0h;4RkQZb1s4$1;pmb8mqi_C=QL6oka>rG8na&>j-mp@2gu^MK(rR zLaO!4&q4+LEPWNg}}0h@fAFaxs35ZJ|HJYW{E=bKp!k&b1d!~y}l&`G_mM{I~Xq|M;p2anP&OPHM z)q@|M>X*msqe5}PW8K?_X&66au3Q#R7E-WzL~}x9)cVRm28ZyqABp!FqorDF8n-EL zned;7YM{B0tGx z5rzvUidAZgRYpi-BD9&6D6F`Zwc~++abT#Hid(|AMaC3_`;od+OsWLiSZqX;q7l&d zoJ|P|s8>9yRG_F4w5|fLnScnvT|PCASOHwa7Z8v=d1o&>79M6KdzfJn!E1uH0y3x& zFdYl$vBgaT6Y>Brs8fkVpo#T3M^s2|!bGPtdn-3yGdCI> zwHc_1mBak`A0HRDCd|+6|r-Q{{ zq|Hle70I*GsPYOfQ-o5V_9qPk*>Pon@b(H#OWt34X**BMv`4#r=dZbEJSFqpy>4-s3{)S`%dq-f0vJgTVMF zt7Tgr4_~%EAyQL|T{l`ydE4hWRmEQtaus4xycG2wa|-NoBx zEGl2r@5^mdm!IvLo$Bi6l1`PiTURP$p2k$cH7|$pn2;HQqmm_IkJGEOnP{bs=%6Y( zKWb~(xSTOouctM;eHH+q8rdc<^bfe4v$^xy2eF{5w<0JO&QM*fuXF+Y<|s@#i}7iGGg) zW2!OEz={-V)*-I5GfCB5kX-q~95+%sKf)u`(M7&W2Lo5gc6Vg_Wr**^DgE$t{B>jh zl#&h_0)x{*60JB@khgD|LGYj8<;Lfy35eoAsOADJd05|K-(Qvk7={Ve-Ti-X6Tw3s z;8b^67||)@cam?7z^&`2^C_6o0BMlIEYl;Y_|O80d1ts6O*c2{IF{O_3KW0=X;%oU zRGbv8P!7rzp!h@#`}CGLa;XH0UtBo~Vqx_FeJYBV#AyU)inx+uofWy#QkpDXnHl|QacT+>iT;c#9Wg~Fzrx2ulxSwh+)!L6JZl&!g zhJ#FnELow*`n?qt=hR#%Jd7+bB3lQ@@T0JsT5iS^3KwYDmW^Q1q9dlp=Oh-3x?hS# zL;nAcD!Nz^0>Daf zf(USyNI+hI=_9&8(n$XT93doLa}x;*hGkiZKFV05RO4Tn8r-?Hbx1&jzoP`l@-)iL zOj5{E7_1KLpp!L+Sh>lHHWLbJ25=~~1spa;l3dwn28!Ne^3yEMeG5N-%jcc@UXlK>pg!aOIQaRpWzr__=^)f$nE5_BO7z97+9 zU|+00elgDfAB47QJfxxY@bA>SC=Lpj@df%(S?Kp$dy`(>1?r&Jh8_f3}8Kuk;LOj{Z-5En|cbyob-=afvy}x`=7b|1oM9q<4+G zm-}-S9aHYW&Oz812tG3-f_gd;5l^2QLH9<{J~|B*8<}`N|%1EZorcR_%*0| zlIb+90zR=MhPeSdB{~K~#0B$hE!76OdBx|Z8m$uN%6sm_3AEw4T8I&UrMKgOPs+Ia zOdr)kAUGBj!_MBxR<9{sEisaBS4F&*F>GIAE6H9U$0W3Z?#(X(*L@AUo}By7K!ep_ zQBe^tly*h;$-mWGw<@o+(Pmq{SDK^@!x-Wx-y= zKkvkItl-)jes>QpM^t4k$KiI1JL+ouS!4@455AIcI?O; z%hlX_2dRA$(u=^d0zMu0XZXp%bsioryq-yHGno%{TvjvbD)J;FuSY3E=`}A=8hh_ji?RVuTI`Y7_~Ged7uu%uUIUD?Lm6C?Z#& zT!C7vbDd@kg6*MnnRHVVRhC{k)XHf0>Qg%P`P)ki&iQt9lbuXg3pC_7uAPheVl5^f zDP$r?ttLOvzqEE^f0-$%2&FoIGk)>l(FgP|Nk)Fem~MIA%VuQ+WBo+-zS4r}L3_0G zyuURfo2MWQ&k}Ke{QM!yRl`df{isV?F>9+!=0ivNH}4J*u`{3lJ<~Zn%V)@vM?Ib> zvUCSKuOsO{9o9eGe^9qn_g-7ZWLaCbx-F6XDZ=iZNB!&xY-(HG^JqO%^s_bFXvO~z zlIZAOKOwE)xiBOp$M9Z4;MQ4JAB$pFm2o3=EuL7pxZZM`|Kf5*>%?->m0-9NI}ewkv$)yzv2l()_)gPq1$} z0$qD06-{#O)0X2tp;S4izxklW<8I@nfP&!0;-rI%0uihBuZ;e|x^;usIS3;pOP2mn zP~C9TzqLvw`8G_~I|g?e^m!D$zDs#d_Y?fcEYpyAy#)GpifSE5b+$Lg{gupYbl1_; zG&@Rob=Sw{TlVW75BiY!;8iOeF%I`bMbYOCnN6n4?#uph5H|%;r>P*qz0vJ?y0?2u z)DWneYsuE8sFK_`=LmOdEkQkkGss}aXQ97^g6gn$` zuM)e|4)9vgzkk=$6@sZ6?YwFGrbKu@B)nsS_T27y zDhiSR+rs7#6!AR2H`BkR6wkg3FKiYnDP8Mqe|g9t*T{}42zH+d%{!NB5^;XjWYay< zR_Xd+rmSlgrW|%RcD*C|cX-d+%9$6ht};$aqpu0=Z0VyF>4%BqR%$(7V(xh!3>xn@ z9Zm6uQ1DZ07`+RK{D`qi@^2IM${U@f8~D@>^D6V6q7zw1?6*EpcM7DvC>O}>TBEO(RPR;w;^i34|{j`jwNyUH<`Svu3yb=^aQWG$34#{PLO{u z!9YpV?&})N`Gz}Sedw*Y2>wV;+#&kV9p?uNC8VeJE7P8bFz=Tkg(_5C(q=Kk!H z4d}l=(egv`KM4CZ`+1;OT`Yd5q6(3$^vH0vTnq&N{Xj^NUHrEVn!K-gFVua+6+|}W zI*F5sOiwR^Cidmo9#U1(`4dTUFpVSwM!mp9bdHTIk!7Lo{G$Z-r;)4p}`?uBkw4#_Ot+a*a%r26O!j)SrLQ5fN-KW8& z!12jlInDgG0XV+i*2!V4T-^VJJK|*?;ydz;0_HbnV^giw$vv`= z;#1pB&!2;sRJkmZDcR1{-?zFWi*2mCVfST>tJj*pKZ2fas^A|$zOVawIaLaG}op_1V#b&0%}QeZQMtXr8d&aB9Xa>S8a(ma3gD*xOWH=Nn0P96Ts7GmxD(|A|+h3(m ziZ#LGWMyheaeiKJ<&%=}u#~@|R=ZuL`gxpv_o*3#uCpIc48A@p{@g!E zC0_Rx7kOCx7f}aX^;v=E*|K+ic*_n!E3Es>03}Z{MI+Dn(Pq7T`eBZ2R)7rTg^}gtx9vk)zdli*}rrr2z z?Vl~}p!RiBBOBGQG)YK(mrc$?f$#^LerXE&ydqD`abeM?s#Z@m0{NG^GyBWzJLO!L zxn}utCdnZg-F<&LMTj)V_r4gjA2#i#v}+e8x3&ETxf((a8NaM8-KupY;*N#RNwU15 ziLDrSJe^jV56ZCRXOK&M^kTh7Sc>+HvGjpP)nc^h`zUPYCzHyY5BN0H-R7P#y3!F$ zJXlK8-IHe{89!~aJAU_-oH6Y9BRr1cmX5pRoqsF*>D}DwFe_OZ+{?T%$60hVtpH)yJ+Xgtw$rk=*K(3dB6H>3s|-Yq7H!6Ul=9 zqvbabW$ssAwqbf2_USVrnMoO@|j9QAVv<($(M_ODz+t z!Fw%|z;HWE7rB$K{`xLtk{t2QPc1GaIKlpxar+}xO?hnj)F{Vf!6eYjbk#nDAqpH+ z*N8TjMBfZ#hV8`i;QZD(VN)BG#8nF_Jv-QC?Wbf<)*ba$74L+4PELw8FmDcvdEC@E4t+xz!_jstkPXPDV>U7xkqxrAPQ z?SrFwxJ0rsooDzI zR!gGOLTEB3F_d3#hxO_=rmqEc-H-wsk%;Z`%#_T+AQrrrvUko2Uh5Qb=ceb{4dW+t{WMQbT zd?Y1~(hMohd;rC*>OnM^S<{ZP%(wxZ`q*oIq*Bi?9Z>NO*-6>GPfIK;RDt$4M<`BF zEfyX@#VaqK++uCju+9c#$v9nB^m)Gi0qG{D6CG=@lxD*JBSuq!>5;D>+G(Xtjk=ab z3GA`6gocL>%=)}ouBCHg3@K<-+-F(?J`3`IV?WB$kaT!O&@&V(OxfaFk~KA|H0-m( z@sV&@>dfZY5EC17_MD}LWTI!3gMKq6)M0&AIU%OFzBvlK0!*R-TOm-;h?n+;>Z}+W z2=iZIK<@ynIX7-S5GVkQprVr1amohOyu;L=ney$zv+h&X~p&t3}@pFCk>z1X)jtrZ;(Da^+hEW4X5W#w4RBN*BpG>B_rR6-C@)I&P+1oc zR!ST5eudL|sfm;6CgJF++hPL?lD$fe_fr6K0t^1d^bh4=^lZ&^{s@8l8NnJs?Z3~g zX8R7P&D&thSP}HOk)eJkys zcjL^t70HqvZz?kRbfUgJDa8XUg@>_)!593C)Tr)kg}yZ|V0c|RKe~rLZ7;P<6LD0w zAg`^`pllaWyw-nyr+gxsyln980I67O;JTcya$YOPHUr*8@Auw|-ICzfV^!=@yC#&* zd7)IT{5guvR-*>!218?pC{{(C6wUWG*0PPyfV&>>RS%NlF_D&QUKQSG7?gXq5cq}2 ziJN%qF>)XX`!i&sW8&Zo*ONE^eAtVOV`EV6+_D_z5oopdSG~Mk@FXE*goF}DI|t$zro24}QN&A) z*gAuuhhZp!u9(Rh^qcn4W1RFnSpew_7{&F{y>k#&^;C{z0JtWqRBK)`#;6bn9nrp9 zX$M_fPbzioRA5*ooC8iri2RAbjeCiJp{OBCXsI8&fS0Th$?z`y`(dXRcNI>0DI6Fm zqL%Aaj)|*e_>}^dd}?iuC_9qz575i}KRQ2}F92k-=bhNp7G3YhJ%ILa~{ z;V(#6E5GfREYpY%^}scb(LW>$goRAU8cpSOIXzBnSAt$)JMt6P+(r8QD2Y?Xou0iR zw?>pa-AAJzi-fhcr?YKsg@an9%1L93yw2)2Ur65`dNGWX{%QF7Ig*)Q=`Y9&1xgG~ z|8sch@=}ryeiG}bv5jo)jcq{Z7&De9k?mjFUHZcjaew_%N-lIMMm+zklSq)P#a4|c zt#c=fjEv?FN6AgdY;aSKY9q`R*yg)r#+^ur9RFJXcGo-n{6f*|u&&koE=ZvD){M_{3XPZTNp-xmk5>=Dap1aFbbGXoj?`i%?`?*Zi<~~k#Z6}{@h@(Oix=0)e zQoiz)hzTuYzZ4Mqy30eX6dq7lcGEjU>buK*IQjGb@-N8vFKGP|xVu+$up8}uQ@=j^ z3sSg={|kC4GLPn`ni8y;`=QzxZU0!8dcXEk+Yb5fG~QPty4E>Dz2B(RDdJ?kcOjT% z_%dFqoQha&*o_}=?yf8g=rvar8n zQ+G+xCQ9=cr0---JZ!X@Phj&korlj?*FEn`z15246L3SWT>9wdq1%p`-il#&cXZhH zQHOkTRxI-%4;!7Fs4rVp;7MBItC)=|m&3OjlcN2aL}OtrXb+Y|-wVGxMBSEbYIpeQ z3+dbv-~k(CS8WL?cz!Xr0+?tg3iq(>1he!7Rr|J^ie8bUC3`R7h~JQ^S>KqKiWiY5 z*+RSJ`NqCVlmq&Y>Uben1xLM%mTjUA>NtwTadW!n5iU`zsx8Ap!6i;&Z%Rk+3#2kS zI8aCmDApv-t~si11&yOcI~@Lk9v2=^uJ0C~AU0Z;yP|SUS94jZr@fo_=6^x+=9gOe z#1AxNm|k3&u|^)Lr!2c|x}=AAzf%^^gxU3I$qYmVujlSFd|xDHjSoLk{84`t4x0Sn zU>kC1Zqf{VV?H~+?XPQg@+9rAQL|ngSMMcWN($o0N#U!vTq3GwPzt&Y0ioL480>>y zhV}WYa@MCqcLurMLErKAPsP`TGfj=PE`txE4ZZiie?enhySHCHzuxQE`m=QU(0l7~ zd0sd4M1oMMdgQL@>niqz=UM;ruTRg`8*=k2iT5T8!7hpOEY@MSuY%dyE5CiG#n}M= zTySeJa_^glLWyT9b!y!{@a{bB?(g0F?JopN0ZaXkJ03#xi(x_A5w()tS;bRjdC z3)-YUBif!EJMp0=-u#of9LRJ(zHLsrXd_BNG2q7h32(;5bv5!>w4-i&?qWlo5s8U7 zlRf{{ZonD(ehZsR)v9iJmDyNS2?zdSi1dT%Z`VzU+k#u*YSRCF90CtA!#6a{{Bs#{ zy!-O$V%#By*O5xlmtLrDZ)+R%S-BTCN9 z;x8D_h0LwrcA8vC?fa}-IxCQzh4;KuY%@*)4+Pya$w`m6fVjj(>c5xcc>HklCFY@g z?%FVh_1NX-?n}t;xf?C$6FhqHUth)nEVZ?sWzS=f)w$}pVbbP+70O4yBnpDMT zGeE#0fKE4Lf=Mq*B^#0VR<08wC+$#BKErGqPb!X=$$DM^Igi&DC_9Si%X@GFR&>#U z{nC0z{eVav%b00RV+eGzAS&CrXl19%YoeP>`z(N8dC15n0%(8oC?RPbIoC+~IPWm_ zJ~)PyR!PDaxbAW{hfW8&CqrkcogU)|{u#zUHANa0<$xgtF;M3%kwze0hZDwQ*nYrI z1HeqnH}XCF8$#YdhE4;BTC5|0rEN;A!Q&(ZGjwm!lfG$;{(~#Izx0D6fEIY58sdzw zCav?(Bq|mk8v>jdQ=EiovE$_u2kDCc^e&uONkG6$h%yMqL)efG z3UAZqTH8>xbI$35L>dFOnk%GHQqeMv0BWby)=HhW(;G!-cSlVbIk_A`_-~q~x>;uKS%a4e(%nJ>* zIi=LnMS;n{X9(0q)4xB~F^A%m3n^p0+aN|5rb>z^~Gtujtrx?CPd5Mv~o>1L7%SS7~@4R71(27h4BIF8|G3K2F|#2KHyZ6 zN`xlFM^auysiZ&Kk7(9;9+_bEE^+M;OqMr;-bd3wmu7rPh-hm#!w|!cE>u= zDBFm{F|s%-1?!6w#sVuEAZ|-9T|8tE`7cYX7>-j7QOnB(qFZl6#k2-HBQt=k5E6Ui zXVzxrf3(4r=?x{$e?qQdXe8y4Fq_S6smzO3G9N@qGgyZJHqTUH;jIk?4hv%R!%^U4 zqzD6NHSRYZQWHp=p;tPBeypH4Bf?n1+L3R0PRd<@l2P3Iw-I zIE~E|Ng?fea9_w#?LQeytN&7Rnh-Ps=}*fym-8-*Mkw0UO%TeVNzwZY;w&uyA)S<) ziGsabwfRvOSbz+l?Uh}~nC`ny`I99yoGK{;ZBg$ zo`4#Zp~1s@pTeIKArgz*wpu($d=_Dzl*>dzr(Ggj;#>~t!ih5qeV1X&= zJFGCdgeE38^Pxtyb()D+)j27ueSE*Gzy`ZS{^ishIWa{jwLQ&&v>|Pdig{+>zFbMh z-e%rIL3>RQUtH#k3hC~FLX7^dprPu3FB2s@6Zq0D5F~c>u4O|3MKDZNWcrHQ{nZ2A1!7X+bCowAL01Sa?QpSyT4QUDA+ElE)W;4|*lrZls zE>&^@>walIfy8HSgiX9kGD%Tef{^Mu<`at%@?k~75aBgPiMtE$t9-G=qz|U@g09ud|j?l$T!Z5b84T;|te{{_#E;#th89Kt3&D9v`{Y?c6)1)7ApI=e!Np zYii!V5c__Kms`{%X3e*nq3S>?X6sd;^Aufr4`vZ*(ofSUd^u59JTCmAB?0&n+PY612beu`${0FJ{(_Rp`-9(qmK@BZ$)@@6X6{8G zW^K2-4X8;x+Mm1|H!t%64Q$dze2GcBQN7G$0i%kSt4Z{vYC9So3X++4o*qSO^EtLd zx3g?`Ce+OvZ`c+Y=ohC8RSpcm!jg~duw3pg1-m)&Dlr%|AUbSCKJ~lTSv3aJsJ$!f zPc4?oMxX(+4gH)&#t5opNY2`Qw$8R0$pB~B0XBR~z#TmQh5}ecu7z4qEy6+_-r@8dnIQ`KUYp+dF&Nv+uZdO2cxOO8{Tb7q6fW`OjJ9G&XOq{;h zI9M4&)Ww?2m1~oqo3|s0Q17(|I%<7)^TOou-ZOR7ejL_i6FJuuv!Ye@x`{tD#ZvsE zIgU0^xf>{qFxOZ%Q=AB`FoK5x*{oWAr#FcG^rn^bm8#z5txD^?VPQe%O5(Ly zFpN@t7;~Q%(lu)Q;lnq-glR9X;&=kg!O9V2`R?Z9lTQAO-FT8TwD~)<{j}K{LGKOp*spFE0gUkmQ&EB|kiw3m&|4siu*Nsk8v=#z}r7 zQG~B?CAGu!biKN~@mTP{g2X{&>dI(a+iGIxJ4oq1;M-yGwQrRI?n(l7 zR^Qg#Sr0kAXSC-Zxv%{VNq6u>ZeH@bYpE2hp@oX$C|G%uo2<)Oxg@K!1Ipc`w-ezLPX zxhc(>yi9r5l7mvHBo2gxWc5e?iny8 z?My25t5y`8W6;B|%}pLZ>5*rXJIJ&7lMr##y~w88GdTu!rR)^gGB4p!m|LQt{dJwy zJ235@qV%Wm_~qkw%Q{l&VA4a=X0CSNU-v#_`UE{uJ=p=IG$!#8sm9Y~h}B~A zD0zP<8h@LWyCR*t`g2nlzuwII`D?KvmSX~<&~LLC!nK&x@$oI~faAB+#Fld5L zN1aXYaoWT>_0r{u&eB6B4wPIit6ICx5kv0s|CyRS811 zBl0a>VAGv^t#ORy1lGbQz@(5WmbvIW*c2U6cv?+(6_R>+!g3<<_Hb?(?<7eNlZ>?U z)2)fhqrT8yC*{QH^O3&yZw+2Ph!Re75lq!N?Sd!~kKiIrxB%uqnWzkdnMNPYJm>LQM6ywk5au>zUTIBBEK^^h#__&fcg;#e(mVQDPUkLU8)=ux&`)G@c~!NkRgrah^x}Q^<4W#oAg75ZzA$Xb?0BW{v~I!u;uLY0 z3pMzqVyAqpPhKCS+Mg((aU#PjANlPG`h%=KjMz&&{=L0TMCCf$x%+I+yUVq5zyQxA zr!9g|nB;JX$0LKrMJ>cAL5euNBl}h)@<%Kv)FufTZ9@hk-+m;&M=qu4>lB8>pK}s~ zuk+U8IK3;s_bh**x&3`MK6S{KV>sR;am~SqtLR@)yG+sETOc*-c&jGK*MHL=`a=H&%exI^;$qnMmAKUXQrVvtnbsu{Fvg7BwE>%pOzIirl7bJVM13* z-f%CGQVYDA^bivr{e~icQ`3r>+jq6Njg0YEv>VMHNdP9YhU*f(^ zBV%?EY9rZqf)XY4j)8uiNM~Yov0>S-iEJJ@Bisl->z>#Wgzes=be?qFz-Y7Q>Kx4i!Xq%Q)_AVJ+{p@);YA;}(wR5Ry~`kWU{JSQ2gj zO4Q#CdEj}OwY}8;#oZgpg}#4Z7fC881Y@tXyK;Zn_e|<*2_AVp&oKb76OUXuO82sY^W;B0VxhhC92XAJdz53SF-kf z3L(VKF1fQu?IuJOEE#&h z=TU-xNEy9!i4-7n@(=Yu#a>oR(?}T4jqKE&j3fNY8Y@gDcSWfRfPt|l*?;r{s3t%D zFNSoaD{zPQzhepGBaZ;|BXxi(C1s}mPh>m7obc9`{|IdNusfTm&ayO9pg@m=X6l07 zhYry%qfeC#8U=Q51%u|}wHF*e$w@BzDc3pI405eD}0l)99QBNYr&LEWnQL6@gPWl&e@_ zOd+yKv~-gi#yl|853@q+Gqe|lts1=g!a;c5c-12WLOq0}2~))RCn*dI_LXV?f4^+< z0P4-`>wKiU6X!#_jywI?pXF^M`4}dX5r9v@rDIB-FjSL(D`*1}F#I!3PR)1JP9G{a zYhEhM5+ffBC0n^yB@D~y@ou82D6bghz^t#RTo^YDBEx~n8D5wI#9<%H(c@I6SM$cLkUg&>DRW0_xYf1VZ2B6~3x`&ZIb0R7$V zvs6q@)B_8)uHn$8;^`B6Oz|OlAWtN91O%s!SR-rDwS*du>O6!aqe>X+D`J^p#G8%H zLQNIA^W_B%=%ud!T1BTHp`~8ng>HyNg_>s6pdvIK?~JT~QHQ1STD9ycN|flgl2)EW zzLj=Un%*BR{X}MIob)(!imP-+wGb{t9F6SrgLJfMz)en*OCApnuhz`$kfbKafc_g` zX{R9|D*}_k>R9FhIslGzM_9y@J3%MEkHC^UK`;FYh#CPyQH^EIVeBPYOE zdC&eR8MXM=1Hj6^h$4uCR_F%l$DOC4WV<{M!m8LVw642rixQA_!z0n$Rib!9VcOKy=E%Eq}5vdY2z1^wuxI|m8{r(r^_%U_=j9oGy z!uaZt#>_E2);1h8W}k%=^hWO>bi%?oT9d!p+HFbg zr#u=vL!FH|4J*~&e#|)VFr~!|ThtrB!k8?;o%J>dwBABn!_>zsl~U|T7rKDJ%ck+! zXw;@Dr0;3UM6SZoBMkBHa&fXIL)3x)nLq2ay_il^x~PlE%M~E>;*{wP(PF zA>$`oO$z6lJLW4>L-Tc+KxfIg_~&FLXUoMeL&#Q=#CjP64(`vOi~w`-gqQ2go0Jb_ zggVeFBSN{bT1iH3Diui!GU<%ewCgC*Qr0gR4tdi76tZ>p@3?CMqz>WA#+8{etgW*2 z0o01~bh=lF8TC>#(ivUMxy&C}`t6nsHM}E7DmHpkB~LG|~-< zzOO%Pd<2*Cf0$>Y9GxzwEdj>u@F5)VQVOrXUO6kUONfjG5OH&<@4(V3dfV9N=q+B# ze$ToZ{)Fxk6v@ga2e!oswEgphXe&TwND2_@#~_*dN!s*3A7+f*#qr4$9_P{w6GAY-cVF?l7lK4$pk#- znNYkTkxuwj+L;Z&s?7-}R=AYyxVSk^@xVrRnV_EVt>Wp8TK!RBxDfo+|4Vlh#`y+K z2SfomtiYZDfabM4uMaIoY{ZuS%;3^!jO-DF9($o1t&P`~2zJkyMUZ$79!z&j?EaW}%rzAwX z`cG_j*flhgDRI8rlRLETe=fAiwaW2oMM-Ad)W0A?x&}G~uq64BBufq|{9ncpjcg#2 zO5JK%I_m;>^5^dWrwomiD@Clg?k|z&^jP^HClIvf9T-@(Gs+;}wc5KTq7eet3|7%a zw}iw?Ci>IKc2a;ntR0IqHOrIJ#=sL)Bt*FAOkU98`H}l@icySTBA%68|hZdj?i0au% z8qaYf210nIzkpc)!wseOf9&4T_Pm*=ZRQS17CbA+W6EU~^`p-+7-=fq`IX zBmugGyH=DIY5a64@ULm4=a`_A0?bROUY4^}u+r-6E`o4v+5rg3;=&9|IbGn7Oe@M#nTG)Rx<2jTT@>K|F-^mc!gTZ1fylZV*3 zMzJq+%vUzWJ6qsoRY(UGaf?vr;XuvgG?hgif{fmA>}->*9`m zA@jy)$O98Wk8(Y~&)kf`s_f758I!ND?~-M6j0OM6V@g6GZA z$WbT140yNVqom};pP2xzJY!;d-q;OH7hR)OXT@#BI0!PrjEV)pd>eWh(@HJ`y(1?D z{w^93mXlt_+GJ-th*$j(5`4ZIUQbL|Jy!l% zGNeMwAyL5Kd*33;80N$c+V7ZizMO_B7r25xEW=ix!2_>wf$}FjXhATieXh}DZj6wv zYJ$njkXRCY7WDcs3_WMbglCk_e?pIgZd=bL_(G$^of6_qwb9gINx6+N_miM6tf=#7)KK(qFGg$yW>C_b?X_@pAGE0ybN+V2s_jsH=r4#^ z_etgQfaaqv2l=~8sge;JPLSQ<_(LtBeg;oPV*gfSPnxf)kO2Zsa<*=CxXo(D73`DT zZEmJkpuE9uwRde|vIiN|V_sp!rDcHFOeJ<7)Fp++Xr@tWwzb z@~2v;saK7&f3{(Om~=_#dxeCKdy-0}ON=HaepZSnexbpyF}e=-=oBSxto*9aQZ*%D z&O>KaXZ_sK^e<%HzMYHB_PzlFf|Kl|+gedn(s87l7a#ZeZ&Y%#PDs5{dmjjILWWK= z-}T1$ij&Tz-$!it=vR`w+CFC^{*KhViOt;=#DBTF@#yYhwnD$T#dvSzflzsPd(!3W z6>Ygf8R~^u-OnV~JpmDxNM9F2}_$t*eWTlNS zAu!|i^H?C-Qpt5uenYQ)Uccb$+l-Gzlm1Wh+pJ;t~!Bp>&O|9SZq~zOm3EMRAK^TZ-cpuF#c4MppAAfrY!R*1L4aa&w zi<)mOAH=`JQ4qIz-`X~DG(YiQ)*VYJBy#GQbl)mp&062%#V}!LWcpQf1ytboJ*}6CaTjXGCn$=u+j#MfK#PT-q<1RW8}f%AC>c+MFt1snd!s>t+^Cy}^#NI|W$e z3P^ahXl`tnPUn+vsGmdU@Npj`xr$G=X0Wl7d1^Zk4p~xT9)wuDxAurSc6-Tt zJB*6&g44zm{n?fFIiObVT1`VmMUlpLA86UZp)Pd6Y~tRr4X#S|Q;aXb!SRluyncDs zcOm%%WT~3JNgugJC)W;1KVRPK{Q5aSftKR_?X9}o7$ryFa;y(lp=*o{C&Ec@$O~EM z)&MrxnvE-R=KJ)MNFB#@rinoh_MrNc;|sA1skz#AiGUEX{Fjt=!ECBJ2A&c;3_owv zJf(|rnQe*J&+q+eiI~Zk+HC@4j35tnIsG?6-3N3!9c3!U)Tm5?Hh)ijG1vnJMrmu!*5+`Wi1P( zO`E6a{HOj`+4*iau17WmYd(3m`HU~sz`?WWu2F*GBt*QRVXk$WL2bCrZEL?C>%?zajoJ0CBg*GM2vR2h>~>scfUy-*!#CfXa3V z@9Hf0R&>eirc>U6SjHl`h-``dwiYzvylM{=u(u0I#GwC50!Nfj$UZ@iPdWs%#-4c` zENQ%!hlpuoF~461Ni4W?p;&t&flg#EMA*+rg*y18uzj7R=8-1Ono>DU>%Lypbt3Cf z6+$<<;CVbCOSEO#f%5_^(Jxwy2bfr{n5a@CjC^2^P*8R#Ju=gKJv0$I$A}22J#OuqTrPcau8%3YPP zbxPsj)100EY%RU#Tx$m%&;=6d(H_(DeJ||G-WV!4+`yE=1@2{~_ssdqiabf1kQz@- z@g$!&rXD?5GGh^!V76RYdks5ZjIV_1C`FIJ45w%b);Ja?RD{M*UfK7;p}b5ODp%3R zC;{mUA5(mlycJ~MpAt*w)KBkt-FwkGK$}yJX-_=2bRI-hr^%+EV)%rw@%XUuFV%tT zFB0`V={k6;P0o-FzAL-!sStNCPZjc72#|s{GLk$NO^Gca8njs z;2k(Rj0#D{!DguR0y+)Z$+sd;JpA1i2Q%%FJQmF3CBOKAP(?@18i|s>3|sO>-e}sq z0WD@E$`n>+qqh0YND@0p?%C#qg6ua@h6pv9qr0McvlH>T))gfx&V^|)U$fsACZA;& zuvl98u25B2m{VJjefEV6!aDm!_Z+IQ2$?Pr)_u-O>;bDoVYV)>(VC2jO6i;k$VXqB zuG4OL8Wn-zc~Qf7&}YB|b*u9WOtl*KtvPa5N+nA%pDR_3aKFqd^Xh^H1!sO|QHzS1 zlt<~IM|D}-Y+3Yc$>c)uxS^HpQLJ$8q`)@j1Du063arlGx{Kw59j@U>rX&}6xN1;q zsHCozzZwr+-|%7p0|4ZfocGkAYN(9c@AU4e^F>i4-rvO44g8w+qn%gLeh)xbAZ(YM zmWxr@x(uDujuD<8C3WWs3iYdZv3VEl z7%m)_UF z+=i0>Cd9x1*wm59S7I`#ZwQ(G1;Jl_G)z>f3MFA#MTYaUJndNMmu>biAQDUAlJ@o< z^|o)_96SZO?EVFvwS{gjRx|Ik^KnI+qh;EbfgC?oai30v_X@u>KZQ7p2AT0pigVmQ z0REeox|$c*tQ1U|qxVTQv>pgO*2Qn#H7Lh?>TjP;Spzw$s>|L#szFs_y{$`?Nm+vz-5LjdCEElmu`A5xXak%A>Jz ztGNBkBc=-(x04Dy`Lo6wn?faGmZ_@4;CfN=Y1fckswm=N}yTD3b|6 z`xTay5;v0fJN!&*mOI|2Gcl37SV$@PhYLgHF)1iHEXUh6-N4cTVT>@bA#q!6;(%So zb$7aq2(|e150_~2KJpoQZuYJFnvH0BVl#p>|0>gu{=Kq2;RZjm(Wus3HX%fPZA{X5 z({$=0#Wn*~Bjf5skuufkAYA9~$}!rLbp$s{vIA)s>7`bSFrdcC=I3L$;g`Y z-1r7(>s%dt;eQx<@p%UxR}rQkHOS+!#F2G>l9%nJiX_%cgIIged+4OFAX*LC^Wsqo zNR6|y@C7=3WKU*6nYPAG1&!p%dJaeJ4aKFMXj4?>o`>0(QM!SuANh;Y{l;d1j=Oek%xGGKNepFu!;#R0AOXvur1DwoR zRdMyDp(T*rQEGdcJKgR;@wiPt+K@2~a24bllL?1l>CdNPy^tI+!uT=~D%iKNm+<*? zd3|->m4Os0^**3UCEdBGEc%^6{M%{Obapqtlp@NQ58br-+6PsY*J-U<>0oIZC26C) zRJzJhu3%tX_m8`Us5Kb}4Xr_gjrQtPECaJXz=t16ix~5|Ul~V_McRE@M+l1FJXS@G z-oSDv%dA6%K0)X4jvEJ!cpz`}TkQ64t;K!VdmSS^T$Nmj&Cy2W5?mf82HDZ0bc2#c zb6hx@7Ga+FS0H47EhmNB8V?YvXi+lGUnvtrlS`ok?+B;F8XW_l3c(QIIN}gi(C|9q zRC^#S4`|H_QL=337fCk&!(w*p8h6ov-8_z8YXiRxzHzy)8I$n85j*rzI7Z4A&9t9z z{Lf@Z#)vk>^3C<{yN%}(mS8U5$ujJBCVxR|zH-tNp~qf2WM%=FlpLi`sN0RV-5V~C zwt#xH_QJt%W%kA2S$xZ9dso8#)2af|bLo@0R@HZ7bF3A-aTfmeq2R}kH~(#^fy^1Y zttvA)b=aJS)al?Y<6jLw|C$k|xHbIBhUq&L80$3Kd@u{ zx~n;jwcSHUCgF)P@v)TMOD{81HnnI|n59beOPL0bwjGYt+5+1KB3jAfp`TMLzmZcJ zzKcX$yA3^UyA-OL-WJBYKoKf^t%t|I zEjl~)EHg~DSGJwl0u13{yPektbAst+7%yasG+8G-d?O#|1@n^Zmz}%sgh_W)Jgk?; zRUhc0J%WukMO(J_+%Q6-u6{;>p*`x`=b~+2dWC=-ijgI?g9~5zR&5g|69(nB` zj;8{Y-U<`&I2N(DA?HKt4u%>iGpu|gNPnoHu{@zZLn1C>DdQ*c^HTg!2u4FS;@!up z?ccme{!xsPQ=5mZ0KF#Mm-1!iVdylb; zO*~g_HaxhT=&uhV>Zztmdbl>tp{W0zRA--Q`mUzI3Q}AZ{qDvj3|#(m7*mVM92xzj1%hRI|K7&jUsB6Zf5iT8kc+;tG(9A4 zfYM&P>S$Tv?0lC3cXhf>0jXnq!6~Mr9@{JM>E6mG-Qyudee}aOg>g4w#1?(~OwNq3 z+N%6-mq_oqBYu60)?d1GS+V-6=k(odLL14{q&t}9o+i;y>^sp6w|zdQ z>j!p|z+@{nqZ$y4Yv4b>kG(Rx9mF#KBi0wfOa0(zsKYRx`n_P+doJe_q^RPFcnhn}Gu z>FzG+8oFzSPU)0JL>i=|8|iMOB&8J?x&=X`VL$|w6!1OI_qW#j$63H)U~$eI&b{w_ z?dx-C{ueSh@F0hL>e3fl%b2%V)vY_QdG)C|PN3fHgzL1cy{}?@$yH=Lm<9zs1p7!} zf6K%=_R{v%?=A;XyQ?Nytsud?-3w!ZNt?66D)cZ17%kOV15KQ|8`V#eE=N={`O`-H z>{%t@J?`3}!ZDA9MNHKTZYXiXa(|IN3Hx2;wp3ZS;`@TA8vPD8*Dj~(O&Zi~66{rR zF<<&=!n0DNQtd|}Secnqdi)W?rJ0ovM3SXuUcWFh7&fW(GJY;Sy_&VE62!jaeP3rW zjKX+P}jn(>I`LjMrDZIYm>z}~jG{1D|!-Qso@V?iEO2~8`%^u>dmotk0A*s>s^M?y@6H5h~mE-Jz8n~V&+XSF?6 ze4ja_*DQ!hCU{y{5krKm1mCexu68P^-ljFoDs$%V;Ks?;<_Y<*sx!8&flZ?w_N6PC zT8Jg1@#>*1)09e{_43#jQ=2eGP@gQ)Cwq#FL*6I`nBxN0ppRswrf4O42aey?h$9&R zzO-5uwoROFD&sUFEQU7{u;E|Fio_=^0CYXfnif2y7EKe6M79WZu6EfoTZ)^ zdk&CRISKWi0~Z#+eewc_K-P4j;eX3t^qHqk4&zyPG}}bAKP7=5I-{&5sYD?mb~LBw zHpUBZG&h;cxGi0s8S5aMuhTL^<8)@iC=mxRZ$kv)^tGFZc46wV*O7KqenE{kFNq7( zi=5L4d(>e3q+uBWnCzh$=YY{)^oY3Rtv-5WG~kk~4Fg1Gz@c~sigrMKT_S>Sko!NF zCpe3gXgW{-6fhB%$v#VR5XVOMvPi< z%pK6jC-KYIQ~|W3@e4*d&=s~gK2m1R=;xy=lvwV7d#gELk}!H5mF2$}yHbi>Wk*1{ zq-tjz#$|K!LBd?}fRM838V&O-a!^VpBmUPi?M>A4zd-Dlu%g{O5Oa7|dUOOO{P2Gu zPl&}DTB|)Pw4Hr&qjIw9E$oO943+1+C-B3}JRZlM$MTmzK~}y)SD(Xhu9nV7;y-p3GB<`mVvQXOdh&`vvygR%jH3^J;P`)jKnKz;~J5qKC>o)hYP z5HpCeK&Fxf)oo1+&!lGQD3}q(@S-*f7vgJ#lNLtCu-gFmQSclXO5+o?Ch^>d=o?UR z)svH8(gkyPZcFAWfYpZ%{8C8`Al6}(u{1UG5pMNkZDk1#0 zLE6CfP3AG87L`~$O<&tG^I9frhGB4%r>IoZ99z%qD^z7nj<`ys(UNH3a!5$mp$xJe!e2_!cD%C2|qcu1IS z=&JxF`_Dv}3_7_s^{?!z#r_U{V)^pka)Q>S2HHUD6{}iD@$5}8pB0^u%5>MQUu6PW#Lft z-*mxYEnSN!(lGrU#!@r=9#+x9ef)v;hHG$s0)g~rk0igd5@nraB- zhb2DmLQ$hljp6fzz4}Z3E=ED{W4y&N702#t*0$WmNT)Qzg1X-s(*j8=?AKP(Zks00&=DBk6Q3RJqSgy~IShqe=H2SI;q#PyGcP|mb=$|6R0Sd^beHI=gE*O*&xd0Sme|9 z-O3VBD=iFy0L8GKnhOa-e78O-{T1$yoshzE&u1;Vxa!=jC+5xQ%>r9|=qHNwB_GY=`8e+kwzQ(9062C(H1^F4Z$hnZ&zd-3d^IIcg z<6Yf#k}uYeslZ^yOHaF1!E+^7(FEri9GQ3RpGvvXeUASP$yQQ zsmC%GvZO8&CE8**G#DUi|DH1RI_<9(xP@>`j}i~@|o-l{1T$aqt3N; zs$`VLbo|r=k&&oCJV`A0|=Ks!;G;a?{D{p7S>${oZFT z)g835=Ls~mlp$eJiuP%eWNYUh@3~(!t^EScci?x`$bS{=30cKJtRH=J0lHAnJlEoG zk&RS3`QpKpt}|=$Sb(1TsXdnbfWh}5Y|T2z@@tWBkVT#-vU?cdBGxyoZx;@Ahf6=5 zEO$0Z`b@0<^eD$cqee%m`WE)F)c?ahV9SDIz1q zM`zJr_zb#?E`mx0iQ`Jlc3?KZ1PX3^oFBdN@`csuV+KoaNzfx5%CLvw|3G|}ldO4) zPS5jwE#B9908L>tu;9@ri~#bM(Rg$hMxUmdJ-hVs8=}M7 zLP)ENrivj0;hcpeC?k4KDvbvAtExbyNa&rZYn^lP+{ID|b?ZS|;2 zymH$)DD{UzP(G{{moIV@sc2U#KU+}Vc|I_8QphD1 z(R#+pGAq67%?%X2|MmHXw|3{-&ASEHu2h-+#LMCzqUD~zKx-er7O~nW=lCSGx^?w~ z{I2yV#j>Ijbu3zgFZa|#=lmKJ1g|F(9#p*4)+}rMnHdBYqJq*`bkB0 zQ%vm&9L>#F6oss+(ogb~M}$axWL8`B2Cj~FII1PDn zsyxPmu65bjZofrAvsmIHZxy<0=rgHeoy6G}OPaNBCqPjQKBu3^8SZ95o$ap1s6P+# zd?Q%M^FT+zZqu&|bZ9nk5|Vh(kq3D$Pl+k7zAPcYBu$CkA=-_01&89@BbF>gYu+y@ zv!XkNK}#U9E6YAlI#sG$2R7mCJa>{7=}#0?2N7;Ix+C{*M_SLe%&|S*PW?K01TaYB z{S{UYCF1E0-xQF&Uf!4D;!&-JH9v1+{@x4*yxlr~KP<1{>s4p^cA6gh0VhG9F$+CX zXy%jLewh3Nk#^Dp!?~Ax`YBVKUtxfi(;@#8x!nHNt;;`9QqCvpOmyeIb z;=l!?r~rp*oW_iF+^Q*lp;QLir#pWP*Ik8Lx)F3^>dpm{$sl0HVcaeZ|P1h?rb zW=#kA8ycr2YUOFj3$TI(rA$IK3Guo)7f= zR+N^mKvQk_G?^4P`E^H~zgT%|Y<~!`V@c_tDt`#m)MpdB&x%FM2cD+hl6`8%H zKk5~0F^R|(clAXpx98)%1-KQG2M5dz_sw$2#-aXSx^rK-xCl#~b&J<}=q-dA&K*%$ z{R64lDP1Ok*d+KwFS64$EfzqFYL*Y4bjI|A)w$uK@!`1gXWe4OY}N_Z4dY1!dObHk zcSLZ{kCT*Q5OwoeW3QNXHgjH5$EJNAr4iD#dIM~PuPoeX6sj_mjtZ6M%Cm=#;}MnP$NpVLNn=3Cb;Ui)!;}(cQSynHFts=PRwthl z)8tH3foP0rz!$JrHy9)Dt{ep6f0{Gi4q(kMys~{SP#C_|)7X)yG^I8d7R>u>F-cl0 zjsY|7+LYRm8-)s$PXbw+ctlFbLfLwIOISiE50P6%S*~Pb6mv|U8Ja&{zg07>==Yrt9MCTnsMQ_ z#OY0mxfi#U532G-`S@G#T5ZCcU63%yz4XVyq66BBTV9ykO{()q1FKGJ(;IYm$1odcbCdw&%`j zGz|%N%3pl<#zOL~zYT4+na5jNcBK>126`d}h~!n49W5CPmUvoSWBMhUIe8WDERuf@x&@Y#~>+=+MPIX87{?z&Gbo#{2jBCGAzX3M)Axl>?^*GjQNprR<7 zPbk%+X)IkxzX+TdgZD10!6Ik^B$Am(*;RvAY`zLox#7*7f|*e=E3QhiR1B$sIPj0j zHbnH(%#9zL0mT(G#yQ8AG$dXD~{K2)j`@X;mQc1C(4-6{|Y}36+Ws}jw=`RhFL;11M z4P?Lj{o(!|it@y|`9$=@@xzL##b3o@n62bmEZrT&#i*0#--zq#i6!GP201zEkU!QUJ(td=% zO?8sHVM-QP9(%>ar9|@+EsfFkuB9w;#bjm>Z0YSp9gfu+#sk{RacyccBEn0NS{ z8(~gVHB+(ea@>Lpsx6efTum&qhKFbp7C;O03L)D6;VyF4F4}64J(Sj^GOO{*n;13D zs0&|RNadchs&VO_w7CO+QMrsclhdx1G8}f=LD`pihH_uJqD`&DTh#?jj^{|D2UORL z8BCXZkg-MkkQ{wns$0b)BdBA~uUM8QL=O+i5X@&|>CLBFfUuM(dzQb?th4rXaNz@; zrTuaizEMh3aFH3YKPNGouy_NY;n?$3+KU)%QLUoO_o)>x7I*0X$${FnaAp~ zpqGNi^{h})VH7du#TB#$6fU(2KkbVDfglz~oOo8pbQjZ*kE}DrN|irIt14Lhb@Ca7 z?u55i<~YuEJp5$?MgXc{3+l-WUb;O8foM$2&557gchtc8zva z@Ptv9r(({4$oH7CFvQHx!)8wEW|Cx{{VY2UBrEwHRcedE&9fE>iFvU+$S^8)R1 zOQ$i_<~4}RHRcLW3DNu+eANm{7{S`UQ%2Fh?lcS_$mq2SAh?GRN|<<#3TU~R9P1v~ ztqk?V`?C#ak(vJy&Qzd2n-)49miP&Obnik_vpV}${2R3qS9 z@_@-kE4!M7Tm^v8K`|gWa)I_o3Uxe1YIux8W*Ll7*S;9Z95GIfgTW&xHVoLKE>%Iv zY-OW1i8k2bl`63!jF14UNYXDgyzC~NXXJGZe%Rvjxd!MJ{r%-JYw)hF8U&1^y}x|J zwgJt@sLy1hb&1>leJD`8)$soW{TkjHxwaAaaKtsIbE_TT?w2He&X;^2aWsG;+cpvU zV$OUvBSpw~;IRzY9DB;q3{bZ4n2Wl$Z<-_43|wX?wVXjeg+l9(=wqz^oLt22sL(<$ ze@+eYo`?x+Yg=qjD*sj8x$TmpJ{BBFM{bEd`~%&*ktJCP?(bdNdig}ZeYf3?XDqVs zg=QmH_i-~KlWWQMcYpQZ3P>yKFWJDK+|gRm&;4vwRtHZ<4E$lY1b@+fSjXg`?$UWk z2NITq;_kR4-x(Eb75({5yB%n5cgy!CY_s|9=WWj5K-+4PbdW-aS25m>mr<~u62%P6%!fYg)C`}(?!ywKgA z5=Zx*$`5}%wz?qCpO_c5!g>P+GP30CUXGI6WiKIL`J4!U2SruaT9*TfnPJDT9+V76 zr5)m7C04>XRQTUoxUX2LRV`i>B|EwQ^jm87wRMq*sIqX&NFqS9(yK;{M_bGjA z_38ePE$my=q@P7-&L=tP=0^3x4m4!}7WCw%u?r0}W@!2T^tB=N*THRA=RH#tSYYN>)V#eAe%>vo87#_Ex;TI4<4ztF*R@ zPNBeka*lW^yG_5t&R>-U4;x|U1!D><-i<(?msZxq7r*KCU~XpW=m)HCtjCNz5L_@f zi;baCaaaGfki#$J$=gN&;cp-83YwE|ky8TQ;W-_RY0?SzVao3hA3eny7q3*e+iDgb z=m)hW{c>sDaW26UJTfWx)^Pu^A>u%F;lmlX1^tHxaKGQ-rDwks*%^t7iEbSdPo0G z-eV$c3b11x_M|BCTv&#-W#C@?OpFO~QYG%>X;vw8wNJyROiVGgsFx%7YVypZlFGxa zJ1OVIqFFexJR8a$_H?k8{y;E|VjCq^-L+T8u0t>G6xT}m?xdcl$A&q}HOxAc-qz$N zR>vPojrwTOX?Nc1Y=6(UF3xU2p~y`SH-pW=z9Z4;p2bf^4m=*;_68m!&SI_%JWZkT zegd9qW@lljE!1veJ%x@N*|^i5Gu+2Hr`wj;;jXVwxOM2ghgdHPMiutgX!_QiM0K>p z4&;==7CNs}AAXN?hGKp3wA#?c^;;7vWfzt8patw4UIQ=o7ER{E1P8!;9{)h#foERD zBb0DB>2s2z(2!W06dne!gtiEm5H+J9%k+!mp4_^LuGq zZu9q(6VOsQ`&)cmtpAes&zkl1Ls%k!ZvHFMB@wGAP!u2O1kF!O5p1J(p(T zaBVP#N!lr2G3=$=BrBPD!&%NilX6aR{f1Hh-s-Bb%`JYmlUO5 zZsui9_v1Ncms?Kacim=@;JKv5>_|qeOQj|$_hJUGIYcAiRa1a5f)zANvI*oXK8TsJ z3c5d&zk~gkhKf23S^x%hDp~9yWO0n#sep$vs)7ZO-LUQdf;zp*`5f_p}H*1*bjzih`J9~<917!r@aPYaOru%;e?DV7j$u07mKfM< zXfe)APWllfU;|v)a6o*m1k3ZP>~q57tt3jwINhs&$YAzhdkv-kN(kV`v2jG=v)FS) z8Q0yhU(2yhUZ5>AeTawnoF%`6z1a#$fY-$DAi0N6V>rS9ETN;z^m<9z)G|Jlp%%=feL5k z>_Z5mwgn*!N&@>cs%vaQjYaYUArh!j1Trea0ouk8kdIoDK{9S5r!CfHHd` z0Nk0VqFI0%IZ*=0d%%U`!Gw~r93Vr;2FIa1a{y`r8^YjY5RG+}#@56+V($t$23sqx ztj@TYwXi{R-%xv2!w#cM!P*L7CVS5nT7U@&~9#=r*2oE~YzsquS)KOFe?L-~(SyRk8y znkIGG)d;wX)6{+h5358oipn};0AaZraBq`nBA^;o^Y!(Ow#U}1HdliZ)+&JIJ@wI) zWiq}pf?;Ln@8^Xe(R~09ziJ_MTyun0_Bb;aN?2b5GkLALphu-L>|jo^sY=j&V_0_H zL_b&SoHi{7zM+c|0rIXZA8Xvyq%*~jr0NruPHTCiFt{(uZvpBorsEl@?>&doF?a66Z1FJ=Lu?XT<#2ec8 z+?1CwmLwSBen6V_BxgsyPA{9i$Z(CMVaGXqs$7Pr`Zocb(TGl}c1o@_sca+{5nu>_ zSX@;l^gq*LmoiPzLWS?^x(Xx1@Am7=W$T^(#$as0t%;vADtJpT{6rr-dqe98_Y4#Q zVhU1fa|Y(M>vIeGlE@rOvdobcqQNyk@7)9~M^Ceso$_m!g?-elo0U2{w2XQxDEH_2 zyz2ble;G#w>xiwNcAUfr2^^*qmKgQZ?PcZ~_7W0Uqc#~JF*#$U9&NQ}(sbQZ^~xe= zvK*YS%(@zzDs<%;zK@hByNa^?z24NdSC7mLdhG2gTb^-^ca`yMqVCSR2^vh>PwtJo)9D zw<#r9n{O=J6*uIaQzcG&f$1^vM_sB=hMn6yFRwmgqy@5?+19lP>wmWa9s-z+#fkSJWLcbx zH8YHN&tg9m)!XUAOAAT`I6YrZ-=szMz4>r?r6cr9@V&;acW=Dz`2W*|U*Rgq#nls;f zxH#9|VnOJMQrVm~t&g2nMm~qU4)6U~lnjOZ9XTI%H^YIP2Q0w%*8FFfVt?0+QBrk|w;R~=k zB^1%`uT0P48@86u-Rh>z;2~zz-N}{?KFxgcVF-MW&85cGWhLF|90LhHhqYP@ns3Qr z-zP1I!g87(7#et`Wp;X7azB_EmJrle`~!smgHU*0tUXOsz*r2uRE}JcIN^OVFm(U=ro}qm3iAU2$Ic=!Al+`1! zLI_z2l2NHiC@?WsC6c*1?IOWw+T=Y=Q%Zyi?zBus!P73{N>^ywk~N?Gzx4A~?cx(F z_3~Th5D+(>tBxL|f@oKL9=C|-y}Djy+X|rTL}gD_Cnbjw$iyo?5vwsD6ehpt=Z`Cx zeHA$T8qbDbKYq~Gvm_5wWpZj~R$^jFEfVt|=)Cu~J~3zeu$i;tF8`+j^7(1k%{!6U zX{nif=ib{W701Y2BUF(|dR}0cte*1$Xld`;|}hZ=2&3*zW+7BH%HpT77$qv^d|7 zc9q~+y-F4X*HXnw*x_W|x%h`k{ECSuf-K&*nuI)CD4W(z}ag zzwExVjx>IEyo^t)AmSe1>6aRgF~;3rLqFQ6XtrCt*Kw2kX7!T)ImzcHBQ6U>G-gy@ z%XbK1j%F{2%0;1~nYbt()udzeWnEKB$1Jz1pM9|vPu_Y|aVQ%s#Yo3WGPb}>q7JYBIS>=23?dbM2CKMLB*s_P8 ze_38s7RN0Y9jH6J-vG^#Q1Lgs2#XJdL+nhIBT9xgQm(DA_T}g&CuSQ$%fCN3)sEm( zfBU)7kLx}W>Bq!CHZfou6zbwUITcqlIkWZZ?5Qm=@wj8YDFY`yXlFx_dtlTX^dJXb z-1NP8V$QL0e_7l({GeLWS79{=LQB1}Xn+=sqmxi&wDZda?@)KPV`mj?EHWJ9qy#6f zddcm|{0PVI2@3eVcdz(;$S!&%*p2v{9Wm zxWW&Ug756UHgM(#WYP4#X-bYV%+unN?m2RYANRJ6JQn;*CWq=4^NmD&s#BNAFMhgn zOSTY=!wq-{6sO=4B@St9L>D>R$@b>kz09;x&NDAQn(i!lX2D3Gw1!KQvlDOpChryX zJkvtcU*41-zZPO27iHY}I80dD*rcIxtUkg-%U^x7oA#AnY<;8STXOV*RlPR^^XPJ( zklEf^Gw1Zvn4SU)ErE^(4O$VH1@SyXiYWbHR(5^P;3n`3SPK7uZhQptVxkB~>1Y(t9rNs( z{w?QYloQ9M9@Sh%waqSUmnZz2=ioLMrM#*j7L;UN{ZggjOOTXn#ylp4Efasoe{;Q@tn>$RKhRGz@DqLI1|hJQ%Y;!;7^-}4 zOJa$sr_htKcV64G}ZG0k7+fIEc#$0TGFpkD!s@?O#XtU-(et{+)8{k|9 zpW>sB-`?OmQ^zx#+$iZheRByn|J|k1pO}$g=ue}5E=%!7wfN>~vQ~QpzUW?a#BH*n91(nSjq*&qevRpp7cE=0p8RsME6yhTrfanX0#9R@Un;?`5AvgfEP* z)jo`H8;N=oU>o_z=(}P(E$8;>Pw-4O!_}E4>oi}4`HKyf>ynhFL&xm zMr;Md|L8bA`s63x4-Zg3)&DV$U2$lB*Y^)Jd-&8Fa`WR+H%yoPWbAR^sBsFdjARch z{arGB4ZXvq72Sn?#{6?*fABaBN%#jz4Ak70yzrzdNsS!+WTn^4FFu=M`P0ZE7uAxL zDY5)nrMb3m3{wMjN6xCFUz6eiUvX^TKrV}l{p^e4=PQG-W4tOfiU9vzS`9#H#gDKY zl9}V3l@G5G$&x@Fm?T*iZ<9ea{&8jMgXM0Bjecd8_d=JybzT#XU8^TcD7jf~Zu!SGqya|wPJjc$}V@#W!LB&hzuB*IS9(8SYWSitU;%AXUBj+h9{XB@5XGndu z>7-4Q029S{ab!ei09lP_-)X~mDZxJP>_|%879c%*f}^(QE@J%%yHd4Ed4tNaQ1kD^L(ABE^%wK3=vL89eY>TdI~Pf z67l1;9|u+TLNc(KZAfArxxTn3e?YdViRqVWt;>5r2E((f#*PZk4NjY#F<>_!_PUm7 zA*cMhN+xxw^sHhhGTEx=OE?MFq2AMthBLjANo^%R3z^|JNq@7xzF)0Y=t<~^LfXr5 z6DXRHY4&>+rePk6HY83FheA8RHz=*VtouTqI!J z$q%mLAy;SB4i0z-bR*7d9Th`Dk{q;6qni`iaT)H~2@dom(hOGat#RFDVq$YFd$AoK zBl!NLQ<^w=G1PJo%~+VQg`g3lNsNFj3&L zC2trS%}&Z!PqVHLecC?#MrIDQ`p|K28U=?CQ$?l1u?VYyLF$AMRl9>iM0CMRWz1GH z{Y@h!4D&*Ww%SqZGA;ZKdrNBSauT4bBip7bTY!$qGFLLk!9Hfas;Da8RLQI}T=IbU zecFni+i#%p)ssSX1()3Isl6d-eO-InvK(9?8rE7X8eGYrtUjJq)m&!`JFDkMDri_! zYe+_Q?`0;}Hp9B(4^sOBbQNrCf>}gSq(T-rd|NM7hDP>|h(=HAXM#CIrNXNgv-4(R z%nNgt3B1+nxR$yXk23q8XYqZlTU1#rC>cE}g}CCy(?Z|vX4m?km6D_9q?hDz2?zX_ zi>Xq2Iuj^d^WUd>(UZ2^n-f9}dCQPYMu=-cqko6Y9pwT1 z=E7TyuqnNj$-o#ept$e1CiukS_7=`Hs1NfVan2y-fJd-z@ydl%)m#6sYH-ONse)Y4KNfO8T0(V9x~8} zt@x$DJStwTa*RLfoM&)7lqD&`sqhlf-t11Pqhe4h;TMKI4|ISJR3_kWYW|BuQXnRM zz;MvTK3E=1%_ewQp!1YuKrc#jy93w)6mNrnr2xoxBm-SxMkzIlCU12}svzgIX zqMUBMgLFRtYDf{gsYN&7z=2ADRfiIhoq=~Q;bEPGwqQnvr?757xA@GFhqV_~tm zZwZ`UonY6WoF z+iiWkeM2#5{pakwGs4>qS9`THFp%6|JkQD@i*|#5-bDBr4r8~PJ4nPC#icrY;F&+R z$VAn%pY}dhBdF(OADRYTaw7WexKAV`B!a3gCtu2?&`I;hR~I`FuAAo1=f(jNU;8JzRsmePNl zR3v|JIk5i_Zt$`EreX6TspzLd*4UU!esssE#FT^rl05k77xxJ5Sl;k)!V^oGxsH#k z6yiEyxxhl6c;#8#TF@KR`K{tbCf|>trLWC{U$-~aK^WwAR_%Qp4)l{{-DHIzwv_E& zt6f$&pOEDTT^>*!tw(U4N2;+5CZFu}vv=~9!_yV;SkhYWZ%%KOt%s2qtvED6ZvB(ZOZ)xo zY$O&f)t`CT($JV^j|+1q-#BSM2BL5emhrlf5yw3`qcLt75B z$0u#+uim`;vg9LiMw04DpnTa(J-2hAj#47F{pYOz^X|QN8Lc5lcqmBeWP?Bc)i-i7 zE|>>RvfDe7DL@tFR=_PWJlk8NZz(=2@X18&Z7Eo(Ce>eHx!6m6O>( zH)bw#wsx(e4XiCl3Nh05MwMHM$`3zqBBWmP+d+6QFYkhygkNa`p|U3~A6zwc+6ZOH zzu4jT*m}FfI)f}UT^%oelF?C7e^_ff>M^==NnQ7JQ}vLC_=I6^cdzyJJ>P_RXt)P> z`M64=ufP+dCfpKfOPKTYZm_efIh^gZijJLOo<{BB9Z8Z!<#n^ve_vW^{FyeV@MM+#E?QA3i-NFYtqjFB_h8+S zZB9Ygr z^Qhj4QO_vG_T@YqG&5Wwa9Qzv9$1UpKviA0^?z}i)Bt|A68#TLEi?e2!Fs9f1Ja8D zPC%>xQAK3tf^HOt=$!X!z@Xa)$Lt4W_f-i2E0_l(IcH9((9~@n2{S55bKa=iG~D;AsS|LY!m&Y zi1s(p*(j|#^!|?8Oa|4cSWsZWGBZ(Ms_~Z*$-7e7{%ndJ^Ma_n#f&goy&{?s8w5>j ziMy`>QWE3U0`($v>+D%y#Gz~gY<_4)j>cTxAcPaH!2$qGYfMYhrg^^}6@povbuOyQ zl=v(GZz4GmAE^L*bOba)bifw+e{vrrJTq@ji}4pjrNRVYsl<9g6XeTD77xy2Mn<-P z0e~>rh=H5K;3p!+ce?~im{RgC0x+SnE_L9HoW))$c%798OlS-vqZuK9R;#l(2PJjf zWKv(_)ltKr`cdT{)rw;Chf7haq}M=qo^n@hjT=fg#|WkI6(?ouA_N3O;IBvuA&k}l zX&j8eat5yy)x74>l%Oq~By@2Sen3S6%SQ)p4loplg&Z}_q(lUrB~I&LGHvASKPj~! z28v$F{hls9HNqALLd_b#WzgWO&PlR{fl(4CSqp`ifdqocP;+VhwW66GYC~k7<;JaX z&E-TBvKquV;cWuH0Bg;Fu=wp$jTGP`7Q0f#d(?X_9PPNE6Hge4Y{3?>iK^g)TCa$6 z?r&m!&>kwXuXU5(KkZL>S=e46iv$wga8I#n^)s&xOV@PKuN2Bu;oi>29LXbRksJD1 zn~!PuNU|B{E6r55s$*wm3t6PuM(qSm`I>@XQpO2c>BuSZ9t0Rt5+TCX7&qsNoP(8O z0R>BxQS`C|>wj6FsDv>hz?-!)Xz<1BFh5%K4xKiQEn@2uK$yeOa@CXub!|D6?#qHn zXDlfz@Gyro3ozF!iasmG<40idRvYBa3YMuZ;c48=ieeo?+<~z`Tds`Rd1waU618Dq zJX-<Yr#$E`^=*&coiO7s`WDUG{Re(D%#Jpe9a4LMdH@= zC?`c%LhJGy;^$q0opuiDY8D*rBg+{(&^4>;;I>3p8rxOxIddieqpc540N{45gw!ej zR|^6Z+vlW}&=-Rek3>1G`DN9lyFP@JXr-qGVyz-Z<*^JNWoa*Y4;rd!+uh6U{a@)j)%Ft9soW8QCN9`3c$pDGm<_S`uu_{uB95 zq@h==@0E^?x!$_qgpRKAD`(GP(z+#VA^g}i^=c|tjcy1M!$l1%WO-D>iV(SXg`S|P z=|@%f{VNqJd6dd?;utZ)+0>^a{Zwv?p>fnIGy-KYS}tXUzJYX`aV_*r_J>UDl{2y+ zL=4a+!bYo-sL`Vbp>^pj)KeX67t}>W7FIzGsy;_7wrJ7zf2h-1PwNR*P82W9Jos~? zK6+*l8`0WW^`cY!tUP`VW~C8j*loCG2=0wvQ>d-lHZ0(rk|A@yZ}7Kzn$T8*OMakP z_H34cSu{wHFExILi*kD^!2A0{ed>Mx)^r%s^6aYmkmf&jz`WUQQkR^iQVz0OG&ik8 zvdlNs4&W+n@*Cyv7A4g*2aafRrDA9l=8f}p{W$|*^HF1E0ZUV4YD!fd%RO#?baQV^ z^YoIDX9B-Y>kJo^M``2lE9!l}d8%u>|DB!VD!TI~p@%hTjG^`S;qBFk;^IZzzO=H5V&G<^0MF&rc6CD#UJBW_k13Ni>C( z^8c}P)=^Ql?b{x@TSQ8_1*A(FX^Ek`rI8w>yOHkhnxPv6X^?J^?hfe&zx}+w?+?}j z*4hIzdt%@Bd7a0xB1FB)Y}!5>W7C%0N(+%iU@ku!UUONMzHQ~ZO#NxN3pU3}3?R9Z zQwho^DQ4b86YxSpgL#Kwezl&bQvbzU%tQuJay2=FNiRvwuMRgq_v@%x(t4R0LPY|^ z1B0nB5@o-$YcSh7_(p24Sy?*7Nij&^(xF#$lHDqS92dYPdHxcjfxq$LH97UFB1zVx zYBk|Vm`)N%#5-}Pi4vY|FPP4AH+?zW2J!U#t<_i~u>E>)rY*dXE{v90`a;*?dd`O( z$mHh?oK#SJQv#=G(h_eCM1o>FML1tP{((}HoQ+NwP9Kie;vq6SbM@!(6Lqs<#WGyM zDQGk1dNp;c{W}zY6FMn<^SgirrWd>O>TcUQTG_r@e!r8)3s@|Akf&`O=iWS=?W6NC z^KCzoowS2~V3_(n=Mna!v)V}N)F#82k)?UpslF7s8Dyc+i>?xsHKuRF@R+Net0J;L1R!cHo0qgh#eO;-~o~^=#GrRe?j=kk3_`b+TA~jJkSK0@JdosFPx% zpNEp|sY`$CgN;ZKL@mC2O+i5on0bWdblu4^d{MLo`SIjz6*Y;25;=<%7Z?QGf-MBI z1N333&*p)&mt-kVQU1E8lIDctm0+-9 z7(7IF{wvCj?Y!9w?){(o zURv{r^6#Q2nfn4gK~~`6`1Z%0 z7l@0e0QvQiw(O*#LCA$Pd92?L*KvgNq#6QVRm9Rlzq^3seQx}zYqo_W7?VNQdmpQj zbP?sNtT8CE7J3{1!4;umAdrZ&vDOj$qb#R~GGvFtuU`)+ukU1VUk70=uX@;N4e}=& zyBMfb{yw0oyK(m`eW-XnE~Q|o?(vrC=>IcM43YjA-(&*4Y?)^t*-UwQ;g4f+ zHGylkz{5lU?l5E6V+(8#%`snZ$n}US*-wOG94@$$@r@kjcvP z)oG_cypVsOoa13r(Qs`wTcK?jYdT1I`LP<$&ke+dznMa2cG5DprcY^QX{rV5zZd!7 zYdf)fv$!5s+xaY06ULKd^EMl_f^(;@(Ak%1+1THZBU4gzeb(MMke-GK&!C1fWmc(D z(~V6cCUo%A@mUM;(a92Mhj@Lj?!@ia!d-ShpcW>gJ{}}wZrlLFo0_}ow>5sv-1zaU z&TIxcq_ZNumw>k5BLag_44zMvig+*ju3~f&&z245vMcYb8$q6`@h*06VmAka%9rC6 zL@*q-N!pyTQm^(-7l|1@(vq9Pzl=o_)t~?Digj~jzV{6Z^9vO@9)C_P+&mp*6K(d} z7I02w7cIfm8%PT|Hd)}wCfUVV^&tC(Uu_UOp|P8{_i%$z?BO`CkS6JZwk%yO95st= z`#WxnJ5f~mFSP1C_9tIjw<~A8D?_ihZElx}Zvsl+lWf15 z8Y4Nu7CxqV^uzd(3pg$MVdIsc;6?X8CT z)68S9<}#H5+heh$;8YaLqol`HV?0rehQQ z$`Jb8#5I!3i_v?5cb?$(_o%g*Eny2I!eM6OCFSl%i7|hChTkt+q^{wEVObUrvh)R! zBNzTSx?Z*4Rgiv(?;I5YzuolC-f?D=P0HbVejviaDrHEyD)MAKpGg&blsTz(Jof7= zsU7%i>lr;VVQnPVj}bDmeD2-%^~Q+nB^`F&N%&!C4E7#q*S@JP-I{g(&ZDcBV0eJ| z-B7E1cE5A;$n!&W)9$>xKmkoUJlt99-T1vhCO5YC;4^EpaX2N}7@{k(mf+^5e}ZE6 zw)Twz@$N5;u@=g9e^e8^f+6S0b7Rarf@wh?&82;=Osted+6pbDVL5Ckj#@#Af_Z7p zdzUkRR$5%Q8~x+L1gVz6Raf?Rq^u0~rf)HtaHrC^5h@VsW{7t~6$!JJ9>e(IuB_X- zT`oTQlaI>I<9zpCj7CPtI z#PUDo$?n1z-4*le(E}lWTSYE{*PS+33WZNpAvpI}9K8W&9BdOR>B+oJ-;{o0^J2D$ zL-ce$Yuc(D3Ds#K#wktxa;JZ?fs2U6FvWD9rNz-DL-Y8PY0JWW-jlhWeD!=_Q!D|6 z(?i0fuBVI;GaxD1VkRm_92<)iRIkG?(o{vOR6C^yp^>pO$3FUSIql8aawQ-hPDvhT zfElg7fj{eOQYPq(ZjD(ZbgenW=3q(>B6%!!2{M$s+Y>7Hx&m?E%g~0b@W%N-#ML^w zxLddnq>eem{KCck#qe=H#;-GSAs**VaY;Q>8+#YVqnCzTgHWV)1Ip9y4oXV9sES&$ zg>l8L9YJ!FyYqM-ozvo>annnkF97amE{*(Je@1n)6uh}ol^lnH-HPaZxau5EKpQ7T zR~G5GMMl@xa=nwM;mDDxT0|aJp!Eq?(RTD&j5vRgsc=#Y`T)?slhsu{sIoGpB$uI0&ghvUqB{iPzDU`0664}VLB-2N2o=YjLe?a4kK!BNl5UGm z$>38glVy9z>nj@x6SyLbrJb=riG<*cu02({8l?|%fYOC*YNjfcjlxkm2u2<&lWd%f zKtoo4%8pHzSs=9&aRaKPSet6mIOkkqqZF-AFs61ftat`THACcIJ^7QD{tQQ1FK?B; za0!@W7Wt!mtg@9fs38l3q(s%@<=tm;OnlCtc0d&^5s7%unq)waM(iJeVL*cgia(zH zpm{@AXY3pgowHSO{6mTu9kJMHXvLtfO7zZ0^F%>LSc`MI#1ams%STS6j8nDn35EFH z*iBfAX-BP61%WM*lUK3GN8#4=8C-cUdOx)pi?1U39wU6JO40zi5Mkge!D^id>;-;v zp`kX5cj?Rbe>W=HM+8ChrB7oh%E`Jy{-!mjaPU^OUPR(lmgzoC$*KuN~unY-n63Y zDUKeX`{F>kHOpNXOyQWxRv%fgIF1*otdY?`w-Uva=B_GC{%%S@p8AL*P%X%C`)px=8ukgGSP?b9hauL0D_vx7fEdYOlJ zU|kgMm4kY>=98pzq2b}jqUH<@_^b=JRvBT4#@?4mN*(JlDJ znF6@x7@#Pq&N49SlauXGtz#d>@D&6ZG45!{^A-Pvm1)dXPFQ5mxj2~69AWXv@zL!y zMDL2ZCQCxGsC{O6n=T6ISR0wP;>W&T2~V_1Itkg{C{3|tM1Ql;J2R_bX4c5DX>O;0 z@+sKkv@STqAd7RB5QDEKOx`zASRz(;cd`y5VN;e{gWM(6Mtiv`leRtOH_9SD$=<$4 z{A*=L*heLhRWh|%=$JA%evW62U>2h#=16tm#3vcK;)cmUUGX4_mngEZMc!xzA`UxB znxEq*A_;1hw|Qiy&|s?YZ(le|p4+tq(#qsHkuvr3N!vSFTRHXAYk5N%?rZM$c{-{} z28gC(UT1;x+mwuArpl_LQqej!l}j{tAx**jPuKD`FB;~<*b!$8UwP2vjn?o5^JBy% z3KmDYk)Cu4uvy)Ziabfhpt|Oo|8{$d=`Z{RCxSD~^A&l~WL&_wW z$w4!pQ6;d0tN%Qf$p4)U1nRTE4jFUCNw@w_G?mSCU{laIAf((9?3rv99Gubd546Hq zLkEmFSTB8g1+zA8JqQZQx+r)N@wbG{Zh^(@38WHq59W@wd1x2T~x9?h6|m-(!< z^Vz(*7(tSul-sTttSb>>uFNEFjk~xL4oJad*Ho<}a8;rak^8RYr94Z;@srO9^F@sI znaPG0nb83gDx+)#Iwumdf~<5DP-xh@5!b=Ex(&f0#-Y7f$w#aN4I^L#e2Kf&a78N& z4Eq>eLLf!O&S8WIsM?hNfs)E)cb6KG@=8C9nxn}FTvnpB0Ptz^_KXG=+*m4Ig17Qu zlaK#xz2XAuuvJtsX~W)CcAPJ-LzBq?x&*DQ33x~nx8$`lRO=cziwbV2{BGX)?<_j+ z=a^HX^^J3^9&{_uZ)oDi^F$qB2Yxs|()N>I8UBGpcdlN(o(?GQo_Z67?72WcDaghN zzK>ek)U>zFFm7m&u`;ym!St%!`4MfMenbRoD0|<7UBe@sI=Pv8E4!Kal*2c`?XqIH z$7<#weLTE0?Q8mn_}B4*dm2gTL+_qd0LvKImSo9{O)K>1wAh0em~r;}{!&{tzoKGA zPd-z(x9y5Se%TFGWUI^G;0*mnB3Xxl^S7S>e0wZ=}$k2d}Y@=oZzR@AW&ZncV<{d+QpDeRz$!xya; zZx7XmLrv?lUfDJ|n%vJ9Mnt+RMh0#5_J&8VrcYOsp zj%kNc1X87@(@ohF8*$%(z+=^W>xJA8vC}K9{QKCPIwEclVKGq7=t}vjNJ%EzzOT!l zFJj5ugT@+9N~{6eD=2zs?^peOz!tJ8&(V~fNE!_jJSN2G!$m|>qt_ovg~jtYz0uR> z)cS*>hmqaf%JJRpm}8>R+WlC5uEv7G<%_OKPj;y9@6>Y9W42X-X86#N>j}M0=F;ha!ztX;U z)n;YVSZaJ^X@c~1Kcagi?CGQ7JZEC4DRu@g50a65T*+-{*QbZ%$fb%;Ajw$HrbVG} zSGpkYRZYmBLsb(W*sFG+rkAETd|}idWEHq@=5F+xcvMtMX^V??vaMPzU(}J<&hVTJGcEHCoK*W(A9G&omsh zfSY=xM+VQw%F-|0wTQ|0KJkwU8&iUb=;OrJleD&S;b^zg@r8|5$i{KS`~rC)NO=wX zHuwUrCKqU{(grf-r{3J~5fo3j#-- z%y zfN|I5lp81#I!jRc%V*CXs*Q`eu4;!MexR$}ms5WlspA zLf!bzm`(R3Vp1aFyI6_Wn^<)!VxvhKmd@{I0mU|)NVczt)u29Dl0pH{N7N13ypzEi zOfaW2p5i1Vb`F><{r#rv06%Un9~)IkEdW&_N|ttHg$a8-PaNOW_qTr;Sc(wQVpSjd zfGR;C$L!rLk^0;(K?IK*{0`_f0-8^&|JsoM3)TMXDlWe%11ze%0WzbO5JoX{@>*~{ za395}fia}AMfCUd@=2Rr`2+9?##BOn(zwBNZSdr^s#&xy^`5lw2n{i1D%(j6R^<}7 zfQuX#9^mduz*({l^EfHRkFB2t|KZ9xLQ4ptV2X|}oc=C>n>85+(0C!J5|v1^6W&-n zD*C7-e{WTS-$$z@gr+g$27I01T$TT^Bt<8|?GHo?tH6zZ0HWN$N!3(C)q@|Ka2t8W zh!!*8cn*(a;n}`nB;fyKHVC9FqvU5&*%y9$6YS*$#MER;Lux10^oYueP>gy)q-88uiR`2YRE0u4 zB*eW*y8k+%^cLkq%%%tpdw9yu;ouX;r{e!EIg0*EpaDwmf5D~@s_pMtTfo8b0Kv_# z*!#{DAC4+P2m)LRr5f$_4NR{D?2{6qKe-Qai-pU=atlHjfG-fO*G4?r=w*mrCLR<7 zM2`PG&Ht0%0;erpTFhTgtqnDJ!UR;yX zt#dT&Trbcnec*z~;DS1dgk$oZhRG=T>@AAsQ(1&&_W}6a?^3D&416`b^n7E^e9{rtCbh#hynPTzr5!&O zYz@vwmH6~d0)U7+Am&SEzc0tqR;{Tyh5p#oJj&YXG4O((7M>Q`T%w`LB{I1T&8Q0l zW?j|Z%3sfxo24oySivG;1Jnz zA^LH@2+|j<%2B;GyY05Zs8zCW>JCvPv=B7@#7Sl>vspSGt~YlI3ahFt(DC6Quv9S* z$`jKs5zW@Q4tOoifK`>FMZKzDU?|r76UyufxCh>o@kd9Vt<&zDEq3(%9ID|}; z>28>V;#QD!7F?@hoC|-4@k9s}u^-5XiAaYM6jrK-411P?xB>5Of_!$;r7J$XmXMgG z>sMh3p86y2UE*P=V)plwQUN6HX2wlpbmOvK-@d@bAn>$5?w6P@(PX8VYyxR40p^kZoH>5^930Aca&tw0G0KUe2Ay@I~Tq zd4`p)M=}dBU7Jj;J8_ZtO!`Ti%P->Js}lLP zfD=IQfLl}}zv|7BQsvFQ=#)j{@DRn@La;|jVJOpY&~dXE5#56|b6X4u&2fzMiiNHl zcY_vff6Thg1mD-~^q^LqSa)mV;A%`v<~$ zCf+k#(pMA;hZ7o!iQ40j-I~iLe#7{y%;d-Tq)fr_^=nveir-feVncoYy-H6{-iIOA zcS5)#L$GQ4PyKy-l>YjDEr$5bTN=B^RLM+}qm;;KB7m~b?CyKWS-F!+Q0dqeyIRw`?+9FA| z@zwOZ{?Af@zpNfktO?UfMXoWh>Fw9-&D^u5R<8fzt(wkftvU!(@i%ZjLm9{oV|be) z>PF0|*z!x|vYMdtlvA}0W}mc*2(H+iV=Z`ZhL&9WApWOs)YR6qXz}1b5KCg}+@(?D z{oVF^I<;`7rq$>m8n)wst@TLvVoUzE7FvHrP7t|xK%=I12qD98Q)asi%(^ui5-_{rjh6lSi?v@4jqe(f+(9 z*P3z?DxGgHLy{rl&UUfobTwiHtY>P#xyxd*a(D1%K5au4rL8X5LSbFbTBO)|mu(5z zx!nA5qvQUV`_v)&Ir+93fI}@NoVEDy#VK+>OYr?YX2F1F#3r6!E*H!=`t<@NMSBc# z83G#aL%f#cDH^*v;|>om#i1FeA?I3t-%9M!O}NTQDVw%NaWisI;;?j7R7B$hE{4A` z!(qcCE5k@8^VOf;mH9RhO8T1M-!Ttwt1zDKLa|dB)mPZGSwk;*DtBXLVi7!1)&S!! z4HL2A1PAoEyMII>MY#D!GH6MLf%%bUsSZJgO!)6%>s?vWd*h!bSfP+ZZH+Rb%< zdF!Wp*XVyD85d08LA=y3HxVu9>b_H4 zb~?_rmiycj+(T5a*t#?3yJrJ1&R3=5$oAp|6eHFbR()4{Y)GpY3(xmDIn2OGe+A@l z+dGGp&j50_=#x+3L0XoR&$K27mYkyj%H$^m%M`$+l1lpt~Bb3Ymz}gOqIxZ$_Z+W=DS-C}pr& z4CRJYVTzW$HykM>BCoO-(Z$3XntboG>2e(RNSQJo)^$n_|3w=^u|VdDG%brL7;d&MlGjxV#N|={a2MH%sfX4PEKk*P3xb`iZUJO}~wq z1uNl?6N6W34@Qctz1QbsNMG$dXyd!y4HlbKoDf;fclk!kKi=0XV|3KqKax9=?WD}o z9OD~Y<+CBsJnbgPR@~>r8I;x+^g_gWmSU_=#`TWe#C}kJaj^0w7uFWG)%2F+;2#LD zD?FRBx@KEB>hauwYR@BkVZaYQ0xImvsur5_doa2e zdLewBxNp_Mg6mTr6C54h*XJjZl$b`|kbbI)UM3@E3&i0lsy>=fp6DoZe_xvA$C4lN`)|8wNNkcvi@%N#GuQwAe0M#W~IY zLJ#L{%i|_bih}4F68aq{;ruP**EG{=hyU&lci0hgB2T(ezjfvk(xw&|UUpIb=y+J+ z06)x>DEl@bE(ajZE!w`*FbO%a&EjVCjYi;o&MFRNN|-iI3*^&Cv&Kg}2I$~Pk?%Iy zf`s?g5z1V9Q4BW4hz-~{r4Pk$+ybSjcqV_9?VF^SAMh-iW>uSu1&Bmh^h-Q5ua>-% zb1OB~MCM9EP(}HIhbWXOnB!b%DP^M`pXN{79V?}7Jt}()?~ylVtHN6a#!PJ1fNr+_ z;c?5^_~5#uZg)rAMhGq2`gpJ*AY;LI>s+tyiWOsaegx**5{Tevn#?Hb*hwVzvV!qo zkjbVht>iIVc)!o_k61QW=fX$$Dtmc=4tDu#Btpph(Tkw{s>u6_wSnj%3ywx7F44`@*YHTT+;SNqGtDURiErD zWEu=I+^+Z?+(iUWGuxL3M{kZCEw%#9Mf=FWG)r_+!DfZR6uuzNT!)a2u&Ur9JA#ay z(FbY>$S)FK(6SX)?^uyHPsep*P=S@a(u6*Y2V+Ir71y0~-70C?zhxV9=J_$kL0YBO zZM)j)W}O2owou_btxv)pA^d}Ul!q*BM#6BVme8b#>n3=ow6BQJEHd0?A7;%;>8y#I z7T-CFB39A3YtNTei{V%~XcU6MGEwd8?RmHZuL z&o*le5%g6P9kC|eZEeJY57l2E(~1{~B=|^Yi>*MhTNrN6mH(tI@3tX`b=L25U*3kc zna^m1?t!Sif{$p2rof{e=M|yAhx7a}DpqPtSUS?Ql5s1~UkX4*8|E#3$-Qb_95HJv z>o~?>G33MM_obBE^*}O1D*cv4gMq}+OdK0z&yx8q9J#h`S^$9s(zwmsj{ohGV1biVbLZE1kusv?dmYrIp&b%dmcIP!Gd7Nq#=)qbZh zTHX}v@pfXDk%%oBv|v0o{{x9B_j5(wYYnX7RH`Ie>ZUMBWVWJUCZpb#bSBQT$Nu;U z=D~YjIIDhq<4c)~@w)iNakwZ$gu2&uF@OWxiV&D5ILEs&G}?C;{yT7GQXSC=jNMJV zj;{|~KKWM1vhN#RoxcvW{Z<;*Ggdw{h!2gehSsLQ^S&QBANT$?a$QAACLa2A7cDa^ z;WX7zJCJuuIsV@5iOoRsa*(ja1I6Sy(SzWrbk)r}i561i%;Z|=^qZH~8TIRXec+`v z&l?N@kH`rP8(6Klly3^j|4Jbt<`fwzmH&eRa!vNK_a{lHGS1AzYI;xJ64Dm)cIv3A zXmZlnuF_-{Tfxq0+PEo6zWFsiNSEQ@<$wcAMJ<#H=@}j_T033J9Ag(g*YLA=kpXnjSCuk#>3S`i7)#e+Qbg zh)6e0UdT@R$5OH>tTULdfUAZ!ex+lK%^M@?RhWuc`aw}Rqr8EtLl5G>&jO*OcJYN1 z*oP)sPAx(F))x~ka2`o^+lO0Eu2pJ63&0>Jn9%XF-j!M< z(bt7ltWpcTDjDipk^Mt7a#tDQMDmPmSLyoe5WO>uJ*8tInCw9zznVq4USE!l%j3(u zixK0Lcr`qMI{Q#H^%(2ETf@gkE1)i@%oghVew01y zk*q3^#2nXLyk<5Bzj3Qh6nYn2n zx$G2tDIOu8-^X_Z^Xifgowku%WvWExk=1ugkdL9RD*dxp3f$FzRhk^sXeyQ!(&M9C z@Tw4u;CC{a;ijemje$ooJ6WmJBUHX-{&iQp@&HON#5n%uP*=c%EQv^|uZUfK|Gi@r zj;e{HyrJBbrV&|u)~$ltPLuPcK=FUcnUF+7|H~U9g0>KBSI_c>pG7%Pj4qWsY#FJL z2e-fkdx3IzS2V8RaE-4KY~^Wm?4!z@Z-``fE>kG%)3`9( zXg*vwoNn1)q3h~T%1vMB7lGIBV$0dw*Pzj2wjqiaZWFyLv z$CXl<{zCDqv-}v{sG3zKUHL#gTS9RJE9+T(fUOpGsM8pd$d8A(9PWc$HH1Uc7c%1O zQpT6)_KQm8b*2QAz9gd$H*BlGwCVt(s5U%qu)k!6^d&B0iB(W1Egpurpxv7k@h>Te zH!2t9WW{I=v39m|%$85UUSIh^Ag-%8N-DRlG2Ji?s%Yi+Rf3g*bCiuoryiavyB_0zXQKwH=b(jQP~nRpD?C$^?AZ{ z1f-I;o{4o**&ThqW)B(m4D7Z}bghI*c(i(b^7uwX5s?@js|PqboXJqfx!eqy=Cbz; zyIjl#5yreG2-c9d1f*LJ4``g*v9723n5`(Y12=}{vOV$tB0t%L7NUW83ROSNeZOJ) z749dn<5vRj0! z+0zUBaLErek4}xgurK_^lvU+|CeX0j=PZMi-CmkwdAgR%p6vefedTwZ+0(KaANptG zXjJRH4x^LB*t!M0{?qs84%|rbv;-ep3>k}Mc{@nBdzrf(+9+H*>-%$Gs<-t*KZ$Hr zo|5I_#nD(Q&v~w-JMH$Gd+%vKR(;rQ{(gG%msA}lzfL)7$cx9C1KZBw-`?j@K%!ja zQam^-Jor_(RUv-cx@xGWSr*u1&V74h#CMUMEVR&`sOpc|A1#y<6+2@IgPmUs+?Rex zH{mhjzNpk%H~CijIU2?~6GsDmz=?3om>n^2;wD!a!u;NY^ZC|@K*jdmd_$x?)(CBA zX!4~W>9)H;HXpb$Lc5vj!M)DJYb`2OO*L0EZzNGi=lqtU_C`(mu1`G!i$f!SoLn}| zNczG@QaV~qDU+nP!p(^4CAr-?RNs9N?+piwmQw}-i4F3Qk^Y5+W+dCUo{du%1j<|e zSLnLm@C!=m?fqpl(Qj|Nm4O=WKjf`cwOm8qi391Y(yf>iX)e1{K0yP~*zCw~N4!S# z7tt@pg|gL7-#%w%P2l@REnMr^oVC0d6`%6_@Xp1rDYyTgQFKwNNsxEa@%Q8~N(j}L z$8pK7?CwWVix|N~+vU5}v5wVlZWg_TR2%Jwn32QI`sie2cNYTa;}>`6RT95lN36yO z15)Ev>a>Li1KD|LpH}mqd!t;WJ}z?hk--?Xw7`}e`dE;8WSWmq`8m7{{8(4D80cDr?-*NWuiz#$Zod7QP9?ofKHqK}QV74q zzO-(^X*JZ^;aYg>_FDZK{lY6WLHtzz52XDX3SKmlTmG)Ic!gw(t%<-@wMw*U^lc8Z zSzIDhKq{|PD#c}f^2f6@l0As0hLYaeKe>t%Xje#`y2gUj4Jg5&yujW?PJ-}Xc!=pc z>1_>3B{^y(D>FQ;nYAFgTbElEgk=V>ikQ{RXET!we{lu%ZWNO#L9Yxoo!V=4b#q&M z`58S6FhdV>3MxYznK(FhT#U7 zHgvZ=GW~wz_>^Z=rX2TOA+FS#YK-PfWNiK&I5^e>RqWnviZ$0b1i*n($as}_0cqgF z1{{dRRN1wt$XJaw3m2!Z$zNn4sHiatAq9SdaeY%$nqKrV* zD5X>=-`j;+eiVW*V|bOapX{>YB`3J4^;qu^DAmB^zeFi(?c9ht)K`_cZDLKPNw?ck zZ8BRv*N&;{>qq0VroyX`(g6xe8Njxv+o&2x=fWA0kabN(187-D7*`2Q0or`fgyfVq zY^Bf!U>ziHavT=rHN3g0`HZsr4`e=WZ5^0T^qWb*M?D(HemaFXdvd`-9Xr4GBNY}W zO+iu-`egc8{83UkQ?Nk(Cd)E{vg^VBc}z6{$#yW6II4s$P`IQAK9@m&tOHj)9|Q*n z1hS~;lK>19{XyCZ-`@p^QG5sgLWqeK@pz0SGnqBIz~y~iuv{{mYoR$1mnCgT;I|*( zH;e`|?p`YygqU~DmP-)8q0>tNXk1;{A8Gb8ThIT}&}85!fJMf?i>?wpN`)#01fghsOtuX`5DB1eliQf!!$999 zo7UbG_|6+rKyV%+T^j}HH3?CH=M<`hXD}Qbs#>xz5WOkn19in5xj4!+R0&m2nxmZ^ zU#NTb@>x3i@Ze3pqP0-Y(3~!}7{(z5N8afke(PdrTbV>$svtxV6h9tV^t>spKj1;@ zoUAjFGNk*5F%@oz9|l~3$ra5o$ja`8#vCRjW{O1>l-ruB7o)I+aH@#?_neZqtjVtk z^ax?(7y>o&p{WVvua$!vfXCAfc$`nq;X|Lz{oj{ zO!XX0O+L#cK@e7KMX%nu$NUD!TeU3Q(A<4ysDyak?Ao~|3q&J0@sE*{^R?qXUaO`s z)yqo6(e_yKN*Kt70|{jaRqKz$f~?X!F=he_VR&^={?wR!xUlbUw3$0_Yla_C%q{bx zB9;%{!%l>Te*>qgC6x(TWwQ4#N=v>3+w|MD^$q)Xm9pi86OfeP=U2`v9eVf>ln-a4 zO1uS}tE})YN{{6v(Yy!AsH`85KHmTME39GX{kMRw1KowPhL1~(`Tazhn1{o#d*xAX zLao~2X;IM!(vxbpT`Gj*MQIg-nI% zoSZ2g8ne~`RdE@aQr1wnX3lme%K3=`H??G{=z01#tQfVuu9Gh+$SQ@rhT#)OIf-BL zs1+Hn2rt*lWx?(5Vqoj5a%*P=^LW?He#GN!5 zIWPKU4hdL91DEHYe=m>(3}zTISQru1k==73mIAsUi*w0KSR-)il0Sm{A-39QC2F zd=7(!VoW}n(H1(ycoty7#xPjOP&~zz7|c>s(6~aP?n^t{#8n=d-LrR!w{M?Hzatka z6HUnww5p>oHbhVLo$ScfmbK1t-pnz<(A&q3{<;=r{Y=&(SnAd201K95M@;&F+oJ&=OCswgT;?L`I^enk&MAxF6a2Vein*Hlb4ttza;8&}_jAd8b39+GWs z(@9J;vKDogM5IxA7AgH6X)l&ze(!u%Ow;8myWHjsdl#mWDkhkRFOZM6k} zbEQ#b3M~Q#d^;VX&`YtjQMp+wbv|uSVyd!Aq3Evrpc+m&)(oxNB*Lm)gPXNK?cWz4 zO;UO^xTQcJ>?l2jP?he&SOc#r5&315f@gj+s4wNFwD|A4PdL)R8bwN>)^_l&=d(i0JjTY}pW8D@B>C+j2t<-MbmNO|ELB}*(J`bDAeykR9+WxsBv2no$ z9m3xf#qJ=Qbb3XZwdBj5b+S1AIM{dj#C4${L_ek%NyAozK>Nh@Wq(VF)Lh}6f#Y6m z5_k7CmG|@lKE!cl4vm_JM8-9h2(GK8B_&&teBm3>^&JqK`ZT5(HUZ7EzD}agd~ekn z9G3Rn*4HieFTV9>DTMVDF@X`gQuac+TD=r76EFuJ2`Abrw5Ja_H@Oy?3$E`w2@W0a z`$G+33C|0XxEHSsj*6=S@tm8rrvOCMm#L#%;LJuL_WL^<-Zw&t_JFo ziYN#L$2qA{#M|$NuPjoRPyc~p_(ME%K+nR2WY6Q>BE*6%@(&>$TEczs2FpG_FOB40 z@{WFOcXftUc{%TPlO`q|SFd{4Xk?f%;ge%?N)d|2_9ziE0241z510Axe$VG8lNA`C zv76|h41gb_Rcu;WTjzwiEt6!w1#?d`qifPCZo~3AdqKuP-R->hyH3%rozTYw?DWFY zyCLUl<^(jl{9XxDv>OA3JXzPq0mRdnqAWF z3ozQlVaP7}57f9T3WPR4XRk$HrGepqm%`}pYFrViHlXxG(SsU&Z)H~--R(b~Hz8A< zp{+&l7{0i23ixS^L8li}6_o7**EG}ZCD+`|$;IABg++*lXcjpkXAIksV^wH)d2m3H)7b+`&EHnNetXf5afiPCrO zl=$-&v^kH=M;%*yR9ehwkKAj6cUpY39wP&IIvdDA4Fo84yQ^F@qazGQUR8}Zyxo%^ zSDbcBJxSBaTE57exei`!|H5?*-7tU_s&7N=8boOVTHv*!wihML+mU zFCBD#^QF)u&HXcSep|$!0jWyk{$nY+KIdVS^2;4S0=~{I1Mrx;-B;1OSOJ~D%zFM_ zQ`zV+=;k(WB^Cvmtv+@=L&5c(>!k)=@tF_;J{&On&^utA%Jc9ey4WJblX#@`$AA?_ zNUwx!fMB#%Zf7&6MF|OHK{^IDXT}@DHavM+;ye%)0tub<;EYqiT??^pyng(lj+kK1xO$UJ?!+tI#7&=c zs3=WONuOctM|H_g=ezZXPaU55F;ru;e=o2k_SaO28!5vlui!j0){y#bW=2Oy6D|9=R*M|#BmDu0oD_^lit zM|eSG<6u7UZ}1^$wWZg+lTT83G4^hz3ro7+2I&9_*=*({&-#By#yo5BF>Lz)lPRX{ zkYz4GnI5=FXHku@_8clo>)+#1^9J{V8wvXsSmAS%twbUuuuLWw5|87Ny2IXF9O&-E zs1 zwbh;xS_ec2%U$H!-6As_;P812jdp}BiQcPysvenrHrn#h5;@=QITMkAD6pBDbT3D& zx_r}#vl56GVy|2A9p5alSsStvY`{XX7;kw-uKVp`Fh?0q*#Pp(s`}u^diV;P2bkBE zmlVQ&NB6t^eDHfMykhYT;I|m%DAJGQseiutAyqK8VklE0SSNdWUAx2?tR6$Ig(iAOJXxK# zh){)Muk{rr{~t|f85Pz0e*K}lhElq_o1q7!yG2R?X`~U5ZV~B*p}Qo9P`bMjB?QSK zq$LLYpYQWq&kJ5KEY5K5IqPtpd++_(eQn2Y-I#NHV^b)VWt%^@dm&XS3v@{I>GgUO zEGmo=E(Oc;fh2$(f)6PO%`J&NV1_jxd|5oZqy@>$YlnuSyqeLA^4z`M2w8|VS71r` zrM*rj6RM%cmvO3o3?IKoMSruak~Q6nvZ8a4`7P$8;$GHjArpL?!t%I0>RvXDnRAF|@KtO}msGFQ z$vO;A;q1g-K=J$5Xnwd!CeinQAeD)GcSMpCDHGAU2}q+H3toJQ$-blWeTg-vrj?}(v76l^);|VgD>(V94kStG-)D9s@Yd_lIkE~ z2#q`{R&jF4XXUtr2gYAm@+;Ygr)9;jSVm)ut zfW6#QWb6!Ig#B804T?P}&IHZBlI$8}5VNX8fA_<%qZwV*L3%l*bU=XsUE#j}%X4&} z#0pLvYKVg4vh{JTopgyoiO+FmORoF!%G;8?+ZfS|n-5F!?0cKlbE+98jsliCO*8T0 zte4wL`8GZVyZP1Eq(7@O+C(tTeU}(K93gS1FuaIX!bOE25bA@M=&Dy2(Poio zH2bykx$O$2AF2wSK3`$J#~Z- zT7K66=bV9mzuVkpd@J~?oWX#k?RZd=zx8@3hB(OAjE34(c-Z z4R5tWQ79!@GGJr>DMIj38*Atby;1vYJ{a;n{~svF!bIp(%do|#bZ5CKV`{aXEZqe) zjb}l{ZCZlTiwASF=tvH#sSdC0&omin#UP8TK>0vgr2?3RV2-AUt1i8cU=0yI*TI=o;Y)$25dTfZZoOCf zMUvXVpXpA@00Qh2b!HmACEN#zD>;Hr*SFE~b_~6iO-Rsk?<~x$GR8o8! zpGAa=s{-?%Uv&Z~eeo*$=Zm*Nzm*cJn4uN+2|Z35QzFnz322lSYOccJbs^fdVsQQ9o zd*aBXQY00$z_L`ckTRoRB;5uy5-mfxJ{C};dyV}N zG03~o-^x`})~i2sh>+DS1~9z^{O(E55*WGc*ifMt245*PFO4dY6|ZnM8p*Ktns6+2AJz~Ev^-(=epGjS;j*AK4%F4?%bHX_- zkvvWnc>I+-%`lo3rM_rtsbg3=e2*So#9XMmkJ4UHOduzQT%=6$P5Y{NkUsr+7qmb- zzkjU;KIAmt){apkINln`_PDgN|vq0+06buu6wH`t)rLyAR|b{eE#BB5Nw zlC76V=p>P!QnvW4gX_OUt6>{XXz~)fJlWS?^}HBVaphrf#~h*(3nHUmBzT94q9>_R zjJYRUDUUu*2FQnu?f{D}ifC0m1_#HXj)|1QTm7SFWFoN5Sntxc#JL@wpA;#7K>8hr z{*vrKvkqwgT<3A_B!!YmHjx!30Xc%|r*}GgbwJe@!ygWL?mP4<0Es5qjHpLtRCA;$ zgK}_Jwf>A#!T7eos6FF!>xLk;l}Tl!t>OxdXHYH!NY_p(Vq!}a)u!fQ>clDG#E~t) z#$m780JEh6gd$KY=R%PH?5&t%W?iAjcR+f_TNT9MLtQ$=VHq}>e$9sy2FaF<-aqCHiH_OiA^m|r znEY^6LXPmGCk9H1b+u?cs5r?)Nu^9wNsK?i zOsDoSw>`i;@w#2c{PMFE5Ym*3qjqZ9Q4?lyF{$cre*vW0~L4NTdPPS#8>`U$B*JOq|EQBI|6>({%oYC zTp+S$z(!CepWAVLDxC;p5S`V$FozYt%&XtP|NA*ky~a^8tdK}Spyq4+ud{70`kjtN z52m%gX;4=uzX!z7%>2GK(~aGS*~PS%&nDut^(6ycO~+QPrcpmfV*aEHfvBb2pe0vP zVF^ETrl?93(!%J9OT-`vKURmwE&AmQk!!4#1}$|mdzB^DaMrcDWE8GTumNP0fiAeF zDrCFnqjkrm!!-7lr5yDTcT;X2SD20sZ%QEVH(AoX5&G({a09%mo68Nx;V8C`d}I6U zNcr;>U-*51qFHH&k;yp&VKiBcddX_$P@IG+2=Inuf zD1hi%I_EysX9TH;v^!_t-jF?_5m~Y;Q=!l=?whFM9@_|>Hu-BvceJKe^e~{=XXSE6 zzxCJ?@j+POxO^_qyHCH>()E}!|GezMy%utDFlt9Z$|rTuojQM^_Sh~N!gJt>V4vD(qAFPk(GAJ3W(=QJt9SdegQuJ;9 z-W+kJLeI?2?PgW`j$>6G;vz@3)QhB5!7aWZSaevQcr|g_dVQ;T_oer?G4K2IbLk&< zCcoKF&|-hzh7O#G16tM!h2+U?{I8SFGn1YO(?78%`92{p7o|rAF-$&qtTf$(gwYX| z#9NxbNw30Ptjl|)Rv}O0|93S&hjNj>{O`9JUMhIi0i{*NxJ`h~)i!d5pT2zJ$M4*Q zOUh43?vKH=Yhq>U`#b}53q@9iawtd}6H+8omGSzZ#R_4$ef@m5%!Bf8g6bn@1sdoE zi?@~5W1avUI9)?}6P~q9BjI*h$`D}B^#Z&y`FK(z6Xg{iu`Cjv8~y zBz%nDi1#`aRs9`Jt~%$KMLEQj6-dot`t2FoH9NvU*x4|#KN{eh8Mn%8+gNX9(07O~<|_UTSZOe1+) z+PG(%GQsitd|*PCMS2~oa&Ci#O_W~0x$A*wp#hq3=pt;Q=_PwX=FF}@zuOEysmeL& zvjLda1j@p0<@fZ{uSDBA4<&@;>pGEW7qLI>wt#M9e$MUpkKF2LlGe_)UimAvwbWbm zXpMExX{bR2vdo?4Ig7J1INPJ|@G{?Q2z7m(d;w8mRx@|;+vyqcCeQs(_qI)LfRFHOMAPa^;5$9|Wx_%*$fPUo_gR(GRvyekg|#GnwR zv;iL6`yH?G&xrAggPS?u+|q{jg)040u=klSYhb)yjfeZ2+%+vWTE?0ixkr%?Y$Lko zd=mR~%++mk;bL$14|%Pm?z*ksE$oLRgv<PV5?TjE!|E1Q7BlHaX1|Hma0`z|au%1L;dZuIhs*66R{aR?w_x_} zf)^RLmfI_R20i11jTeen(krdvQjH0>6mAn|UtN?LINg|JMOM!oMoyOVkN@d|>^kbVfIO^8=U#}zNX<*h zZ*y8Knv6@FqnG5T*3>esH>W(hS_Az6i?g~U0|SEPE|3HK0@$rsnPf;AG0Oh;PtPDt z9!i{+YoZ&;D21g9BqqTY4UsX>E|BN>c!PRjMHEr(*~rfDoDz1m?^W8!xU)LuT-?bDBXq@LQJfng zct%`Olst!fQW?Mucn$SrfhvWnpHB&q;x1tN=r8XQmtnc}*W!;9H!5}nR6a0CDUo29 zM!H2g7|`|u;(M1oAOoL(pd=)n@k!kM`gWoU0_l<|g{Z*PV&;iKbZ1yZ%~w5}1)mSe zG5l;%Qm~{>TyFsQ!8VhKl_FWZ$`}kTqd1`7;-JKlF6a!{P!k5?OgWp=Pfu0jVnEQ* z3^nZ#Uj3O&J0*p8USa|uO{m_`G3F0mgp{GaxBzxN`$j3AzjVe^Rjn@F`;OqNB|T5m)P> z5{I)e*<$bYu~$dEQE6V4iDcARf}ZZZvD4_ZsxVOK)mv1FGIn%mk$*<`qMeK?&?R!mu&j3g`clw&;x9c{Eam zb+hbZVM4?axahk=g*2UHqYVG+NJX!Axi5zrgDV6Q2%D$W8=13Ea|y7u`f0zVwT8te zVG47lF`E9DQZ-BD4Hf51F}e!}P{dFRd8kPbmz{irqZF$#D?$F^cic$e`mn7hnNo8@ z=N#2bs^C0s3J6-PikK}Xg2rhZGGWOBh4w|fNlMNf02xiz8YrAq ziLS?1;pj%5JA1(h=hyWE6N_{8f5>Fg9qdtJ>`0{GVwuQ(F)HB}urwHr?MjB#b7|K& zx2^}^vl&B9Vyd@l(5&MU_KGH5W*ZE3_sLw9PSN8MHDEkMknZEyG#fOlw5TG0nOl$G zAfM@2S=_=8XEq94$;d75$7>+ke2}c>}2JGsX~3Y_};d!9Ds9voK|hqdSmk?bNUvZ zhFHu~X1eI6Pe(N6Le)}PwZEl17_3_8FjwhXEhtrLw9*=|R{<_fQk?hsDU$e_g;_?G zESPHAih^~;5k-5cachBPcaiC4p~%-iSA{f(Ny{0G+(!(Kvvl~>iAhr1ZxqcyDP=eg z*kOXj21U23xEhI^((}w#P0>^9&$|k2D>WBn#v>Wgi6d#zE8!uSWTZ@(WrS1*WED)M zKq{Goi?&0@=mNsE?7vwG0J(WaNpZ4%VaZm}C{Sr~y7l1#7acU5I8p?g9jaUOz)9UJ&vXe7k<3-rp}mqaAXI^KteG%?tRcl z!y7ZekSd{T9Z_tS_DfYDe$P>)gZeS8p+b7Rv34OyKN=ck>1gor$f ziQbyFZuTdVbF|ZJL!BYRSGjX$X^9C!VxA|2cOgqmjV#W<<#wU-W8-Y$tp2%c7N&6r zpO?P`X2G=;R$2NmwwF~4%2<&7O?OuT@s7SC-m<^H7n-o8!8m$`N}Uvy>j zVi{?I(Rj}ApLl!TraG;w;ub!YEF_zl{Zu8v5BKp6^|`hrrA5B3a5i8~V3&xYKc^*@ zji0gzX4#f#wdPv!QoI2T1W&APBZ(?^E;D2IyPNSpsQf@|`@Rp10k?`#TukC{lmFdj zqqH+Bq+D_*#V2Jx=+`D@pT zgZ`zHrR6{-kjDqM-}BNrZmQzyxO}QnGe1YI;IHNGu;acatQo&rt472T%d3%Ve77tz zB1eqb>*}TZn-^UQJlSjcJ>BsZewpod-q^`miYC0NZrL9MR-9qqiO)o_tiPDtR!Nx; z4m!hSC?=YyW)dYF{dgkKUWeSa7Sehj4~-3=PKiSzK=TG=YONR^=W>^tpNrLm;@j!IN~ z4?n^17)CN9g{ufjBX*N#$uGFxc~ujuVk%(b^Sv9Fs~$^EW0a_hk(dR$^zAh#Krpr=~hdI*1GQm{vp+u&sxQj zu+ilf9{yT3lUoPAUcF|)p7(jun6a9jfnmFfrS=@s%9v=AkEHpJUo~}WSfI*UFnU#g zS@J6VpsaKP^qZc}?h|3+2+7}lGvT@}_)Svon1m%;;4{aKUvg}9b>RLFbouRULi>%A z&<^&a)vu1AkRfkHX`Nu~B{&h9&bHL!%3zQ6&ytwndGf#7SeA#)E5ou^GYDd@R_c_Gtee6p< z>rspKn8uVeKmMXwDSbYhTADC_q7L;41@5`&8|L;?J|Pt|{IS1`%MspVF{;$GyB>|0 z-+B)eO%;8X1Na?H`dV|<@h%Qo(AbYV{>l<>bjb2kc80L;2Kv+^CfVaA%d{Oj5X*aK_mPcz5 z8AV66DLU@-xb`}n2_en9Yar1d8rj0H#JqP3tQCLu>W8MmOcpJ(Uj1&M`X7QK;y$8q z9oEr~D#B1|bdpLF8M{Z}p7;Wv-RdoJGoRA4)y0DJw>6PVlZrWemsAs(MO}WqLRs&G zd{L}BD`44^78R0l2Ncaqb|0AeN6u&9nB`z6nbKtGikzpg;4v6((QU*7<*jl0E_C?2 z)mp6MhPlmML*F~LI@Q!suyW1c{YU9WcJrqRkpmna_@J|@pS}X|S2+Z|Uf$L1Zo(x` zApHU?B8LCf=jT%s{7*Bco4uPvKLlXp0jJcNva&U-n_DmxRfqtBMP+ht%<|^EEMd{P z@*2>(dI#kr&NcB%y{%{y>-H!1A&-jm!vW@UKS$(t&Q~l6`*|aB)*usXzi@5z+po`@ zx%6MYw%7K75oaBIGv=UD3*%wK$%@+dP^JKjE)>nZOO#{18*iRjIM?}PkA!)F;l*nw zWK{x_sMJ`9_V=k&^X7_*3M)E)j=Qolv@A`3{jM0A>D=0uBaKBL6KsobNR)c;ym-w% z=ppF)5iE{TI_bh(4Jh_DMhiq}1%g0Ab@t6a5J9#*| z!J~f&r5tZ!P551X!CD}{RGg}hs;?;oO+fuhB7OjNv4*G3ockusLX9m^h_SwtylkQ5&}^1Po5 zK0r!${C*LqY{#*Us<@7aFzh>EkLcW<44D~V& zMRww(VDTNzTB0N+C@+*huE2(1^DB0uB9KsPP=KFh0p-Hj-q5}WJN_B|^F7%Kv{B!! zLUDWTUALj_EOz4=##%nFP&e~Z?IvH#&w_iNRuDpuv9x@Yi1H{#51!b?yyjVkfk?1C zO=tB4Ok3AhOcYVAB5SELHVx_nE6kw`)w%WP z72y&|2#)LThmFE)+#@6cBf>(3@^KfGeIm` zUlxMcbvEAxUKY%(&m#{HTw!jm75d&qRrr1cbU0iUBtdXw?l6M)teUzLqk(c}uk|p|!ikHp(i0p))SH%1z3qI>g$40j z`-`kDAa+aJD{ar6=_k49M@e>!T9gTD6*W#mN)K&ViKR1KYxfvS(lKjMGws6sjWTj+ zMla1KgmNU94;C`sovPG0P{|qDg4w$fgnGpoitPI)maTpSaYL7^^V7ntF%Qyyvcc~m zu^-lv(so>Najwml;%c*|F%Jpt}9a;dV(m z>WPGviL|w{!Ncw%Re=jX3^zA?$8aw+nUG@Ia1%asF?l?-se}jnAbOF1pz$fKQc`Av z+6pSQ#beYjTRy8vn}u@x9jcOyhC-t@g|h`T!V1`(>$;$R$?sgxmJK_JGzMuOWgIik<{< z$u`D!-|z7z#zC8{y~=Ymj0-D&sC#xaz;DKGUU>B~YXQcRVzJl(tQR)*_Uj=l6<)a(GIV8|W^-iwJx+NIO&=@4E0eR%#pr{GhF?LW}KSFQT(_*%@xJ;V!vg}-=*oqkq%a)->@$=f0K zAA)HNXR?UAc+ZFoUPo`--BOo{HZSe*xIYJU0E; zpfse6PE!=G%RN72#0aC5Bk{$Xgh1AwRn2tCd{SJ4b<^~Eka7`SaANB{pUw-6&WVRX4!r?pz!<1OrmQmPmMxq;Nub}Ec3k!f=e=dp=jUznhp0`AIPn8vwCUPR-dXAsSk9y4NCcLNhe9)8IFu_ zh{|6oz0f@h^$+0e#M?CJ{s>=Qa|_@(?SOgQ7%sMdcIH-8sMld4+oxTo$_)G3U$*iK zTruiRuPg0bTwUgld4zV(yjX1&OIj@&JmC5&Y1-*yrnR4Gfv1k>%WCzaHu%OLT)27a zWVJ*+;?sT;%DQRxifwsmDHJ7sK6SE4F&Y+&;c@%TkWtf@%NHA%t)TUV41aLvK?mU{ zGKS$CncldQC4Zr2$y5xC%y2G?i-JEnb<>mVoeah&9f-8l+)_4wRZWZ{S5EUkRq9s2 zl|VV-O{E3|M_Kt{3d~0ea^8-TR5cfU0-15EjFtFc72w_T$sM`z#?~q|@@~`-jnkyF zk_=wzR&>>HSuFXgp!dwyHFc7dvW4`BYEfaARLQAT1tC!rrk0d*$myq%Sq^A@IaqSm zI!HYerlwc?18wJ3v9)a z7XeL|k${KRkOLJrEfh)&BqnGZp`!ar-d(P*fx5CtM&xX@Jbqatg^E&?nEpqav z7JDq z8MtYQ3OY?Sy|O0!uGCAz&kRrXw8S-lz3e0(1nszrxJE}?;wR`CI!?$~Dw4y#c8byC zJpF>%8^WuKv+d&cKz2XO2R3TC+!Ri=7R{PUmEPdQ+qUe1RBZ ziAC;#J66Bx~No$zGuz^lm55H3YMkHHj~z9QPhj(3AXx{Kl<( zjxzN;I^~;mO7t31e)-W-ev53DF(KTyZ1CUa{~?EYmRh|a`qRUG zcv_((h=ogKn|I{%85bpf;0xTTZ37!kkX+ABw_SKJiRt;Kmycy@UriV7Xv4e6)!Dw| zSMOXkqSUjZMO;und<%|`!7tmGoan3%wqNopbXZ;0;6~9Zo$dl2zxUTxLh^%6NooSf z%M)~exFxeBsI9&j8F=*zUhAW7!0T*{R8ob-V@2{+2m9%N@64K>?EUjRV#Wks@{?ycUfMan zJMDCA64ZHEA+XauJTa^gw2&d<0Zz2BN{3}1nz*giLwVC-prDC zf4(>%U2lB%zJSyU_qoG!dK!w1Q|*b-H!5Kt#VQ?~9hV5*u^L_+A@%>xedQy5dY1Q@ zp2Fb1qS8`$@UN@iC@4sXwm!;tOZ?Mz5(jW!_RLyG~j^lKJ-c*3SaW zVCHSZdWX)+8mmO*l5UeWyWqLAWdXqu%pa0D?ZO!U9ON`xw4+$4Qm@(S4THOP zKfk@ZZCMM>cab9C`(;OC7GXc~;?Mb?Ri*gx&u+|5Xd>b3-%Q4Os0C=4`<4yA)Jpc3 z4MYdDMwIJ_eGUtvEE@T22U#x=r!3vs`ES*f7Ej-?mHO`V$lne}@u-h)M;U)igE7^Z zi}>kQEP009&AdPRCRcxmXxbS;^auungIQkQnoS=O402)WwO8dgP*M2l0EncaJZi!L zL}$XlJEy?~2MF4d@7ItA8Eg38w{;0-8E%jrOtbDFzgy~M|$6~=UCA`VHs6?`1@mBv<2}&p~AP`F9J#6 z6Y*-})w+?Lu|+Ieu8AeB%L(_pu}hB&d!dnmz)7+8O5ana&TJAQDK z@U3lYf=()}?Up^%g?3wqociOmzyPc!k@Zm8-t>3Yw{mi&_H!D%8EE2w%d^`++|C9c z&Bp1JU&@V7U0h$8-JMK^JbspU@wPK%xyQ=J+3oYrl)e(085yA5*5-4z)ElTwL5LmW zhfP-h0}%A<@vDvrQ~n#u3D(IntGo4`Tpo64Gnj%6)qTu4e{P7TD}n z8a$=>CjR!X=(^j<+%O=nu43~QY0#(W;2{`>Uswp}EW^0a!D91mXSJrrK%NHCKaf5Y zNpKso1$mM_A0~>@BdmHw++in9fx}qTn@ShjfRKwh6MG+s-u$K99ARwuN+IfJ(kzu+ z%B>utz=)k@;O{?B^LHds#mU$vu#M5>zW8X=m=!i=xV*b3YD`Hn!qg)Q_g(p^R#kQ- z`+DX@c~&-_usB`30SJA3f^#=uUeR}%w6*8i4=_qvoU!m8j&PG%Mw~5hHYJ*oyAS%3k~Z^pUbrK)82koo1a(2rb*X!!TCX&`8G;l@43>VixL-_E#de@ z@EHBM1gl3}_w&umw5rXSBjkK*N2>W4j{~ai-gH$c)T-ZCS=d!X%_v(r$IFCky=RF^ zI|RkJ7HaX5GtfV@s***=LWUxIj4IAB07pvllE5?obY>HbK{ zH;X&zrjdk2#x}``MsLVW0m&992GvEiEyC8sc;27J`Gr{}(iR&~uB-k#cT~884-}iv zJ3&E#xLVibG@GQh2m*j#sZfB-s?lzUeC_{>u1=@lBjj=dLUXh}>lcB5G%BYza!9@^ z^DDbiVJrCj2`9B$vz)y?lFfih$tfagX;u?lVwJ13sz7xt$>EOW-G?Ko`UD(lyP=gL zGfZLME0wo!8@YYSB#Q=&I1H7h4N*``l`7rS+5(wKGf+zykMm_m?I%e|(mNT8v3$6N zZ$Hjfn2=+0eu?6_3(pKL<){Q?MkeCO-C4$ralIlcFJn2|xEoGmM&k-eeS4$RQi&*R zEtoHHxoBikfD>ubhoXJ4k)Tv!8nQ}MQutL-?F~?Oj;r7a3sY=aDE74GnnnGeb_y({ z0we@CjZsPjcqJ4HmfPbXCuB)j@Q`9ZWkuy`djCLkWx=??AIpnko&#DJ&k000ibHk9 zPI)3g%=NXpRY41zrUozpVgga)z0l|`q4ejdA`a>ytl&sS$ZKq%ceg6LiwBT?w z>vAY=zhs9YH#j3=l^b(BN>Xn?2Kq{9pfid__V8AvQUz;{SAR|-Xo2(BJ#%D0ZwaF56OPHvPHR~E zk%lnG=h$J)?{=z9o_dN+#ALw38Dnz&+1S(a>pZ1N4vg3@U9QOB-lAp0s6rW+Sk<*2 zt9p4QlDa^R=}V~)(ehF{rsq162X)Ri@}Z2lP_y~pD8kg&YL)s<*h_t=S)Jf-BeQgB zG`Gt}K3tgz`fcD5BZr@c^$l2d2Ak45W&Et%+O$i|UbsyczSIvzxIo-js?0z2ph&BN z@zR%5V?2_z89^M$QW(i7VMG|hN~1mMH+7}{k-Zm6oIEE?I~&ew((s3uh0~bDKZXS8 z9u^Xq2)))$jrk71nZ5@Wl4g2yZr#w0&5G11{$y0B^uJ8VlZkAd!1c^%rl5qs)8{PX4>Dd3fbj_ximVxc|Er%iYKI4R`Wl zWYueJ`lwC=xQSa1DeADHqv&oVQ#dWS^iAnRt6I0%HXWSqlVEmCDpqYvzNN(RlFOpf z#6PwaeM#wTBZSH2hgyR4eAVP}+qEwjoA+>6kXq~PM1phtQG=CUUW_fhkR-j#mup%8&=hcpj*E7b_g*gZObkWn_h!}GR%JSkvqX(k(Sxxt1 zusKyjrE17_#w#N-R3YV`ez-)Rl2+bAGul+NRmZ3Zf~$H%D=aY@CO2DMCkk$h(%Lf? zTFRFrzNBn-duZ);`0&aE0KE}vo74qEE~?93FQh(vLQk4|PGxgyGIriG_zItP73Gp# z`%Vn+(EVyHFY9+SX)ycK$6q@m&%f3z`G-%KrQ>XS2-D}`7-6`%7Yfp@~nI8xDle{-27#r&-=yAjZL7>;~vF3!_o zpGnzpEzGMK{G8s~$%to~N!S<2f67k_-~@O<1<2?3H68KznM)XjNlFerxULbZDAVt4w97@)>R)@e z+e>OYLU4|23r8ecL&K@;%6|L<^J17|f6H-E5`L$o(c)X+y$SNFB7nW4cf(7g%{fIOy1jw~fHKCL+YL8oXX zmUd}YlB%E_qS45vX%}UuT@_~QyA$Uv3g;_Y@6B?^Z!=sf6E9-0-oW2cKIBYis89=b|0x-HWnk@12_|#kGj8 ztX$7mV%!90R^OfdD69MCoRc70B_djSnAIS-rL)>F*uL=nw@q*P7HC;g=Oy@2Z$vVboI zPuDs9@Q-ke2H`9Q@@X?GwP=Pi`A|1V@dLxV^qqyrx!OMvMe5mY$lll;Vb5{?w#KFC z3p{JgW-wOawUOM7NJn5;L%hB{)AD>ukKXpho@h~TlD+E+tkaQKxM~-ovSbrd7s6aH zl!}D@109-^?z!FplWpS-sU}Q})k_~oV7XWBv}m(wC7O5Cy~3=@abGtyWId?(vD7&D zG~b$!cNfLs3%@E#-pO*~$z46tiH01k% zaN8y&otCXxxkb#SAuZxGsOXNWW40Hk-xynAu0L7)o}}9m*@b^CmtR9}o_-_x9n}h< z|M;xt*{rGa9>|Zh`dW_isH3BUcXz^1dsAUxB%%4)`4SggIee4~dyW3e(D-fAO8EE1 z8aM3{4#_Ynf)1Tk<_Orl&?v!o&!@kZf1HCYVHFFxJ|%b{#_4-7pboxNm8Lm$0Kb|I z8NZ@D#xIvoov_r1iiJy{ZAm_bI!-x`TudbI2{IwJdO;{u&R@7E-b_ixC-%!rcX(NL zo`==)h2qT0&-s6FD|+v3n+ex7SKb`+J-3j4a;(ViE_Q5Om3M#F&!9wPG}80-%^qAu zVrqEWK_dpGEC$#!#01*yf^8QWZFS&y6%+i7-;>_}H)w)iZ zWA|3o{ZYmE@Aa!cW3FPo>~KI?FSo$hq?EW#d?24=|CuSVZ?Q08O3`go6so${6981f zy6vTp9QXNYDsC#0SJJNNV&C)kQ4+5ZPXWTg(Tx>c?l9~Fq9@{sx2Wm@euW?wd!9=_ z%FlcsPkXO(ZnN-IFl}>(FPGo_;9r9tCy4bDXxix=ssjC0VEF)50iJa5X4eM_L%rwO zWXt@IUu?Hs5I!7tGso}V*Xu~eNfu&)Mx>p)Qj7>5rD z#|~%00^Ux*DvOjrW(NatE*<>-^0rmbFoi}VHpxCj{_Fa0MMRgP^gi?(1mL_S_oyA_`(8-V2tz@hiBo zig8#0iiF{cj00}*HzU7-LIiJZqC1)t&EEI}`=#7NNaQAk_+4Pn0_8u@bW_38pQqD3 zW*sEQdYv3GHOgW=1=}JhX#Jx*=-}U0Ckg9+C4V6qsSQ1Wll8=;_K; zES8#|e*3coK@G8bkXvwp-OoYTp5de|1$I88dn07`#NQhgA1qhkvpFQELs{U)#%yf* z)}j#2G_+l!=Aw-;+stPH>gmH?(SSzF)K@`g^J7Q zL)aBSUWlwkb`fQ_AbpA?^fu74dbu&XY^uyXxLUBrHf!;|!cKEvk6^_zj#~uIIBtE2 zfjZcdG3&tqqQf~Ujz$x#qKR97$v*BP8e%!#!3MLb3Hx3?K;P0HBR~npf96QdAhJt8 z^wlMhl~=eZTzkhUQ>0xr9Q`2GLeb6xf<`J7LtE$|%BDYUBcyf{Igg(8=L!nqeTQ&Q zCF%TBx`=8!Bl0{;kTB7Z*hzwzA%d0|4TTTQQ+u7LI^1k8Z}44(%^Y*+IGZ_<16r}C zu-@(Gu9ND9&=w#pjJGq9{gmFZNF;=+m(!98~sXGZ+2~{+mA#?$Z zEg-t)qsusX*W!Ry>lB@IlfB1+Hp%&8`IThLL|GvkV`CMBhewhN!ltlb^(SRjp=UdZ z8jW)iKtM(3zAgGrd$T)c{yOvF%JcXd1(d)Nz)6^Klpzi|NN(B5!ZJ7~bo_4DS9cqF zv{0OvZXeksl3cW)IHu~jXH!ti`g#W^-2Y0`BE6VlFh89Jqi>4OCHA4hM_@|1u|X-U z?)9DdMn2I!=ZYlyBw>#&`X0WUtC~X`R;G`S5Y=5a^X8M0-4`Z&B?mTWk|8!3zfuz&WFzqQi*H)3yKn~+LxpqXGxS4Z0Pq__ym1cvdi2wWDT9vuAmf$A&{-7k z{EoFdgyZmis-l|?oDu1i(t-Whd z_cFzNnRSbryOey7mRyQ-?Z$=QU0oST3Kfv&UwsAcrde+Yirau%c=h%^Qia0O{p>tz4s*9O%grLg%qCWq zL0qh<>-z?QcHN~9ucWQFY3|m3i@mF=U=9Oct^fIL12_MOmrh(81nTqwDjKn5rPUSV zgtFU+vmR-Jp0u2C5KJm$NTpr6t?Gq72y-^~%G~adl#mqo2l8HU?I5&4Q*#b+vWl3QzSr=*xS7N+k3FbC-y9T9s58yCPc{O zI9R+I2>_jz&)@9*y%89yoX&tT)Q;wt=h8kxAJ2zm9#<~^T+0dtD`q^d!2xbQ|AHLB z{`{6)RCvSCsvK$4q_g~vp+{gtZpSx`coS;)st&1^?{SmI1LyAm*2a@oNU4}8&I_06 zm7F3tx|acPz$JAy0>)M9r!n(0$y#K{seb3LYxNyA0?bO6F<2ai+gUT!!jvYgOvg_1 z%@f0M0U&oaH{161A*$`XA@%G6f?SHhoJRJzFHHCHE_YguZE4z0KYm)YLwnT!cs|8h z&z_`yP+AD*+$(JHRy-YUE;P!GzQ$1L-yb1tIoHQ6J9Wq`l$)5p(|hAy5apiqv3td zY1$IaCyq746dtcqS9Tw++TPDrhN7#1;c+Qt@n${?-fP-pC|A0O2%baS=r%uDzrC8k zZK<*#y~Y0eviJMwR|YN-zxxLaICjX+XXKl@_cYNkOh&u{k`X{ysx_y%d&u}9tiGwS zdk^I{+$>$u-mvS3*z8gGVR(&CU$$w&nvi zZL$xY#brCSryfR2!N#MILRaUbjxnyKn0#Y<6NW#mruR*AkRXHR7vF~~+==(Y?sp9a z-x+%3t}-?Q+`95}0iSf!%7sR3CSM4H8!uMu2}y0)_*}dGp&x?EPgOlX2|eA4v_pR% zRv1uh0h?iFsoFnxT{jq{Rq3>3bF*e61fi)ywK-f6>e>R*Nw4C^m<_lpq@OKTe;x6$ zQ2#+Y-)ztITNmQ@e?)y{TvPua@92R7qorh&l!Wv^VxvPq7$M!Mi=Xk4r3a{ai9tHq!h=OnF$iCzBK(b1M^gKd`` zthMK3Z?kh%m(w}k@0PAbFviM+pGFpAzvs2Q7ImC`BDkk_ndT3@^*gFwVJ=iRjBRXd zJo21|3FEb=d6?DXxokb8`Q|8KeVH@*j!LCC31R#F4Un{6)q_Fy+gS{>nm7kM=W?nZ z%B{McHmJD6hM-zBhD5-4(X1rTE&rhx6$oNLNB+;`z*%t=LL@rE(vTe(20&v(`)?rs zLcDZpfKDs6DF~Ve2Y^d)0raB^?4Ed=#7Fs|z7|=6EI~kWJ7@t&Q&;?-Pn4$=tchl5 z;8duHqp1+4?(2$xQ`!USdEA z1;}28I&Je*um3OvNei%e&w%*2s0N%jVmd}-NBL1JeA(&KpvZiMvJ)*dG&t3ff4o>d zT|%%B4T=!FddpQOj{x=r)5|=E0kzBMCZ>B^Q?{yfOrYn>H+}ns^eq*MSc<8Xs`iG2^R4ig{cly)B1{unwXW`0DjwjNVrk zs$q2osACuh!eY~8rZqTAC#(AL^&etARpi{&{I<0=r;>Iq?1Ti(`ZPiT{a*2HKLLAo znpmc8j^{VX{}LFHL@#xUhvyOE6#)2*v{nIH;p&OWuv2BMI$;g#rJR;&e{rq$Wkq;PH@(&sX7RwT80QZjMpMG2EJe5Rf;1vFvJ{1jcnGuJN5OhO;-Iq4mLK2~hIcln4j&T?66QntH71PM z6StbzT3d=nZ}TMW`u|=$|9;dS&?TW%?ML%qW`U}Lz~+;QZrbx_WA6N8o+rEQt5K4e z3OAz z<5!!MOYr6u(Ev;IYV_-Ic9n47XYo_*DGlMfU3rX`g3%kVTeltz_Abc5N`Gg53@SM0 z{OlYr5J-Hb^2b8z*a}#Xz#b#H>41mX`Jant1R{cv@xS4cF!GV}b8^ z4|(luBn?v)P-7C#v-$A>Nvm;B-w*tVf3fXHZIl1*RadK>va!sC_p%b7&!MpdU%yRo zOw(^6hK1Aep8?KCaa^wV|CseKSW3Q+>atV+4@A~lW*)&9gvWDIx-*wo*?*bdXV_-I z0&faws~wb}iD7^ZCLNw$+B}{*^NO9w>GJyglnK%J8h+498Zi8HlJiWC^m3#{a2@-o znjtNRS4YHgy71~D>Dtn=-T;!({Y&$LAzO)&2z$c4-PP!t3X?uMai1~%n$MeM44T3E z3%j%dZtD8rdk;YNErSsvJr;K z7cyvxcc2>Y@Uf5)$XkglfF_?BGmaY~@=BF=r@k^38u%Q>24-=!X-;Nvma0KR3+-8A z9-(#^^A#yUI{l<)hA)1m;2fPJvaB5zg^`)7?0S$#$_XinX|Mv*7JZYD(WwZRB|+J@ zg|-;#S`PeTZ6x6DRN}=P&`&f1VDPbSO6r^pusfaGfesgG*%$K>nglv$DBkP0Jtp8kat05J;K?Mv+y$i5?V56cqES6gCx|lA1Bgg7Zkt z-Snsx;d}OW#Ept<&~RalQKe6mV@eAgjNmo^Y=n74@|f{d>4Jm^>uMNq&;1w4{ExMx zE#nwrIZ5Rvx!B`2;GI{;rIy6&Ncr6hsLuY)7XT5cZ+P2s9jq9Wdj~&L|M!vq$G@op z$EQp`u}nAwXhZ3DHH@7xIr)gml7&t_$Lbms*kdcp@!tb*27m}4PipM+uwh4rWmLSa9Rgb0O^jL-DmpgKk z%K=$c0e;Th+|QJZ=bd%nL`F1WZtE$6s`DC$FZ&lyLQW^iRLKUMmr4rwg=n%+u2F_E zAmT%DzbbT!mB@8I5p2NerSeAKhYbT(8aC4rWvD>FDqx~2cwe~y11I#Br;9u2CDEk+FOaQQ2PY@7A zYR)3Qi3((=Cx!rufP@1MP#hs@`vfb6=D1WC&gJ^K4}y*a zUciwSG7OYQ4?EA$Q1PY_oy8oC_yaW%E*!-c>Q@y#%`xUXPdXA8uw=D)SSMRO&?F~8 z-Qln0{X%4sxD@kEs42Q;%~b|KMyzf7h&DlC0jJPwe?>q;J(KFQx3XpTrEq!JOwrq@u zN7Ev;1Dmt9=B?D@eAOvz96yR#E>*p@cR-}E2OxlRT7$u#$4eGNT?H8COTaJq0nQ!u z?kddNs0^A~vwlG!Y}gAvZb)^Ys#o8g2JueCk30#C7S_#b94D41DDcv-l=*gcSD`W5 z!qeuuqg!kROya=0N3|f7tc@t1Ce>{M+%r&zE4%Bh{|!jTR)&hP&@LvMA}YLbD+zmmuiMOy9V&Z1H3^ObYU|Qd3a+RUi!43!C_$%yUmSArt}= zfhixQ95b^yo@r;f!~hg&&lcK&MEM((w#e3=AtehX#i#EbM8z}mdbLmzu5L`Mog)8m zSnKT$3rhvAARrTf55=1ycs-FXF)0ga{6AaN-=tysNV#h%Sw%=%I3znNQSA!XckCHE13YB_KCfZIzmSzvNUg5jo8OWj zyC-to&s^uS{EZqbp?rA3@G^71`|;?;^~Yw8bmIIAAQ`sNh3ZD-ve4A@nU51hw0K-5 zeZ<7wEFoOTlIq%UzdJmf>5bgOo*PMks(C27`Jv`NkekhAfS5-em%m^L(a}ykn21^&&ECpiWaSNq%(~cs2A= zwIbS$m<1Ru9+{FA-E4IzRlC2BB%1eI4D4*XV?q2)JIs@#ay>Y~UFu>ukNI_?{pa5L z<$QZlfPM`dPBKGwK8h$n`aO@sTTY>DTc!gc!bUG|M1?9qQ9y`i;Jrp2qojZXxARl{n zp245TFxGOO!W|QW2eP2qlLP3zK)KsUS|DDQ+~oc7i{Pz}plAI(pulJE(`8x+lOM_x zV)*aPSmoFM{p$tDm%2*i+u)?AgdWv7&e~{#vb0sDr2S|qAWLy2@OSxL*BS7f^Yha} z)DOwBiM@?W-~GgJqb|nE?6-^F%Px1Ltqzxr>&u+s0?bd3&p-b#MK9GZ=Pp z`%%MAC8fm2udCI|*8Z#4PpR5x!J08bi%jt$wXh((y!A%48JNHw<9fUn z>Dkjb6yDQoA5)EKGHBAYFxOQrJZMVGbU7N&=G645S`YD-_^Ek3O{9qzw?6G0bRR_&XC_(=DoLJ&5(YK9s^kJ=ap}v$2>t9i)8sW#ASB{)?d&6C{JQxmAcT-9nkJ zr)XD@##pFbzU(>nzH!<)Y^?vY&*;)198rRT?_llAYPMrkv%4La zcjmz&V;geobuliQPRGh0It2KKP`P0CoRbwF4+g(nWWvnv)Y+y}Q{y#<41CcOX;1Sg z=A%FDOrzfd>7sgH`}Pxg&CoqOEVuIVq9RL&jkdmC(Iy>FW;`(sxWF-L#}v00YBY^F z=*m_GN}T^39{FHznwiC5nYJlKzg4<+oRU^i6pXyW*|WQsD)7t$1RHroC!;J?A{#J-QMwhe-3J#O;lRt zMsQy4v~0lB=1#IPc-(}%NYC$GjofY*z+3(3Q39e1S*|;JNd2$x_<;J^{l8{DfBNT_ z=w%EUXY(hMSX_sbnG4qHzkg_PBq)SBPWS$r-RU~yIYP!26(0QPX7ao8yEW>EyMKKJX``FqJd6y_ z?k*NM=Ohxr$?2hf7_8qvfEC9G#C20-DEbTBNsx<7T0~|g;ILc7CjH4sRe|+(<*Ll( zWxb>;9eBu+5wbXD>#SM(Bqs8wS2liV`@PnPtv`XU`aWfOA)PXo<4WoBK9sT;-3lf{huPkR@6LxTE7X3ov<#M8tQCp*@xgPDc! ztnrg&=)5ROnJw0%my?G*o{-19rx5T76OG@STd!rw-8xooURHraUA32MWdf%)C2_&H z@*w!3Ve!BszdN2m&Vbjn-_n$^MgeWpj(phWo`>Q4(Wi}@j#Vp`_V|z<#~_fYRL{CB z!-9MaK3Tzj5A9OFyjSiY<#6vCs&mgtlcTf|YmHo~f#86$f5c}jVaj+t6#$H4^m$dDzJeQe9bfwnS>AR$ys~6KMlk<`V{FXXT9t;q5I|) zlw-1EKL(SZ71(rtVw|Lz$Pw6BaoFkG9!K{|;5*rN!`g;ux0CC07O!!it_(aU0|U-vo#Rj2H^0Ph~-5sPLM?Hrq#+_-;^Hei#~I=b+w5OR-h08~!m>sdaU|Y?x8I`>o9A5OAvi-EULk~>%agWJb%hsd z?joQwwH#e9g~>j}!z2Nn4MqgVCQ-gV=N~PJ+;)VzRkI_VI5guMWNK@61o{i>8YI0{ zviWJyW(LN+vZblKjnP%q3W=WWcsL^($_!q4)KYRdqKap3v70a)7*5F5klrW+#d}g~ zTMFV(WY*+t3e^);>|I9BGkC_uFoZ~z)8y<=5TY7h^oAD!!^m zDZqU&4XE7CYi=u0Z)m#FcVv4=mz12Q4{?a9AU_B!I}~z%FWoN&U8tbao~!NzYZSLC z1piDai&@@T#-(mwG-a?PQcIqkR`8h`dj*V2rKZ1Qia&>AtHoxFrbH;UM}jKx7)*a> zgv_=}r#2{HpL&u)A6yy0N%3qTGmnBQ24#Q|L&V#sASwVv1z`eY2;U@6q`4on;Y52R zv5D(~?W}FX{PKEMPn2}XI2Tn{Ur6JBOfId%?`5164NE622s3*m+p|+rlQgxCXDP)Q z_f^Bj zaJ-}w-jSYo8p`pP>*g*Nqkl-22oz!0yz*4)AJkQ!dGhl=kUPtIdog&yZ?(a54W^7t z8Jo)h;Z(T>R5I+)D}ulH=EcO&Jvq$P7DVk6^x0n1Xn<{DOYz@m3X_}WNbwJAmHoBW zd)5h+6SOZ1yVGif)`<{}dap+`G(+APWP9a~6T#;q`0`2T%*fK|jXyzo+Hym;ENLPa zKLMBAjBKo zBShlOK){-k-1JdfkG#^(_2?KP=CkJ=8!Bup!aR5}jBwItYVZ7@8;%(K1Qf)sy)CqUW7b zdsqeUrsUm*j_xVMq`|h}G+*BPVw73HvFrMozU*zDOS-}7i4fNNLKrvi^m_2c!t7)a zmS7)DW}0q}H?ES6m#NWgP*l5}gMG7Q?%w|SM0tZ!_G(49{rP%F^EBxVZ{TS}=mq{^ zaG{=edPj2V9G$MHe)kDbIv^;vj9oz;po@l3@*F!Y5YW z-*mRqJR*xQa#p^1y!h=0Cmj1VL6P%omsr-vj$nPgL-daN(C(B3I#pmh>rKT$VaeE@ z5DZbgLYN6LP%#G#rWJ3#cLZaNn_8A#L-nQhJz1^2N1O4B-)J3CJbARR{IEz#?e*Qc zKCn)NpZHa7@#8u3qCApd#ye-~;z6Atl6?bt?=y2BiVWpBV^D)cG%=(12o+&+rqBYYVRhW6t zKfLMsGD%rQncCGrd8#4q{k-GVv1O2n`&IyXZgMV|GX_*YD->()rk`%rof<1dgetima2b!n-8dXnB4h zgiTCKP4C-w-#vK}9iTN#qX^LaYYPLS|F{|6ccE$s&$(N6=wT7Ne?Dr2{sjGbSNP$G zrr#?dh!C}%64?S)ybj7K05<}w$nA3* zuo_xcjFYYKxM^P+*z(d4JWt0)9adEg^AZ?Da1h49xJQp6u!1!JCadEN`jym!;wU%Z zox%b2_~og+b|^pB41*T<3Fs{lc~@KfkrllV}h# za_c`$P)m3^VWwB;$7!j%E5PWS>i9f?z0MFBC^E)j;4b|)sXN}#sa!@(ll48la=+n$LqclA4l64)bl0k? zNM(2A9T3g?0;pb+;+F(ulrq$S-2`7fOgIKC{F8e~4}+`ZtV-~WK9%H?Fu&eF95qnx z<;09gm*B0&fE9-iArbPaJ^Iy4K6d=U;Aoe+d2!%K2Uy>(zAi zUc_^4m(0rql<{=k?#(a@_+6CVZbjb{O!WHPZW9@^Rb~g^o2q(sDCXPuqkN05zEYqv z`@y1m-SX46SIl2TboAO#Ox2lln2EJk-=}yLFAmLjKen3)dB>5I8~m;9JjQc`j1xm< zr4;uoKN~IWz6xjry1FfUXYC?e9=biz;wzpN@(e#ooc9*AWg3f;|N7FPeK@j)=I6E3 z_@r0PXU9d7bI$v)iK%`DH`5 zui|BM7hMPhAacZPOe#uig7wC!znvN0l^T7vhmsmr9|w{9T*uLC{Mg9(;WzJBr9$q? zEFW^T8?}{Z>1jSl`}FlN(1Nj?SDT*Q!#U>}NOTm${&fu2B~R{wz0MOvzgXwT?o$7H z?roTi3~jgIK9cd!IA$kz32$@r6#&A_gg*1wVh5Q@?O~nR(YdRi@4aR=z0>mOn2PbR z{UOUBP4%n)KyN`#L3L~F&!TQ>Uv0cIj`rhF&;lZZWRD4XG`lMthaM7x{+LIVW_e!c zbR%EGYTAxzAeQc*o#N8HK3#x3m=--;>!mMDgZn)NJnm)HxEjpZ;_WuQ?!MK1g;0ex zaiw^gI7kea3DTOm*K)o^O2+xpwKYer`|=z3i*Lr^+Ko>ayWmJVR=?i=nK&ZO<95$! zF|1eNyUjB?R31~>(u+L_0s9Zt?pQX^ouex~q7p>iI|2<6!!hB&;b7|Qn|`S=>>8er z#qT!Kj(8<6*3bm2zVvgM_rkt*lV;kr9alJ({A2ze;^SXsiBnAcr2d)p=LH)p%*R4) z)Ruvt*+^Ia(apZ>bet%IkvO}hf9h%Q*TJLso*!I4TF5Og^iRZ7N$1yHYzZZF$SVup z7}6deydL5Z^4jh337#!GdXgX66LD7G8EZc~@Kk99YZnsQfVJ0>p92I6zSW-RTbp51pb7IkDKsP81uP<(K1*oC7dzZeADg-LIF z2E~1f(zIvo5X~z~YKR(oqpz|K;^RRIysWCvb~*o09T~qn#qp{`UY63oj8I%HZ&W+W z(mSCz29&FOl3B&Bn?EZZ2>k!Z$U5mYcM$)~|30no;^+*$h>|KNWIWXy%By%Kj)iAT zebh3^&@47k&uzsjd26XLEiO`{2Gc!~X*j zV}&RfAF4mxxC||TKTDB^h5%`r451pok~x_5$a5<6oXUs%xeY(GM{y!NL!TGF8&oo` z7bNcx1wpB* ziEk>f@A+a0T_%|xlMF@5DHt5TPOpanWs(4N9S%NF>HhOK zPYOi_v>UA0;=|jK83Lt`aB^}+p92Jx!mp^qg#8p=^WI*uY10URWFuL*b5b=XP)pF} zI0TGP7|HCwN_USZ8QkSFQ($45a;1`HM*|ApZnB;yDXCvsNtzf2I<{j}u550mg{ho7 zQchy_CXj?7Rabr02P57w@R7K)L=rYG)GuwV4^8l*pQk#1IMf|V0L}=43n*fqX{qTJ zNL!<&Eg@-8Rxt8j|6wK=C=WeEama(^$fEzpdjPZ?#Xn`zKmL%|qyU2E)lzli`e?@z zCz05N`xWNPBd_>W(NJ*|`hkungj|dlOdx5ZDonY_g_eNm#YHnC6rs}Ts5}Z z@i6S zP!)_`I~0b>BFIeVacJYkEfB~u#TiB9ZUQFdY7bEZ&(w^9eZQ@xM8 zcd#}$4t_}SRSAxR*6Y9e8+l&kixOZTfC^_EM!HLLih7=q+&OBOXI89V=<@89j?5Fn z%F2DE{#{-vv!GHZqG!4%i@2}oaRUn^ka}BDFU7CRoJ>yBLApu!!|EqmU10=*`|K)@ z;xfeH3_!~#w!Udl9@&!dQ#OY56TG;b&DWSfMhwKx8VAz)(eS%er9~`N-$3oKMJg|6 zr24dE%J;=GYJur%-td{4aC3J$dtqU<OSx{vcLMB94Ka-*{kwO z!!$J#8Z^Xv%C(5qXUonZ<%Dw@5_V53N*?`>L$@L*h>zeiMrGy=PZhb$$Q|pVxxRLw zSxG!kq!Q{*fjJdiT0!bN%)YZ{{R%Q3;eXmDen`eD@*V2;4Si zT)gy3ZR34e8~CT9HT06~ z$gk8R67f|L#-$H*s4-x9N#B0nhyYm~te1^WX(c5FtXrhFm1$5?Gs-iPjpJ&Di(Zv; zRNp$`o(9fh2(SfP=)dM?l&wqxNlBKPUc$NNXZfewicAJo%J4-vL4o|V!B69sK#aOI zj#RX4`TB)ARu`jci>CdkW?}&711ieK74ED{^To1Nqg;_ZKAQj=SfJx~%>(CfndYVe zm_%M0!5~yUNfUHp!Cv89ml62mB#GQ*;%q1m+*EH#G^Pgla>{SM1(EeNPgqbq98Jmt zY_|{3RU}x$8*GsX3;Rgm+yA||Mn%Hd3yt#y?Du%7^hKC3PUOzte(@WZggb)HMn?6s`9Ntex!ubjE+ zsqDJUvtEBw58MU&ZhapPZytTCi4&pSB~WV|Y~$avlgY)hbMH@e`Jdg$ttIAprc1OM8}-<1 zX(immv4TBIyfFHHnw9uDQ^)ge)6@;!SF0?kj8(PyQMR z4lq0=r?q|@!q&K<;ztnJQ+Zc>7StHO+_13lezuleBa$g=HttzrH1PZgl@Fn|$GN6- z*!Sml8yFJ6S545`HQMotVf13Usm+~O@-_2+*@VK?4417`OqW#Uk{F+=@;QsmS&dog zplRg3A2TDieJ`IAL7QuvaYKIg;`>L49pIlbUKVx&MTe*e?7=o#lE~s_ac6v7FO(uZNlN z@b#udib?N@VePSTnLmv?_Ra1{+Och`L&liD8dAHeZ4 z-8fI!>cw~N4!>+VUwN(4XE=T5%G}TOdZg6+6WGNNQZ^CteiQr z_?iC)+VEOM{WbIvCHBKA84so_$x${LYcob{XE55`(uPBbqwhjWrTWacQy;QlWee!N0%k$)mqoUirSyKo1AcI}#-ila9=X5m_(`X)l2VdGwI7HSG*x)r>SV$ij*S%1k`6=5uP1^;-+^P$5Jh&Rb-s zd;LGqvt`A_ySd9(QtzQFi_6a$ejm{ZXpdSgO>fIZ=0yo~SH9=DdB3vog_7v=Jxe&3 z-KT-anVJ+rUvfdxH#H^uxK`tw*-huBFV)-K$^ObGz?TIl-T%rtj;?Rr!k@)Grf*$l zjy89ovvJZLvkegquQPwo!cQhZ6wSmDUV8x?-V*t5@DA{T9(MoZV1EC^M%k@{J!@}V zd&Iy%xTM>d*cS2juy?(0+JXlmbA5R0IUOFPf(c>u5eUVys_co|_VV*M<{f*VA-3k~ zS1S`8NIrU!DV0bmhds0|;{SM=wcnW_Cfi*(X)&J_A1C~P`L7I}8x9 z&;0sgnGs`A+hZ?XWO$VJ6=Lc%=Vj9pdji4D6|zK0F_Zi?yWulSzBK=G%kSkZ9i;cy zF#BrX7r-Sp&g4o@_V$9;gUz-BzIF<_u3n z(M86P;kurb-Fg~25#j$pyDWM9=%=*~eNGY?kSoNw?IFz252dP~)jl_?Qu~~2`bBhC zmTE4fO=6thGukOr3NUL*B<}LX`JXH#a)f+k6aRgWm>uSxoYKpTn0=%7v_sh}CWG&Z zi$-jSZ2i3dgWIRw+DWj@S`^%U2j;7$gB!#SJ)akoe>l-Q1cFCA^QF7ru6S^YoVaD3 zAVUQ%HZeE>DIMgOS&>l`rMj4b&KD!ZjECAt++Fuy$&(G9?C@guh7dO2uaAmPK%_qC zu?!Y{qda>2;HW$q>iRx5YfEhoqki(96YC>W8&S>PMFCHS`-#QDeNl6yKMzo|00$?9 zXPMiqUh}DBvy_8s$oou{iGetVy?l;!;nT96fp4uB79H_$8^aJt9|xPXz0|(MLTrsZ?$}rYh!RM2o|e8PNx7c%OIg^QRHe?jQ|%jbEi5SlfjVqBaH@fXl2@b+? z7EokRb?SHt` zEf6rK|42<(p4G9R@9!uMsTcgxRC8DpPzt{aOk3AF_{DHt>S%5k;jUI6)A9V zoXW5>!(Ks#%Gr*|%AF3B;vRTe3!};h-yP~-aA$&WIOt`*lu>@cAszcs6!IQR6T}p# zTuXV}C(54nR)J?ZW=1XKor=jqWP;^jc`CIj{uv<-NrMA=&arUg0kqTa^q#(WTFmw5 zsm3R(6rkT#r^e-7bj}VE0u{W09R{yPD{z)?$dzVVsGN|amU>d**i943Xi$c)mJ+Hz z`|6diqr5G6InOa%Zu3)%B^Jz&?@}g)&AX>{P%OePg;vG0%ll5RS1gWC+9^=O@bS|K ze%piHptpwx+V_Pw`e9W?*MNBH%huZ#L%A4($>6?kK5j0aw==t80WW(hM4j#2Ek=Le zwU(^6U2L#}!d~$+v)ptE{yJJxx|}>qU9BAf>Y@Gvsa^z=4=#jP-36bykkdQZK}QNx z9bM~5*7ldfu81m*UT*TOkaC=W-A2kQbu|yE7KgX{2A4tic`b}hny}y32!DA!{G~re z>u`DloddlhX(lUI{)zUJdF=g4s@VHwxRJhojkQf1Z^MT7-Z*8@lI2ZpQ6OimsSacgzlLH&g+L;XDGR;l0*^R5-r6Wu#R-p_1QRj4m6RME7P12QBjfRfZ+ z6_=k3Qy}tK}BzI#3k9jQ=F=)SnS zR4S9&BJvvTEQ-U*x_qWTx4EkVaNye3)((s zaZK(4o;dtuJl%9@vt`b!)~yme`MKP;VKy(+w{hwyb4fDphAgCcHhk1Wh#A87BXIpv zSc$*k;_xRyFo0f36*_lm)s=)Ju-mGn9LI#xO>30~iT&yv0}jN+^m% z7{B5WO4w;zQ>qrN333frTq<@}<*XOd`v(G1*8zP#(6%A?eue4sUq!C?PHI}`FvEl* zRxK5s#Bm~PPQ2TMjJcDPkzfNXIFu)((tvx268|4F7ox~DM3DfcATiU@9Etu1r}<-m zq*qq3-W)zF$xHAMHG}1=23vM3lkC#2sVem?oN+^&BP28$A=VRG0A!AWIm?&V;0vfB zRbKY>ki_xPooe?mLCIAS=(yAc6g3kS72Y5R8iVAth{Y>0cg0h?n zdE(b^W?6}_)yk%YG#GqURVQNrA#%)!OJ#BT`^xbGL74jNk9WSZE$(sCnLasz$mF1%7xdnXp#V+A8|=t5s0Sf{eqYk zK19=_$2wb^n$%4kK9=jHBLk^UQN&wRA@BUgQw~GbI^#Hb>!oNgW0S>vl=G(7~NO&0n8GbTTT16dFsL!^TOoV26m(84AFah>LnW{#kqb3K9A%} zz=%`~%#z)$LzsXTmsQ;2Xq{&^$ukD`U8p(@fRmIMurlz_l#)XCi|ZbaAcuufC^2`A`$^r5kpdfC@DFL<|RM1W_@3l7!v;(X&ZkU_vgxpr2y zM;=))b+^|}b8=tnTMa=hvZ-o8ywMC-(SAoor@MCMy7r7I;6Ko~Y;gYe-EWEXdxL4+ zwE%pp^<-p!kiF>nJaQ?7OlL==mBV6*h_+kx3E91TgB=}ycUQ|l%?7uk=S|MY zfOldyUh^&`$PP5vB{C~mY=kB@w=|+qL3Q@dAWPp&r%u(0F|RyN-7Jv%Qy$OK9Km&* z8bi!(`yKwVjX?cgHpuu(d;3?<+dsqlKTH*dn?wUYuI&U_`q%P@&57sn75P4!9QpcW z%-cNjVU`wSZf(X{e)6Q8nT$Bqz||Xx2L-P(ew8w_P@e)1Wq)d!FM}e54kf*HHWZ?n ze%u*O|8{&kmvwu@dw8`y-ztc4Ju1c?>33oj^KT35#8no zYH!kdS-JAMpp|Q=LC)y7a(V?(;Gs&h;57n0KJ)g7ItnH1{tZ z1)PHy=~>65OEm&nc+Cuv`CGO3eRHcM7T#-CS#5wBWAMDq_D1_nG5}3XmAAn+Nt60z zI6+bH>5HX1PR;(G9#>lH-YT-Uk1Yw->J)!JO)KnI&(8UgE)d$w%Y(bIkk*?K|8{S; z`d?ayq4b}K>0sVOa`v#Dt7L=wq`425a|vj z#NixBV1rfpwLf}r*wjz9(7z+s@O$l(_MqFR?8mI*fced4OAsrnr3?=JnvA#GQ*x=| zZXDEwp`7&6&ghHUf_x^D#P2;)QnA!2eFO>wiM~52(KS2jLu;0O$c10^MIC0sT|*va zBLQ5KIun04b(Kexx13m5g2%S$LQ88&8(UNRN6*PI8o{N+rSm(QMsMu%H$IjQNCgA)5U&a}cfpgci4AhlUnb<@j5wg4E2617}1Jfl4=oZM0*A6KcK*x(%UVGubi zpky~Y4jMAxZNO(i0=RJoT7`pEhOZm}$=An>RgE@h}l9z|Go}Yeco=0N?hvCuJ%Y~%CFHw)V({9Fjkp|sdKrJy{yvNTqv}v zUSp%uxHPFA*tak`%Ii#XiWnISaZ*7+2$y&WNkrq7I4}lP8tDR`sTYfyf_HVxfEdjy z=@CU;R+3M~Bp>k#fZH?}?%dZNa?p|C3)plR%ZDi2?1<-Jm_8C6H(NF!5+>(X3K~P4 z`gW@7pJlD!8UxsH(1804-xk#UP&70H3=Y5>U}pW_jVv=) zy*An(pHH7KpR{6$vMrSgGXH|(wZ(8*=k*91-YO3C1x|#2HRu=MC zdIssFGgJauqoA6| z>XJus!3Z8bJ=_b0MmY zD&Sx>nJ`g+SjDl10BzFhDjN(=4SEe{~DbSxe_z+P`$BXt6wQiq5xQpP1|>;7Zdge7ixOo^v( z{mKL;Ju``gX#_l&Fk=7J(JnMCYp~@k`U-@34pCzS>Jk%p5IGSt zsu1*gW@pN{l~1^B>%AsJB8)Pk_7yjArYed+V7R@}mZwc%zm_^wlgCH-SHQb2wqo6F zDSkhh=gIRjGZ*v`53?RoTkGFGT(x6O?8Z7C7U*7RC;8l|e?#HL4`1qvt-!=%hfC%!aCEo3+fV4Tf*!~YqXC2k#`~UwDQWB%3M|YPrjBXg6 z($dmMNOyO4cXtQ~NH<7JNRE&a5rOyb_VYcze>jK3cD8$LyRPf?jK_>8x^3^MV`anS z*Cvm&b*oFfulYKQ-6-T=)DHF6T!MMGwE?~@m<9K9WlijEgUExeEfy)Hk780zLSeqL z_QjBuH8K5z$FqRcMJi-_}k$&Az4~k!LN)`S{>yzg%!t-58vzu zm^8?I_ihd|K;EubT^kp&9-|%A4KW z*2(YE{l(!F_$8i(GPLl2pbkc*QKfqHguZ!_h8?p?>1K_DH>ba~Na6T!5#0KHF9d_( zOAQ&ycUBW8{+W?m6;QBnxK=JjIX7|^^Md@BHfoM{v3blj>so+4%a#I>z)RiY>Tgw{ zEE)}=;}@i;tx0ewDEM;}6l|#GzWle8tDqbjvJ19T*0Q{V+4wL^VzgT{(hjr)ffI}G zp@^7%)tbooEE!3weYl^P&m4*;&E zgxt%EL(gIB5|XUu7Rp?)*CXp^lC4xwb3PmHP^}_2Aqn&dx_x1Acmz1d<}HYP@!H+p zNx(OS;g2ImU)`|T50XVu25V{mW0n5v!X*Vx3uTCSJqQ~C)oBuktfGB73iUI{GGMWL2PL2ewtNgOmZTAemRo95o4^WO=gW2}i!o@L zdy!pmG}0@bPmtLrPY!z|)N)wSu+a%Es+Ar@_gI?I*SuJvUL8Kr$hOp$cM2>J4>V{N z-dq*~ZACauvuA)DvbNj|?DK15Qpg3`yvu7I7lsv=YyyoBz` zv6s~g_0`8o0<@K1h$s7KciGgxzRhJezfV6S2EQIw(-59~_FM8z5dB0&>9eiY1tb}w zuDQQ#ofq~3j^D-yc7>HEr6CArV~-Pe=NMgM=fk^uyO#ISKby%-N;(`Wd(x4ru(FZs z3PY({`c;rdvUFbP-AHu5?@$h(3yzZGja+Sh~G|Pt4`0Im#;0wHs4|6a?S#dRu&V|E_T{u5c>!b{6 z|Ax0p|Ofg<3wta zdFp*e@(ey}24u0EeYvuH&jpp@gzHUvHS-1Y9@pKZ^%)UQqlQ+Oh_cj5m!?%~ptr}y zE1A_F-?H^V_9MIh$8Sei)+_ynq~5PBPjdJR=5o+M>YiV&R41CQKa&^?x{SK4;x;E! zt@t`xgw}KW#n@Pg0SSG8AY=@l??rVApZ9^Fg}Q8NYUTz z*1N#w0JV{bc9^zaO`h+(ym{!DITl1;ZXiQ)!&JH-pvvfO9+-UF&`s}yF^35JOI|Y_ zo$5E#JQ*m{<@2q9I|h#OOOJlOOc4&hQZ+#INo{`T9=kq(?YZrZq7MI#GL`6KS_Vuv zqn%65QQdmF!UZyfm0Kx5h^RFO-vv3m`S=8^LK`f4TprwSJ|-~G+z!!oWo_kuxz(>9 z-i_>Pvsq;Pc-b%e_hVTQaxiTj;W2j>$H#0sI|kaS7v;u;u5Q!!gdFa99w4++)<}Pe zFLc48696Y~t9c|u+BkqH{_i6P`vs3X0*$vAwfCN>H{;Er$imG`$P}Y`R&(RkDT*)|t${-@f$?)Dp=2Y%S<70o#>|x8*jK0;y z|3DUiOOL9ZGpq(oO63NZxgg1sZ~0R{6_00Lfp**_B5w^3d>Q zT$J@v?b|1E^*-@Z*I&=L>+rGlKak#CBR)g^jAa@B$fwo9ks3)MAmlS}uUCAHBr6JS z9NFc?qg}N2nU>uzrc2GjQDnV!7QE;>?4$RYHW-Oi&RHU(kZ9`r43VM(T?|Lc!ntku z+w?b;~p6a{cV?W_f%IO9t--YT}kyoF>>g*k(e zvtI5fh|qMMJ(?6N27oK(&GKKU48C#oo|d0Vb2kmd_3?V&U&>52qQ2mLO@z1)a&HO2 z0n*T(U;07sse1%nfaE7tX7cRrJ84oCtRh4o4vNj-X`^b9f&qB%$A)-DX8KLVC}WW$ z!6@~W9?;4U8(7tfP_73QP%f1V>r7k{&VfT#RnIMBf4Y; zAf%@AWdzPgEWjX>3GNq1O`dyWx({!}62?M!`O~;e)gmkPZjhMtcyb>k`X8w4UFO!3 z7F#OWIDA0yWo(s1l<*^(v*Tb8CdG6E)y$6p)xh1eCxA)OY5BqmC+<1&vQYM>Q@ne5 zY~Wy2owae3R>;DR_aj{EtNRG`T$1!+jg4AHjy#(Fb|Mt?SsnHJ&C}b}9sCmMIR94i z-=^NgQ!?O195<_m=i3cq^lZ|>HBP}8T^EP)84lrSsu}OAz69U>eKz4SF@92c{;wnG z_*aLxSo6u$UfiTf`-V6pjLpWekHHPtbZTbG@<98$?;E|;IdYNTnc@lzo=7dXYqbjI zNdfqc%)lPw#FeE_abB2A_$GaD)O2GeQ$&LfZJy(Wlan@osBe0h3xel68;hkhC@Ewp zxe06EN9Ec&6rRxkhacs5P^Uk&6cueyPd$DxAHXDmuoTvIiVUT5e&j)5WRuF**8b>@ z15ta{m|avf$7dHobB5zsz+?^UlN$XdWA!L=*&ozd(FqGy=yuS9INvB9#%+sVG zkg#0q(~1&4&;HNszQ0T$b%DZzGVn1zk6MY$Bqsm73SzEo_+E3_5Im$9JRs_>bXFSw!H99 zTFK!9+jd!GFu}womES~Q3o9vn;qrwtlHj&@jLs?^E~tKaM#}L?5UE=H zX|n3e&ZP($U6wG#dqs8Cp_xBcb9C_l!xB|>Nh^zrpdcTg|Ie=NNhBW6!eXbMA@O1~@u?>|K=GI6eo+>KAQgda z-m6abhqB5K&4TEemWZJX|ACOvkxwgcO?;F8=)eNNau>$67|m)Xw3S@@J#Rx>%yERw zl0d70+R(YZuWhqbwDR}}UR;B+Qvo!`!aPX=#<9G#0v7TO+vc8*o@VSE^QlNFJOi6r z@0K}VI%`sM_uq{OzG1)dDs}eRDS0X4JnH-pWb`BQ>S|y_q)A2RQ$15c@IfH|Gi|k= zV%Dnw?&o(I&t6&pnpwX8q53}%V37t4&NW}}@6|TSOBK?k?GZ12VSLPAo$P1l6W%vQ zh&r#XhDr3N2seF@C{lPFyh+|xEm0*oAWBkUG*~_sQ|}QWo#i^a*U_#*Us|Vy%Z0*H zW3NLh<|$xmyEk?(y$`gmnPT*Fq)A@D zE^GbjfO4E;ibUN&d=krjv!r^C6ELR>@nJZ!xa)sbNJ{=mVtEM=G17Bbq2Q#xv>2__ z>GE0H9&N~tth}OVj10Z^tZqakSTalzt~qs5jELOewZ|jRn;Up2mh-=^#c+hd66s_l zDO&AuD4Ss$H981r*@28RK|#Q2kn%*B9+>0c6;YE>a{-zYa7+pZ#wXNLKqp{1n(QBp zu7~%k;4m-)0W^(f9MPWW#H4kzqiQg5qK+Z&wN?(|OS9e2AVuky1YCJz! z=l))Eh6$Nqq%BH%M1C7hADVSZ@XwWf@`_ZH87kQ)elqUI0LAenLG=g%+79vB7{|d! zXp0(X|7wH~kR-E|aC>k|=VcO#(Udjp!(Rni`K^R3xA7=?IarwV?Hl#p+<(FnDtaeZjT4-2$wz} z!Dl&M#QC)W6EDP6pjSyZ+Gt~T0S%%MNUp;=2y|>ibIz1*eIOYCAT`uJ>1 zPrqRGRHRUW#M29^Ao;;qy}!uxwbhE9LqcqF?1Dh2M>JiBqAmP$@I&qH2MCKrhxV=3 z$|}KNDr43O@m$RoM#3lI1U!T(MvKpliK*Bs?-?ns1OHSex^{i<_HW(X&iuxK-1Zjk zZN%0>h!>KhX6p-e7>9T8IyHX?v<}EP(vsky66#=11c1 zcb(E-eivq$&6XIyZBrnL+5fRza2DBK)P=<3Tc=MP&9we;r~|WRLATXiILjj=q1?+~ zVW}E9X27ELVPchgQdMtO)X0_sR!TyBokexh^77^#_r2b?k*_Ue;|-CqOhP}Ce)C_V z02klqOuSDjPB`kI*F&E%A}dV=f%mgEwKcn9PB1|P<#G#MsJbA z<2e`V|E8bz89emwJvP>nd5vjR@M9%79GNmc=?&t{dA#}E%Vr(=%e1h3Z|>`l&}Dbm ziTy-$ErKT>yIM;=ba;PaoHOOev?)m*Wq@5l((+{7JS_Uo!4(#-@lE>yeXZ@*^cei4 z(DLDARCE%3}#8cN|= z?W-w+)f$*24`!Wdl(AoTRy{{GZuTI9w5|(A`-LODe#(Ts*yd$-P1AdN|lH=hDm!2X%8#7X#U%i2gZJY-gR8LadF@9R9+^?#uw%V!No0 z*w}m+U0dLt{o~tXPwS=1~O1{s=(0!lr#_|6weF@WrmD{?~;{9ada%D9qRggz#?p z!%*Xwznnuqhx-H(nk!X9z9sED616~7g3%JJ#^`lCl^2JSpAWHaBl=di z^Ccobi=UFyS~4#S6*=O`8@1~ozeSpngVqxady3S|2$2=Lgg04XL1h8Awl!@Qxd#^% zxSJLLG!?0adnyi}!yu)cZslleKsxHp+AE%*wPR}Sf!0h#?Y1PhWMsyVNNIADBns%? z0;2UBlOi3p511F32@o>M7TmD#q9fr_I4kL8+env|MU! zYwNs0k^CaBB_Z>d#UzW%9k0re$fIvbB#UfToiE{ZMa_ALT{^pUfwX#n8Oqo!bI)|9 zt!n58i8{(hJ5x4Qz@!`ZW1O_mra7Pb7devYVFx4R<}oE4ic6M@O`2M?m?@zp<;88o zGOXdSro(W);cf^Y4!j(#kpBHTIq0Bx7+|I8D7D%9RRmq6MM!C|g~9eRW#FA?bku^l zNJR>UNBP*%^I`B&TeTxpk~JXUAjyL7^0!>UmKsgNkX{PKQ=?Ad-a6hxhq;75tzC#g z188TiK?d|Cg9BUtKV5P81;{lwHb z0m@cM@<`|VVUkkH?A4FAnxCGl>v7nFPn3#ZXkat30OWM@xM>f zqR5|9KM{x+kU=H^2ga#_Bs#@-1r1{k`MM+xK{9GdSQWws!gCt6bjO{RC~`5HE@5}~ zCvcr6U^n?+z&i-9d!a}=4qYiUS!govxCNL1TPUK!FhVXvFT?0dngA1ug@=5P3KKxb z3#-`&6ed{_FG_c zqXFni=YW0%Q1gJPG>gXczc?G1uU|6+nG~sj`W6A;LMyRUt2-^!V&%DWrAAJdO6v2v$v}^)C=p4SwsO6s3d{t%qB|CR zqM&(+6_8R!TfSu4m2X&w9!-0hI!%F)6WU5S*Vzi4wX_k{ay2L!Ns{13+8a$VXD!_Y zWY=R@p8B2s z9EY5%?Y^~$6Aj}FQN=td#Y@d}XwkizC5fs1SEhvAs@;TO2T!)al!Q0%ot}p3>~De^ z$QLd3%aEUpT}Jtm6d_7!vpvl4KA$(L5Tj;rT0#!Ha|yY?IVvJMt2Z?DNp5OM8l)w zibnhSwi;-4yjdfwqKVw*cKC(q^$YY%1O^Q|0W9U;k_HH-JAH&<9s)W&}MekWP{5K>1-6W z$x5^jCEYtrzqFS{_~tE|;Y@&%CMn%E|_?rvFfDnlaG-WbyKaz8f?-;Y~EySQe@ zwhe@b_DLIfCN)kX?o^9&_`RS+O>(~IaY)s0l-W}fOoC4lOQ z9cUxb;kNuXZFNR`n~GQF5agE1s?6bY%z_HhNE#^;48y8?n2AA5Thv{bC?e~~L<+ zNr&Y(>&=G?*#{tkv5s^f@3}p(XTDs=bo7x69%eHiSaSLB{>!~MQG2CRq>)x<+0dgQ zg4l%V&UH({yEpt_&^%H81Bqp(I(_uVSwfZUmJs@b?SDNSaroS#PIcw=NJ(zht$6fp zisifMQN9AN>hAq~L*_m|+h?{$iDxz)+%3dzj|8tlNN=O;>h&)F2R4VXKONIT-Qx@X ztJp?c4Nnzy4P;y7hGg92-GMFSZtBxA7cC8ygEux(c*4&~lg05U2uSa;-H-d*;@PYD zau%qFwlk&-fvBd@QpsUUv4^e4(t-!OBxW?-*StNqW0oIUHIY+_4~i!0Z>X+%Aa$b)&7O|Hnka1uG=hHgQsH(TY^TqgWK5GS7GKH>$> z+!rV*&KD#p-4x@iHz&f6^z0G1q|=fo4Lck0j*F&fws?H6i=oMUQ)P%Jw6Y1|OzwdS zD2l?T&%{bgw1)e}^WGq5#4%yttI$$qxv(>Co~o`2I+^6p8;|VbW#>2jEEH2rhpWqmhFh4-pxCch7JWXT=xN%FSbyv4_WYG> zb62HSUP?l_0iU&yegKdHN7~0oHv;Hsm`%ti;p`wH6NJ#Y2N zWAQb<)V@yH)dZ3Kx}Sd!we5+)l9M=#Iv0H|wg|J-o8#-2c)meui#hI5`6xNgUFXk@ z4)Aa8xp>Bgo(AwPlySUIp1MNi^&+W#>f1JT#&Ru7ixvcy*iNe6wq`byR%)&A?##=* z5Ntc)UymH=8m18NJl}kSGtE-k)8NInT|~G`BRM~#DxWc%@gX*ilxU>*&W`NK2iv18 z>=evbgCjwKKc(9!5_Pt}&h{NKkb@$Ed_2RCT{XUmjX5b!q6GW0Ns6!r*)c$HD}k;y zfnBbk9}wk8$$k!E2|5>Ugp4Gwb*X94y7zyeSI%UHol$HZPP3H92#>9N4U}}Rt=xpM zEY+Sf=Dye$7e*0HyGL1%vZSe;@+<*Wh~-m&vA2LHLDhHBY;Ksxf=|D}o_}Zo)Z0+( zG*a#37ZWdmZY{61Dpf3T-eepqBSrlmNT0Fg@44t$=K!Y8xC1#7XcD{ZX~>P6EMzQF z*e$sWOz+vCXa@O-TQQaF|J3%53XSS@Fxl_dl_(^0*!<&vCL+2fULHBc;P58d4w#cQcY5}Bc$wKDp-uTQ zKP@a_gU3h93S_UW=%-Eo#X|xe$;G#U{nWKg67n_vFze35 zVI#%(ym+bY=H)+7%8z|Q8l=28yEedqway_ld9MD&c@WR+be34)w4I_Z0u`Ufb4j-6 z^wMwpS_)Nb{MFoN$P#3PDl7ln^;qE));)B7pBEr!zLpPd9ALTbz;PpGNIzs$5F-~f zaNc6&1KvCQm*Rcj45`~{7rk7R-(__<6;qvbOn!JR5h3*P=B4I`-u?+ssTFBj)@eLH zf-5I{VyYq+k*JOe*M@rciKy3xgN>=Lw|bn2Tx#?nZ@ogTFY`!$#zeyYuG?#OnE5yD ztVOyp`6<{~aaHs5^^Cb3{HTz}qA z-0yy0e#l4B=T8AxZh3+NwXkQxK#gGWD>+9r`*>_5K0T;4`iX4 z&J3(ocvp)mr^VYo=PIe}9*AOdjXig7qN^TLu}>H^`Yvh4aKcXU7HH4zO#0M$^S}1n zvO|s>j2){i}hfH#a^% zLj6@$l@F336aXr5GhCPxl8pov@-pd@t9|oZ;ngg8nEZmvPa{4`emq*Iup84tLLbpt z{3{@R$J7PpZnPRZ@W+jXxmU_hep*$r04{HO@y*8?lrRJ zPjf`#W{sS^#NI`oM;NFNb-G#q31UoBTnYG44Vo5FeWX0Q3p`I*)w-fTGzTF(}X%(hd;cFvgB*qs#BwUigB(%f`--cPXy>>3SfE*5N zTI>%zh7wwt#iM(N0Dv5LNV)vi2~8dgzyn-UA_Zl{^*A%?toGA*CZT5)UJ~Qr1sEn^ z(^ptn4ZR+SKe+W5(yu)n9LfTvw%lgLi6yDL$u^lr)6!2BTgQt&`8?ysQ)sJd$_r| z$t|9nyoC^Tnh4paMe5KOkz@;xF!_~;)ABNSF|)j#m`9q9Us?@&V?zoD9SOctNSUW7 zJ8R@?QI&ihhJc7!w9FAAaO7Pm6GBRUpDAURgkzSM!hD3Muvvr-*k390gh)Gf3IzE3FWb?v1BC(UKFyb zm?X7X6A`im;_q%-)o!3e1*0J!0-Zy?5c-|hUJjXpuO%qI~~> z+B_v6FqIR3s&mR>ziJRp!M+l=I!sb__n<4O;~xYo*wRtK^70awvO+99670-80*aSB z=JJnip6OMKi2(Rx!#ANm9r@X`M2)Lb|F=5Bt+Li=^&! zf0^Ho9X$937x^T;WtaRUVQWEgeY+dtcD9WX3;0`t_?{#k2?8_L9Y^eDXss(@m~WCq zm@Q*(lB7L$J_2kpEnc;~^5&MfV~*t2vMRc`;XU@%l#m~}3d>l3XkLwE@}WD*wn51j(q|XL(terLK@(JX&I-p*>oCxGOv`Q@gnj5@L=j9;DZK&}WUhqXo9t&NM+o|5NCm)ZLLHn8JEMRXfK1pF^0OVUp;5S}3J1iiqfw4tKw zgC|g+_6f?If-J3A0MAG{I-FMY>a{1>$?Le}01YO}C?5(vBxot_3)7)9FnX4xg&-ii zC)CoTPE}z3-m2#_Y0X1RJgB9$FOjo@wD;!o8`|PrlX`Ohe$7ub63h|Wai)Wks?$tI z!T<70NoP!MbVETne~?v|Un4*hp$RGSi^pq<(1gL11@Mol0Z;EJIH~S(`>V3Et;%R? zeRh4Sv>^sMc}Q=UB1d;blCkG^#7!@BZ1zl zTS*PXM^Z~j{~Mq{#;<96!hZfy()Axg1wiO$fR+1D?1UODjLf+9o3Pjb zsYpqme?ei3g)mC0RyxAe9L3Os3lWTVY;&hk2hcB=-MvNA{v8()c9?Z40>)NYU>yFy zyd>+NYg$nV7wF^BY-!d#I=qwVRe<927jGoRhg5Mat?(9|n?oUF#c0}y{{m8mc`2`; zgi#nPG3^$JJjj4q*%RB@##@s0j-J`-K5Tt5tV%cRr@8A1?0_lL{MG!4NYx~x)jCGl z9pb-f8I6XnBfY!gW}x=CvP%Wa7Ef4t@aC<`HSTY@ulOPZC0BEr=W+dsJywujVouA; zbp0^w$>lMZeBe6CCkzF)#Z3?8q}Nfj|0z4j)IeJeC_H%E6F7M$ZHsA_OKK(>Xap z;n=bz#9)ByyozPgnUt--VGM|{3H+8Mh%Lc63?nMYhsoXj7dWezTa$_?Is_L@mx&#F zi&~3@T0s3$+htCpAkh}E0ZW0CuKtC_{&^Y^l*JS^lK_lJ%go?k`l+-zSv!Oh7;{bL z{XY!Y`vg1fbTq&zibkUmMj0Xx!j8}?Mqg}W#RFq+(AtCpIkSH+Ju@HBaKyZb&%~A# z26QA91M*__E7W5QjnE{fVBQ5KaJ#LFQHD^tH2;TAR1I_8HYT>r&>F)?mJm;h`9^nl zG;L~I8dwJIwlF?GIN3}`Ly#V6tNu4L8;UIwx{oY*@6~F~6J91INzvn%FDfX}Hk_lEp78~OUFK`SJCV+c z&ZoXMeuhUv4WLj+2!r1E0MP(W;065Xelgjz^l-GE>QLmFc&$KaP}@TP6PxbW`gUKZ zYPnWr@}+6QlNX6^e+}%P^dzeGehP}e%WRI*-NC9b@zmG+r1}Q^&ySQ_ar!6I(%`)W z&-`@1jkuueDlE9V_40Gk6K?ba@iofIs*2MQ>8h)vy;THdy*Jy=tlr$o#|C))=n~Ur zPw%PjH$&2Sp-|Dxwd)@|Uk#4*ILn6srP2D-0&G~(RI9V2Ab^CZ`~GZbf7uzNr)IskmCk5m$jzYSLQ0NykFoqB=WwdIFr zs?H~M>m%i<&qPg2D0zS#>TdsC%^x;63A$>b zhihK1BL$eq>(?5=+qbQ;GhZHH7xOXURzbQZt<2g3Cyb`M`Ew)3~sa!|Hgoaahi zt+^KGd!iqTUl}#V+i(3oZwx0ix)yBtBhD$c%qkqZhLmMCN7HXgr5wpo*M98oc5}7q zueXFPwD(u3{mf*a+-rqInmO_2nMfVyVP`n5-`zo=x{QjwO0DSEJC2Xo=JQE>c-reJ zOg%Jcn|U0kr`)SKw~e(2-Qw+u76oLZ%^YGPWBxL;mH=C66`W(-Gpf|-c z!Onnl16u$kF&610mZ#WjO|2Z>R(^Bh+GNvdcQCR*_*o}To2Aqd8PwO0q`g{k-8qB* zQhVU>fn~GHs^%zg-`vSr#CKJTVZWGBvmu!3wEm&QH~QA{@}p{0b8ESbl!r<}jK5~= zpVy>bZF#$o4OkvnDmTC130;ltAATp4& z?{B{3=RetG@W89q<0WdaD}=pGaSr~xulUjJ<}db6>a%~v8+FdbfxDyUEO@}17pm5g zu9b4`cuVa~*xG<$8v7Oko&fTR@1x^@3X#h_gOV=+iJb~hF6o972&GNZ_FRaeYHOAq zK0x?1&@i=pvjv0}B_iPx@poF0F$#5j%Yhno&I7VEsfHj>g*BequQ%J_LVl+!<+uOU#{39t? z8S~WIzn(0i4@1iU_ZVHI0>HDj z>>#)q6UTcEyzY@+lcaSHVf)ap>ZNia2pT`bkosy#*Ff~{0icDR_-dnkX5A1;yw-g5 zqr4IsB6S@UqbeksaqWhh@w5gzT2FIxGWsZR&ASD_3~fu>;>PQdpH@T3l9${JEM=OF zR>;K|O?TCCm^iRh&jn64nh zFz!cBLr_JHrn4@HC#nFH{Th}8qd{@1?cJ2}ny9qHyOog9U~^g2vuS~$J%9}O259xR=;W)wrs{=GW?zbx_Jt_`4u zan3^tBo3L_D%XKsNyz^+EM4QM>0cV;4y@&%42moyo?*Q~K$9r%XV@&xP6kN5C zX2b4B41T1_xdbv}6&Mmcl7`X2fOm+WfcQI&o@>q#eGs zc4!~ZleB`clL)6#E6yBkvJP6Z3TrwF!syA)S}boJCbZqH4asn+--0@wCQDLFpxq6j z>spw*Y&3E)XrVPOTbnoruy3gg=;;Qw`DsMI@ERsEO>ovp)UBv&-Y;G}!^Be-4YB)S z-IY!fE2O4E&D~9AW!3WB=j}Ziu4ODYa=l(!t_}%-j(O}}2$D8VhjyRDENisXxldqA zisO}$>k2kKSYkSPRNCj2X(tj3Vz!s|n@S>Hx?0XTAf5Q)=^I`C(2QVGYj@pA$j=$W zZ=g!1omdLAf3{QvWrrNJm3SL+BGqOp$rwraYd9f6ydyBfF zeOuFfq$HnjSrYLu>M0-|lj$FBZ1PIu(zJ%B{+hK@Bg;RWO(|Db7#@b=wjfCg_twBm z1ERY~*3>z0E&kL=Lfc6avf%S9zTjuVw2k-XFVXAD2I*R)xf$sZ_!H`{7feeaQU^5_ zbNw1dhzh{wx1HJ6t5~VLe9{t%k%0U2ypWFRxUN_u(OF%a)VlBU#Qlbg~u0c@xq9B4{tvhe0siLDo^~}@; z9;>nV8)k(Nc`N^%E|5Gu6IAk_!izIq{_kT0(kTU`yhveBVc_EwN(t8h-t~w8JMfY) zntYpJty&|DS}CMnKY1n$nV#TSt6C)t(Zz4F+7^l!WKP=ki(bso|4TiB(4;eGjSPe> zd6`~9)@zTp`Y`H6$sK?kIl73Xxooa{pPU79RBtI>CLY9A%##9F)S&fKqyYsn zNQOShwg(#s5o5A6nI)u)0t>=8N?Q{m#ce-c@Y}4Xr+ObqEttdEV ztL>t#rL#Mp&85`2+HDSfG$9Z#R8zWN5c0}Cf_0~M)SS!AWHR&<;7-_jf; zhS?mQcyy48G?Q5KWoDaTIRS8I0Tye5p6qPO3HR_o;H2K8V_imqplI|+8_|nIu}l=& z{Fgz>7W*hZy__vSisjAxMO^j7Nq$_2B`iKZf=3}LctwQ$5fQ_eAR6@#JKuU0fvV5$rV-6uGAB-!m_Dm$d>gHqwrG(iSQR|LEX7r5G~L2mhS-S4ux47UNhh=t%Ci`5jNm z;zmy@Xu7~*>Zxrz^TGFf%)?SCw22+RON>}+B!Tm)fY^<}C?~Uy#2DxS=+%GZ*!KD} zFuaQN>YHBB&n_2JV&b^A^Ql1oK~H(1(0v-Uzl4bT6DgQqdmNrMte1aLFTK=Ia0vTz zh+u0}rkC-vBvh)X{A6S~(T{TQ{Ns^O`-%uf2jb6LS#n~e=Oln;%Yd0*?s}s$zO_MJ z`XSfgsGm3@sBw1yywM9IQR@we)Hx#agY}E;RZ5|{^im>sF;Z1Kzr*}o^oZh>f==a9 zyLh~s@$UQa(-UpR2db-ELiL9*r)r7w;zl+uw+;{PGGErSrQPMKF+SqxuTN{2TIe8-E1us>6W=vEC_}LEfd5Sd`7T!8vdwpBtT( zKs-e{VkD%zs$wJ7vR)`=LNLNe3g(I6%b%(R-ag{DcUG~s2xO68IBckQ3FPO8?m>@5|QRBi;2>|&;QubIdZnk=v4KcZR&kN6!oXY z@04JD?EwEI6}}R_)xtCRXH%^K&pTTMlPC!-SuEXuuSK19LWH4eQUTm`bG2ZOddR?- zv_a&1j+jilhH4ryI=%||EinbXPR=QN|0E&_bg^m8N8)7a)k%brH|y}W8S zLeS%P-Qi)uX{k5)o`(D6v8y)jdFZItqn}CNpa93PpE?_TT#%5pldj)InUtHUO)r4j zpi`hVJiRZ&*EPtog;a9;(ChwIkqT#2L|vm_fL&(M^;KDN*$9s3aWe}vSBgZ@g|5Kb zm)wABQuNma*Wl@-bf;)c=`b<-mnX|e-Dy;e)9geG-CDTDRvBM(D2?|)w;oBgaYt3+ zl_~kc-zK@rbzgrH2Q}m4P4C32mf_Kl={%G?IB^2$l5qbG=yd>i=IRP%8uTNcq+%1{?6XHdB%0jC5M!Is9En(=s1Tny+J#s z^R2K-LapqOOJnuC1LQeV;J$cTuHGTfL--8dYa?!8bFfcHPQD9z@Zue?9{g%g{I)GC z8WdWq=ll{|aI>i5aE&dWvb(PXa#9cF=*4gRI|=`B_2aOClHp? zi*z5sV+0BGYHO5vh)$S%-vh~xYQ}||=!pY_=ta``*l;OWIDYg_FCt}YbWAPD&)Ycm zck3?lp$js|(^c$|BmNc(YW5b1q(rW8!JX47)|6ZyXs?hijyBQ%7w|%=j;lm&II?;pmhYsg0r3c;SuL`&4>aUU}LRChJH-?fLpxgvwtZ^aB)cmEO6O%kq*DKxh#VcqQ>g zP~^Jl8wq()V3qEU?)=Fopvdm3ukw6!Khkob^+UM%InB4wYWdRH+LiA+V%f1bsg0aH zPn)^eee3E+z`_1G@@gypnV9n32mqyG+>3IJj>ovwkG9N5NWgMs1e?hAlGCYLI?>O=D0XnE^NH5< zf%V(=j`Y?E!W`M*R-;giiBKGUaiinqUS0a;sOftFPN9JJ`|Px>YPG>p&9lo|kY3G6 z)O+IUfgYg9tQ$K>5Y~723}cy!V&^iM#CdFZAx@r)oq4C(2=kb}g4lhoO%Alynf4hU z+@-VOLcDt$+cG^!V}=VRCc1c1a*m9|3QGWbZbiNK4sO*s`J?qknEaw3==o@@sZnb~ z)Fb2@sq+oLZgZ?>un>9^fBxY>p?O+S1S9>Kom$-AoIDzP3hLWnjU3q%`??s2IJ)2*D*3v;h)gI2QIh;y#Eh09ymI% z$N$oa^YA&*SPP4jJ!OxIFCyW2l@+g4aT$$%CYUr|ytX##bFRI}?t|P@`%za`ybZwo z%tNCg6-Z@0;(GpkR(Q9+FVLpXs~n7i-J-O&qv;?OlYOhWQrj4)-Q2LS=pBzB+OLO? zSDp5TV`gB4pR!PPXN*!^;&h^~$ypC^ui=OL=}FgGel|ZEp>&Q1d8}{4%J#PkG%keY z5Ad$HE~cfoudu+apIsupD06`G5^Ft*1qWDto!$INn@ma1n!+4|BKgo zq3*Kxx>KDq#r{DntxK4nHmzz;ZKqnmZY@%g{9gIhRZUahd$rTAOZ^C530FN%$^T|7t&tNsI7wVk$~bD@9uTu_r^+qRyO4VggI(7+BNFN>EUnC-M8 z-;g}YoQezn>M;-YJ`Y9M6^6hWG{%A+a69^o5i>4G$D}r`vCUBw*}Y9QqNuaZ&n1}g z-alw93T3T5v|Kbir&~vAWuTE#)iihKNJmZP3%7?Mkcqf4P!k$k1!R8cp?LX!B%O6s zQ~&?RM>mWTX-0=2!swoKH%KGh4Fb}mySsaIrxGHKw6uzZFac?h`uwin-yh>}b~xMa z-95bD_w{@}A5RA0KZ6x3ZaAS@VZT$YJfptTp*o&!VtT> zg&LKZ5W8Fv)?`O?kWL}>AQTWav|qJq?`4Y~_G(@$K}>=G=XOGZZ@3_2GvNvPNo}5L z5Np}q+EHosSjt9@!GZ+Dwq>dsD#Iq&hf!HgoWo!bFy?w zLxvn+rquchZY*CA>cAt4d1T;)lEhBPAS&-7Io7(pmhzLfJ`i^KoLoq^DZ|E|7sa(= zcsBp#(aYqQCw7l4;(~t&o<4niMu^e$A?WiwO_XDl=2by%$o&eCD_#iT@Yo&=Ar6!bDeEa_e`BnT zUASCUBbInazSF0#yPL8EX|~0jpf#4$L0&9_uILG-MCp|D{D0*YvAM$+(|KlQ)Pp13 zdI5J|#()qr-AdkYN=&Aa$*)#3A$PD~NAG(D%ihMi%H0YdndywGMzb((?75T`+GW=I zzMm`#q;Dx7wdZ|b@zfmqL}EntC0A4mm;_s)=$jGVvl>4ZjtQ~DS;$+RnXgo|Yeh*S zj#{MM9UvQ#Du{sMvIyNfR{h4HS=O*4gn;6*F0y~P;i^(3&JwvvL0PCLz^M+rtI`^0 zEwh;RF92fk>`-hKMk1D7=Acq6W)BE4yV(Ec9kn`c@b8)S`kYHCKrsYRiN(ML*~k7+eehE0oV(8a4-a)XTnBUAXi1tEbmS=TUaV8S9T_y8~E9it|8cr-{t0u1kk z%OJ^mjl@bDW)6xOPU6LZoKhk=7vQ{plZ4pZ{1|Jppf{pyM(<-9tLz-z`gV1$q)jPt z*+tOB%&Y?DTwS8}2}$J5(gq*bLsSWwFY=n zfCR@!c2YN^A9X|?GbNsC-(dul5+n-$;?S1JoMt}wH)=CLZD(T;X=zP*o)pN63*W1t zwPt|Q$w68n=r)PAzU->CX8g&>(i!-HjO%B69ZGX#DX#SY$bWhv7hy(W*%f7)0w- zuz|wxB?e-gc(IHMm@>deQG-HoOiQk$0T$A~XTvRW{b*-Rbp!d&=wZ_=S|v3#jHT*7en>Ln`6CwX!4;$S z4w=~K@4otz<9y@yQu!pof`Uu4rVa3#{`bW``^OXldvd{AWbE0rI1D{ArfhXtp;vR2 za^;GD>5*hL??4AwvI;f?EXshE_y(&~dAn5kfh)k^(yuq>=#TffY~P#Lufw=;jOM2? zoY-EnEAD@4#|>Uds+)aceWG3s=Dd~M!5T3-lkXZ?Y5r6z?!3K8{_y*;w}qbg3Flo@ zF+5l9x>FXn-Q(HA%F-2Sj@R6{XwzZ2s*l<0v+Pr2)CcENAWufo+|})Gd4Ba>l`88` zA`Q`{xx%gaRG^5uq?<5MVgAq$L{SeVCi*4KM_+=MnqoBt5Szz{B!&PXo3oTH<|R(;%iGz8-~I>IvpNRUc0~Pk@4+D74xuW|AU(h(oTqG z)@UR8Trzv@%QnyVk`P;f=kV@ky9nnt(9PZbZgrn2?XC@9;<9T>JnPRo)){6~^j7ST zBC@vj;bs%uk`AAtDgu?b2pGS7tHCdNly_NO@K=t8i48C=Lp^ebh@Pz=`L3U?l(&7` z1qy_4T5 z(01E{#5<&)5P=i_t|iUl+kq(Z=6rQ-Zlkgc1w2w`h6am2}kg9bTJ zEp+m(F{mXa54XYiVQ1@mN{mF+828ZZu_l1?vv7H~$N0&acVPV|ldqH8G?ERtjBUB6COXrja9Lbw!ry``%@hRl-0WkkI2x1Tx_D^a+6pQj`Ay!L zTc{T*t#7?(Bf?K9%D(Qh@O*3bQo8aA=d*Z!LN&o8wkQNcD_#9?_H#80MnCj2UXkPX z68fMg&SCTL`_csg*_ih7CRyu~phX+%#9oFpA$p%O#fuEr6gNb3A`=47N;(DN!HFGS zPml9g&w4_dD-SQ)hKBvuN#X0HJTK);J*^6o)Gwim%SLtngw)EMf(_V=;2&D6>0H_fwLn>@i&ew{2I3?b=etNG`fd(YwtyDu$ zA_=B^I98cLO~q8gbSAg2&b5B`v)D+T_`<3o+*CqPSgTq9k&hL}?}G@{FNn(1T4)oL zz)#xM^}L>eSQIg%Kp0}}b}S)X5)esg%;*y-?ls5I7jx{ZZY`Qb9e^GcgURojlNd~? zsl;R&*YK3AJf-5RS)V4zs~wfQ%H$V7#VTEC@^g$9h7gN1eoSNl%jdI9ozW`4U1eA8 zDEm;o%-Nhv6COTK6_ip)YQtQZaXO~aD;%^y6{#)j3lWq~2-6r^m1TuqZgHfJv$+n_ ztX(M3MgIySPA$CGir3>`GCVWn7fV#xWtH*Qlb2;Xoq89khBN%jRVXGcMIE zvD4ucc70qtX$0iIFHur2!l6cZGMk*p`9$Mhp(|-Ufo9TB# z17QsyhS|JqNr)@R=q=z7+<(C&c@5q1*8Lvqs=I3SoofUBGQGFj zUt*Qh{@JO(@TNf^J68&znoEG39L^&c1}-Q2FO zk{#TZIRPqlwq_FL;f(_R<$cxE?~`h6Klw0Lvs^Eu+kLL`NZr@ zns5Woe#It#SN-BuYbXTOpDCYqk1L;Zf}83jd(W_# zT616L=`a8Yd6k@vll|R^9hdOo7>7A7Vr&gZbsFpivONOP32pNx-57c)j^)oBytYv7 zShyafB!>@{X~?UIY!zi;{|d~RBZ+FOkciBk-r8m5{Is*3^~sK@k8#z@n!lXNbPz=| zEyL306@Wx}?3tmSkDe@^;pUX0=R4v=jiB)^vNV0OSS|OuW2MRFS;t`0t7@M&yeuk( zwTi!7Njl~eI2O$uyLjucXMl}kV_y9_Od`GJtFE<#+MufR z@;QKi=CPBb)Jvk&rPW?kpImwtO>m`;7#|PPr9q6txk!X1>N{z&G?CzN$rvEa$)f|mI65X0OF{t^I?Ap zCGKZqxL2m29B=`0Xet3FJrtVN#5nku+fL^^U|VE%NUNxRwkDRt z;82!vg<3?~%lgCbo(o(y*cA5tsQzEsE(tb2T%{L-T{hn=9LW7@k7Bv9lI9$_P@lM^E45p*!9L=-rWg4B6^@nAi#)0TFXs0mY7Y_yHmd9{ihZKS_ZZ?78f9~&E==2xY3ab3ov<$5iH zE?_-3u&&K#iX@+uIfesV9hdCOF~ka53GB<+)4E^1Jp6=2a+95vq8{{Yo@| zeJV;$U1OsNiGjeti9mnUAJde0idAF8ojj9I7u4W7JgLgWS#kZX4y$b6x8(SY<=HMB zT0v7mZskCFsSTKZqfdI-Xcg>R)7u2Ziz@91Ux;zxb)=T{d4HMZ@KNL?>FoLp1X1zb zCA<|^uo4Bi=zaf8OurW;LqrqGlPtNK>KpkHfBaamJlgdMfgDS-5qPutqM~uo_{Q+} z{I7W@-_2!NkuP(P*+Q&hw=Ri``^D`7@yU_L2$XYu5(RFG(Xqdu=d-+%rY?zgd@27% zZ(n^a-tFmNs(=1echP4?$z&ddPI_aevG?j}+6^!w{oVT=EX92yv@Q-MzM$_mOaG)! z(arkG70oW33+h(q_vAGFMw}E2dW;f4gtFP19m}!kH?k4+G4|C`2;y(8&qPhy4n>+ z8PPuVDHaKJ9Y{5dQQDwA)=AZ&pM0ty)8+aKVB1+cHBOa=n4ZNb|lnin8P9SKQ#eLbi^LnqlPUIiFSLcAQCU@p^{orugSB@u(!Trw^=wmzyv- z&Eaq>GE)W8#&Ht5pv)I_0MqY|$4sfdz4mnO&lxQyj`M$@U_{&;%B>4BM4+4 zh^WKNvR`9@+1XGF5Q!e53#tDu3}K0OS1Js8b{|b4oCvo!kUWVmLUE!q3Bag=O!P;0 zhvO;lee1=mRxcb__HE*(lM!HPnHXhyG~hhh)R{Kb&vEBtKvEdca>al7>AbR?9Pd$! z;lHUVEdKj^BGjt&GN;f{cPdoCB*dGR0`sX(VQd&v6=yT@z{B4vXw0Ts?uNLyjrgvsQgDDNAl`d3A0QsWqgt^XKtH0& z(a|ro-S@=J`#WBeGQD)tAg<1O?w1Ewvm%51z)|1r@v_S7r+hTRKxbD+t!epCF-?PX zms#Sr=5@lUKT;H#Q;R!YA=Q1uIwot{47T-Ov!+u7=;E_O930pDXn%N8LNV-XJvaB- zC}UEo4=21@C?rm@ZO3Oo8^KO1V~(?zV=?m`g2$70$$q@}IF}|gZzJhwqC^QxC_?1E z_7V9AJ1_{jdNuxzk9%!KoAO|kKH(OTF8t%|)j4ZMpj|IM zbU)nZNu~BZ-eLE|H1swBEVbq7mZS7H)ZGs2xJT0DNIF~CDQEim^?vgvWtb?c zA~UUo{(V+&jl-jC@DbXYmn-e*fwlUsr}59-nb|&v_p%QIa#3BkKFsZjY%d{GY2Uq1 z7qvr-g z1Bdf5y#t~B3XTuuQ{NWfkv5Gi-_*P=SFnqWdilsyB^(l^}o&^&F`!vf#B$; z+fD!97iS{tA|vwoDg93@?E)1dgVU5;AL8g_Z6eOR?s%Rtsu=wU2G7`eDwGw_H8H!l zP>rM=ePPa>bD;vdn|{(9VD0aL=zjOaEd8W7C+>b!nf>YW8YzB8g~c#`ZCcW4c97 zY9?42P^N0{8tItMNIQDOX80 z&0ijqR6EUutRgQZ;&|IM(Z(bUe6QAO)6})S`D^Ks{ZH)DBwKcdn=xkDL~-XmR;ik) z=3cdT8hUrs*K+=Ja~4Na5=lRd}UPw=6yU*$D+6NuV6BG2z{XX<+}Cibd`js&kO< zKXpyMU-;FU{8|~|eN*O6@`qm+G|n;)re;(G{4=BKb@A_h{4g<8Dvl}M?_HSrhIV znF}Bv87Xq?nH#sgkQ(QCV#}N{F_E_!+jE*o^6WO4<>sc$uiX{m>Im=-EW9XG048yA z!vm#JgMDJECMV^ zGyO#hvJEMRs90-C_U>7zK51Lw=F(q$ZQEXejnVz&-S-nwy#7YaFvU6<+I;e$S+ohO zouQS=W3e1NWzNg>+>=ns(aIP^E9$M{;Q=g;4p@Tg8hSc=BSWhZjh|J_)0Y;kRpcvB zNTS8tUFUP|Vw7ncOVGCDwJ$Pc(GC&)!I(0;(V(N2X7TW-*T&Roc5{p+_Lz#yxrCb1 z6<;Tot`~5nGNQpWN-=)RyiNtjN^TYpBytvo! zinPOf62SY)3^3nu<`WHHaChgkglsZvbpgE-LI~cnY(k z=CJ&mbykH7%|nKSUis7+bmv)6al9!?p@wH(R&VzK<^wQTW1lZ5P+|tQ#5oJd z#cUy-3PGkVF}~FE>lLemI!sQQ!PL1wPe}W(Uw$ew@$6VXWg3LN6osZR_-c;X1@eQ@ zzZ9gZ_Ih?h(H7IRHDv8o6 z(ySc3ynFYK>*?~bNgTz(K6>$CJ<+bC+_w1_+Z@Q?W!-EQ1=rQDC%KGHN2$Ii!eNDI zahAyKqrcAF9LBNVo)3OM=zXugt!X|l?>SKXL9NHrqz>7=-?Av(l>L}-HmljDgw&0` zGBoUrFdx{0G<<_K3Cp`zIRAar8ab+)MOF(-D|z@yy)Ee#%BUQL&O=smY4_0VcxduU zmM#H@GVm0KJ2sX;0ErC~Vh^0r-{(Tc@O-)WuQIZ_Dh7t?l~Gn&s2mrrs9aa;{CCW| za*xNo@+F4n>jXDe?QG@fT(BVQRb=aj1xwuvwt3O;iG95~BSx|;aEt^lMhy&?Y*qVT zDVO%XA_lf@n#~Cr#}}X|9dI5iR#p&%>%GNJiTBp8gV_nO`738t-U1{ZML>2z>*NHw z;Ava*N+6pbwEOO=y?j75waw}@f0;TtJN}JNX7M<|vOcgBzy?i*?S7K`;+$y>-G+o* zgDay(pQUz!1W%k?7N;mqGai}?1EaHm+T9?M^Ttt%`(vf*a2KK_@YbyA&Dsb%0jP84qbkoUe0^cpqW-a_K3U>gWxY}CJCeNVkV(8GGl1N_3$E+6Wa7o zVO^{OhohHrpqQ!>&ok8~SsKAF$wYc|xlC3s75Cvo+NniMx|4k9sNEoMKHvn{c7p$f z);`9_mKvtcEri0E*vb;%)5;i?UY<3pTqGj>k8xlalNF-=n@6+ zC3Z#yA~a1poi-(RFrsr3lwK2F*P2q&Og7?FQN!p@c7w`?K`Egln(Oz{vl^n)i<7=A zZ?^p=rAEOKFXdV*rHYfKj_yPGtGwwz-t4P<=WrQJKnB;J&~dnuinQh z-Suxe{0a;;-&qtoxx#vXLo+96>mCSyR>UW169sV>{{FB)o;)5AKbu* zU#+>d>Y2)sBSnR%w@q=)pDaC$wk}&g=1SC z3nazDSpmiA4i<%FS7WUqG*2$t?q&MYj0TtxohSxv&C_Ei?Ysn~IRIm$7-N?Ek2;;C zb9Yy*)Xy7Xd68`-g<7p5ptd|b1ahZKPUxN5hYv0Fll|JqfLc03;O}7% zDpIjw6`64nBB4V6y=>N=SoLLQ8F3&8whU1mIDB1snil3e zf2nW7y`iMn>5K5f*^nc&)d5sujaN&sgec+7H*16n_wX!}Sn2ykQpj_s# zlk;#$%y>3_Qi#8wbBHT!8_<9etH!>l+ev04LB^FR83P@^R5!&?bG}ejw?xy{&GQrq zWZuq>E$*!iUZGrH%)|U`BUizAmcwURupnoLt+rCy zpRz0+23a!Y+JO#5{Zj>4*lX6oz^ZM=Tt+Z*HS}qK`JdDGjo@-OX*cR zH)fdcsAOE%oI5`OZ-O@~Ck;N*MjqC``c&Sh2Uy>-w z@T$T2xs=OEt zfPkRwU?ZAYubpK6#3?`TK?34G2t$-!nh2sllI%)g^{xQ8*}xjX6E+K-Ey;RoLUSKx zrA@9GN%NW42T{Z&E7rcXiy|QJ*ZG_)IxM4L`<{q5xK-L1;*gCs8sK5J&ck1ltQozL z!d$&2@urn<(v$v(i$HRrJPNI2o_2D0PlEa+Otrh(%le>1N4)wQY1a_(4EH9Bmo-bZeX=2mRM;oZT%D5@OX@ns1hdfI<}oh^h9Rc*MD*j;#+Z8d$BWy$P05q_xNitWtMaxE0KJl%?) zzIq>elD#I3wNqW2Q>jH1W&Hr6rTptM`M6=_e*u}vP+%W~5g5Rt&k`t-jA(bRfeER` ze>wr$P2mJ}ci_Z8)_=!Vdj$BKBtqdDZ{f}i36nJAYkVZgKz;a$bvR6WfvjjQrPT)= z=FOl{j5}92lM$mSLjq?YpFa5aG8p#iMz%27r%(XAjb%#iIKr8+%Vo^Tm!l4MO>1Y1 zUGV{-Q85j2lHMoTd)Y{Y&svmXtD-}2+2wa@wXJ~NANJR1f<>TQ4ye0xLi5!IJZ5~4 zfI!CCf~BV)4+wSArPBwABc;W>Iyz}t5zK{4l@1fzMx-LOy77RZ00v0Y>{S1LjB7%H zg9QP}f6^_9c_1EhDT&lfIfen69(f37w&nj=-92>S;7G`$Rnpi|CAPU@v1#=WBPEomWq%DMlv$dgXTo`=XD70jus2St3zMwjK^m9uXPnmSe>+@db~pw`i3{%B zIOjX2+H3h}8xbNK5ef1h)PJe8j8iWGe@#)xda`OnL5lyihRufK>d3LHW(77cX-C_Y znusnY`Y9H-4zE1IbOOIo?~SWfHB^*NV6K);+fvj>S96ud)zq@uZWj9HA`UNY#ksj3MvaMZp~mn2hbih+Hkg2vLUe=Zl+%Ep1w+F5#=;M`E5@h zpVZCdnR||%N%^{p1tq1ReNf|pZh4oTY)XN#Km*F;4UPcrF=R`PeX%uCIFutD>CZEE z05ePJV4_ZOc_wyc%Oxy#a`$LS4@MR-;Df8#>N&VyEaY*7a6sA0*gw+qE%}M2RH!2) z!(WZ45!H==&_-pQiNSk-i*PcN%2&hkMUrOayeMb)V`l86Hw2q>LSI1ZRi56oa}2W1 zc5>Y$YcrV9v+m$XLPuCeNonf}*Hn{Kf!EZ6;;~M}HQ=Vqw_R4UwtBRn$rvcYGol zyOVLRmdR6vy&A}7!!5>4ZscEu9=0W7dxLvyVL`iOjlt!FHZS_sw0siLa2rHUUPu_~ zji+ZjULK%*s=SrVh|iqH zrFpg^O%e!=;IJj~?rwj{bWN}1l!lYHqK#qOrroYC8C-9d(hn(MFy8o;ABwGH$@ zya=FAnDt-N?U&&EPLf^iU;RV$2=kK9jnsuytA%W zU&hUP9$y-r9=;n5?K-2i7zFu$SzAC^_AENZlYJJp_{P+YVrHK<@*A|Ls)L6*+1(20 zWAYQY{AK6NGGtJf zW*&32r$YAN`8LyClRyzQNO3Db9Jjow`AB;bN8kWAA@we|={$3f*7L{NogezSsg&?! z?2bo}a=EZO-&_1bwt<@oHSy2uhiExlc3JH<4EugO4u?w&jyCsLXpGPNU#B)keB|~{ z7yDD@pGaHEq=?5vXLcP;3*B@iV(4hiG%85?U?p93&`z_tG#;A>($&YvnEhO{qHeBN zx%4_XAgsD%3BjpXF$NwLIiauprKC*oO3%R`r6hg8rl_*77Ai8Y*!70Zi_2x%v7y39 z#ZZV>(4?<~4kz1Id}8kI+Sp^uU)?CM-zI~{+{M$e-M^Qh_VjnX6F`~LD*1^cU_zwE zv}`?evK6##Y%+-Ec%k^aSu}aS(dv`ZH?q5ekb#iaosU!~T{c?yHQSTwaa|??$sRV( z9&|{j*{x*km%sum+1DgJkzPn&(CrPXg%h=x(Y7^pqrg4hg~&)>eIkp8oBdRLgi3`BTH2*h#-LZZ zR$ImN%~AJiBn6a0hS__+_qHix_aY}!d}NS{C{C1zjzwCSGUXsOlMHOC*nY;#>U2EpDA@ z!uNGyAex=1?C!%dsCakKZ=>+6lScBzsD@eH@c>TIZKG7RM#aEJm2$@BpLl*1hum;{ zz$l7GzRW;%0NPKJ^H( zBM*1svXaB3Xz-0i0MFKr=ZCR9*A17e0|N^3kXvtT+&mm<3CNJ`h%Qkv4=SgO$q9@C-86=6~=|GB&2-$O&=zszl* z>ucU_Ko}_~gBPuv5B*-lr*}8IEnilZ7?pyrc6@VgG2_d?w<(0iVsdI+-}t7gBeT6& zqszFDa-v9r%mOfO4ncN(6Lz1*Nk>0Y2$7rZ;l_I9u^RgI!u0u=q}w9><=SVOO}Ed2 zFwd{$>eZhcOLEO?UJ1Lfg(`Uu@%KKs{0Gu_|7O)~NAGjrIGyj%*@Ik_!4cPDUh(HI z)-DGhnJ!EMuCjm;Dc7BpO6 zp%wKt65JA%9jo{-07>Vaou=~LB!c_+FjVM*FM5+y@H>mda{I%lx}MmS%^#%e_?~7V zB(B=OWU78*YRd*ZQn(U{<&KRYUyay;!o*il?|EOMY5%}?`7XCHvMwF$iLN>oa0H~e zq{sGnX)r^PsK-FH+1c<2b{!0_B!U)dA};e6MZ_Z88Gj-%+mG05L-tqNu*C@FT_f$a za|H?yHPq{mWPD%juGf2EgI^Im1iaor+Mdl~HtMO=bOdO%o)S-cm zl8pPi?!LBZzTYS+N6tUU0?1S*=zHm*h*J7*@nOEfZg4E6g<$Ou821>W@EAVk$G-rr z?Mf27l$@lXBysmrC3f%pp*u57fJQ#=Q2c5uXzE(7XUZzBi>ozT$nqT6IKCG=9{4H$ zgA(ruNTzTDBG{H~sL4@-RM6zuxmR#8)H2T|AFk*8qIFd>LS8o!Vo`xR>=E_ zti>=m%=o$?_8q3JQ@fBR;#!|x6~nu%@Z>YH0o5@@SzLIhoVw z@>v~#B(U>vKGffRC8E2l39R1+2-A}^cAXYTh z6r|PL9ZL#At2ycRyFxQO-E0-1wQD`zdH3*zhxwO46NtpBDn2@1m@i)@n&NVW^Y~{X z53hQ){Q>TepP88Upq^^j+FF2#&eX&eq1xeG$0Eb|*JnoX9H)ddzr@U&T(ff&P_n1K zp9(&0`I`mYlhJqn{_i6UvmEMa12UpYSwZP5x#~j%Q`sC+=GI~1($>>nyND7J6m-lO zsxLn(Yc@xS`4r~GDHDd)WRK~slWRD8)x*|R|6K0IpK_egSzr!QD$KEq%6NB&Eqd$n zo-Qz-(*|IW7%>uAid|`r5nbmL!*QsPsz_9&*w{Z+)sGo_(J0(0K1ZdyQ8}WiM`DnA zl}(i}XHnk+3GL;aNsE+2;u(G=EcpXKF}k}}yg5EoOvGIPnNjD-wiETnzVvM)*ez%9 z8fQe8RYxeX7N9}OUoWGX$-jxfGCR!G#exndX_i2rsaJt`$(n5wKa$q2aoT}L(}qqj z_QCYfb(SxnSSC4?enF{M5~7bfw)o+qBcruxGBXSjG~>IOR~US&QQ-oGneeoqG$6K* z$lhZ}QtTWmlP**GW1sEI8Ljo>S+}w@m5CH<% z-%>$A5nZ}Eu5kIpJD34Yt9NMdL~V1Y-Tp?+YgwV6pmthx0){H5yfG45UY~=s{7~;t zRaROXe>t3D9~lUBW*97MMN}h7X|=MbG=>!rHLd(4>Tl*Stb&QzbZDll-i4)fDna`D zLTpSR--%IKRnPUHpl_}YG@~D54}_P{QuhNCte=uqygk@nFNg*(BYslzgfhTCKSXqX zSA5gBNx;O2Eny9}I!`iwtUvNKh(<#%3M8Cd_?o&9v@D{!H`N^`R?PraBBcWR>3^Zh zM~mS@!Nk(8x7z-R6ETZufKNMP=~+>+toel9$joN8E83&V(DZQGPw&k+QT;*ISSkHJ zqwOL0qQV#A;1y&A*L*C9>K2okZ);tA&EZeC(?QvM z>8}%lb4jaWhm)dcRRw04`$er9-J0a?KRrbOZZPv3sbehzia;g1=w?L6&{SVB8KAe1 zNy*)65L98#g2b!Z86magx+HoV%wdOn7PmH9HZycw&aRLGh2DATxw7l+v z_dFf z#!;QAH=`dmiu5@tSMc?hkVK+@TvLA}Dn_!4XcRDemEQr)O?9lAs-*^+fc#OhnOeXB zBd$0CvOoq8mHb_tWK$&o->}L(TY8IAhLD7;6n&3>iE{)TyM%^I9&2)_>zVoQ#vgcu z1NU4Y*-9_(L!6W{vIF`{=J78VDsuAG5~*XjYnw3F<@0rUGZ@Q1A(xQ5C%WZP#{`m zvbK(D&1BaLXg>hnABS{COm<~WGg6#?o(XBtPUl{RCSQ=wPGZbXvV>TUrCF8J#wCm* zJb;0=GEJy^kbxI4K0` zyXqNrpGB;3v@(+I0qD$W_HnUV7_Rp2rRER$!@01g^>*n4fI+1_!e(A3lJ<{&v>%Pl zZjfoA2)3j|rD1wKqds|s|F3~0A&gg+4QQahl;$LR2FUT$C!s)8422pUqAmmUh~d2z z*iu?G38NHCwqciHh^F&QHB8+sm#tqfBYVH6OtxAgu!ao_ECpDL3aFT$4a*tiKFVNc zR2Gs0lR#5id_M&X;2YEaCMRO6b)&pLeF#pR)83pQudv}H*5Pbtg^sua=f+3G*8pdZ z41&_iR_2)rXGmO9@GM9ugGCFHDnYhj84xTkQS#X;I*0=H)6JS~Lqa5vdw%o-)0Qq` zVTpfrjkHuL9Y9BA?8?8M3uNZz;b(dzk9&Sj`!Fo;3PS3sSAL33F6-N_@eeQOBFvvO zX0KJ4>4JU^y$Fv`8ua4G0~d#%OrQzGtbri-_A$})x|>4Y9M0s}<0s?WWX@buXYV=f zcqZSeKYs5mF1=CRt5qRD>b|N-EMbF&{yxd9`}UNXhN8K@PZvAId{P13o5NPtNi~+# ztWM_F|JtyztVGMU;gT5R*| z_jdc}`&wX9gB0Jh|Kar2_w~W<9;cs%RtEnYv1@HgQOauriDvbK?Ve9A^POo@qQRT= zEo#-rl-qYXjnC%Ye#UdMw3|;JmTQjreIxRDXg`~cIC=jvX=}~g_-p$>OU)azLj7kS zl4!GU3^zopaxH_M9{Z&%jNR5LQ0kH`pbqP|os+rlAkd~<%eh#VEBwkl=#l?XgZKBr z2b-tw37(H36t|D&O=o8p1Gx`UeJ_RZFK(pVc9*yKJv1b>S9JcCn@ma48^>{K)mSf4 z`QR<=e2-rJi1L#wUaUa!H=w_$v>n|5Shv@)TKH87RCE2e;^ zH)_m^-16nR{P3W*QX4Ipz_hU#TVL0EquCx|s7MojSNZ41hOxV;Q4e8_wGGva=YO_+ z3dM|^Ys`M>x>wNIT3nhd)&2NwEGl63 zHLIWn-BJ0%?>Q}%0aZJ|x-n1}PkRu)*y;7JTfq$7YPBbq+UxZBQ+8m!(Yz%x_}Uj0 z?4Gq0x}x6N%a$!@{vzv~hSldA;S|!m_1Do({L{if+&jPMW~2bE`Ug$dMl>ZCTYAGU{8|1+J)b(KKbmvYRpke+ZTP(VriNzb(q(4*04 z!}Gbv4ABIFxaC0!(`#j<^xTxs&Lg6R?jbe5g{<&GH74z^22T!e$5;1hNitRMLKF;Qm4PRIJ?F2Z4s~Tsm{frGT}p zfMq(*C&3?Qajt;Yy1>0BMAXZpO`A|aI7CA@|O$EHx zwV{>VyBfhyWyS7|FT#`Zm5YcE@$8726^L4c{sY0R-tf^)(rUD>3>^Utql6RJJUzU- z9LA1zI>)`6E`yKk+eJ@@Qv>1W(~}~`SODk|E@o4Kv_Nc5B*m;v=We+YvApS;T)az$ zb)Mp^>-yWt*JQ;_uFGPhNM+7UKR)aAZT3ag$#=&bUrqm`9(WAe4N0q<2I6~}i$Me0 zwL$eGi8`y_7Yp`(C0QfBed6s}Zc7*Aeb2OU)Nwij6Q=)ktt48XeQ2|PCp)@hF zI#fZ#h@(~30fJflHqF@OMKazeIwq#HDih?ohu#)%1$_yfprCg0pQ(0D+Z_IV`4GE40kY;nXCy?Xpof}V}Q^&^;i;6 zL{~_2nij1B?ra3qr?BraGj#neOzddQGL?;G`9!ai$3zHJ(<{Af43ZewCn{HU=WCl$ zb1G?xqm>5MS`tcgVfu%*A{c4-7`T{}3Ss5NtluU>kck0bkl0E7;tw7^<^Y~eKjJ{C z$1<97VIu5G;H|+lCK^!!Us=@4>{Skji&+J9k%5(8sl(jIfJGsjqb_@2^=M!9P#B|e zjtuiCaTUdinjKy^0IWuSk&OtN)Mg4A*9Jh^w$V^Y7)D{2w(>Oq4v#S08V3_uV`|&8 z0SP|=u&+RXX0az=t-=n_teyk1Wqt_w@5|7Y%_Wb4qtt_ekY1P?JR2Q(^gpO|6^^2U zRJ`0eI1cJst5IRytYl4~EUO4yie@`HpIEGe$n1Om&%M z3mXxLNv15~MLDTbS1v!9?2p{e{eSs1Vb`2+TKxb;;AI4K)u{v^tcHjf7ow8Ofe+;G zc8ZvH$`G`Li$`+)!+H9b>KHiWBNhPA00lr!%tn_wLjbz%c=4;NbXa(ZF-Iv83A%tt z-za{PuL3?sJfHhx5iv&d+i@Nu?Ee7hETih4+Wh%x2V$5I8eNH6Ok;Fb&$q>@>ca1; zF7BU`)qurp$SfVZ6L|$HtjfuYNzxuINf~mha9WfwwzCNqkJ_XR;rYZ8HVfo*7n%Qq z!`ijjoa3kd1JVCz=HFB@RNVoE@&yycy8APR%+l25gH)x9>*5g!F9u!X!g{*`9MORl zGTgKMK4rcgJ(or$iXVDaFm}T^cmyrC0=X};jQ&2Ydd0xfvJtx^=pj;E8&=B%7_Rct z#i|Ua1m}23dFx{h`&BP=;wlO?iAQrY&t92J$oi9G^F(UJr`MLeQZ!WKo+)szMa127 zD4(o@VV9#-sVvo46<9PY=r$#7`jzB!_>i$>4encHD4HM4iGYHOFz73;hG)g`$r*7b zMjtB^4$xb20uiOW@Eq?JLtn>`(BV;JRf zswDAuw3%1(K4e-&1-k$o_ix!N5bD#!gv&w_svCWb6>#>IIz*YNGrwALh7>Ljspl)@tlNZf zp(1poCC!yAXsGXtBL+T_b!2&0f0XVu!iVa4*U0Py z_F<^-a;of0A`yg6md=wIg08QMUelmw4T0`$KJyD4Vn;YL{whQ%H)Ae{V^iOJscj z!W><7q^|*`9`}-VY^tbz`ITYka1#vUP&4ydNlmL7TN3Ay{dV3Gf555n0GN?xj+3$jR?KVU2@*GWb~AuRcVc;@Yj*^i;eK0zY7dd*8fl*S@N^Mb~Yv z7%1L!7#XXMYlMiKfBhbVD)&8>#rVLPpze>enEWQ>H`$1RWv#lG_rh|H-g?qOsi<+q zj!$z&MPD|IudZ*?zPw*J{S`GOVW?n?;T~ghhHggD$f6}*SmagT>*B(p;2dDfvVdepQ&54 zf&LgU^?F;Q!hJRzvzrgYit))$e=>_`CQz{<(1F;3XyBO|1KbUDN`ISNeQ2nS$K7apZ!mG6MmH~XV8RnyJceK6# z=+ndD&b-$)*pbn>!Q^(;EjxONil&D>R9{zcxZom~gcZG}bA2g~>EbO^Zg{$db10y8 zABy5E7k`0La+OqRm%LJU|9;1A!!GkNZ%y}_rOixRsNEhp`DN^6xuxB!IHB^~FAiP* zV_!>x3m22(0~^A99xo!DnQ5%&h@}lB)g*+JY~1D>@(7IW{DZA1Z<}j~B|q7r+*c5! z;OF=+w@YRW-p5&6?VF@JgX~s%gbaoE<57Is!3!G>*DABKd}z#%={T-u+%2VwHXZk* zpwAWRpV%|`q~Gj-Vh*AfBK{E%3=#eJ$IdZN>|WXxNuqNXzOkDu;;XL zY*%&JbSYC;h2jK^Z{Hg>WL~1MPe*DqW`~VNn~Z!7Gnka%V(2>6?OFMap_MqD^JW(# zcz*9zOWVfQqoG7jDCM*fL|C<0qrZJ|Oqcgi&-NPdR__Fx2k=Ks_Cih3sYAWfm+QT> z=24T6JKH%k3NzF=zE|x@ryAz=jus+DA z^IjhK{1;aux@l&ry!1nx@p}b3i^!OLtG^BM(KvLQ7ss=ZEVk+0Ft(P(;jngw^@yth ziJc>l#7l&6MRLN~e<05e-^F|LXjDk5NKnc3n@Cq8)LzAyUqCrdfF9;ER9q!%UO4^u zQcqkXb%105rMOmbm=z+_9E#hx)6r@E7aThaZXWK&_|L z4@rUJ5=2h9g?K!d&_q$k<#t6h$?sn;-WP6pm;s;H-U%3}*)*k^j5c29IQB`Dqu513 zvR3ESwzP_G=S3cCeSOhb==1;B2P`k`P-g2oU4h(Tt6fgw-$HkGQO;bz-s8Neuls-L z)q0`XQj1pIfBzC6jqc&x0aElbK1qGnQzK7JK5F`8#hbo_Ns1=s z!kacU+@1DE>CFA>V~jgTW`nFhJN%@23hINSJ9K(g{vMk$>-z23`FMzDWq)^THoeu~ zBV%qB6Zp0xX-Vr_1ziy*2;N&Nc)l}7|h3{ASuj$HmK6AS;iDHTs?^y5-KMYJH8&D z-xoOS^nZsMK9%+2;g@%2l3f;G|47a*d|i%Qe@LU0FPQB>=f{X^Z*26?hfpf@SMm@L zudn>_M6ZN&UfD{F`j`gZbedgaW5p~^0@zFH+s+YYMnNQXVNzoXU43PX6n@h}Y`@R- z44>@cPEc`%h2Pb`jOo}B4mxBWOsR;_Nn`EnP0`i_dxenum;tScZXM!0)dN>Ko|4Z} z??$H{oUQ@24GFrNuBM_i_qiJy65L}SLj_q-D8VsI)rvPs(Zll!5YWZQG-fQ^hD#g%F3 z=D}sBA3h!ELLqqqRg!%AQO=V|xd(Y|h6Tc|R3Jc z=LR2qB?|~vX)(Cx2?;aO#u9(Bwrg`bBMP6_;o<_9b@060Pn&4u6{RGS;`;?mbD=?y zpNrU>%B9@S^KAkAgE^8E-4cWPUmOSXWT?VV&G$o07yzQiq1qQTj6Pdn0@LH1l%#in z%Eg#vd~S14Nv(=O)5NLdG3~b%6tj?YH6G+oCG*xKzw8*!MVNr`q|Ml8Ix5@ZA$awn zaZ&MkYVKSFqc8pusbqJx+y-Ke0^oRF>=bknZv<&CK1C+(^*JhZ4~Jwb7|{l{7_Dlv zY9$6|sFh0#8D4feh+|xVE>9+?xvIg#9+jWK3Y@2ni|3_+?N>otoSnVE(D>8*T%-cp zXX~Z9AR!2;BakxzZ8((JDw}~qD#Q*%FYMy#JRHR2a!?9xwimET5x737!R(PElcbPw zONJn~T}>bY)JB{#_CNzqvuL@q?>%W5!Nyk7NC9>w8Y;rG=A&6@{XD~|TRAORimq!u zqC|^hAkEG>pTeX#g}mdbuK=o(lssv`7F z=i^)MNxxA9eJA4+%V*i30&hAi@Gq7DWlz-OzuB1xtQt`mf zjy;2Fh}zsRR9>drESCd^Flf#dp>dk71Kfps8T;~$dJa4*Rrmu)bcZw-*;iY`zCyU1 z%o04?hZVW7SXB;_nwO+m4WF@@?>|Y^;&$#^^JXh_Q(0UjEZ?thBUhrpi03Z|QXS_e z=`X~Gk)H6fziyXmk-yPrZXJ9D6|VTmh1gD5>$IDW?icyy*J;j%kPK?ltLY@AF7Dif z3@pXrQkg;QL8sLq&)yTNZL&bnbIf~D^`^yNd+9a104B%d9Xr}TP?fpapc>XreedA$ zg8fuMslhL{XWYP#nzK_TDq`=%57FLE7;LHL)kE>m~u7ym#@J)2^DfI;xg?3oGp z`Q>Bov#H)ie?8r0$;?=Pe+KfjccZrtIE|ztA-!|xa_Vx>@#-uf5EirVeAKMh;g!~O z>7!DR0`!Q&V-xa)nRmL2mC_>d!dXSZK*tC`_1FEc2R?#`crQmACd?rBWRHx5`iTY* z2*&<2z`QXOVLitPT^SfJOfpqR5eT5Kj>@nR zSTjR`jT}hnca-%wmJKM@lL$Z4R0;1B0PrK6Qo>UL49bPtP=YyhA>$C)|5ewstbhG# zs-#aonT{+4CQtz5MTY3^05xSO_F5TIr^N%zr}?qVfKi%0oEd4CL8;EAq?Hcxo`e#4 zJc188%L{CN$6`{#Nr7R{+rXIl#r?co6fk-?(;{*!a@sh0+P={LibcpB%V*}>LU~bG z0frBfm8l|QUpNgikqumYTwPE~ff|CzgTgFTO0BNwrkRb7_dn1eC>=Q0QAtc7A~!2H z<~ALo6U&3b5(?PAiN-*bK*zYMDcl8lRD1s%`l?tdNQzV*oIb_DrB$p769B4mX6f{` zl2|vyk}*vP%f|^>qQOLw1nCu(;cTFg5`t5sd7whhO5-00lWN#lgXeE1S z8AeJA8?Ab99e|RWJ?u+{(ql#lV}=h!dofwZ4&gW_S0hl&@{2|ow$mtG7Q%$3%&%E| zH^rq_DR|d6b$_T=M2IE#Cs&2LA~R#7NZ@wGMG)<;Vlx7)qq6WT%nhKstpeg$y@-ud zttI5ZO4p$jPlG=3z6{wLT_3DPmsc(coO2XNHKzhhXj!tlY#G|8Q~hn8$Nd}8zE~2Ha}4HkdvZoF;s8JOB(*kUbgxUk@D$J<_sFS-CK=M@4-OgTLqRN*T=AJe=9g z14@{WT(kjPvxZ2x=+_+C3NRUQ1p;mZ?@CG=0go{iWL_kkrImivzfu>N=b^BM1N(Y; zbn4RxaPxl}Cs1wGyp-Rk;F9y{vE~b14&dR}j_p9IQef#JUA)x;OzGOEtIgfTw=5Be z0&`|br8H_SY&sVKMDE>eSXkePfYUxtTNiGBTPWi`z`tphsSr=}8Zo{AHu#H4+nREr zEy;Bp=ukIw>Qu; z#8i2!YH0KjIJ)7$pwajHR(0H6KtlUTP>7P64Mj{)ZkgDcc~qyaLJZb&_9YIKvBvEl zEpm3Ar+G>uo8^JzqOp(Vvnf0F@g?sZLsag>kp7NxS-~Q)+M<@hOnM-_I-jMZsxxqH zk}XwrW$`0&7+^RE#25q`LhBk|k^4Sf)6p`cC7bcfSOJ^-d4W|5;9ArAlkI6G#v}$Dow4;SaR%hv7WO2> z?rU95?{J@je*XjcZs#`O!Umm{D;KJ-1nnLFys%!x`x`TySN@P`>fB!>*fP&vlzowVi>oJy%QOWa%rS7+aq<9@12BinSiO%ZM1)N<*ivgB$FMz(VQo#T-Hg_v>Q-6RPn`DTh_! z)IZSC*73dAyLVLwdGFu+W_^@+CjSRAx80p~+jWb*xYW((O+{|6-U=`9jy}Rigxq(( zJ2}XVgp*nAaCH?%QAG&p?QBK5KT*AEt8j?2STt~RQ|yZ5E<&hUJQm#i^dR(s)n%?L z{ps;OK$@q$2&Kdu&*&}9s>^6p`^{7Jdbu6n&K8_h#c_O zhFMZsF<4u>E0olV&Qf!pobC^hn6uUQUdt1r;onU)Run~BHO#Q%>15%B&LgJ`mYvN! zK{*Q)t3L&EsvlTyOuP4Q2<0KR1sAJX0dAYBSMY3PsqlK~s*iHQm1AiH;#Jed%C`xQ zqO6uxa%O5aBDY{sJ~*BVjdYIjrxE%CGEUFz#vK6Gm&<7qtiuYWC3L^~RS5`}x-(Up zopVLH{7L-k=xEy8OX;lhuzntin3waSjk zYMA`g^3ATeB|a^veXB~i)!#ATVkttl|X3JmKC#A3-$6t{F0IA_<_BzFDW$w)o#-sxg89W4)JBak=u2BRbL`V zqoWyl;Ofm89AQ*xL&YT_^Hj3i_vj$XAdn1m3p|{*+fWj@?@xZBJ=h^h zXw3B#z)M`3V0sQ-I$J=OsREB%H#7$Juv*0P0`lW5t~yzO|03P z*_&3-!O%q6BpOC4rsGO%dv#Q?$tktz;LRecq^0IJ$5F2^GjN_jTC(M+s%cK?! zhk9cUp%jlX_Iu6&81QR#se%)NmLU3R1So?FO+T7-?0i2#GTF5PTlE-keGY5EPsanJ z1ocnhKz%NbtNjv}$d5H+%oLB#mwO0f>4Ex-O)MdIGrC$C~uI$$jzTO;h8=!Vt&Vtj13)Ui8uQe2g z{s%l4CID=5^r++1lu0ZjkRThLPqD*O`2FJ5#4$X?0$6wmo+&H#M=Y~30-r9+9Gayi zkFzmG>E}DrgcQiYO&I$8#Ms`N0T#eYS+Q)#fuN`nfPJ%RC0(mhdrA@nOO9lrC;%4nJ@%tj zrJC%jF4(VfV*R|{J>ew;A^cY9$EMz^+dFx5z_{=a)B%_kgrC^DdWt;hOPOpRYp{@A zaW^sOnhV~*1JVxMf~?Of(A4&!nhebKW8jPh>aoO<2t(lBSR{~9TNSo&|0y0l_UkmE z#kog(N)nV%Jx%4AK;;>))s`+vDVchw+nPM4U=d$&hH<01L#F5kS>-)P&=tswM`j~c z!u8g45ENsxA^oYdcyg;bj@+lmleI+mOt|QEP%u8O4$;#pS1c&B=FjPGs!ioB@#LDI z=gAATF&y@%sY^E}&>0=yC)?zk;|eKBM;Yqw7nolB14b%C?&p(Y@r6l8C&Ft2R1dJS zPKV3C>2Oxja44lf_G`Rmyh#LBw!g-RX=J%P>j+1amrsjUWwTYmMNNoE2nd7+iOMdg z@w^C0p2P^kP*8qG!AngQ{fs00Cg)KP=yI&jSbvg#0$3O)d3vcZW@lpiGEsOgwX(af z_BQJNc*f^qeL$%%>kJ^w?E5(`DOxr*TG(tS%I?6El+6?EPDIxhOK}X|ean}w{}04f z?)4=~o2Bg?6&?+Hcac`n5vyRSQte=ufK~yMi{`gK6}>isW1|#a=;W275-~KN@05%a zv62~$cfDb(Sj|_;IjUVi23kdBcp|RS3)K=espz}vfK0;YKT0~Iwm-O3kf%8k!&(0% zz=iTtTdtdNWl3)iFg_Ll-cD9|v(>zRplUsl03ww#FQ{B&e6{3Jq7G>{3cBJaba32W z7p@}Ml*!soEa_7fqHs#l;`>6@<`mYS;2C>7Qs|Z4z59)QW07Q69N)8gwKZ zlo3@67*&5bh>9h_^@h*!XbaWxZ2;rSRJpK*ppMW5$$xXI4L zSr;{oH+?i;Wu=rUw|GzzZAf7uwQ(P3()Bjiikvmazah}p1%4-}URaJ4X3w{%E>BKP zHp(WA0fcU-&bQ=icP(zDlE~9C+ocahJ%nQ{5*y{TnzSxJPl3vmT8?$x-_S1&$s~Jr zn66RhO)Kk@ryK+wZ3%qL1EZ=_Njb@QUjaytqUd-bj|7B?cX>^Ozj?boug1WabIUti4`)GL+hc@-sd|}8qoL)eu!)p0r3}mN zi0l;c=mF>qqi6XtARP!;4&`sV1eirT-I<9!m%4{V-wWgqkiYv{2TVZ-&?P>a&g$Wk z5l>#$Q@oejVFxeBlPyw^i&?34>7`Qiw%;x!;$*87X4=tEizx8Ip~9^QjH=&rpo1)b zjgFeugoL6Cv|g&~g*mYq<$8)go7L=e99h9XHvbg$;fj-5`k2nzl*UuEWQoR~IJhK{ zv3JMU#}HqsjP@JNQ6lGy`9mW)y#Q05uL;!~9qg}--)!}?Yo}4<-EiChP z{R9#(#uk$)VAEVimAnf%^3qs;-tgj+%Rg2XSyafS_^H;Ygu>0W-17|;sRwIZjF(>Z z#dl)AcK?&=bFhZSxAVkBF>5VJYxV0X!w2>1bkGUeYaOPnY9ZoMDVlCZA_O9kT+_Z( zhRP4(RD-*7LiSZl?SEB|Aw>LGv*Gfq^JclYSu*tVGT^L{|Iy+5M~xzkV@efiNXe2? zB?{+LgRC!PVkEXN3Udl~`GW$?udDXnge>xReNA1c3Hc;Kia6V+$YiDs&KOY(D>28B z4+&yY)c#Brn&dg?XtJ^-c2J%qYqz!|IKu4>8E|q@+v85XU?jR-N-OWx?&3jvgegQO6B0)F z7sKP|{8IDw{wcz!=uo6Qddg^E>(#YwnfAr;J9(Pxs|GDUSI1vzQqS_TL*E*Ag`!h7 znI8AM@4v=fCDO$#0A0oCi(xm19fFI}RXv{>Rh%ZC^_m9jyg6o2F=mzi+$~K(={^YF z`~&G6U)r<_==YR8C-*&8Q zcWU^I5oh=+w5(>`OHC2v99VNKfji}KG+dhSOXvc5(LJhls7UGc7kx@BXf@!4e=`+DmxSaWC~^-eE4b75V}N{=Ha1-{ML+!K zM$hLDUNO$2KM{AfbUkWn;+!ULev-)Hm?|Au-q!mU;HV$|D#m{v|07gZRH@RLKz%H* z4Dkziv1n8aXZrqwGE@Z*{%hh{JPEGef5MR8K_1t7W|8jE1;L`G5iBxwMc*G>H1tENkFjn{s35Q&3Q9ri-SsfHx@ zFTRsQOy1hgrDJR;y6HSEH}Fe&xKHxatc1%h^g@;bo*opSj!CzIMSs-F`_y_FyD z5=em=M#W3q{xA5|z@5akuLtIaUC(!389o`5qf5h)X!(JQ`X$;61PN|BtFAxyWx8G2 z(Mjg1Q=e}MC$0kx0EFRAg%A@n2allfE2SDoaWDIO?&j02Bvy$Jip#P;1|6q;(QH#M zZf;C^0vQW}*pg#(oWA07aH2E|Qo%d)zkI2u=1UOIanl|^}&kq*Q7X- zvEfnq&DN0c{=3^kV)O?|gix&Fq4mU)o!xh1wCIe1?>;P>zSJ1$r<~4OT1k?;zE2uX zqVJshHDmTW=UV6}Ds}48__Ne-ZrniL+~nljFNx8M_SP*&kl&AM@UCSYnrYj3djbl% zKh1lV??yd;AXKP+o%6jINuS)?df(Y86{*^jiFijBFG=k{EBCA0Pn~}!ZJ=CXS+;L* zLz*%hsuG_b_uEFuS6;GV;6BhL}gU9Go&3jvDHZ=c0IC_Mo|JgFI_AUy{im#SAZ+9hm=?Yw} zYB@hld{K@D;n`xqAZ~fe<;am?#VG-L*cl?wPtJis4d2{Fl8qO6E z=47PZHkMI)XZocsNTV|!Rg$oU^DV6xSGL=vB;23#MKF8jv%^GhwJ9ZX2O1?n()6)? zlZ{P{RE73TVuUA5hHlT$g)-6;)y*<-k)0G&eJx~{nLK&$v$aQ>w#bj{Ryz~WBs$vj z?1`888S5SBDUaN%LU(0QTmBq&Ge!StR^H6eH$grVrT11?e8coXxQaeyFHQ2Orz|=X zZ&|hL_se(*&9&E$X!7JP;~^M52v=A^(c(TD?SMy6bCz74k|$aOdoB`Kt zC)h{h!?XvFm+fpJyzC*HgQ*}F_f8{o2SkAU$g&mrIp{3%Ja0VRLYWX-y z*;tY6tqGBb;;ier70^Vb6H$pS+Q+oP!n7+KGbR3mkn9cbO?U`26I;a#F2b1F6amd9 z>_E!2!CtOJ^3=?XYJqR_E##e+CH@29auK2_P$c<_JK#Y$86m3zmcuOsGG03EY;cg5 zyrA5;j5Rd@+0UNEJ>>TXbT@KG1wFF^)c7+pMMprSZQPLZLl`^KLUmc56qy2}T!dW* zGU(N@g()ec0w?$BS6#dND4&pVn^(fNr&6K2+ja`eDb2|QQjC-rNje6WpmpmrY&>Z@ zwVzUZ7j_wq$AMbU55lFhQ2B3CT`Be6*;H*#c)B>qfw-(8r&K7pZX zxP9wlwSyM<@J`;I7%()dR#&@n(o3fHykUKC85Q+0G%9AAUvpun*_7xs1S-sf zxqDKC)AQp;ZK)yT4;*}Xw60RS2?es72B2;B7RpZ-Dix%uxR4if8m^tsp2X%f# zM%%#g@B+R^-&2}<-JsV&fXNHRyrINVqakK4z;AU?|6}69KhW#+=f9=S(nt`5E)dDp zmzQv=aF@$>d-eRgvDabQJGBx~vU69kT4gC<1c3Cse3P2eXko|ormb(v4M#-vnC77uO>k{Jc3jrG#%{xxCo95T3>Pf-V&3QOih)@GX6sNA`eTvdl^g*8e-10(=R6YNR_u@*~SBWg~^{OAhDPbzi4 z!;27BTRtyllaxYk1A6058G%q9x}GH1whi!m77?!#q29vKvlkvQzXyZy8#VngDVsDE zX?>-K14jwi!0vrSu_ozf_D<$3Dr<&bDzl(9%+R%F5#Y+VO0P45KPdv&x9FNVY__7h zj*T6Vf3h)oh;FS%wXOf7Sw--*D2QQd4m>F>(mOUI*FzPv^?+%vrh}4UM4Kk{r)O<4 z^IO9X`4TPQiJ`y-h&f;9|nBY3nr9!J^?Vub{4p{^|jQfO8!VQFxj(1_qkPJ z`9yThSG+hT0#0~ytQ)2>9L(%ZI2&Ha4`TM5Wfr<(-cIfaS2B$Iiv}q#gxT|9?28wx zAzx#}%jsz*DD3zce(pRjYZ1Y1#;Or2p%7qMcmBkoeMWJXQT@hGB)Lm>wCYRVI>8yV zbo6bAul>#%BAC?xzj>yst3z(E#hIAj<%>1H{n7>_7F=Y(NaL0Jp^GIWmySJO#8u`l75@hEzDmsWrwX&71puZi@Z07OHNT zs-HiUZ!ejy`~<~M{yc($d*Qr}ePZG~fv^krH$1q3`FXZ9QX~MjK{rbmb#fY9j;op0 z*xvQ61sc?xfZ-5>LjLM7IX=z(4wc6EFr=sd?N4K1@NV{cjTj}zp=2(TB|cOs{(<_V zrjcksN`};IO*9RS18eu|^n?3uX5H6P)XvdjL^&;NLauO)6xFdc;?~Y@L~Thd9YKNX z<<$8B{hu#nBC8%&H+ITt;}ZP$_8pV)xA~2ig)fABl;EL{*QDK zqHOm8v!w6mPx*;r#WecP8;Bl>p2XokRdKeX8Uv@V6G%#g#G_YIc-;fEF9KdC%bR>3 zi$G@6$P8OQO~7?)USVdrdWp3ugGEgY|4?X4P_{#BUq##$`%$jOE<)w~*1*-JsURkz zHm#dwMqorBMA?Nm=u>_4*K{lP$+MEOu{O5P;wJSq0aya_h`y{3uT6pu%#?;^+{r3i z%Y~XRppwXJr;TAAS`JuEQQM@!^pyVZq{2UXr^#80!ppZ7jBR_C-(g&o1`-?we|t+6 zJO}NYQ!Ekg@5)E`u&(f;T+YsT4 zVW4VUlWjUnspDdAF2d1{v}2G@D5h&L_AW|J_@j~1EiE6*C7Zvo8)luIA0XM+4Pc9; zRdb1@lR>D%im}LZL1~>c-VM0bJ$^0}dAuwY7ZNW`TTQ{wIlT_#?fU9tJ5Qf;yAg-G z8K_lTzEW;%GMQQg^3_D>?BZX(Zg(Mhuy}3`vVKCl9esM+b5SlbCp!&%T1?;6;?&q_ zV^hrgpd#Ox4Hm8=y<}}g7yeiO`KyQL*P9v@xl?PSc zKii?c_p_;2+?}|48abjWd}7qUGF7pQIzZJYvs8whw`dOJXJH#sRxV3^3uxad=k_&C zB@O@Cvg~_rvuHfrJDZGk7j()E1gUTdU-)=mUCJjmINS#f2-cSRDlMfBoVzji5YW=| z^-*!7?P9^j^!A@6%69Mku2KR5&z==;|0YlkUtL}K8-H96`g?W1{LI;V(jE7*P8Ad1 z@y%wMa(j|^^^*LL!q7wrzFhK3$8S*(|AyL~TOXh|3huat*K)C=_9swA?6eqxBQPzI z3_)c1V+)$zY+vtn?lpF{eiS0?Zmr=(cbmb^>vsxhtMdC9H)5C{?ej zzmN(W`)vF9;X9SGP>-JhhnFwYab<%d)Ke_Ow{d#EyiDagYPlZ&^!mjX1w<*W)Zu*! zra4E;8KZ#uFR%|GtJ~OJq4SSJZ96%8HMa4jawPq}HKnEb z#qjmRZ9O+AB5y_1V3Dl&ST+B7_jw(g^?UA%tY^^Po9=N%p&iui+`N$2n4HG;0fN+Z)TJQ>8w>d73H@xYU7 zJ9ZjQbz!!=S^k5kl#D~A{eaJ`_h}+lI##(DZ~2rRvi`E>i&je7x_V&v7!T7-PuwUR zO<$JSb@16l7OV#HN{v3*^&Xw=i6D(5#cXF%D{Lv%+7say2=RNY}~rGH}x ztbeeSr$dBgs)aaDYrG{&<|9lpCI-&qqMGLh+`yR;&|l2IQQJx*j*DBYvr!BWGqRYS znrFQAf)pD=Q^D9QnEUK-ZTA48SozwTHYo?X^Grw5e3=AUU8Bn5)(!{WTa651Cf--u z4)rH*M@3M)B`HqGp?@LDUqy+A#gBI3Toz?LQO(0SY(|2>Bu60mqi$g2Q0{ z;WatL@c5O;P)A3Jipgm&9*cN{%fW~|IL8wkRRCXIV4(yLxzwB)aDt{$-+}P}c~7G& z=2U}n99ZkRKbCA3-VriWBqy-|t7C;$4S>#>#5f8hJtbj)umJ)CJ;lKbbI5p5uCyP) z)UR>>L#{&*nE%T<0w8bTZi7f02pVAGmbfQF@(bgTYGwO?-u z{+)9^G8xHD$HFxS9HP*j)56Ox7hBF(H{aGYNjB0&^NiUcppg`WDKcnWk`)97Mu`Ei z;*d=~bt#I(W)USpVh>T4$@35cKq-)u%p1A(*J%1M0Psl;ND&#)R+VjEvCRgrQYO>K zv_xk6>@$vv2(I$^q61e+Kod!T9ALVAu0IxA0YLJ;$;bbEwVxqMmnnS9RDvEqoK_Cy~H3Frchrf_+q-+XctQW!6ky%`Kgz8u>mTS;vzSaxd&aydo0a0JS3B|J99@#wBWuCmhbsST zGTxB)Av=gFXlrH)zC`N^a%_>KoO7OYn zI)%=VypwAsQ?%+@7*9}%{EzDw2ji9{OD|2ihst*aO0|2|4GraGcAo31H6MdrFuj8I zzvdKm;SZjR&HvSteR4flf;SQi4|=LQN-C(l7O8hNWC&0^Po7RnJJx93iyhGFZC1A? zg)w?;N*AcYUCgv>!zQ8csIS#kyXdDbm5f@o2ubc>axUI;Ec7?v!mCaKs-N12Vqk4X zJ;F>J2j#DxFfgGoB3}4MGE553hvMn+RIN=qOzRuq{`&7WzXIgHmdH`2>bPyEDcXD& zPtuwAlwt&lFmy2L^WxL2fcl?e;8BrGP0+deJ=UyAA=sx|pFug=^^tX61TOQi+aHnf-?}QL|HqMK?0mbY_3)qErlYK*wuVgBY|b$*_o4 zsuuzD-Hgz<9VLRr$JZ`o|3PqM=3||69tyCsLL=tI}r2zZ+GcTENiR}; zNbGsR4sc+NI#4Rr?EhxbB2k>9PTJiBCBu{=lYB5GgX61533?%8W>A*Q(LzQYQcil7 zEU^D_|33Ms#(5dtPTw%JgpW65VwD9?t8ui@8^_g(hBqx*3Qs+Pp^!_pMwgnmtH9L1 zY=^i?PO@};tG}BUPDJT5XZGV-C)a8bT+pc&wgKk3)5vX-Yw9wIXI4_VLiR8B;$PER z`M(Z$6%;(r@ic}a`7V(Aru>`RTiHORRzdT_Vo`W$%qlAZxdhSOon#d?JQ-c^@E>R> z54(fv%WvkU#-+t~$T+GDeF4jb(50>n-#6ugytihW&t>lHnHiZ=(e*#cJEffeTr+&m z*xloHl0?>;#V+jvcx!Y+&zlunnN7!EUxpvD${j!0P#gBsB4gYd)fxRQjBw+S$(*G< zNFH?#oQPZ|i(h%wb?jqehP8`0K~i+5h6A1dxG$ZVns{r&?qhQ(G+b`MbiiaPlWwJI z30nL#9;XyCa7lI@&9T$d;vF+vHf=mGd$sB?72?t0qPfvb>l2^8xJ7o1&PGj^7&Cq- zVu_C9Hs@isQ(EDqssBbHSqAufim0K_LpnzmR2&rL>9#p$9amQcJ0O3N<`L zzB>aWn^gyKuGXuM2gY@X>4Q2JF_SnoIm?Q3eZ$?HchMW%RJev4Amy{eFMH*CkEb0( ziT(7XH?W#gF@uggyLb*K1*W1+eFuD%XuLB2;;0z8IvtF+C%=ol*!f5wVs{cU8Rb3tK{#S9G zkr7sHJpvtdn0t@tOY&;3{nxEPdoK<2fn^J>JY7K zqH-q5_}Vskp}Ny=M*e2k6S6d2}ZP?ZKGJQ4#iU1~g0TodSv>34Oft+rGuoNx$>X`x@hXprkj_5qF@EFe zzr0lN8PW8QSpG7z|JTb^`eO>k5n|_^3pTP8bv9)t_@uaOX!}*yS-U2Q_z|y3dFmwy zwanYXI4>b!&Z~eYRFZs#tMg`bSCUrEB}#U_%c@#abfPsoUr(gdtMwyIcRYPZeV*}Z zV`lKK6>lE3@PO{ES(}9AllMx)Hf0$p!xF!loXGzp>8!(={NFY_x<`X_w;<9XHIQx? zAR!1seM>mWP1x83WDk)4rkdXeqkH7bC;@Gig$DZeNU)Oz}ZjgH|y&jf7 z64^5hoW`i%D>xKBmgqZ60yFF8?KMhqG`Y2R&)Ckh-p#+ed_8*c^_kAt*8Pd>;wKTw zsCn{Y4*w04*5)Fvrw8BkyF2StB(qy5I@5oiN!2-}_)2LPHKYy6ne5hMbJEiuNUCC( zJYJg9t2-}VCk-hdJ*#D>;DvL=+H`*@;X_C@{gr`C5RLMNfbC`g6mIKLqkZ zrWTEW5Q|G!P}%~NSLD1Y&f)WWtXi{!&mz5H^teBB5R`>_Nty59h+?XhI@_yc-wMqMQZ4EH@4vyo-eAh(ChPUyP@{mo~GM|`SeS+~XV zg)Y+vKlkw#Bl3z0hN0g^UJ-(YYm@2fInIT9e=`GuFQHz>r+wcXo<4N?{bsEwilq&% zM)hVM-Cp0Tw55Q?v?DAs6Z*V+$oa{8{=9BECBxa~=*u<(J4vJ3FD)Nco}F%OA$|^9 z0v^tq3ywwC1XkSdDonXA$Gd8Ih818-5idH{H@#0#=y-y-bYBrWmPSrs9Bz=y?1xPH z;HZfYf|kizKesV)K}idpCb<(@@&qkvf(YZqX^1B2xl^aiG8;)ftK}I9u>^;o$JC2N z=e_TS(;BwJ3W6be=C0b#=*&7io8E4!Rxcpi3JI7)yOz*ERA&r!>xZT;iyn`?b7O(W zTF0rfiLR)T{&?vTa!57sFe)7lv7sq@KZ#d4xi@&^C zgwdHQk|}y7p9hK9ldEOYMVX#~BpT6b>nDR5eXey#QdWp&4#$bzk%u$nv?oQN@hOlu zZAwZo>pT;ZJXO`yIkPn*bY@m60iOq9!9QP6X&81#24Yap0f~-~=lIh1_g}ueR^fk~ zu_Q;AOkfU$Axyw9k+3Nll?1E(Uz>dLffi+A_7EdR;USGyGSvu9-K%@%56yO9{|fn; z*nM`2`s(zJoqmxY-(g4PqXx_HOes|^lO)}e(!tnN1{IM68VjvvVRU6j%_tK(&$|kn zPxKD$`L`Sb(>IRGZ?cOrVpJ1a8OYe$etO~z`JxlUO*qYQx!xZi#E%Lj3QAt!J8NtZ z4>5afpt5VhAasjj&~0ffZ+3#Xlyh=D5u*SJB{~h>R4X3?^ zZ^N0s{;-PRrONKR-!Pwix#lX5Y{D5vhhz=c=5v@FxhY=3#tfkXR})!5T{BI z2^w?$NDz)C+!;2_8saMh39zM&v~zz>A|}IOd6^SUuX`*UIgTsX~vQn(l zGo3?|C6oAr;p=M^MWApFLz?W;_t;9VyJwy{f8ScsV8qRd(5mMRCV-jaR*3g&ghs{p ziM}a+H{A9-GUv2%f>*>;>UOm>I0DUSGqfV@h?43YwPdDoGs!VdPUUs3Q_r_9U~5wL zKcv#O zww%u+o5`5F)dE`6ZkzRj`I=Siyxu`qrca?)z-^<|A y%fysuFC#Nci2|K+CF00h zWJ-NimB=-S_*MW~gZU*gxy%VIAOz>f^yemx0FkWQq&jHp+7gkuxje?Aih$|peLf<$ z;V9;TJcK|c9Jn)K#CIiIjx1ja5Hv@pY8PI=y;b$NZCDAjAH@NO(uO}0n=}ZMQge?3Vmj!lAGDiY~Qxms7$5;DJ>sJIH z8h=%BrXP?j_tNmgoBzPw${m6DeE+$s+$m6-W`Rj z9)AB&OvClofHU>^I91du{1_n-7LytcX2L(hs7MlpMTK`tzF5FSfuc-j(KLC;Y~>-f z_21FC5+bU=_PYNi{%6xyAa#<&!*^Ezf=Cw&>}FMt7Y-bzaRAL4BdQG;9~`_Yv~z@z zcpd?-$FSV1L}U>?UBe=4P&X28H^Ww?>pc^WpT^m$LW1&9%{#FAEtvkrTvwG<|AoS( z_GUOP%Q-L3B+o~PW|xKZkRO0wBz=*d zXQVI&&f#WN9{-~w1SEoQ1EYLD8`W-Qtv*$bI0`SokKB+&NjOv~m_~ArZ`=XSo;BU% zDV#SPuW*WWvnNXIkcZz$o~V0sI2Qx;h`(=`roy2BvBR#y6h($s!qQ9lwlPh za=aUu1A1PixvDD)_zz~qz9_k;LeG&2TQj%OfWyel#DC{?SI1`*~z`bZ0rg0Z7uC@_?BPf|E( z6-)cWErPeIHFo*RLOEoQ(PC2vvBJ-OUmevj6atr4Y;g;$8fC}#6d^q_kH?gD1dOjU&Ax0R&A}eMQ^_S*Sq7i8NN3w(i zi;{V=^*oKFQbQ4TX(Iy5u!%AC7!%@6oeizRN`_8@-6NuciF-VlO4wmuh_Mt7;xqNHt@sFLSI9-L>GB0+!@}o)Q)Ymj7Q76 zv5H?#I#Khs?_WS}FCTsPC&xtx z5goT*l}6DH98~93`!(*hZz>&k9+1APUpaa+kV|VcFMJ@f*T-m76qy{Mgxe=HH6>(+Ab8_ojI4&#sKAyw&&F^PRb$s$O~0B~B>3 zduJP+c>>QMOIg`ZABLbA^`-r}E#pt%q;%zb%4Na9mWvJkKJF;eA8m-OBYc!Glox?8 zP&$9N>9}=;FBDLHMAHmbJgVe5Y4CZv(T9|f=^H!d)=TSAn5hn%;qzoX*cw$b_0T1$ zAcoWeI6RbR0INwun{~bc_TUWXcx}b_`ccJ-Ez$Eik|ok{2?lS?C)lXB_-pe>eAtlq zqG@CphC{PE3n|Y4i22GqN{1L>_mo6eRvoENnNV7EP>`!8R7ZqHkgQvj8!CkrNW;}- zG}kd1b!kJ@?5n*lt8#=etaZ3?Z50~AtZt`I9(x<+J>s+~(dfP*(8ebT0GXp{>Dd&P zUy7P0lDk?=@>Re3U}5ctO~xg!-nWd2wI-&24Az;?eiuzWLPV`Rij~6Bl~nR;^+$1$ zJ((m{-?sq_BDaT>b7P_8lu@FsR!4+phaczAvQ11hiFS=~CYnnUIenLTsoM{{g!%Q( zX2^l;j3jionW3+GTKZX-Bu9baeb9oG4u?&3Mm3UEl2!3&;#Fkp-&ahU<0Oc8CE!5= z{ZNMRyfc>=HoVHyY(dz%oz&>&+c8dSw1|R-w7@_Y;rXa-bKlXy6|8SOam#k)Q3=AP zy$*%Zx!Aj-9B0qglCIK+>Ou%T2;PBrg6SLLUYnlPS-x7RKj3YCw2uga=(pI)nNdb|UN`qaO`FDO6&(pD<@XEZ(Qzd!E`$UUS)~&W*lv zbACgSAhq|EP1yT7i29&^u5dm$Hx(=gMG2p$BSuly)bSdv#%}h58kmGl&ey_)=0-lGG z|3K)CNm%cRsZak#{!V=6`gdj1^1GpRd!<%_N2vj`+!LoP^7h+jTbDW`FWeF|xSCID zK14)Rx4szs`9OUTGWzwl`BC6;Mwa9>z4vmxG0$wUe%o~Wy;mV*f4f5WoAAc6lRozG zgplz;Nb0?~T-D*{Xo-y%zXQ*9zO*&;XAa(mAkWSmGJN-h&gz10&U^m@%|84c4k4-I zvCi1r`C%W7tuM4ln?{&_;$m!oPoM}Ig zTdu$Lsqz1mlO(DoLua1ejxEakmV9iaiY}wg|@zamqZcDq9uH%+vJr3!&p8442?48yqJ^NY%p1DU zMzr}3E(r)$7RuSO3FymjBwY&bv_xj@>)bdoFD<0fc7o8q>c<|m^il0WTb>h0A17%o zo7T~nC{M_!V-1o&TUVp+=M8CuSIgrGB6NxuC|{b|7F7MEUYw|Nkzui`aiI0GaBj78 zs8P_|by|`nZjVwtB$c9^uai&D*s6p~m>7ca1TE8~pikzDZ|y_L>Ydg?TP1*zg{Rr6J!mv-bEiO# z5I>2+ntwnBRj&|$gqvf8eCVp!dx}yQ?n*vnngR(1{{&f3O1KUOzqcFZm9fT^Z-=y% zCXdJ`A0||K8%S;bVU4X(o^(ptYPKlNgHl^@Zb`quDH4n-HeN)pa4R%C zff`&}@E_=!jUQ5)U;(@d*o%h+#SEMYMsq-86|vhw)kxeUwP5PDPxCMqmXco41EF8&nrA zgvEYU2*<P@QmFIC8!<3AJozFLC1`D>_NlM)>=c_#^xzeuq*(hSmj@i9i8toWAY zYXbJ6T1tL=xUrjI*P4&2X1aoauMIC=Xt-{qT4RmADvlP5Vk|8@WzZh>8^AJuNQX-D z(K|el^`scEGNm3q!ppt-EQ?q5vn?Z;vN(MAq~Mi9+mRSehP}}>aTr^d#>HsLD&De4 zsz_!bDlf%s*pQ!?EGLS16%R>S20Y{MH$*IcJA6I2sj@0lqo+Vd*6msAo*y)qv5#h0 zz7O{TM2@vyp10fze2~UC^;g_jx@Kzz0M8UcuxCmMlfuF(5tF}WtuytOu41NOF}I($ zB?U+fz}j5$Pemz}%OL zlb#k z{wTc*T?i9P5+7)Ixye`H$mf-+zYm)K$1Y{}JOKD2tLSO;{mryq8{9_G(`(%02jNSL zfHAs8h!U6fA34cAe6 zAYFlO&<;ZraqL6NlI_b6U{^_tf#ch?s)=yr8q@uFC$LHg_(CJ)5ELtKWm_d|25!G5;9 zI}xc+T4!2?u7TvLx=NqqXo>McY&hIwxgFVFoj8q}U1Wo+%{N<>tYv4ym+*xX656+BkIzK)Q43HAucoWu7S7Jf3!{tpiNjB5+)XOmuD_4|46MmPzCBxe^FLc*O^7K2NR ze8bK=!wexwuK;)>y0e_*wZ}6o_E8WAug9BmfpJ<*c#C}h11mr@&4^@2*WU~>U=Nwp zC8?Cujl>YQkmOXK2_m-(Ll^?w7B)qo`PqlW9;!1b-J?CpL*Q?0B-aC*nd!)mCQ|*V zS8i$xX)IJnyE7109iQh1$;J2p4Tn5ao_kCR(6E~V8_a@Hz>GoR0I+!g^j=^c5&{AM zsua?Do@vZjrcFkb%#@BsY+IIqJsi+%;-xz)X%uE1gLq+)+*2I=hV~~xDaA68ohfC6 zo1yBpFR?18o{`_Bzj;k^d{pT?k_i71{h=6Krk=72OOwN#4h-a+W>aba_(KMGS6xJf z&32|A8h=1v?F@W=DtLa7eOCtl7-m|oPS1Q>9y|_rYJd_v{hg6alLQGfOtfYt^{knj ze*Q>FZyaLHN_MPVGR<>%r3D1&>g2zbOV-k^!<8f11BJdc<2x&E7rfN6{F77!t((dm zDl5BxeyLpVrz%ep0GZ|<$3xeSlB)0LFa!%8RK|kWZsBPO@eIL8KZR>HxCsNWZgP;Q z*KDh)#6pggJ$R1O?9H`=Wp40&lPn-;LC%;%pV8$k6`hg!lw-$a^0F?5wjjm(n`}zI z*rtJqTb_pMH&M&F8hv05Zyo^tJ2^4LH%tV}4O(vfrhL67txcpadMFiCY>jgNJ^Cp3 z*Z20tWkw!CM^ZcGhiHO`DL-mD6r+D0F|_KEhnvHNkB02+Xy(B zy>3=?lsNrHWk=7RWRt+mDL3@`iciY$~riawW9A+{T^ncmH!3*h(cZQ9g4 zGj2KuhNSS>mvf?+ARkootUG)3{lNLEh1xB{$U8cL7dh&)3Zqr5zUlL=wJ%AtaLJ!D zJ9l~aNtG}w#G()syv+smRrEiCErxzhX^{s8RF}-~NWe4SPV!vt!R1w==bWUUe*&dOz+$|iT zkk4vo<8mpeln|$Az63)f?bgvR$;fvJL>azjrj~HVo7et$wGFATPQz#f4ei*+Ox|4@ z>otr>`YkIof35yCY=a`lR!eBxt*SQOfoVqIXgj)mT9X$jaDW;14oLZsvnf7D6-2jD zF0q{WCc37GF4T&*K7ugOw@Q``(byowK}&%t=CrCSRJS!dHyRBt&}9>gUSm>@^7>1+ zpUW>x(ltk4%}kf-cLg)lGsJ9|r3#QjbDSL%A8YJrr?&0b8za!Qi{

      &IzAI|CLiD zQ`)2HcuNs7@ff%G8qy&Ptz+qMB{(sDz zdkA+OrQ=KlDm~ID-{0qX38=c$Leh%PY4;ib!&#aamu9D9mS%FCrFZD^r3|7S@zd)}Z+D#%uS_^}sbI z3C6_<@au=xh!`CIve7$)AMw9H$Egz)8~?2 z=%Mm?gX@zUGJ@PP%567ViAYax&lH=IzkjbzM&yWpQ2`s$EFSD$;T#`s_rBVxi1XoP z$0Z>ih|lQrdu8Q@Ya;l!OD>|DHA5vKJC=*!GFu6nnRg8)7JMDu!W+0ObCIhC*CN z>vQ(?nVjTa_#aQ@NOGd%X$~)@8hMxU9}HJ4-frbbf-IGeQio0EqtUGr`|NR2C)C$_-UX_B!q$tYA{MU-30KW%+xX=8o zw~cvM(?+O;0P`=5;-kLbcNjLDF$rfiIEo)WH;{2bOhfW0PXpn~^g`kLi9K83r51CxMjmL*Ag~RVgJ?~!EB*`r%tvty$P|H;;QT;|(59ZRV z_qEQ@8S<~+=O)anW5SEg*WnoW{N(;T16P{SV)^sg=&}EQpbj@Mx0+3ME@$2i5O(5d zLFT@vdiq)%Sx>*unluR}{krM?9I`zp>V#C_+H*c0+y{ynU@;EE7C|SE_o2%eMF51- z!+j=xR?3xH|2l&j*PALqJhXH9Eobhes_zi~(N5B{9EpxfzCnSFC(MqU0Rq~rqJp+z zpd$tpqGK6H?r@5h>hKsqZPE{}dLryK8E|gv@7c!pJ>L~*#E)TWBn3ZYaz2!_;Qj1j zDEI!|3R_+HRTf0ed)YAdJI2Dg7w1{?uN{B$X#tKrnOU?-6KreuhHv-#Z-kx71QzdP zS=rk~3pW|4X&Ir5b4{IIOGnU zYSiv;C)jz_BwHHV`eH!RfH5Lwn+Sc5R)eW}Z-u|t;yc&?AgKD8uYBJRK|Nr+|FOL( z?y92OY3zgjMp478%tfj`{dhHoYz!TfTu6#?qNjFAbdsM5Ghh4H-utuQsBu5~+)8_Y zm>O-jg)uc*)yn(u{RCx%K>4E8=?_LUx<5?N@m?RUY>s*o)%lzH6UjUO7t=4#Bi@H% zhaV>*{LDX{n$D?`&4|$n)N?>fFelHYV4cg;<1Yv6nZ5pHnSZ)6PqKkNu-c`ijM1q)B7pL?3KnX2FdGxPxVX~sY7PQ{Tkw&KEGXu=ES;oi&zJ1MMU zc|RmVt-j<_PQJI}l7@h0bycU;;xG!LOumMHN{rEsPagl^n7|LtVvfD7j1j7W(XRZ3 z%Iz~dGovI?g(70|9?zNoa3`Cc=8eQ%cZA{_lj^EDeuyQXRSpW>Wj_2XA3i{L8}Ec9 z*D7u;f_;xIs34QVi|%+UBKNJTfbDAP>()#Z7`TYxXbHQQ@-bd^^R!`r!^RNjV~Y@Y zt^CG`hRgEAz<{M04@Ycc$gpqPvJBS=!%erm0Y)$Ws|UXE-qk&oD|nB{&18x_tcWg3 zPlK7XeqeGWN@N9W-MEVj9FVhMbklxm_Se`!Xy5P+ulUF{^F1#fox}gqq-c(ZT^Sj> z3*n|RLA9;ehvTG`50Vq_^Pn!VNLBZrJm0)&HQkhORhN}I6%|Nulni3*gt*!xS-b^p zg+$pJ*e}MO(#8E;CL|LDY##YW{35qi(<)y^8KVCR317kblRy6%moU; z+4dsLUp}_C+6#bGSH8gaW$LZi)o2|JjQ9>44KY>t9a839e{9;0uZwf!$3Jriucy(N zR*SJ8%qbTY0^Y_tuWRp(zhs0iQ=YugZF9+~Nd`eo{^iB@-b!9`{ikTDw0qGfOq1|o^7P>=5Vis3NE&Al8eqY-p8=uTH#*` z;bsl)S>iPuj!?FE6PP~VQ7|kn{fTEMh`eZe7_sE@G*CB|7quIL-$UKzjO18 zQFGS9mu4zyPjkEo4C|)b65+!3TOt8>HltA%%!aw|7qj=wK*e+P?$xy%VT~qYE^4N? zE3C+lbcFee9qrOG_Y{HNYb07K&dud^J{zJdckt}`*}jJ*<@Nr4maKlRU^hfbu>b>3 z3e;E~ZyV^&U)QW$to{kEe0Uf4AIK;bd}9*>P}XK2o>~!sL_pX;JoiqNzrsOlC@-eu zUUsjmW7cu<1|o!e5Nf5c8^7f_Ra=owM~VNL2E7`lNX$;PuTM)Wf^Qi0K>+FFq#cRn zuMs_t%jV`Ks{h7VVk{xdyM*lXR!*<%_D!aWb+!ouVix;{fyQi%% z6Uc-AdZX_n<#c7X(bb-}r#iZ1b2%QJ@-t za%FdCL*?TN$t%C!dI1i@<*)hw2D1L?*DKPd)7qAd?@Hy#>x-5Q$QVCdQAzypO&|P~ zcaRbs`Oxag{50DOqYRAp*fHtymSd>x1<+~M5~8r>-e720>y*I9$xf9Y zMcIWPp$S&YZ#gzn*aXgnU6Twf0QgcYH{JMu#4HD51i(sa`O^@ysSK$bKLC3CV&%I3 zPE`L}>7!0}51<5wHY5QQv}Js_C}3iO$(91RV?2ifi=KnBalCEuCh*pwz|Tv>%>OAW z#DJx?OU-TyA%7l<2g(Eot$-Q~hZM0uxWr2hr`rdrX#MZ+(60G}{G(TE+EE7}AvUZt929Z1cTb>NlW=!m zJ}E)2-~wFS#45fu5(;ZB}bMo9Xn)>3F$Co}ZYRxY4 zgd$Hu`eM>o=Zy`$&P0q70m%@D&!z)DjnyhGo5S*rSGN7K7>H-nnyD;MpjY~}^RPWI z9K-Y1xf&&WC0Ux{-1zf*aU4)N2W_=1>gqcoS`W7NO znx#2^4DJyt9u?#_UYO>(y|EVNHxFcU`UP#?5DdkxdC8}z)q)5R5z5YoUPSAYx~hCnQ_G1^4b!pry8 zUV$7zR2{Itrp}G%QoPQ%GaODR=nEDkK71P%w(6MA!mq&d`%o-MShDG$W`gdZ0WQ?> z(jY&LqtlZ2Gh;4?$PcyWcr)@7Sdz-wE)v8qGfKC$YhHSQ7;8A(f+)A`1km{6vvutT zhRiF)_9@v^z1WY+)4DlVEg=PS71xpk>KlburcUdjVnzlPBC}@cO5_ih+Cvr>06;0 zp*A^vjoDBMO;p5M^Nhc`ikLU=&>U`->J?Q4-n`*fsyCk}MR9helbY08^FSbn$WkKl zzlB19zB$e02O@6`WZY3Sy;irh!~dv!B9N>A@2r=|{Q9+qi@0R%)(Q_0rRgYY_L=*tI=PHHKgD9p?Nm;# z@SN<9)k_PagbRTW51KYv$*C~L(F?lEY{y9G@V`;pu@)A|vzgJRjpypz;e8eu#7ET% z!fI^@oyJX&WTK0f>MPx89L{C>$bh3f!Sw3(oVU#(yg_6~bIL{?daF*w{3o@Qwi+2Z zVscbS`J&aR*BT@9))fTRFi5!~1@<0t;xQRNRy?u2(9fGn|A;ckSK>{Ol#VJ&kWP#Z5SxM)gp?J zQ#i8&4N2E6fK)KNK&r3CEB2Ae>Rp}5#HLn#Y1XY^)ZfC;$BGNtq)$mniynJ!bmxin zf8SoWyZpQYz}0Nm0LW(QoBL1p2}|h*ou%*lC*3^H5m1*;BO!>sd71{b1Q%7WC(NxQ z4Zr=i$;0)Bc}ij0QbZiEcIP|jC;yZwyPWPy2iODY*{ zqr$}7GI01I=-Ra@^J(+wb?0}cKN~>5aL2#Dtk=P1*%%n4gi!qwEC1}*`=f0{yI1Pj z1qRSkif()ycun=xOI7rj7tl@rU~roGAE<8b{>5qCy1)ya?GNu5eWX5bM_};i1#-zB z3+tHh{Y~1U{sFjn<~)HWvKxHdmjUiM$g61JO!(kIkEtC8r-WJ6blwc&`AS$d=v z$GWIOt>Z~h;1bHw)S)O(bOzU$3)|%Q=p2d!Pqk5%XhxdIdvqM2Q5Yw z417?B{gta%za-S6q~Ara@);13NvV&TKvq4BFx7{RDr{baf93sNxz29@K-?Q|k*mf$ zC(Xt@n#<4Uh1Zzjyv<^9#zrB3XB`3ub=sr8@K%#pA-@`;@vhY~*x6Sb=@{+@>Oi4p zm~cL6_8MnHoSZ4sPFF4=zA(m9x>X1G(FkLhs6%3u{@=-LsBmoOBl24M0A1h97oXlX zVUG>|hnA6ti4330jy?@>;+e9$2#7vrLXA{2E-U14o)m1uf7Px!Ry=nq0K(tLPBHVTv`` zo3@l~GlkwBQiX^vJ1Ws!m@*2>ddilVoVJF?i2t_I*R+n`{l(%W+`l%wCxN29zd3(C z^=e~nNOV!LCL!#V#cSo=w2B_E+Siq~wgv&WxH50q2~Y!0j_-z}5BWh}d3(DY_eR=K z75&n4BXPW*ffIC2#kM=AZ9iRS#&U;qP`*7GqH~Enik88M3&FEM(<*g7YbTB`G1!9N zqnazWd0Kd*uj+QP-aPu{Qj^d7(b@jxQiInYZ-c_SDES&Raq>>+N^8G#U{#O-Eu{|i zEKx85Md|kGg& zxpW7@H*X3{(pMSGlk-FQwrnah2ofV)#^!{Cc2gu`B=gYX7|N8T&6ka#^zwlI&ZVjn z#bsmDiK`>zwFhfJxn359300YwwN&|{;!RXuE+4t!y~R*%GidfXN!l^~(b*RDApH*j zZMYx6p?{1dw@)6&1uVD_gIXURwXjN2NzIdzO7?9Yi$4^JLhM|u5PhLo-ttu*NDCnP zvv=CfV(Wv{82zJtekWI-QOd?p0=j8J6t0fZdHIqo3j;s#n!(8z5X&E`bsWku;L;m@ zAo4NG?)g1O$$?)A5p%z-F`pA70}3=Syp033W;6c9lvLjaK|=Ak=nLCz1(U~SP)Ri)dDFbP>sYK1JI{6zytA+-#gnqj#ogcW()8| zgQBa2C~2gF(i7>1fYm}XeqNxPRMcV-YXszWl`BX3v^X3z3VS6T2SIbE=lNvEs(Jse z%))?(v2s)1@lvA^RVzX!0yJRmYJ?KQlz|o?Qi{TsfihbUaB2?%%a>s@ zTu*7`4FEc-KD-%AQaUJA!j6_xOaHwwMiHE>jgaSAW4d=c^tm+W@ z$c{~Hlq+wU(`tt)>%6oDhv5x2x97RZ!c9SYh<|GD`Uxnm_H1^uHMez{Cb0|#_#RzRHcqfyE{~JG&70$~Y@Cy-hY+X(?j^p2Hj11FI&eVo zQNVqDgYU_}supKig`eD9`)q6~StU2hU>BbrM8=}E#$Vcwzb2gZ?bt_opZT~PRm57ESKMmVtD8Blr8eU5wm2Q=&8$~TQ=Q)m^ ztHQwzyhwG^>{b?BrEvL3P9lMgA(pjfvze;U9eUW3Q$<{8R8af$N=A!?Bo_v^?%?Td zg|?Ac*%R*6O`iAo9nb<)@M5C0$xr!{njphOZ)X@nom%jG_e8j?oJ+AbB`tdsb3mgb zI)~rbjuD=dlwh#=ts5@vM9>~{`Isj|D$X`Q6GV8#O_VOI8(}A09>HRy4h{b-XsLmImNV_NrEK1 z3Nqzu78i7qkLs1Y3R9#n6t$hNSUotuYLSEGV($-$T)3$)a0_n($GolO(Hdev7o({5 zvY9m-V(3lFi1EZdMsL>wEStKuFA-SGBKbJYc>tL-jpqgvnJHle|3d{>2rV0{Roaa0fQe+ybw&@y1BtJ8g-Jc67UT0*Hb%0L zk-io!a296yDU9QTUv92p#>-1sc43fLrRfhOr`AB(S3`kBRlWAr!hK#Y{s;@-%Wj4B zO;!iT6=U1%PsP`J4v!N4jKDrcK)NESN*l-GUklPz5aB z_8MWleYokHb&~9G{bIeBaY+*w_;td#H-?#e6#*Bzt`ZxmC}Rz=6rq4JG#V*?)2CaQ~U^Yj)7qewZPd zMHb7xiOLxPaL)HT-5w9EI}>&3H$h(~4}M;-IF@Yh(=4QNsYVrS=e{!ALdA=%4-Yw`!+z5B~T4pA8>D=_Z?4{VH!qjy9a9m5OqZrk&1^z4xC3o?sAUp4(?nckDC+{v&a>Dju~HJu z7e0Y^$BdiyB0m)EPc7Pve{8Dbuk{ja1fdCurP~n{E(G@)SsRm7eZHepz6d3dj7#?oxsrrN$FTU1H{2HFR(t0I&J+$<`!*xr#{qqyZ#5 zPRbC=;OGs9%S0~bLGWk3*ODoie-`=6>b*rsyty((Ek>lo4i66sx)LrEpwFr#+=Q!_ z->S2?X1(;X`K0F&^L!e4c;I&{kUzO@-kX~NR2wLVyQ+YHh0(d+4dweZ!As4Y!njeN z5X@3?(0R3Ub`kgC#;Md|5u-v!$l>T?Sq?iMJ07RCT}QRBui7;N>MN9;cdA7CA%AtY7`_C|w<_$Rqh(YTk3wcT`x|2wL06zm+d9&EHBs_wRw^ zjgiYeWl%lp%v>7DRP|j;w8cU-5maEqOk||$8M%DTS6z4-#na?1^86+uGO0609AySF zaLA6C(fTcam+X9ByBC<>N=g)2^gGL~?A#-ykx#+>4ju06sxgF_GYGfJTV%a>H2L}c zRo9WwQXEKirZohK=(3<&D-VqWf$whw>_*}y_zS{S=Y8gr{_O19 zB9M3<3o2~z{U!LYTB-h2C1TwqvsK(c23&M$(!hiLqGLOg6fC87c!2Pj&*dcOjxn^3 zj9Ai4(av{})Vnce;~#qQXYj8)(5=#OisucfU;bc+hl4wv-gF zga?cW7JHeWe=%KQhXI*n$@ZIP9s&!t_AN5)mlp3wpFQ<_cd`kKL#tF^m97W#xSKpg z8=vTKERV!8XMnt1rOqE8sA(UzbCpvF%ECHleb1&;GAHgkJELr%<)hrz%ubC!pfSzL643fi^8CgWkHqJoyYoMg4p+{5_Xa$o>(ID-V61?= z2niQ;IKy9mj#Xay`d3&`{hJv~GV8Ud)qBROSJz>VJ1t?@VrJ(z+v9_Eo;D#_cl+!= zMwzlSm7AV_UG?xlR}IG`37qb(&)@T(7qglzja`Tu>kU?>o(Oe|EU?^Y$R3jYD|aTBj}EdRm@#E%xM2`ApV-C~V&GrMALHx5$)2)F3a}n&59arw z8`|B*%p717ZVeR&XhvoB%-uWtz-6-b_#GL8#tsCI@3?ZG2|%wstc6$*L3W<+^3&Xy zv(Wu7`6^>yWZH$J(Zrr~UPnqhvMU@Jhma%p`k!*`FA(o%)PRtqog^nVN_Jy^_M?Zz z60C}F2#08`zE+kTwhg8ehU2=Ed54V^DXKDe^UyjMWxjxIksM-^3ix9yA@w;GG|5cC zJ%f7;24dM>V7>EqFH#1kXd*8S47OstB5>e7g}wYPsBc<9ybFBOsa%}$hLSjndps(C*nSE6rAg9Gv14ZWY{r^6mgm{$e! zKdj_xZ^cVvQ+8FtI2 zI6Y@~Bo+}G{j2;w+zhM#>AU|xxRYoCNGVtuOpNWYmV-^$9PK){!S?c^%Ar%T$nBfK zLP>4~Ch85>4Y$XHwmfWy5w6$=V)e%u=ipRs#?AqGb5|@={Q{w3G9h9*?a@ZURyYON z$&?s_@L7lw&Fdy+JhhilcsS4WI#ri7a;&8F>gQ@HUvFEmN1v!y|Cv)%W5OfN3gC6q z0Y}8`OM0HvQxfE7A(RG4tN1wfAZy_aM0Ab?Jx#k0eD6l)WT_c}bj##x!U$Stf*5{_ z<{-O>iq;zg5G`m081S|>jgVnVfk&G&;-~1o>?)V@up}17Ccg339v#m>$!BVpgDxIP z(B?RywYD$D++c9G7%|umc@r%kclc5(Izi%X&`dS$;lZ+_ww_c?HOyqc6&LglQITg@ ziOrng9cL`^QHxWJXhxm7-Q1|3tf+!Hw53tgaf|#y7d6y7T&X&fI(Dh0*}+ZpJl7o9 zbLT5yeQr9WGGg!LCT_~zNX{{%Iet=YqwP`AtAjG-PE8fe#G6CUNZl$4#Twpb6JPal zzhyTB?}`D%silN%A0};=_jQBqf$@_JXeVj8+M0fCQ=7j&c_z1;tZH@ReITzT>Ufpo zWp3|1F5J9nzcDRLqauRG@EyGFfojE$055nS_4feEsC!z!AC*U5ThhD>*M2K?&BBkWV17Z}A1F%K<2s5OdlEgBg>kE;> z(PYRPX)uS_eemd4eshQZKvD>Lp~{(K?#m6Y?ATtVd&Yp2tC19(l~Zb!X_xx>K<`i= zO%UF2o}~19Q(rU1zYJaF{0cOlCW;tO)P>W4c%_&* zFG?N=1TmR^T`KwU-pP}c05sE=q2*Dd3PPy@Z%1l$E2ik%^ccbc*PrSmwAge2Et@An zEPtqA$b!!SNl`rxb83!+7n^VFD~~g%CQI|_Rm!C37qw}{k}$j>1&BMvk#yTBKC$1*82baF#l~MYxOfq1oBO=mV3sLe_PgYm{OfUQpRi^)ll;G+>{!;vkRqv zSc*1N&tIH0?`IBRvTbN&X23rtc(q&fN_973(Wjp6sky@gxj3;`7v!V`JcXqC_}*k* z`|zp~{-cGE(|i7?p*-3*ebbGWZsI7v(_Kn|yzirOX}a=ATd`Y5Qz*Mz+g#%qCmJ7= z7o=iXAvV8JNcdWwQSZAq0SNoEwrDNz2Nf|o8ako!||NBm`%5{m1Xz-A}MFp}Al))S1Hj6<>|1kF4R%dL*V zSl9w0FhKEibDgAfotWxoaVJ!f+Ju8hq%)&I=q%ymv>&oXa~dcDgh)A@Dt}(F9EX0Y z+g3{;$-|W(%^ZbiTJh}Slq6DEtleGA6J_OSTH8k%X>=$#CFm9>rJEZ=1l-+UCMc#I zWiIiXw7+^^g|)IxljZV&X9T$5EP+17rCQVgh0AmIdz>5O#aJR>H1`$EnPzPheF^U+RIU?jTUaPf<)ua3{Boozz9) zRzI-Qrsl(tMyb<&Wwfh4br7jaPS>;ga8d8<5JtLn+ud>4`yDYu=Z0_(80|BQoex1& z{dqbTcBjQUBOb*KS0ZQ&A5`@qsUF>IEQeNV+A0X zjkCnW=#!xSy7crX&LM}pv;*?Gpa)dmq`a+0CBf!}wM@fQk0O%V;r!Z7Kz`abnxson z5EvVqGQTa#K7Ng;h9VKXGM;A?cT6f#5i%=qq(*ziDFn$NneZ`*S6jUk9GgLhQs_MM z@RKTpmex3mjA+x$fr)P3x zcLlMs1;5f_S5uVm>rS?8&q&geKQuh(%CD<)71Tj}edbpTUz8B}36APy| zR9`Tjdn@3{9DPVRE&a{5VNwERvf2-iOvU(uG)ab;hEhZi+3rBPmT}p;*yLLKK%- z-mD+D>t^n!_z*)mrb-s=;KhI|fS79~I#(&;ZzfIWT8#<8DtGCoqZuut1k5vT@?N_K zO+TOwt?Vq$GSYvko@qOwod1sgs9avD;nIG4c|?c+*f>9`WaEP!)zW?dE!3?@l!fcB zO0W?yzlqFdYVAhQGcW9xaH3_3ZJo6Zr=wfYCRxebXccwKLvs~0hHT4CWD+7>z93Us zIy~QPThWi?wV}gVG&U=oMt&JnBuu?B5ZtCMIWkRvILi7iRFlyXug6Ua?#ALE(t!U{O&A z!o|juiP}etR`7ec4sdn0vqX4hRfyLdh9)20_B_ztVLr9PZK zB@4|MeXj#AGxiXg8#Q^`Q9o_Jxzp}=GQnbT@v{v!% z@Ws+!D7c>c8(PI6T2254-P%|iGTH84Tt<~Z@%G+bThYOE7f0;kx%560A@0jg~MAn zxaM_>(I!}djhWHvkV$4e^AOLKMC!-bET*y_hq## z-F0ZiVO#^lx_Xj4)Mx+_pkJ1>!od?-p~Od#`!PD$)Q*sHJORnb8rwV$-M-Zo&`Kap z1=dM`RNh+M9tucIPcqN7HGN_C$q{5FAyg;xjN9b(CeDUj34mZ>?^WK$Hy=BM1NIzG zGWV5p*&=e*<;?I5ZnDv9( zfl0Xpua_(^#-0Ts-B=I0EI{G>ju3m#nJomJC%J}7mgjsWuZX`}$ej#*9ypc168Da! zTH3o(%rKTi6>rjLmDA7hEp;lXUHbLrxyh}NU>?0KNqH+*SRF{aHE;1Y<=44@rB~K$ zwFC*CE~BVYbRaG9&8zZj-sQBRrzgmx(sxF5mDo(eF$8HR)csoo1!O8fNb7bFm6aWcBz za%|* z=salo(bG?($X?~F=2{d;Ed8spBRVWW8K96m8=GvXVyM+f{987-VmO3%c-dnN>}GXM zMN-)4o0(_)%6T4+)vG~m=X2+m2&vU7RxOSP1lkt_HQ4ql(@N21Rk=7SY63Du>E(j;8nXxw+i z9pcIk5&zvtyaq)wk*Vg7i!0#<<2%4K!FD`>);0YOkJppAcYDAc#Q`UW&uY=SoJ35l zO#LM>7AdXCmH{R@{BZ>uMCQk~s1MuB+oD5;Gv8fL_p~?l6=<~#YZZq{MRr^K7|CL! zs&f775VjT=4=3|f4Nn2vRVg^Bj8{(ggkPYj-y=2(qhWGHkmqO6VYg8GEA1^A5x4or zsC=`D&ZhMChxA3=ppz^9sE(&U=+-G@t9|e4IT=mV7&qI zU*wR=I;ro2U?-SA13QOnUFuy#u=y46e`UKb2uNyzD&}B4x`>H-(@c$xe;QU!bpuQ+`l z2`i@F46X6r*eQ4*$*Dd+4lQ?!;<(YbG(_K{N;EGBrabkD zdTYkuwU^;0ZP_Os5@lGgBdj^oV1F<`DWVHnwZEL1|B_XUh+o<{SE zT>#!7y#NvBL$jwq9@$lt9<9#&Q6fLV?%$A;@)Z#n;)#|TvQ^DM)67G+| zpNEsmFym{ex+H=f7Fti?U9$RRkB;&i+2#NR&J;LL|95WYr3xgpfWretv9yf*Wdc0O zrhs4E-J+Z%sl@`%0g7+HR8Wlyc6pspm`UKEOXxK5FpdxkNb*VF;#`N{t^R=6(;=lJKYwah%MF}JS zxE^2sImBP88f~FZ7soOoNX`mn41Pn+st$_XE|Xeo+NMsNe63#f;$`x8lV7k(q=!7( zah+qBI#lP}D(N z2?s?sgx`p@n5A^=r%#m#Ef<Dzq%*tVD{FtI3#V# zM2CiIoBZC|`R!%%blde;(iY!H(e9t=x_-xh2m_KO2pHLdbDGh0VtrzYl4n+JyQL15 zib&Q}lf;*OSi&DzLhz zYSEEs366S{p65K!+!!v(P8z9 zlQeVQC4?TpnrJ0r^*H%OPkY4*9{uU@n=smTrw;}X??j4y4Mi>89olFds9YQMr`BXy zAGQ8D#}f@96Z$89Z@T>BAhFq|k-c;^Uf!qg(*IrEamkJ1&y&xuB;5aD=M>+YJ#6ES z(wgZLcpYr|g-sJc7OcFjLoR^sEkF(d&KvVPAw!CPH4#TF*n-K|FGqBv_1vE#1c7f- z<>uPl=aQX=V4_F>FKNBI6SCkKQ6R+R$@{U&rU-fas)~E#a|s(iB?SK-JbFe8`zYey=tague7`@t z)p0&^)1Xr-tfyKsLHjw|Pog_T1bYNQ_E(?WB7Hw}N206la{2p(aFkER1jGn}8WsG5 z?0?*7^n~#49Uk>t8IND6(z>Uu;={crf{uQA(vZZ|{^@gg)E9cMIU3{2xJBYsj*G|_ zEP$dmdGZ^&CV2p!Rly!80OG@#e zA?cA9h+@Sq#s0pc2UJ6ko_rZ~!rdVWo_ccZ{V`@{bM@`wozt}_x&7zj>3%lSe2BBT zmyZ>=jqTfRtPZ&2cP~`Pxt@%qztnS{;u92jD-h5;l0tY)w%vm|d@?xi`3%E7`MfCL z7k5EP=AmsUX*10~pR5;KL%xs5avC}HH=dR;OwG>EFM$8-;|8ogdF7CnGn6x(*}thv zZ6eY1)(HELS@}dJCCa8T^M~}nrcjpso3Td(A7(dgT`KY4q&SfTMbes4qs8n4ypu!x6LwM9~!5GKF`9NuhnW)e@prokyC z3vT|VkcZiNN*grf3Xz;Q%)h+3D|$_6SQNcU@p`*|x!K>tu-EYX>DGEQp(hVhJ$a_X z7ptO)*9BaAW$e*D(M1ewQJB5Rd&C;Q$>v6JPv})WxBJfaV#(a2Ljr80=G1gF5 zgCB9{33C$)V~!yYUU5f`a*}?hho_Th&g^Fe|Esmv1NJT4ZNQf{TTkdAk8v^WtJlFn zRPn4Cws^XWqjx^!Yk>}1_Z~Q|$_^E1&s}|oeR}t@GkfHB&@?#~{;Slk@Es4HVCU36 zO{=eP(_R}g8DSN|5o+JFH`QO<1iH)UP65}M3zU3QCXz`o_x(<|WCqVqDN6ny4|6$} zCI9{C`=t5n^9JzBx-;wqT^~*iHjE1KD%KgU6$t)i+yn1(E*l>iaA37 z#7LIZe)^*NGPLA9yIV|QPL(^A+K-Dzz1fjlSGNsiwsK%YHGJOcfEw@G<(b_h3BnzK z)+v>w#G7BB`HS;^1jT9J8G?-K>ICS6ymwQ;5KVSkr-u5h=8_E+tNc!X5)+Hg(SFVf zKKIBy6y0z3Y>kZ8Jhy_9N{#9`hDij$2a-D-jX@A_Z;H$mu3|X1ZGSm4zYcMhQUsD>5Ya_=xu~d3GQ7CQ-XO zb~6I{Q=Fimg525^?w=#%wVR;XTgpK>MRFS7_X@&u*gUZs=|bSsu=jON%OoLw#%vsM z6o;8$?x(J@VcVaAoBSq!{}zhOmn*@|S(6=aXAno?JcJdJ`r zbS@~#C#2v*0XTH<)&-UA^S+UdSoOf$Ly49)%1K+=j#*%;9jxS|W0t5w`_ugOJ zqBV3QZ5DMTy=x7u7v5Me7{PK=d??8sP32&bEJ6v5i`-bD7q${ZG|%|K+W2BR=5Mya zYXjL>HIB?py2#Y0TYfb>yPY$o*;ULfgq@c|;C-rnQM&^L)mKQzhNkB{Q@ScS9lAZ3 zuaNwP*$HHyWd424MR9_-=8VUL4qsajRb@em8TMVdxqBg@AE}{ylyzm!@$ri?TF{fBN(b3DF=uZ!_J~EA-!p zSn8)j#R{6K(I8)-{G*xqRrk)R;aBwwH4sT2_6>ju%0Cec7zw&3?UDUhl0cw0%voY` zLR(GyBb?KRh~G7%iv%yn$#`JtmBf2c-kQ*YxvUyLHR)t?4hl`MOWX~yLpdMUqegUx zc60x+xvPieCbK8&*1tLl$wiH|%Zk{q2vaEGDy(yOwPS$}5!2Fo5noC+bytye*=Pn} z7AtR}Ie`;Xe=#L*R`54+5ApwtN+48S&h)tp@kAAXSvDy4~CX!q%ilBR+d9`iS!Ic4=QG+zTslcD+B{G`1?sNv2i*g zvsb7SuA~*mDjr=_Nm9kR`G?2-EdP;$uBqyTj&HIuPgOCv5Ywupm3I>~sBu77VBXf9Jc#MKPiJ;+p7S>nb9)bmRpy$8bZi5I8v7V8cu#J2S_cODC2dd@A9xuq zp)4H*P+%0w&$T}{x%-J<#)zzFG>TP*G6w`P_t3Q*s?{z06WIuB;$Q@%y`25~ljK^Y zNY+w@UkADKr;v{POhCYEk$nr@=2b~B1qLXA|M68=c&!beRi>4n=-KhnUk14TN0*)L zY+l4bo%N(xfRvlMxoKQC%6{!zy*RlalgEI*VZG4^&_qOMA)8}HSPhIXTygTy`=X!B zziJ`hcZk^#XLogW-tMS?O`B`fknzKBtZKxoR;-0h5VZ+|ts&=D?P&+h$)n=PS+tim zJ^6{<-dA_4g>D*RP06Rz>XS|+!wbeE?O5$qmeU4`d6LS|yU>U7pA-dIe~(KHrwAju zP3hX3tAh4YI?0Wc#O`Y&66z)y1_hZ7PKo{d`JZ^Kid1RRLc8Y5=MhEvt7@F10H^jV z!WvVS*HlTi8Ho}#BhCkU7^mwO+6avuN7fyTbNfq+lhe(qLPN|;9zjZLG)jn5!1di? z+CcLttZ%Rrt8pZa*KfEGl?=1^)F^Q!5Mf+roLXn~OA0L)=b?q%wleDM?j=(&{F<^? z2Ya1nk@^;6o{e(3^7VUprFkhh6D}^%Qh1=UAm8)iROBiF+c=o}x*8xxP1% zV(#0y#m~)lV3erUf@ywJL|7x%hfunsuci5x23k!CV?z?@7Z9#tCE+LL`L?BZA9_j( z6(<f&8y|7^u-SgaJFEH{BPoaUX>7U;W>-?W3a#TJrHRhSG(JiBF#q`Wp8KzK< zuET+@n5M6Jruy;CYqh2~IXx43|08&4YM2XxBc0hOr>~#59tzZ$mk9Y(sL*suoj`xO zsbD$m2h{cRCdgqbUjAHfO(zc8u`Nn@EZ&&UX8Sf&+aYVEr~)gQej6m#T~9l!gDqig zQ4epHTdJ=?39fZBockRny(UG1yIw7bLGtcor__a`V%6{_ckf#yS}+MgD8 zmJ8Z}>keRLQ(G(FY%Fi^al$e6b>O3C6@_PMe8cK|z%@>L)nbhEZTExHt3^?!Ww6S^ zS%k63%txa)=B4|Qm>#=Kc?Ti8j8xLb^wj5U&TgHVyq?O}aOKW9{KTE%9!S zQ%=@4T@%^E?hL()3L~&extQ0SkTVrN_(c9SzPZkrCzB{)t=jbK!_V0rleBT`4mnt< zn�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

      8ofbp&C0(iB3z_0 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�j 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

      bgIzKW^wDLty!RM!uCuEhuQt>#)E06p~3( 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 iJzdgfJ*OP?|7dKJ;ElHoY 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 $GLh4u`DiEzjuK;09O<;9EV;a_)L5b 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

      SS$`Y`7*bW@! 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

      FuOp$~b==p&MYn|TYYBBmQyx(-lf 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 self.OS.APP[name] = x boot: -> #first load the configuration #then load the theme - \ No newline at end of file + _GUI = self.OS.GUI + _GUI.loadTheme "antos" + _GUI.initDM() + _GUI.loadScheme "resources/schemes/test.html",null \ No newline at end of file diff --git a/src/index.html b/src/index.html index c5767c4..ea7d5c3 100644 --- a/src/index.html +++ b/src/index.html @@ -4,11 +4,13 @@ + - - - - + + + + +

      diff --git a/src/libs/ace/ace.js b/src/libs/ace/ace.js new file mode 100755 index 0000000..d93cddc --- /dev/null +++ b/src/libs/ace/ace.js @@ -0,0 +1,19560 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +/** + * Define a module along with a payload + * @param module a name for the payload + * @param payload a function to call with (require, exports, module) params + */ + +(function() { + +var ACE_NAMESPACE = "ace"; + +var global = (function() { return this; })(); +if (!global && typeof window != "undefined") global = window; // strict mode + + +if (!ACE_NAMESPACE && typeof requirejs !== "undefined") + return; + + +var define = function(module, deps, payload) { + if (typeof module !== "string") { + if (define.original) + define.original.apply(this, arguments); + else { + console.error("dropping module because define wasn\'t a string."); + console.trace(); + } + return; + } + if (arguments.length == 2) + payload = deps; + if (!define.modules[module]) { + define.payloads[module] = payload; + define.modules[module] = null; + } +}; + +define.modules = {}; +define.payloads = {}; + +/** + * Get at functionality define()ed using the function above + */ +var _require = function(parentId, module, callback) { + if (typeof module === "string") { + var payload = lookup(parentId, module); + if (payload != undefined) { + callback && callback(); + return payload; + } + } else if (Object.prototype.toString.call(module) === "[object Array]") { + var params = []; + for (var i = 0, l = module.length; i < l; ++i) { + var dep = lookup(parentId, module[i]); + if (dep == undefined && require.original) + return; + params.push(dep); + } + return callback && callback.apply(null, params) || true; + } +}; + +var require = function(module, callback) { + var packagedModule = _require("", module, callback); + if (packagedModule == undefined && require.original) + return require.original.apply(this, arguments); + return packagedModule; +}; + +var normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = base + "/" + moduleName; + + while(moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + return moduleName; +}; + +/** + * Internal function to lookup moduleNames and resolve them by calling the + * definition function if needed. + */ +var lookup = function(parentId, moduleName) { + moduleName = normalizeModule(parentId, moduleName); + + var module = define.modules[moduleName]; + if (!module) { + module = define.payloads[moduleName]; + if (typeof module === 'function') { + var exports = {}; + var mod = { + id: moduleName, + uri: '', + exports: exports, + packaged: true + }; + + var req = function(module, callback) { + return _require(moduleName, module, callback); + }; + + var returnValue = module(req, exports, mod); + exports = returnValue || mod.exports; + define.modules[moduleName] = exports; + delete define.payloads[moduleName]; + } + module = define.modules[moduleName] = exports || module; + } + return module; +}; + +function exportAce(ns) { + var root = global; + if (ns) { + if (!global[ns]) + global[ns] = {}; + root = global[ns]; + } + + if (!root.define || !root.define.packaged) { + define.original = root.define; + root.define = define; + root.define.packaged = true; + } + + if (!root.require || !root.require.packaged) { + require.original = root.require; + root.require = require; + root.require.packaged = true; + } +} + +exportAce(ACE_NAMESPACE); + +})(); + +ace.define("ace/lib/regexp",["require","exports","module"], function(require, exports, module) { +"use strict"; + + var real = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + real.test.call(x, ""); + return !x.lastIndex; + }(); + + if (compliantLastIndexIncrement && compliantExecNpcg) + return; + RegExp.prototype.exec = function (str) { + var match = real.exec.apply(this, arguments), + name, r2; + if ( typeof(str) == 'string' && match) { + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", "")); + real.replace.call(str.slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + return match; + }; + if (!compliantLastIndexIncrement) { + RegExp.prototype.test = function (str) { + var match = real.exec.call(this, str); + if (match && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + return !!match; + }; + } + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + } + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + } + +}); + +ace.define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) { + +function Empty() {} + +if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { // .length is 1 + var target = this; + if (typeof target != "function") { + throw new TypeError("Function.prototype.bind called on incompatible " + target); + } + var args = slice.call(arguments, 1); // for normal call + var bound = function () { + + if (this instanceof bound) { + + var result = target.apply( + this, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + + } else { + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + if(target.prototype) { + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + return bound; + }; +} +var call = Function.prototype.call; +var prototypeOfArray = Array.prototype; +var prototypeOfObject = Object.prototype; +var slice = prototypeOfArray.slice; +var _toString = call.bind(prototypeOfObject.toString); +var owns = call.bind(prototypeOfObject.hasOwnProperty); +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors; +if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); +} +if ([1,2].splice(0).length != 2) { + if(function() { // test IE < 9 to splice bug - see issue #138 + function makeArray(l) { + var a = new Array(l+2); + a[0] = a[1] = 0; + return a; + } + var array = [], lengthBefore; + + array.splice.apply(array, makeArray(20)); + array.splice.apply(array, makeArray(26)); + + lengthBefore = array.length; //46 + array.splice(5, 0, "XXX"); // add one element + + lengthBefore + 1 == array.length + + if (lengthBefore + 1 == array.length) { + return true;// has right splice implementation without bugs + } + }()) {//IE 6/7 + var array_splice = Array.prototype.splice; + Array.prototype.splice = function(start, deleteCount) { + if (!arguments.length) { + return []; + } else { + return array_splice.apply(this, [ + start === void 0 ? 0 : start, + deleteCount === void 0 ? (this.length - start) : deleteCount + ].concat(slice.call(arguments, 2))) + } + }; + } else {//IE8 + Array.prototype.splice = function(pos, removeCount){ + var length = this.length; + if (pos > 0) { + if (pos > length) + pos = length; + } else if (pos == void 0) { + pos = 0; + } else if (pos < 0) { + pos = Math.max(length + pos, 0); + } + + if (!(pos+removeCount < length)) + removeCount = length - pos; + + var removed = this.slice(pos, pos+removeCount); + var insert = slice.call(arguments, 2); + var add = insert.length; + if (pos === length) { + if (add) { + this.push.apply(this, insert); + } + } else { + var remove = Math.min(removeCount, length - pos); + var tailOldPos = pos + remove; + var tailNewPos = tailOldPos + add - remove; + var tailCount = length - tailOldPos; + var lengthAfterRemove = length - remove; + + if (tailNewPos < tailOldPos) { // case A + for (var i = 0; i < tailCount; ++i) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } else if (tailNewPos > tailOldPos) { // case B + for (i = tailCount; i--; ) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } // else, add == remove (nothing to do) + + if (add && pos === lengthAfterRemove) { + this.length = lengthAfterRemove; // truncate array + this.push.apply(this, insert); + } else { + this.length = lengthAfterRemove + add; // reserves space + for (i = 0; i < add; ++i) { + this[pos+i] = insert[i]; + } + } + } + return removed; + }; + } +} +if (!Array.isArray) { + Array.isArray = function isArray(obj) { + return _toString(obj) == "[object Array]"; + }; +} +var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + +if (!Array.prototype.forEach) { + Array.prototype.forEach = function forEach(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + thisp = arguments[1], + i = -1, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + while (++i < length) { + if (i in self) { + fun.call(thisp, self[i], i, object); + } + } + }; +} +if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; +} +if (!Array.prototype.filter) { + Array.prototype.filter = function filter(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = [], + value, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) { + value = self[i]; + if (fun.call(thisp, value, i, object)) { + result.push(value); + } + } + } + return result; + }; +} +if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; +} +if (!Array.prototype.some) { + Array.prototype.some = function some(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, object)) { + return true; + } + } + return false; + }; +} +if (!Array.prototype.reduce) { + Array.prototype.reduce = function reduce(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduce of empty array with no initial value"); + } + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + if (++i >= length) { + throw new TypeError("reduce of empty array with no initial value"); + } + } while (true); + } + + for (; i < length; i++) { + if (i in self) { + result = fun.call(void 0, result, self[i], i, object); + } + } + + return result; + }; +} +if (!Array.prototype.reduceRight) { + Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + + var result, i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + if (--i < 0) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + } while (true); + } + + do { + if (i in this) { + result = fun.call(void 0, result, self[i], i, object); + } + } while (i--); + + return result; + }; +} +if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { + Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + + var i = 0; + if (arguments.length > 1) { + i = toInteger(arguments[1]); + } + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + }; +} +if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { + Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + var i = length - 1; + if (arguments.length > 1) { + i = Math.min(i, toInteger(arguments[1])); + } + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && sought === self[i]) { + return i; + } + } + return -1; + }; +} +if (!Object.getPrototypeOf) { + Object.getPrototypeOf = function getPrototypeOf(object) { + return object.__proto__ || ( + object.constructor ? + object.constructor.prototype : + prototypeOfObject + ); + }; +} +if (!Object.getOwnPropertyDescriptor) { + var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + + "non-object: "; + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT + object); + if (!owns(object, property)) + return; + + var descriptor, getter, setter; + descriptor = { enumerable: true, configurable: true }; + if (supportsAccessors) { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + object.__proto__ = prototype; + + if (getter || setter) { + if (getter) descriptor.get = getter; + if (setter) descriptor.set = setter; + return descriptor; + } + } + descriptor.value = object[property]; + return descriptor; + }; +} +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} +if (!Object.create) { + var createEmpty; + if (Object.prototype.__proto__ === null) { + createEmpty = function () { + return { "__proto__": null }; + }; + } else { + createEmpty = function () { + var empty = {}; + for (var i in empty) + empty[i] = null; + empty.constructor = + empty.hasOwnProperty = + empty.propertyIsEnumerable = + empty.isPrototypeOf = + empty.toLocaleString = + empty.toString = + empty.valueOf = + empty.__proto__ = null; + return empty; + } + } + + Object.create = function create(prototype, properties) { + var object; + if (prototype === null) { + object = createEmpty(); + } else { + if (typeof prototype != "object") + throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); + var Type = function () {}; + Type.prototype = prototype; + object = new Type(); + object.__proto__ = prototype; + } + if (properties !== void 0) + Object.defineProperties(object, properties); + return object; + }; +} + +function doesDefinePropertyWork(object) { + try { + Object.defineProperty(object, "sentinel", {}); + return "sentinel" in object; + } catch (exception) { + } +} +if (Object.defineProperty) { + var definePropertyWorksOnObject = doesDefinePropertyWork({}); + var definePropertyWorksOnDom = typeof document == "undefined" || + doesDefinePropertyWork(document.createElement("div")); + if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { + var definePropertyFallback = Object.defineProperty; + } +} + +if (!Object.defineProperty || definePropertyFallback) { + var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; + var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " + var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + + "on this javascript engine"; + + Object.defineProperty = function defineProperty(object, property, descriptor) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT_TARGET + object); + if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) + throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); + if (definePropertyFallback) { + try { + return definePropertyFallback.call(Object, object, property, descriptor); + } catch (exception) { + } + } + if (owns(descriptor, "value")) { + + if (supportsAccessors && (lookupGetter(object, property) || + lookupSetter(object, property))) + { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + delete object[property]; + object[property] = descriptor.value; + object.__proto__ = prototype; + } else { + object[property] = descriptor.value; + } + } else { + if (!supportsAccessors) + throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); + if (owns(descriptor, "get")) + defineGetter(object, property, descriptor.get); + if (owns(descriptor, "set")) + defineSetter(object, property, descriptor.set); + } + + return object; + }; +} +if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (owns(properties, property)) + Object.defineProperty(object, property, properties[property]); + } + return object; + }; +} +if (!Object.seal) { + Object.seal = function seal(object) { + return object; + }; +} +if (!Object.freeze) { + Object.freeze = function freeze(object) { + return object; + }; +} +try { + Object.freeze(function () {}); +} catch (exception) { + Object.freeze = (function freeze(freezeObject) { + return function freeze(object) { + if (typeof object == "function") { + return object; + } else { + return freezeObject(object); + } + }; + })(Object.freeze); +} +if (!Object.preventExtensions) { + Object.preventExtensions = function preventExtensions(object) { + return object; + }; +} +if (!Object.isSealed) { + Object.isSealed = function isSealed(object) { + return false; + }; +} +if (!Object.isFrozen) { + Object.isFrozen = function isFrozen(object) { + return false; + }; +} +if (!Object.isExtensible) { + Object.isExtensible = function isExtensible(object) { + if (Object(object) === object) { + throw new TypeError(); // TODO message + } + var name = ''; + while (owns(object, name)) { + name += '?'; + } + object[name] = true; + var returnValue = owns(object, name); + delete object[name]; + return returnValue; + }; +} +if (!Object.keys) { + var hasDontEnumBug = true, + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + for (var key in {"toString": null}) { + hasDontEnumBug = false; + } + + Object.keys = function keys(object) { + + if ( + (typeof object != "object" && typeof object != "function") || + object === null + ) { + throw new TypeError("Object.keys called on a non-object"); + } + + var keys = []; + for (var name in object) { + if (owns(object, name)) { + keys.push(name); + } + } + + if (hasDontEnumBug) { + for (var i = 0, ii = dontEnumsLength; i < ii; i++) { + var dontEnum = dontEnums[i]; + if (owns(object, dontEnum)) { + keys.push(dontEnum); + } + } + } + return keys; + }; + +} +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} +var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + + "\u2029\uFEFF"; +if (!String.prototype.trim || ws.trim()) { + ws = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), + trimEndRegexp = new RegExp(ws + ws + "*$"); + String.prototype.trim = function trim() { + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + }; +} + +function toInteger(n) { + n = +n; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; +} + +function isPrimitive(input) { + var type = typeof input; + return ( + input === null || + type === "undefined" || + type === "boolean" || + type === "number" || + type === "string" + ); +} + +function toPrimitive(input) { + var val, valueOf, toString; + if (isPrimitive(input)) { + return input; + } + valueOf = input.valueOf; + if (typeof valueOf === "function") { + val = valueOf.call(input); + if (isPrimitive(val)) { + return val; + } + } + toString = input.toString; + if (typeof toString === "function") { + val = toString.call(input); + if (isPrimitive(val)) { + return val; + } + } + throw new TypeError(); +} +var toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert "+o+" to object"); + } + return Object(o); +}; + +}); + +ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"], function(require, exports, module) { +"use strict"; + +require("./regexp"); +require("./es5-shim"); + +}); + +ace.define("ace/lib/dom",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var XHTML_NS = "http://www.w3.org/1999/xhtml"; + +exports.getDocumentHead = function(doc) { + if (!doc) + doc = document; + return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement; +} + +exports.createElement = function(tag, ns) { + return document.createElementNS ? + document.createElementNS(ns || XHTML_NS, tag) : + document.createElement(tag); +}; + +exports.hasCssClass = function(el, name) { + var classes = (el.className + "").split(/\s+/g); + return classes.indexOf(name) !== -1; +}; +exports.addCssClass = function(el, name) { + if (!exports.hasCssClass(el, name)) { + el.className += " " + name; + } +}; +exports.removeCssClass = function(el, name) { + var classes = el.className.split(/\s+/g); + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + classes.splice(index, 1); + } + el.className = classes.join(" "); +}; + +exports.toggleCssClass = function(el, name) { + var classes = el.className.split(/\s+/g), add = true; + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + add = false; + classes.splice(index, 1); + } + if (add) + classes.push(name); + + el.className = classes.join(" "); + return add; +}; +exports.setCssClass = function(node, className, include) { + if (include) { + exports.addCssClass(node, className); + } else { + exports.removeCssClass(node, className); + } +}; + +exports.hasCssString = function(id, doc) { + var index = 0, sheets; + doc = doc || document; + + if (doc.createStyleSheet && (sheets = doc.styleSheets)) { + while (index < sheets.length) + if (sheets[index++].owningElement.id === id) return true; + } else if ((sheets = doc.getElementsByTagName("style"))) { + while (index < sheets.length) + if (sheets[index++].id === id) return true; + } + + return false; +}; + +exports.importCssString = function importCssString(cssText, id, doc) { + doc = doc || document; + if (id && exports.hasCssString(id, doc)) + return null; + + var style; + + if (id) + cssText += "\n/*# sourceURL=ace/css/" + id + " */"; + + if (doc.createStyleSheet) { + style = doc.createStyleSheet(); + style.cssText = cssText; + if (id) + style.owningElement.id = id; + } else { + style = exports.createElement("style"); + style.appendChild(doc.createTextNode(cssText)); + if (id) + style.id = id; + + exports.getDocumentHead(doc).appendChild(style); + } +}; + +exports.importCssStylsheet = function(uri, doc) { + if (doc.createStyleSheet) { + doc.createStyleSheet(uri); + } else { + var link = exports.createElement('link'); + link.rel = 'stylesheet'; + link.href = uri; + + exports.getDocumentHead(doc).appendChild(link); + } +}; + +exports.getInnerWidth = function(element) { + return ( + parseInt(exports.computedStyle(element, "paddingLeft"), 10) + + parseInt(exports.computedStyle(element, "paddingRight"), 10) + + element.clientWidth + ); +}; + +exports.getInnerHeight = function(element) { + return ( + parseInt(exports.computedStyle(element, "paddingTop"), 10) + + parseInt(exports.computedStyle(element, "paddingBottom"), 10) + + element.clientHeight + ); +}; + +exports.scrollbarWidth = function(document) { + var inner = exports.createElement("ace_inner"); + inner.style.width = "100%"; + inner.style.minWidth = "0px"; + inner.style.height = "200px"; + inner.style.display = "block"; + + var outer = exports.createElement("ace_outer"); + var style = outer.style; + + style.position = "absolute"; + style.left = "-10000px"; + style.overflow = "hidden"; + style.width = "200px"; + style.minWidth = "0px"; + style.height = "150px"; + style.display = "block"; + + outer.appendChild(inner); + + var body = document.documentElement; + body.appendChild(outer); + + var noScrollbar = inner.offsetWidth; + + style.overflow = "scroll"; + var withScrollbar = inner.offsetWidth; + + if (noScrollbar == withScrollbar) { + withScrollbar = outer.clientWidth; + } + + body.removeChild(outer); + + return noScrollbar-withScrollbar; +}; + +if (typeof document == "undefined") { + exports.importCssString = function() {}; + return; +} + +if (window.pageYOffset !== undefined) { + exports.getPageScrollTop = function() { + return window.pageYOffset; + }; + + exports.getPageScrollLeft = function() { + return window.pageXOffset; + }; +} +else { + exports.getPageScrollTop = function() { + return document.body.scrollTop; + }; + + exports.getPageScrollLeft = function() { + return document.body.scrollLeft; + }; +} + +if (window.getComputedStyle) + exports.computedStyle = function(element, style) { + if (style) + return (window.getComputedStyle(element, "") || {})[style] || ""; + return window.getComputedStyle(element, "") || {}; + }; +else + exports.computedStyle = function(element, style) { + if (style) + return element.currentStyle[style]; + return element.currentStyle; + }; +exports.setInnerHtml = function(el, innerHtml) { + var element = el.cloneNode(false);//document.createElement("div"); + element.innerHTML = innerHtml; + el.parentNode.replaceChild(element, el); + return element; +}; + +if ("textContent" in document.documentElement) { + exports.setInnerText = function(el, innerText) { + el.textContent = innerText; + }; + + exports.getInnerText = function(el) { + return el.textContent; + }; +} +else { + exports.setInnerText = function(el, innerText) { + el.innerText = innerText; + }; + + exports.getInnerText = function(el) { + return el.innerText; + }; +} + +exports.getParentWindow = function(document) { + return document.defaultView || document.parentWindow; +}; + +}); + +ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define("ace/lib/keys",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +require("./fixoldbrowsers"); + +var oop = require("./oop"); +var Keys = (function() { + var ret = { + MODIFIER_KEYS: { + 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta' + }, + + KEY_MODS: { + "ctrl": 1, "alt": 2, "option" : 2, "shift": 4, + "super": 8, "meta": 8, "command": 8, "cmd": 8 + }, + + FUNCTION_KEYS : { + 8 : "Backspace", + 9 : "Tab", + 13 : "Return", + 19 : "Pause", + 27 : "Esc", + 32 : "Space", + 33 : "PageUp", + 34 : "PageDown", + 35 : "End", + 36 : "Home", + 37 : "Left", + 38 : "Up", + 39 : "Right", + 40 : "Down", + 44 : "Print", + 45 : "Insert", + 46 : "Delete", + 96 : "Numpad0", + 97 : "Numpad1", + 98 : "Numpad2", + 99 : "Numpad3", + 100: "Numpad4", + 101: "Numpad5", + 102: "Numpad6", + 103: "Numpad7", + 104: "Numpad8", + 105: "Numpad9", + '-13': "NumpadEnter", + 112: "F1", + 113: "F2", + 114: "F3", + 115: "F4", + 116: "F5", + 117: "F6", + 118: "F7", + 119: "F8", + 120: "F9", + 121: "F10", + 122: "F11", + 123: "F12", + 144: "Numlock", + 145: "Scrolllock" + }, + + PRINTABLE_KEYS: { + 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', + 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', + 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', + 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', + 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', + 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', + 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', + 219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*' + } + }; + var name, i; + for (i in ret.FUNCTION_KEYS) { + name = ret.FUNCTION_KEYS[i].toLowerCase(); + ret[name] = parseInt(i, 10); + } + for (i in ret.PRINTABLE_KEYS) { + name = ret.PRINTABLE_KEYS[i].toLowerCase(); + ret[name] = parseInt(i, 10); + } + oop.mixin(ret, ret.MODIFIER_KEYS); + oop.mixin(ret, ret.PRINTABLE_KEYS); + oop.mixin(ret, ret.FUNCTION_KEYS); + ret.enter = ret["return"]; + ret.escape = ret.esc; + ret.del = ret["delete"]; + ret[173] = '-'; + + (function() { + var mods = ["cmd", "ctrl", "alt", "shift"]; + for (var i = Math.pow(2, mods.length); i--;) { + ret.KEY_MODS[i] = mods.filter(function(x) { + return i & ret.KEY_MODS[x]; + }).join("-") + "-"; + } + })(); + + ret.KEY_MODS[0] = ""; + ret.KEY_MODS[-1] = "input-"; + + return ret; +})(); +oop.mixin(exports, Keys); + +exports.keyCodeToString = function(keyCode) { + var keyString = Keys[keyCode]; + if (typeof keyString != "string") + keyString = String.fromCharCode(keyCode); + return keyString.toLowerCase(); +}; + +}); + +ace.define("ace/lib/useragent",["require","exports","module"], function(require, exports, module) { +"use strict"; +exports.OS = { + LINUX: "LINUX", + MAC: "MAC", + WINDOWS: "WINDOWS" +}; +exports.getOS = function() { + if (exports.isMac) { + return exports.OS.MAC; + } else if (exports.isLinux) { + return exports.OS.LINUX; + } else { + return exports.OS.WINDOWS; + } +}; +if (typeof navigator != "object") + return; + +var os = (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase(); +var ua = navigator.userAgent; +exports.isWin = (os == "win"); +exports.isMac = (os == "mac"); +exports.isLinux = (os == "linux"); +exports.isIE = + (navigator.appName == "Microsoft Internet Explorer" || navigator.appName.indexOf("MSAppHost") >= 0) + ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]) + : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]); // for ie + +exports.isOldIE = exports.isIE && exports.isIE < 9; +exports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === "Gecko"; +exports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\d+)/)||[])[1], 10) < 4; +exports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == "[object Opera]"; +exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; + +exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined; + +exports.isAIR = ua.indexOf("AdobeAIR") >= 0; + +exports.isIPad = ua.indexOf("iPad") >= 0; + +exports.isChromeOS = ua.indexOf(" CrOS ") >= 0; + +exports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream; + +if (exports.isIOS) exports.isMac = true; + +}); + +ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var keys = require("./keys"); +var useragent = require("./useragent"); + +var pressedKeys = null; +var ts = 0; + +exports.addListener = function(elem, type, callback) { + if (elem.addEventListener) { + return elem.addEventListener(type, callback, false); + } + if (elem.attachEvent) { + var wrapper = function() { + callback.call(elem, window.event); + }; + callback._wrapper = wrapper; + elem.attachEvent("on" + type, wrapper); + } +}; + +exports.removeListener = function(elem, type, callback) { + if (elem.removeEventListener) { + return elem.removeEventListener(type, callback, false); + } + if (elem.detachEvent) { + elem.detachEvent("on" + type, callback._wrapper || callback); + } +}; +exports.stopEvent = function(e) { + exports.stopPropagation(e); + exports.preventDefault(e); + return false; +}; + +exports.stopPropagation = function(e) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.cancelBubble = true; +}; + +exports.preventDefault = function(e) { + if (e.preventDefault) + e.preventDefault(); + else + e.returnValue = false; +}; +exports.getButton = function(e) { + if (e.type == "dblclick") + return 0; + if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey))) + return 2; + if (e.preventDefault) { + return e.button; + } + else { + return {1:0, 2:2, 4:1}[e.button]; + } +}; + +exports.capture = function(el, eventHandler, releaseCaptureHandler) { + function onMouseUp(e) { + eventHandler && eventHandler(e); + releaseCaptureHandler && releaseCaptureHandler(e); + + exports.removeListener(document, "mousemove", eventHandler, true); + exports.removeListener(document, "mouseup", onMouseUp, true); + exports.removeListener(document, "dragstart", onMouseUp, true); + } + + exports.addListener(document, "mousemove", eventHandler, true); + exports.addListener(document, "mouseup", onMouseUp, true); + exports.addListener(document, "dragstart", onMouseUp, true); + + return onMouseUp; +}; + +exports.addTouchMoveListener = function (el, callback) { + if ("ontouchmove" in el) { + var startx, starty; + exports.addListener(el, "touchstart", function (e) { + var touchObj = e.changedTouches[0]; + startx = touchObj.clientX; + starty = touchObj.clientY; + }); + exports.addListener(el, "touchmove", function (e) { + var factor = 1, + touchObj = e.changedTouches[0]; + + e.wheelX = -(touchObj.clientX - startx) / factor; + e.wheelY = -(touchObj.clientY - starty) / factor; + + startx = touchObj.clientX; + starty = touchObj.clientY; + + callback(e); + }); + } +}; + +exports.addMouseWheelListener = function(el, callback) { + if ("onmousewheel" in el) { + exports.addListener(el, "mousewheel", function(e) { + var factor = 8; + if (e.wheelDeltaX !== undefined) { + e.wheelX = -e.wheelDeltaX / factor; + e.wheelY = -e.wheelDeltaY / factor; + } else { + e.wheelX = 0; + e.wheelY = -e.wheelDelta / factor; + } + callback(e); + }); + } else if ("onwheel" in el) { + exports.addListener(el, "wheel", function(e) { + var factor = 0.35; + switch (e.deltaMode) { + case e.DOM_DELTA_PIXEL: + e.wheelX = e.deltaX * factor || 0; + e.wheelY = e.deltaY * factor || 0; + break; + case e.DOM_DELTA_LINE: + case e.DOM_DELTA_PAGE: + e.wheelX = (e.deltaX || 0) * 5; + e.wheelY = (e.deltaY || 0) * 5; + break; + } + + callback(e); + }); + } else { + exports.addListener(el, "DOMMouseScroll", function(e) { + if (e.axis && e.axis == e.HORIZONTAL_AXIS) { + e.wheelX = (e.detail || 0) * 5; + e.wheelY = 0; + } else { + e.wheelX = 0; + e.wheelY = (e.detail || 0) * 5; + } + callback(e); + }); + } +}; + +exports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) { + var clicks = 0; + var startX, startY, timer; + var eventNames = { + 2: "dblclick", + 3: "tripleclick", + 4: "quadclick" + }; + + function onMousedown(e) { + if (exports.getButton(e) !== 0) { + clicks = 0; + } else if (e.detail > 1) { + clicks++; + if (clicks > 4) + clicks = 1; + } else { + clicks = 1; + } + if (useragent.isIE) { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + if (!timer || isNewClick) + clicks = 1; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + + if (clicks == 1) { + startX = e.clientX; + startY = e.clientY; + } + } + + e._clicks = clicks; + + eventHandler[callbackName]("mousedown", e); + + if (clicks > 4) + clicks = 0; + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); + } + function onDblclick(e) { + clicks = 2; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + eventHandler[callbackName]("mousedown", e); + eventHandler[callbackName](eventNames[clicks], e); + } + if (!Array.isArray(elements)) + elements = [elements]; + elements.forEach(function(el) { + exports.addListener(el, "mousedown", onMousedown); + if (useragent.isOldIE) + exports.addListener(el, "dblclick", onDblclick); + }); +}; + +var getModifierHash = useragent.isMac && useragent.isOpera && !("KeyboardEvent" in window) + ? function(e) { + return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0); + } + : function(e) { + return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); + }; + +exports.getModifierString = function(e) { + return keys.KEY_MODS[getModifierHash(e)]; +}; + +function normalizeCommandKeys(callback, e, keyCode) { + var hashId = getModifierHash(e); + + if (!useragent.isMac && pressedKeys) { + if (e.getModifierState && (e.getModifierState("OS") || e.getModifierState("Win"))) + hashId |= 8; + if (pressedKeys.altGr) { + if ((3 & hashId) != 3) + pressedKeys.altGr = 0; + else + return; + } + if (keyCode === 18 || keyCode === 17) { + var location = "location" in e ? e.location : e.keyLocation; + if (keyCode === 17 && location === 1) { + if (pressedKeys[keyCode] == 1) + ts = e.timeStamp; + } else if (keyCode === 18 && hashId === 3 && location === 2) { + var dt = e.timeStamp - ts; + if (dt < 50) + pressedKeys.altGr = true; + } + } + } + + if (keyCode in keys.MODIFIER_KEYS) { + keyCode = -1; + } + if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) { + keyCode = -1; + } + + if (!hashId && keyCode === 13) { + var location = "location" in e ? e.location : e.keyLocation; + if (location === 3) { + callback(e, hashId, -keyCode); + if (e.defaultPrevented) + return; + } + } + + if (useragent.isChromeOS && hashId & 8) { + callback(e, hashId, keyCode); + if (e.defaultPrevented) + return; + else + hashId &= ~8; + } + if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { + return false; + } + + return callback(e, hashId, keyCode); +} + + +exports.addCommandKeyListener = function(el, callback) { + var addListener = exports.addListener; + if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { + var lastKeyDownKeyCode = null; + addListener(el, "keydown", function(e) { + lastKeyDownKeyCode = e.keyCode; + }); + addListener(el, "keypress", function(e) { + return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); + }); + } else { + var lastDefaultPrevented = null; + + addListener(el, "keydown", function(e) { + pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1; + var result = normalizeCommandKeys(callback, e, e.keyCode); + lastDefaultPrevented = e.defaultPrevented; + return result; + }); + + addListener(el, "keypress", function(e) { + if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { + exports.stopEvent(e); + lastDefaultPrevented = null; + } + }); + + addListener(el, "keyup", function(e) { + pressedKeys[e.keyCode] = null; + }); + + if (!pressedKeys) { + resetPressedKeys(); + addListener(window, "focus", resetPressedKeys); + } + } +}; +function resetPressedKeys() { + pressedKeys = Object.create(null); +} + +if (typeof window == "object" && window.postMessage && !useragent.isOldIE) { + var postMessageId = 1; + exports.nextTick = function(callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + postMessageId; + exports.addListener(win, "message", function listener(e) { + if (e.data == messageName) { + exports.stopPropagation(e); + exports.removeListener(win, "message", listener); + callback(); + } + }); + win.postMessage(messageName, "*"); + }; +} + + +exports.nextFrame = typeof window == "object" && (window.requestAnimationFrame + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame + || window.msRequestAnimationFrame + || window.oRequestAnimationFrame); + +if (exports.nextFrame) + exports.nextFrame = exports.nextFrame.bind(window); +else + exports.nextFrame = function(callback) { + setTimeout(callback, 17); + }; +}); + +ace.define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i PLACEHOLDER.length) + data = data.substr(9); + else if (data.substr(0, 4) == PLACEHOLDER.substr(0, 4)) + data = data.substr(4, data.length - PLACEHOLDER.length + 1); + else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0)) + data = data.slice(0, -1); + if (data == PLACEHOLDER.charAt(0)) { + } else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0)) + data = data.slice(0, -1); + + if (data) + host.onTextInput(data); + } + if (copied) { + copied = false; + } + if (afterContextMenu) + afterContextMenu = false; + }; + var onInput = function(e) { + if (inComposition) + return; + var data = text.value; + sendText(data); + resetValue(); + }; + + var handleClipboardData = function(e, data, forceIEMime) { + var clipboardData = e.clipboardData || window.clipboardData; + if (!clipboardData || BROKEN_SETDATA) + return; + var mime = USE_IE_MIME_TYPE || forceIEMime ? "Text" : "text/plain"; + try { + if (data) { + return clipboardData.setData(mime, data) !== false; + } else { + return clipboardData.getData(mime); + } + } catch(e) { + if (!forceIEMime) + return handleClipboardData(e, data, true); + } + }; + + var doCopy = function(e, isCut) { + var data = host.getCopyText(); + if (!data) + return event.preventDefault(e); + + if (handleClipboardData(e, data)) { + if (useragent.isIOS) { + cut = isCut; + text.value = "\n aa" + data + "a a\n"; + text.setSelectionRange(4, 4 + data.length); + copied = { + value: data + }; + } + isCut ? host.onCut() : host.onCopy(); + if (!useragent.isIOS) event.preventDefault(e); + } else { + copied = true; + text.value = data; + text.select(); + setTimeout(function(){ + copied = false; + resetValue(); + resetSelection(); + isCut ? host.onCut() : host.onCopy(); + }); + } + }; + + var onCut = function(e) { + doCopy(e, true); + }; + + var onCopy = function(e) { + doCopy(e, false); + }; + + var onPaste = function(e) { + var data = handleClipboardData(e); + if (typeof data == "string") { + if (data) + host.onPaste(data, e); + if (useragent.isIE) + setTimeout(resetSelection); + event.preventDefault(e); + } + else { + text.value = ""; + pasted = true; + } + }; + + event.addCommandKeyListener(text, host.onCommandKey.bind(host)); + + event.addListener(text, "select", onSelect); + + event.addListener(text, "input", onInput); + + event.addListener(text, "cut", onCut); + event.addListener(text, "copy", onCopy); + event.addListener(text, "paste", onPaste); + var onCompositionStart = function(e) { + if (inComposition || !host.onCompositionStart || host.$readOnly) + return; + inComposition = {}; + inComposition.canUndo = host.session.$undoManager; + host.onCompositionStart(); + setTimeout(onCompositionUpdate, 0); + host.on("mousedown", onCompositionEnd); + if (inComposition.canUndo && !host.selection.isEmpty()) { + host.insert(""); + host.session.markUndoGroup(); + host.selection.clearSelection(); + } + host.session.markUndoGroup(); + }; + + var onCompositionUpdate = function() { + if (!inComposition || !host.onCompositionUpdate || host.$readOnly) + return; + var val = text.value.replace(/\x01/g, ""); + if (inComposition.lastValue === val) return; + + host.onCompositionUpdate(val); + if (inComposition.lastValue) + host.undo(); + if (inComposition.canUndo) + inComposition.lastValue = val; + if (inComposition.lastValue) { + var r = host.selection.getRange(); + host.insert(inComposition.lastValue); + host.session.markUndoGroup(); + inComposition.range = host.selection.getRange(); + host.selection.setRange(r); + host.selection.clearSelection(); + } + }; + + var onCompositionEnd = function(e) { + if (!host.onCompositionEnd || host.$readOnly) return; + var c = inComposition; + inComposition = false; + var timer = setTimeout(function() { + timer = null; + var str = text.value.replace(/\x01/g, ""); + if (inComposition) + return; + else if (str == c.lastValue) + resetValue(); + else if (!c.lastValue && str) { + resetValue(); + sendText(str); + } + }); + inputHandler = function compositionInputHandler(str) { + if (timer) + clearTimeout(timer); + str = str.replace(/\x01/g, ""); + if (str == c.lastValue) + return ""; + if (c.lastValue && timer) + host.undo(); + return str; + }; + host.onCompositionEnd(); + host.removeListener("mousedown", onCompositionEnd); + if (e.type == "compositionend" && c.range) { + host.selection.setRange(c.range); + } + var needsOnInput = + (!!useragent.isChrome && useragent.isChrome >= 53) || + (!!useragent.isWebKit && useragent.isWebKit >= 603); + + if (needsOnInput) { + onInput(); + } + }; + + + + var syncComposition = lang.delayedCall(onCompositionUpdate, 50); + + event.addListener(text, "compositionstart", onCompositionStart); + if (useragent.isGecko) { + event.addListener(text, "text", function(){syncComposition.schedule()}); + } else { + event.addListener(text, "keyup", function(){syncComposition.schedule()}); + event.addListener(text, "keydown", function(){syncComposition.schedule()}); + } + event.addListener(text, "compositionend", onCompositionEnd); + + this.getElement = function() { + return text; + }; + + this.setReadOnly = function(readOnly) { + text.readOnly = readOnly; + }; + + this.onContextMenu = function(e) { + afterContextMenu = true; + resetSelection(host.selection.isEmpty()); + host._emit("nativecontextmenu", {target: host, domEvent: e}); + this.moveToMouse(e, true); + }; + + this.moveToMouse = function(e, bringToFront) { + if (!tempStyle) + tempStyle = text.style.cssText; + text.style.cssText = (bringToFront ? "z-index:100000;" : "") + + "height:" + text.style.height + ";" + + (useragent.isIE ? "opacity:0.1;" : ""); + + var rect = host.container.getBoundingClientRect(); + var style = dom.computedStyle(host.container); + var top = rect.top + (parseInt(style.borderTopWidth) || 0); + var left = rect.left + (parseInt(rect.borderLeftWidth) || 0); + var maxTop = rect.bottom - top - text.clientHeight -2; + var move = function(e) { + text.style.left = e.clientX - left - 2 + "px"; + text.style.top = Math.min(e.clientY - top - 2, maxTop) + "px"; + }; + move(e); + + if (e.type != "mousedown") + return; + + if (host.renderer.$keepTextAreaAtCursor) + host.renderer.$keepTextAreaAtCursor = null; + + clearTimeout(closeTimeout); + if (useragent.isWin) + event.capture(host.container, move, onContextMenuClose); + }; + + this.onContextMenuClose = onContextMenuClose; + var closeTimeout; + function onContextMenuClose() { + clearTimeout(closeTimeout); + closeTimeout = setTimeout(function () { + if (tempStyle) { + text.style.cssText = tempStyle; + tempStyle = ''; + } + if (host.renderer.$keepTextAreaAtCursor == null) { + host.renderer.$keepTextAreaAtCursor = true; + host.renderer.$moveTextAreaToCursor(); + } + }, 0); + } + + var onContextMenu = function(e) { + host.textInput.onContextMenu(e); + onContextMenuClose(); + }; + event.addListener(text, "mouseup", onContextMenu); + event.addListener(text, "mousedown", function(e) { + e.preventDefault(); + onContextMenuClose(); + }); + event.addListener(host.renderer.scroller, "contextmenu", onContextMenu); + event.addListener(text, "contextmenu", onContextMenu); + + if (useragent.isIOS) { + var typingResetTimeout = null; + var typing = false; + + parentNode.addEventListener("keydown", function (e) { + if (typingResetTimeout) clearTimeout(typingResetTimeout); + typing = true; + }); + + parentNode.addEventListener("keyup", function (e) { + typingResetTimeout = setTimeout(function () { + typing = false; + }, 100); + }); + var detectArrowKeys = function(e) { + if (document.activeElement !== text) return; + if (typing) return; + + if (cut) { + return setTimeout(function () { + cut = false; + }, 100); + } + var selectionStart = text.selectionStart; + var selectionEnd = text.selectionEnd; + text.setSelectionRange(4, 5); + if (selectionStart == selectionEnd) { + switch (selectionStart) { + case 0: host.onCommandKey(null, 0, KEYS.up); break; + case 1: host.onCommandKey(null, 0, KEYS.home); break; + case 2: host.onCommandKey(null, MODS.option, KEYS.left); break; + case 4: host.onCommandKey(null, 0, KEYS.left); break; + case 5: host.onCommandKey(null, 0, KEYS.right); break; + case 7: host.onCommandKey(null, MODS.option, KEYS.right); break; + case 8: host.onCommandKey(null, 0, KEYS.end); break; + case 9: host.onCommandKey(null, 0, KEYS.down); break; + } + } else { + switch (selectionEnd) { + case 6: host.onCommandKey(null, MODS.shift, KEYS.right); break; + case 7: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.right); break; + case 8: host.onCommandKey(null, MODS.shift, KEYS.end); break; + case 9: host.onCommandKey(null, MODS.shift, KEYS.down); break; + } + switch (selectionStart) { + case 0: host.onCommandKey(null, MODS.shift, KEYS.up); break; + case 1: host.onCommandKey(null, MODS.shift, KEYS.home); break; + case 2: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.left); break; + case 3: host.onCommandKey(null, MODS.shift, KEYS.left); break; + } + } + } + document.addEventListener("selectionchange", detectArrowKeys); + host.on("destroy", function() { + document.removeEventListener("selectionchange", detectArrowKeys); + }) + } +}; + +exports.TextInput = TextInput; +}); + +ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/keyboard/textinput_ios"], function(require, exports, module) { +"use strict"; + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var BROKEN_SETDATA = useragent.isChrome < 18; +var USE_IE_MIME_TYPE = useragent.isIE; + +var TextInputIOS = require("./textinput_ios").TextInput +var TextInput = function(parentNode, host) { + if (useragent.isIOS) + return TextInputIOS.call(this, parentNode, host); + + var text = dom.createElement("textarea"); + text.className = "ace_text-input"; + + text.setAttribute("wrap", "off"); + text.setAttribute("autocorrect", "off"); + text.setAttribute("autocapitalize", "off"); + text.setAttribute("spellcheck", false); + + text.style.opacity = "0"; + parentNode.insertBefore(text, parentNode.firstChild); + + var PLACEHOLDER = "\u2028\u2028"; + + var copied = false; + var pasted = false; + var inComposition = false; + var tempStyle = ''; + var isSelectionEmpty = true; + try { var isFocused = document.activeElement === text; } catch(e) {} + + event.addListener(text, "blur", function(e) { + host.onBlur(e); + isFocused = false; + }); + event.addListener(text, "focus", function(e) { + isFocused = true; + host.onFocus(e); + resetSelection(); + }); + this.focus = function() { + if (tempStyle) return text.focus(); + var top = text.style.top; + text.style.position = "fixed"; + text.style.top = "0px"; + text.focus(); + setTimeout(function() { + text.style.position = ""; + if (text.style.top == "0px") + text.style.top = top; + }, 0); + }; + this.blur = function() { + text.blur(); + }; + this.isFocused = function() { + return isFocused; + }; + var syncSelection = lang.delayedCall(function() { + isFocused && resetSelection(isSelectionEmpty); + }); + var syncValue = lang.delayedCall(function() { + if (!inComposition) { + text.value = PLACEHOLDER; + isFocused && resetSelection(); + } + }); + + function resetSelection(isEmpty) { + if (inComposition) + return; + inComposition = true; + + if (inputHandler) { + selectionStart = 0; + selectionEnd = isEmpty ? 0 : text.value.length - 1; + } else { + var selectionStart = isEmpty ? 2 : 1; + var selectionEnd = 2; + } + try { + text.setSelectionRange(selectionStart, selectionEnd); + } catch(e){} + + inComposition = false; + } + + function resetValue() { + if (inComposition) + return; + text.value = PLACEHOLDER; + if (useragent.isWebKit) + syncValue.schedule(); + } + + useragent.isWebKit || host.addEventListener('changeSelection', function() { + if (host.selection.isEmpty() != isSelectionEmpty) { + isSelectionEmpty = !isSelectionEmpty; + syncSelection.schedule(); + } + }); + + resetValue(); + if (isFocused) + host.onFocus(); + + + var isAllSelected = function(text) { + return text.selectionStart === 0 && text.selectionEnd === text.value.length; + }; + + var onSelect = function(e) { + if (copied) { + copied = false; + } else if (isAllSelected(text)) { + host.selectAll(); + resetSelection(); + } else if (inputHandler) { + resetSelection(host.selection.isEmpty()); + } + }; + + var inputHandler = null; + this.setInputHandler = function(cb) {inputHandler = cb}; + this.getInputHandler = function() {return inputHandler}; + var afterContextMenu = false; + + var sendText = function(data) { + if (inputHandler) { + data = inputHandler(data); + inputHandler = null; + } + if (pasted) { + resetSelection(); + if (data) + host.onPaste(data); + pasted = false; + } else if (data == PLACEHOLDER.charAt(0)) { + if (afterContextMenu) + host.execCommand("del", {source: "ace"}); + else // some versions of android do not fire keydown when pressing backspace + host.execCommand("backspace", {source: "ace"}); + } else { + if (data.substring(0, 2) == PLACEHOLDER) + data = data.substr(2); + else if (data.charAt(0) == PLACEHOLDER.charAt(0)) + data = data.substr(1); + else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0)) + data = data.slice(0, -1); + if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0)) + data = data.slice(0, -1); + + if (data) + host.onTextInput(data); + } + if (afterContextMenu) + afterContextMenu = false; + }; + var onInput = function(e) { + if (inComposition) + return; + var data = text.value; + sendText(data); + resetValue(); + }; + + var handleClipboardData = function(e, data, forceIEMime) { + var clipboardData = e.clipboardData || window.clipboardData; + if (!clipboardData || BROKEN_SETDATA) + return; + var mime = USE_IE_MIME_TYPE || forceIEMime ? "Text" : "text/plain"; + try { + if (data) { + return clipboardData.setData(mime, data) !== false; + } else { + return clipboardData.getData(mime); + } + } catch(e) { + if (!forceIEMime) + return handleClipboardData(e, data, true); + } + }; + + var doCopy = function(e, isCut) { + var data = host.getCopyText(); + if (!data) + return event.preventDefault(e); + + if (handleClipboardData(e, data)) { + isCut ? host.onCut() : host.onCopy(); + event.preventDefault(e); + } else { + copied = true; + text.value = data; + text.select(); + setTimeout(function(){ + copied = false; + resetValue(); + resetSelection(); + isCut ? host.onCut() : host.onCopy(); + }); + } + }; + + var onCut = function(e) { + doCopy(e, true); + }; + + var onCopy = function(e) { + doCopy(e, false); + }; + + var onPaste = function(e) { + var data = handleClipboardData(e); + if (typeof data == "string") { + if (data) + host.onPaste(data, e); + if (useragent.isIE) + setTimeout(resetSelection); + event.preventDefault(e); + } + else { + text.value = ""; + pasted = true; + } + }; + + event.addCommandKeyListener(text, host.onCommandKey.bind(host)); + + event.addListener(text, "select", onSelect); + + event.addListener(text, "input", onInput); + + event.addListener(text, "cut", onCut); + event.addListener(text, "copy", onCopy); + event.addListener(text, "paste", onPaste); + if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) { + event.addListener(parentNode, "keydown", function(e) { + if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) + return; + + switch (e.keyCode) { + case 67: + onCopy(e); + break; + case 86: + onPaste(e); + break; + case 88: + onCut(e); + break; + } + }); + } + var onCompositionStart = function(e) { + if (inComposition || !host.onCompositionStart || host.$readOnly) + return; + inComposition = {}; + inComposition.canUndo = host.session.$undoManager; + host.onCompositionStart(); + setTimeout(onCompositionUpdate, 0); + host.on("mousedown", onCompositionEnd); + if (inComposition.canUndo && !host.selection.isEmpty()) { + host.insert(""); + host.session.markUndoGroup(); + host.selection.clearSelection(); + } + host.session.markUndoGroup(); + }; + + var onCompositionUpdate = function() { + if (!inComposition || !host.onCompositionUpdate || host.$readOnly) + return; + var val = text.value.replace(/\u2028/g, ""); + if (inComposition.lastValue === val) return; + + host.onCompositionUpdate(val); + if (inComposition.lastValue) + host.undo(); + if (inComposition.canUndo) + inComposition.lastValue = val; + if (inComposition.lastValue) { + var r = host.selection.getRange(); + host.insert(inComposition.lastValue); + host.session.markUndoGroup(); + inComposition.range = host.selection.getRange(); + host.selection.setRange(r); + host.selection.clearSelection(); + } + }; + + var onCompositionEnd = function(e) { + if (!host.onCompositionEnd || host.$readOnly) return; + var c = inComposition; + inComposition = false; + var timer = setTimeout(function() { + timer = null; + var str = text.value.replace(/\u2028/g, ""); + if (inComposition) + return; + else if (str == c.lastValue) + resetValue(); + else if (!c.lastValue && str) { + resetValue(); + sendText(str); + } + }); + inputHandler = function compositionInputHandler(str) { + if (timer) + clearTimeout(timer); + str = str.replace(/\u2028/g, ""); + if (str == c.lastValue) + return ""; + if (c.lastValue && timer) + host.undo(); + return str; + }; + host.onCompositionEnd(); + host.removeListener("mousedown", onCompositionEnd); + if (e.type == "compositionend" && c.range) { + host.selection.setRange(c.range); + } + var needsOnInput = + (!!useragent.isChrome && useragent.isChrome >= 53) || + (!!useragent.isWebKit && useragent.isWebKit >= 603); + + if (needsOnInput) { + onInput(); + } + }; + + + + var syncComposition = lang.delayedCall(onCompositionUpdate, 50); + + event.addListener(text, "compositionstart", onCompositionStart); + if (useragent.isGecko) { + event.addListener(text, "text", function(){syncComposition.schedule()}); + } else { + event.addListener(text, "keyup", function(){syncComposition.schedule()}); + event.addListener(text, "keydown", function(){syncComposition.schedule()}); + } + event.addListener(text, "compositionend", onCompositionEnd); + + this.getElement = function() { + return text; + }; + + this.setReadOnly = function(readOnly) { + text.readOnly = readOnly; + }; + + this.onContextMenu = function(e) { + afterContextMenu = true; + resetSelection(host.selection.isEmpty()); + host._emit("nativecontextmenu", {target: host, domEvent: e}); + this.moveToMouse(e, true); + }; + + this.moveToMouse = function(e, bringToFront) { + if (!tempStyle) + tempStyle = text.style.cssText; + text.style.cssText = (bringToFront ? "z-index:100000;" : "") + + "height:" + text.style.height + ";" + + (useragent.isIE ? "opacity:0.1;" : ""); + + var rect = host.container.getBoundingClientRect(); + var style = dom.computedStyle(host.container); + var top = rect.top + (parseInt(style.borderTopWidth) || 0); + var left = rect.left + (parseInt(rect.borderLeftWidth) || 0); + var maxTop = rect.bottom - top - text.clientHeight -2; + var move = function(e) { + text.style.left = e.clientX - left - 2 + "px"; + text.style.top = Math.min(e.clientY - top - 2, maxTop) + "px"; + }; + move(e); + + if (e.type != "mousedown") + return; + + if (host.renderer.$keepTextAreaAtCursor) + host.renderer.$keepTextAreaAtCursor = null; + + clearTimeout(closeTimeout); + if (useragent.isWin) + event.capture(host.container, move, onContextMenuClose); + }; + + this.onContextMenuClose = onContextMenuClose; + var closeTimeout; + function onContextMenuClose() { + clearTimeout(closeTimeout); + closeTimeout = setTimeout(function () { + if (tempStyle) { + text.style.cssText = tempStyle; + tempStyle = ''; + } + if (host.renderer.$keepTextAreaAtCursor == null) { + host.renderer.$keepTextAreaAtCursor = true; + host.renderer.$moveTextAreaToCursor(); + } + }, 0); + } + + var onContextMenu = function(e) { + host.textInput.onContextMenu(e); + onContextMenuClose(); + }; + event.addListener(text, "mouseup", onContextMenu); + event.addListener(text, "mousedown", function(e) { + e.preventDefault(); + onContextMenuClose(); + }); + event.addListener(host.renderer.scroller, "contextmenu", onContextMenu); + event.addListener(text, "contextmenu", onContextMenu); +}; + +exports.TextInput = TextInput; +}); + +ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); + +var DRAG_OFFSET = 0; // pixels + +function DefaultHandlers(mouseHandler) { + mouseHandler.$clickSelection = null; + + var editor = mouseHandler.editor; + editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler)); + editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler)); + editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler)); + editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler)); + editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler)); + editor.setDefaultHandler("touchmove", this.onTouchMove.bind(mouseHandler)); + + var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", + "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"]; + + exports.forEach(function(x) { + mouseHandler[x] = this[x]; + }, this); + + mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, "getLineRange"); + mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, "getWordRange"); +} + +(function() { + + this.onMouseDown = function(ev) { + var inSelection = ev.inSelection(); + var pos = ev.getDocumentPosition(); + this.mousedownEvent = ev; + var editor = this.editor; + + var button = ev.getButton(); + if (button !== 0) { + var selectionRange = editor.getSelectionRange(); + var selectionEmpty = selectionRange.isEmpty(); + editor.$blockScrolling++; + if (selectionEmpty || button == 1) + editor.selection.moveToPosition(pos); + editor.$blockScrolling--; + if (button == 2) { + editor.textInput.onContextMenu(ev.domEvent); + if (!useragent.isMozilla) + ev.preventDefault(); + } + return; + } + + this.mousedownEvent.time = Date.now(); + if (inSelection && !editor.isFocused()) { + editor.focus(); + if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) { + this.setState("focusWait"); + this.captureMouse(ev); + return; + } + } + + this.captureMouse(ev); + this.startSelect(pos, ev.domEvent._clicks > 1); + return ev.preventDefault(); + }; + + this.startSelect = function(pos, waitForClickSelection) { + pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y); + var editor = this.editor; + editor.$blockScrolling++; + if (this.mousedownEvent.getShiftKey()) + editor.selection.selectToPosition(pos); + else if (!waitForClickSelection) + editor.selection.moveToPosition(pos); + if (!waitForClickSelection) + this.select(); + if (editor.renderer.scroller.setCapture) { + editor.renderer.scroller.setCapture(); + } + editor.setStyle("ace_selecting"); + this.setState("select"); + editor.$blockScrolling--; + }; + + this.select = function() { + var anchor, editor = this.editor; + var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + editor.$blockScrolling++; + if (this.$clickSelection) { + var cmp = this.$clickSelection.comparePoint(cursor); + + if (cmp == -1) { + anchor = this.$clickSelection.end; + } else if (cmp == 1) { + anchor = this.$clickSelection.start; + } else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + editor.$blockScrolling--; + editor.renderer.scrollCursorIntoView(); + }; + + this.extendSelectionBy = function(unitName) { + var anchor, editor = this.editor; + var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + var range = editor.selection[unitName](cursor.row, cursor.column); + editor.$blockScrolling++; + if (this.$clickSelection) { + var cmpStart = this.$clickSelection.comparePoint(range.start); + var cmpEnd = this.$clickSelection.comparePoint(range.end); + + if (cmpStart == -1 && cmpEnd <= 0) { + anchor = this.$clickSelection.end; + if (range.end.row != cursor.row || range.end.column != cursor.column) + cursor = range.start; + } else if (cmpEnd == 1 && cmpStart >= 0) { + anchor = this.$clickSelection.start; + if (range.start.row != cursor.row || range.start.column != cursor.column) + cursor = range.end; + } else if (cmpStart == -1 && cmpEnd == 1) { + cursor = range.end; + anchor = range.start; + } else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + editor.$blockScrolling--; + editor.renderer.scrollCursorIntoView(); + }; + + this.selectEnd = + this.selectAllEnd = + this.selectByWordsEnd = + this.selectByLinesEnd = function() { + this.$clickSelection = null; + this.editor.unsetStyle("ace_selecting"); + if (this.editor.renderer.scroller.releaseCapture) { + this.editor.renderer.scroller.releaseCapture(); + } + }; + + this.focusWait = function() { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + var time = Date.now(); + + if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout) + this.startSelect(this.mousedownEvent.getDocumentPosition()); + }; + + this.onDoubleClick = function(ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + var session = editor.session; + + var range = session.getBracketRange(pos); + if (range) { + if (range.isEmpty()) { + range.start.column--; + range.end.column++; + } + this.setState("select"); + } else { + range = editor.selection.getWordRange(pos.row, pos.column); + this.setState("selectByWords"); + } + this.$clickSelection = range; + this.select(); + }; + + this.onTripleClick = function(ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + + this.setState("selectByLines"); + var range = editor.getSelectionRange(); + if (range.isMultiLine() && range.contains(pos.row, pos.column)) { + this.$clickSelection = editor.selection.getLineRange(range.start.row); + this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end; + } else { + this.$clickSelection = editor.selection.getLineRange(pos.row); + } + this.select(); + }; + + this.onQuadClick = function(ev) { + var editor = this.editor; + + editor.selectAll(); + this.$clickSelection = editor.getSelectionRange(); + this.setState("selectAll"); + }; + + this.onMouseWheel = function(ev) { + if (ev.getAccelKey()) + return; + if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) { + ev.wheelX = ev.wheelY; + ev.wheelY = 0; + } + + var t = ev.domEvent.timeStamp; + var dt = t - (this.$lastScrollTime||0); + + var editor = this.editor; + var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + if (isScrolable || dt < 200) { + this.$lastScrollTime = t; + editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + return ev.stop(); + } + }; + + this.onTouchMove = function (ev) { + var t = ev.domEvent.timeStamp; + var dt = t - (this.$lastScrollTime || 0); + + var editor = this.editor; + var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + if (isScrolable || dt < 200) { + this.$lastScrollTime = t; + editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + return ev.stop(); + } + }; + +}).call(DefaultHandlers.prototype); + +exports.DefaultHandlers = DefaultHandlers; + +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} + +function calcRangeOrientation(range, cursor) { + if (range.start.row == range.end.row) + var cmp = 2 * cursor.column - range.start.column - range.end.column; + else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column) + var cmp = cursor.column - 4; + else + var cmp = 2 * cursor.row - range.start.row - range.end.row; + + if (cmp < 0) + return {cursor: range.start, anchor: range.end}; + else + return {cursor: range.end, anchor: range.start}; +} + +}); + +ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +function Tooltip (parentNode) { + this.isOpen = false; + this.$element = null; + this.$parentNode = parentNode; +} + +(function() { + this.$init = function() { + this.$element = dom.createElement("div"); + this.$element.className = "ace_tooltip"; + this.$element.style.display = "none"; + this.$parentNode.appendChild(this.$element); + return this.$element; + }; + this.getElement = function() { + return this.$element || this.$init(); + }; + this.setText = function(text) { + dom.setInnerText(this.getElement(), text); + }; + this.setHtml = function(html) { + this.getElement().innerHTML = html; + }; + this.setPosition = function(x, y) { + this.getElement().style.left = x + "px"; + this.getElement().style.top = y + "px"; + }; + this.setClassName = function(className) { + dom.addCssClass(this.getElement(), className); + }; + this.show = function(text, x, y) { + if (text != null) + this.setText(text); + if (x != null && y != null) + this.setPosition(x, y); + if (!this.isOpen) { + this.getElement().style.display = "block"; + this.isOpen = true; + } + }; + + this.hide = function() { + if (this.isOpen) { + this.getElement().style.display = "none"; + this.isOpen = false; + } + }; + this.getHeight = function() { + return this.getElement().offsetHeight; + }; + this.getWidth = function() { + return this.getElement().offsetWidth; + }; + + this.destroy = function() { + this.isOpen = false; + if (this.$element && this.$element.parentNode) { + this.$element.parentNode.removeChild(this.$element); + } + }; + +}).call(Tooltip.prototype); + +exports.Tooltip = Tooltip; +}); + +ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"], function(require, exports, module) { +"use strict"; +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var event = require("../lib/event"); +var Tooltip = require("../tooltip").Tooltip; + +function GutterHandler(mouseHandler) { + var editor = mouseHandler.editor; + var gutter = editor.renderer.$gutterLayer; + var tooltip = new GutterTooltip(editor.container); + + mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { + if (!editor.isFocused() || e.getButton() != 0) + return; + var gutterRegion = gutter.getRegion(e); + + if (gutterRegion == "foldWidgets") + return; + + var row = e.getDocumentPosition().row; + var selection = editor.session.selection; + + if (e.getShiftKey()) + selection.selectTo(row, 0); + else { + if (e.domEvent.detail == 2) { + editor.selectAll(); + return e.preventDefault(); + } + mouseHandler.$clickSelection = editor.selection.getLineRange(row); + } + mouseHandler.setState("selectByLines"); + mouseHandler.captureMouse(e); + return e.preventDefault(); + }); + + + var tooltipTimeout, mouseEvent, tooltipAnnotation; + + function showTooltip() { + var row = mouseEvent.getDocumentPosition().row; + var annotation = gutter.$annotations[row]; + if (!annotation) + return hideTooltip(); + + var maxRow = editor.session.getLength(); + if (row == maxRow) { + var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row; + var pos = mouseEvent.$pos; + if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column)) + return hideTooltip(); + } + + if (tooltipAnnotation == annotation) + return; + tooltipAnnotation = annotation.text.join("
      "); + + tooltip.setHtml(tooltipAnnotation); + tooltip.show(); + editor._signal("showGutterTooltip", tooltip); + editor.on("mousewheel", hideTooltip); + + if (mouseHandler.$tooltipFollowsMouse) { + moveTooltip(mouseEvent); + } else { + var gutterElement = mouseEvent.domEvent.target; + var rect = gutterElement.getBoundingClientRect(); + var style = tooltip.getElement().style; + style.left = rect.right + "px"; + style.top = rect.bottom + "px"; + } + } + + function hideTooltip() { + if (tooltipTimeout) + tooltipTimeout = clearTimeout(tooltipTimeout); + if (tooltipAnnotation) { + tooltip.hide(); + tooltipAnnotation = null; + editor._signal("hideGutterTooltip", tooltip); + editor.removeEventListener("mousewheel", hideTooltip); + } + } + + function moveTooltip(e) { + tooltip.setPosition(e.x, e.y); + } + + mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) { + var target = e.domEvent.target || e.domEvent.srcElement; + if (dom.hasCssClass(target, "ace_fold-widget")) + return hideTooltip(); + + if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse) + moveTooltip(e); + + mouseEvent = e; + if (tooltipTimeout) + return; + tooltipTimeout = setTimeout(function() { + tooltipTimeout = null; + if (mouseEvent && !mouseHandler.isMousePressed) + showTooltip(); + else + hideTooltip(); + }, 50); + }); + + event.addListener(editor.renderer.$gutter, "mouseout", function(e) { + mouseEvent = null; + if (!tooltipAnnotation || tooltipTimeout) + return; + + tooltipTimeout = setTimeout(function() { + tooltipTimeout = null; + hideTooltip(); + }, 50); + }); + + editor.on("changeSession", hideTooltip); +} + +function GutterTooltip(parentNode) { + Tooltip.call(this, parentNode); +} + +oop.inherits(GutterTooltip, Tooltip); + +(function(){ + this.setPosition = function(x, y) { + var windowWidth = window.innerWidth || document.documentElement.clientWidth; + var windowHeight = window.innerHeight || document.documentElement.clientHeight; + var width = this.getWidth(); + var height = this.getHeight(); + x += 15; + y += 15; + if (x + width > windowWidth) { + x -= (x + width) - windowWidth; + } + if (y + height > windowHeight) { + y -= 20 + height; + } + Tooltip.prototype.setPosition.call(this, x, y); + }; + +}).call(GutterTooltip.prototype); + + + +exports.GutterHandler = GutterHandler; + +}); + +ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var MouseEvent = exports.MouseEvent = function(domEvent, editor) { + this.domEvent = domEvent; + this.editor = editor; + + this.x = this.clientX = domEvent.clientX; + this.y = this.clientY = domEvent.clientY; + + this.$pos = null; + this.$inSelection = null; + + this.propagationStopped = false; + this.defaultPrevented = false; +}; + +(function() { + + this.stopPropagation = function() { + event.stopPropagation(this.domEvent); + this.propagationStopped = true; + }; + + this.preventDefault = function() { + event.preventDefault(this.domEvent); + this.defaultPrevented = true; + }; + + this.stop = function() { + this.stopPropagation(); + this.preventDefault(); + }; + this.getDocumentPosition = function() { + if (this.$pos) + return this.$pos; + + this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); + return this.$pos; + }; + this.inSelection = function() { + if (this.$inSelection !== null) + return this.$inSelection; + + var editor = this.editor; + + + var selectionRange = editor.getSelectionRange(); + if (selectionRange.isEmpty()) + this.$inSelection = false; + else { + var pos = this.getDocumentPosition(); + this.$inSelection = selectionRange.contains(pos.row, pos.column); + } + + return this.$inSelection; + }; + this.getButton = function() { + return event.getButton(this.domEvent); + }; + this.getShiftKey = function() { + return this.domEvent.shiftKey; + }; + + this.getAccelKey = useragent.isMac + ? function() { return this.domEvent.metaKey; } + : function() { return this.domEvent.ctrlKey; }; + +}).call(MouseEvent.prototype); + +}); + +ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); + +var AUTOSCROLL_DELAY = 200; +var SCROLL_CURSOR_DELAY = 200; +var SCROLL_CURSOR_HYSTERESIS = 5; + +function DragdropHandler(mouseHandler) { + + var editor = mouseHandler.editor; + + var blankImage = dom.createElement("img"); + blankImage.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (useragent.isOpera) + blankImage.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;"; + + var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; + + exports.forEach(function(x) { + mouseHandler[x] = this[x]; + }, this); + editor.addEventListener("mousedown", this.onMouseDown.bind(mouseHandler)); + + + var mouseTarget = editor.container; + var dragSelectionMarker, x, y; + var timerId, range; + var dragCursor, counter = 0; + var dragOperation; + var isInternal; + var autoScrollStartTime; + var cursorMovedTime; + var cursorPointOnCaretMoved; + + this.onDragStart = function(e) { + if (this.cancelDrag || !mouseTarget.draggable) { + var self = this; + setTimeout(function(){ + self.startSelect(); + self.captureMouse(e); + }, 0); + return e.preventDefault(); + } + range = editor.getSelectionRange(); + + var dataTransfer = e.dataTransfer; + dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; + if (useragent.isOpera) { + editor.container.appendChild(blankImage); + blankImage.scrollTop = 0; + } + dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0); + if (useragent.isOpera) { + editor.container.removeChild(blankImage); + } + dataTransfer.clearData(); + dataTransfer.setData("Text", editor.session.getTextRange()); + + isInternal = true; + this.setState("drag"); + }; + + this.onDragEnd = function(e) { + mouseTarget.draggable = false; + isInternal = false; + this.setState(null); + if (!editor.getReadOnly()) { + var dropEffect = e.dataTransfer.dropEffect; + if (!dragOperation && dropEffect == "move") + editor.session.remove(editor.getSelectionRange()); + editor.renderer.$cursorLayer.setBlinking(true); + } + this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); + }; + + this.onDragEnter = function(e) { + if (editor.getReadOnly() || !canAccept(e.dataTransfer)) + return; + x = e.clientX; + y = e.clientY; + if (!dragSelectionMarker) + addDragMarker(); + counter++; + e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); + return event.preventDefault(e); + }; + + this.onDragOver = function(e) { + if (editor.getReadOnly() || !canAccept(e.dataTransfer)) + return; + x = e.clientX; + y = e.clientY; + if (!dragSelectionMarker) { + addDragMarker(); + counter++; + } + if (onMouseMoveTimer !== null) + onMouseMoveTimer = null; + + e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); + return event.preventDefault(e); + }; + + this.onDragLeave = function(e) { + counter--; + if (counter <= 0 && dragSelectionMarker) { + clearDragMarker(); + dragOperation = null; + return event.preventDefault(e); + } + }; + + this.onDrop = function(e) { + if (!dragCursor) + return; + var dataTransfer = e.dataTransfer; + if (isInternal) { + switch (dragOperation) { + case "move": + if (range.contains(dragCursor.row, dragCursor.column)) { + range = { + start: dragCursor, + end: dragCursor + }; + } else { + range = editor.moveText(range, dragCursor); + } + break; + case "copy": + range = editor.moveText(range, dragCursor, true); + break; + } + } else { + var dropData = dataTransfer.getData('Text'); + range = { + start: dragCursor, + end: editor.session.insert(dragCursor, dropData) + }; + editor.focus(); + dragOperation = null; + } + clearDragMarker(); + return event.preventDefault(e); + }; + + event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler)); + event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler)); + event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler)); + event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler)); + event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler)); + event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler)); + + function scrollCursorIntoView(cursor, prevCursor) { + var now = Date.now(); + var vMovement = !prevCursor || cursor.row != prevCursor.row; + var hMovement = !prevCursor || cursor.column != prevCursor.column; + if (!cursorMovedTime || vMovement || hMovement) { + editor.$blockScrolling += 1; + editor.moveCursorToPosition(cursor); + editor.$blockScrolling -= 1; + cursorMovedTime = now; + cursorPointOnCaretMoved = {x: x, y: y}; + } else { + var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y); + if (distance > SCROLL_CURSOR_HYSTERESIS) { + cursorMovedTime = null; + } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { + editor.renderer.scrollCursorIntoView(); + cursorMovedTime = null; + } + } + } + + function autoScroll(cursor, prevCursor) { + var now = Date.now(); + var lineHeight = editor.renderer.layerConfig.lineHeight; + var characterWidth = editor.renderer.layerConfig.characterWidth; + var editorRect = editor.renderer.scroller.getBoundingClientRect(); + var offsets = { + x: { + left: x - editorRect.left, + right: editorRect.right - x + }, + y: { + top: y - editorRect.top, + bottom: editorRect.bottom - y + } + }; + var nearestXOffset = Math.min(offsets.x.left, offsets.x.right); + var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom); + var scrollCursor = {row: cursor.row, column: cursor.column}; + if (nearestXOffset / characterWidth <= 2) { + scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2); + } + if (nearestYOffset / lineHeight <= 1) { + scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1); + } + var vScroll = cursor.row != scrollCursor.row; + var hScroll = cursor.column != scrollCursor.column; + var vMovement = !prevCursor || cursor.row != prevCursor.row; + if (vScroll || (hScroll && !vMovement)) { + if (!autoScrollStartTime) + autoScrollStartTime = now; + else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY) + editor.renderer.scrollCursorIntoView(scrollCursor); + } else { + autoScrollStartTime = null; + } + } + + function onDragInterval() { + var prevCursor = dragCursor; + dragCursor = editor.renderer.screenToTextCoordinates(x, y); + scrollCursorIntoView(dragCursor, prevCursor); + autoScroll(dragCursor, prevCursor); + } + + function addDragMarker() { + range = editor.selection.toOrientedRange(); + dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle()); + editor.clearSelection(); + if (editor.isFocused()) + editor.renderer.$cursorLayer.setBlinking(false); + clearInterval(timerId); + onDragInterval(); + timerId = setInterval(onDragInterval, 20); + counter = 0; + event.addListener(document, "mousemove", onMouseMove); + } + + function clearDragMarker() { + clearInterval(timerId); + editor.session.removeMarker(dragSelectionMarker); + dragSelectionMarker = null; + editor.$blockScrolling += 1; + editor.selection.fromOrientedRange(range); + editor.$blockScrolling -= 1; + if (editor.isFocused() && !isInternal) + editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly()); + range = null; + dragCursor = null; + counter = 0; + autoScrollStartTime = null; + cursorMovedTime = null; + event.removeListener(document, "mousemove", onMouseMove); + } + var onMouseMoveTimer = null; + function onMouseMove() { + if (onMouseMoveTimer == null) { + onMouseMoveTimer = setTimeout(function() { + if (onMouseMoveTimer != null && dragSelectionMarker) + clearDragMarker(); + }, 20); + } + } + + function canAccept(dataTransfer) { + var types = dataTransfer.types; + return !types || Array.prototype.some.call(types, function(type) { + return type == 'text/plain' || type == 'Text'; + }); + } + + function getDropEffect(e) { + var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized']; + var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized']; + + var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey; + var effectAllowed = "uninitialized"; + try { + effectAllowed = e.dataTransfer.effectAllowed.toLowerCase(); + } catch (e) {} + var dropEffect = "none"; + + if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "copy"; + else if (moveAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "move"; + else if (copyAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "copy"; + + return dropEffect; + } +} + +(function() { + + this.dragWait = function() { + var interval = Date.now() - this.mousedownEvent.time; + if (interval > this.editor.getDragDelay()) + this.startDrag(); + }; + + this.dragWaitEnd = function() { + var target = this.editor.container; + target.draggable = false; + this.startSelect(this.mousedownEvent.getDocumentPosition()); + this.selectEnd(); + }; + + this.dragReadyEnd = function(e) { + this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()); + this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); + this.dragWaitEnd(); + }; + + this.startDrag = function(){ + this.cancelDrag = false; + var editor = this.editor; + var target = editor.container; + target.draggable = true; + editor.renderer.$cursorLayer.setBlinking(false); + editor.setStyle("ace_dragging"); + var cursorStyle = useragent.isWin ? "default" : "move"; + editor.renderer.setCursorStyle(cursorStyle); + this.setState("dragReady"); + }; + + this.onMouseDrag = function(e) { + var target = this.editor.container; + if (useragent.isIE && this.state == "dragReady") { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + if (distance > 3) + target.dragDrop(); + } + if (this.state === "dragWait") { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + if (distance > 0) { + target.draggable = false; + this.startSelect(this.mousedownEvent.getDocumentPosition()); + } + } + }; + + this.onMouseDown = function(e) { + if (!this.$dragEnabled) + return; + this.mousedownEvent = e; + var editor = this.editor; + + var inSelection = e.inSelection(); + var button = e.getButton(); + var clickCount = e.domEvent.detail || 1; + if (clickCount === 1 && button === 0 && inSelection) { + if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey())) + return; + this.mousedownEvent.time = Date.now(); + var eventTarget = e.domEvent.target || e.domEvent.srcElement; + if ("unselectable" in eventTarget) + eventTarget.unselectable = "on"; + if (editor.getDragDelay()) { + if (useragent.isWebKit) { + this.cancelDrag = true; + var mouseTarget = editor.container; + mouseTarget.draggable = true; + } + this.setState("dragWait"); + } else { + this.startDrag(); + } + this.captureMouse(e, this.onMouseDrag.bind(this)); + e.defaultPrevented = true; + } + }; + +}).call(DragdropHandler.prototype); + + +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} + +exports.DragdropHandler = DragdropHandler; + +}); + +ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; +var dom = require("./dom"); + +exports.get = function (url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + callback(xhr.responseText); + } + }; + xhr.send(null); +}; + +exports.loadScript = function(path, callback) { + var head = dom.getDocumentHead(); + var s = document.createElement('script'); + + s.src = path; + head.appendChild(s); + + s.onload = s.onreadystatechange = function(_, isAbort) { + if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") { + s = s.onload = s.onreadystatechange = null; + if (!isAbort) + callback(); + } + }; +}; +exports.qualifyURL = function(url) { + var a = document.createElement('a'); + a.href = url; + return a.href; +} + +}); + +ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i 1) + base = parts[parts.length - 2]; + var path = options[component + "Path"]; + if (path == null) { + path = options.basePath; + } else if (sep == "/") { + component = sep = ""; + } + if (path && path.slice(-1) != "/") + path += "/"; + return path + component + sep + base + this.get("suffix"); +}; + +exports.setModuleUrl = function(name, subst) { + return options.$moduleUrls[name] = subst; +}; + +exports.$loading = {}; +exports.loadModule = function(moduleName, onLoad) { + var module, moduleType; + if (Array.isArray(moduleName)) { + moduleType = moduleName[0]; + moduleName = moduleName[1]; + } + + try { + module = require(moduleName); + } catch (e) {} + if (module && !exports.$loading[moduleName]) + return onLoad && onLoad(module); + + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + + exports.$loading[moduleName].push(onLoad); + + if (exports.$loading[moduleName].length > 1) + return; + + var afterLoad = function() { + require([moduleName], function(module) { + exports._emit("load.module", {name: moduleName, module: module}); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function(onLoad) { + onLoad && onLoad(module); + }); + }); + }; + + if (!exports.get("packaged")) + return afterLoad(); + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); +}; +init(true);function init(packaged) { + + if (!global || !global.document) + return; + + options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged); + + var scriptOptions = {}; + var scriptUrl = ""; + var currentScript = (document.currentScript || document._currentScript ); // native or polyfill + var currentDocument = currentScript && currentScript.ownerDocument || document; + + var scripts = currentDocument.getElementsByTagName("script"); + for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Selection = function(session) { + this.session = session; + this.doc = session.getDocument(); + + this.clearSelection(); + this.lead = this.selectionLead = this.doc.createAnchor(0, 0); + this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0); + + var self = this; + this.lead.on("change", function(e) { + self._emit("changeCursor"); + if (!self.$isEmpty) + self._emit("changeSelection"); + if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) + self.$desiredColumn = null; + }); + + this.selectionAnchor.on("change", function() { + if (!self.$isEmpty) + self._emit("changeSelection"); + }); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.isEmpty = function() { + return (this.$isEmpty || ( + this.anchor.row == this.lead.row && + this.anchor.column == this.lead.column + )); + }; + this.isMultiLine = function() { + if (this.isEmpty()) { + return false; + } + + return this.getRange().isMultiLine(); + }; + this.getCursor = function() { + return this.lead.getPosition(); + }; + this.setSelectionAnchor = function(row, column) { + this.anchor.setPosition(row, column); + + if (this.$isEmpty) { + this.$isEmpty = false; + this._emit("changeSelection"); + } + }; + this.getSelectionAnchor = function() { + if (this.$isEmpty) + return this.getSelectionLead(); + else + return this.anchor.getPosition(); + }; + this.getSelectionLead = function() { + return this.lead.getPosition(); + }; + this.shiftSelection = function(columns) { + if (this.$isEmpty) { + this.moveCursorTo(this.lead.row, this.lead.column + columns); + return; + } + + var anchor = this.getSelectionAnchor(); + var lead = this.getSelectionLead(); + + var isBackwards = this.isBackwards(); + + if (!isBackwards || anchor.column !== 0) + this.setSelectionAnchor(anchor.row, anchor.column + columns); + + if (isBackwards || lead.column !== 0) { + this.$moveSelection(function() { + this.moveCursorTo(lead.row, lead.column + columns); + }); + } + }; + this.isBackwards = function() { + var anchor = this.anchor; + var lead = this.lead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); + }; + this.getRange = function() { + var anchor = this.anchor; + var lead = this.lead; + + if (this.isEmpty()) + return Range.fromPoints(lead, lead); + + if (this.isBackwards()) { + return Range.fromPoints(lead, anchor); + } + else { + return Range.fromPoints(anchor, lead); + } + }; + this.clearSelection = function() { + if (!this.$isEmpty) { + this.$isEmpty = true; + this._emit("changeSelection"); + } + }; + this.selectAll = function() { + var lastRow = this.doc.getLength() - 1; + this.setSelectionAnchor(0, 0); + this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length); + }; + this.setRange = + this.setSelectionRange = function(range, reverse) { + if (reverse) { + this.setSelectionAnchor(range.end.row, range.end.column); + this.selectTo(range.start.row, range.start.column); + } else { + this.setSelectionAnchor(range.start.row, range.start.column); + this.selectTo(range.end.row, range.end.column); + } + if (this.getRange().isEmpty()) + this.$isEmpty = true; + this.$desiredColumn = null; + }; + + this.$moveSelection = function(mover) { + var lead = this.lead; + if (this.$isEmpty) + this.setSelectionAnchor(lead.row, lead.column); + + mover.call(this); + }; + this.selectTo = function(row, column) { + this.$moveSelection(function() { + this.moveCursorTo(row, column); + }); + }; + this.selectToPosition = function(pos) { + this.$moveSelection(function() { + this.moveCursorToPosition(pos); + }); + }; + this.moveTo = function(row, column) { + this.clearSelection(); + this.moveCursorTo(row, column); + }; + this.moveToPosition = function(pos) { + this.clearSelection(); + this.moveCursorToPosition(pos); + }; + this.selectUp = function() { + this.$moveSelection(this.moveCursorUp); + }; + this.selectDown = function() { + this.$moveSelection(this.moveCursorDown); + }; + this.selectRight = function() { + this.$moveSelection(this.moveCursorRight); + }; + this.selectLeft = function() { + this.$moveSelection(this.moveCursorLeft); + }; + this.selectLineStart = function() { + this.$moveSelection(this.moveCursorLineStart); + }; + this.selectLineEnd = function() { + this.$moveSelection(this.moveCursorLineEnd); + }; + this.selectFileEnd = function() { + this.$moveSelection(this.moveCursorFileEnd); + }; + this.selectFileStart = function() { + this.$moveSelection(this.moveCursorFileStart); + }; + this.selectWordRight = function() { + this.$moveSelection(this.moveCursorWordRight); + }; + this.selectWordLeft = function() { + this.$moveSelection(this.moveCursorWordLeft); + }; + this.getWordRange = function(row, column) { + if (typeof column == "undefined") { + var cursor = row || this.lead; + row = cursor.row; + column = cursor.column; + } + return this.session.getWordRange(row, column); + }; + this.selectWord = function() { + this.setSelectionRange(this.getWordRange()); + }; + this.selectAWord = function() { + var cursor = this.getCursor(); + var range = this.session.getAWordRange(cursor.row, cursor.column); + this.setSelectionRange(range); + }; + + this.getLineRange = function(row, excludeLastChar) { + var rowStart = typeof row == "number" ? row : this.lead.row; + var rowEnd; + + var foldLine = this.session.getFoldLine(rowStart); + if (foldLine) { + rowStart = foldLine.start.row; + rowEnd = foldLine.end.row; + } else { + rowEnd = rowStart; + } + if (excludeLastChar === true) + return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); + else + return new Range(rowStart, 0, rowEnd + 1, 0); + }; + this.selectLine = function() { + this.setSelectionRange(this.getLineRange()); + }; + this.moveCursorUp = function() { + this.moveCursorBy(-1, 0); + }; + this.moveCursorDown = function() { + this.moveCursorBy(1, 0); + }; + this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) { + var start = cursor.column; + var end = cursor.column + tabSize; + + if (direction < 0) { + start = cursor.column - tabSize; + end = cursor.column; + } + return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(" ").length-1 == tabSize + } + this.moveCursorLeft = function() { + var cursor = this.lead.getPosition(), + fold; + + if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + } else if (cursor.column === 0) { + if (cursor.row > 0) { + this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); + } + } + else { + var tabSize = this.session.getTabSize(); + if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) { + this.moveCursorBy(0, -tabSize); + } else { + this.moveCursorBy(0, -1); + } + } + }; + this.moveCursorRight = function() { + var cursor = this.lead.getPosition(), + fold; + if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { + this.moveCursorTo(fold.end.row, fold.end.column); + } + else if (this.lead.column == this.doc.getLine(this.lead.row).length) { + if (this.lead.row < this.doc.getLength() - 1) { + this.moveCursorTo(this.lead.row + 1, 0); + } + } + else { + var tabSize = this.session.getTabSize(); + var cursor = this.lead; + if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) { + this.moveCursorBy(0, tabSize); + } else { + this.moveCursorBy(0, 1); + } + } + }; + this.moveCursorLineStart = function() { + var row = this.lead.row; + var column = this.lead.column; + var screenRow = this.session.documentToScreenRow(row, column); + var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); + var beforeCursor = this.session.getDisplayLine( + row, null, firstColumnPosition.row, + firstColumnPosition.column + ); + + var leadingSpace = beforeCursor.match(/^\s*/); + if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) + firstColumnPosition.column += leadingSpace[0].length; + this.moveCursorToPosition(firstColumnPosition); + }; + this.moveCursorLineEnd = function() { + var lead = this.lead; + var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); + if (this.lead.column == lineEnd.column) { + var line = this.session.getLine(lineEnd.row); + if (lineEnd.column == line.length) { + var textEnd = line.search(/\s+$/); + if (textEnd > 0) + lineEnd.column = textEnd; + } + } + + this.moveCursorTo(lineEnd.row, lineEnd.column); + }; + this.moveCursorFileEnd = function() { + var row = this.doc.getLength() - 1; + var column = this.doc.getLine(row).length; + this.moveCursorTo(row, column); + }; + this.moveCursorFileStart = function() { + this.moveCursorTo(0, 0); + }; + this.moveCursorLongWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var match; + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + this.moveCursorTo(fold.end.row, fold.end.column); + return; + } + if (match = this.session.nonTokenRe.exec(rightOfCursor)) { + column += this.session.nonTokenRe.lastIndex; + this.session.nonTokenRe.lastIndex = 0; + rightOfCursor = line.substring(column); + } + if (column >= line.length) { + this.moveCursorTo(row, line.length); + this.moveCursorRight(); + if (row < this.doc.getLength() - 1) + this.moveCursorWordRight(); + return; + } + if (match = this.session.tokenRe.exec(rightOfCursor)) { + column += this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + this.moveCursorLongWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + return; + } + + var str = this.session.getFoldStringAt(row, column, -1); + if (str == null) { + str = this.doc.getLine(row).substring(0, column); + } + + var leftOfCursor = lang.stringReverse(str); + var match; + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + if (match = this.session.nonTokenRe.exec(leftOfCursor)) { + column -= this.session.nonTokenRe.lastIndex; + leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex); + this.session.nonTokenRe.lastIndex = 0; + } + if (column <= 0) { + this.moveCursorTo(row, 0); + this.moveCursorLeft(); + if (row > 0) + this.moveCursorWordLeft(); + return; + } + if (match = this.session.tokenRe.exec(leftOfCursor)) { + column -= this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + + this.$shortWordEndIndex = function(rightOfCursor) { + var match, index = 0, ch; + var whitespaceRe = /\s/; + var tokenRe = this.session.tokenRe; + + tokenRe.lastIndex = 0; + if (match = this.session.tokenRe.exec(rightOfCursor)) { + index = this.session.tokenRe.lastIndex; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + + if (index < 1) { + tokenRe.lastIndex = 0; + while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { + tokenRe.lastIndex = 0; + index ++; + if (whitespaceRe.test(ch)) { + if (index > 2) { + index--; + break; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + if (index > 2) + break; + } + } + } + } + } + tokenRe.lastIndex = 0; + + return index; + }; + + this.moveCursorShortWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var fold = this.session.getFoldAt(row, column, 1); + if (fold) + return this.moveCursorTo(fold.end.row, fold.end.column); + + if (column == line.length) { + var l = this.doc.getLength(); + do { + row++; + rightOfCursor = this.doc.getLine(row); + } while (row < l && /^\s*$/.test(rightOfCursor)); + + if (!/^\s+/.test(rightOfCursor)) + rightOfCursor = ""; + column = 0; + } + + var index = this.$shortWordEndIndex(rightOfCursor); + + this.moveCursorTo(row, column + index); + }; + + this.moveCursorShortWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) + return this.moveCursorTo(fold.start.row, fold.start.column); + + var line = this.session.getLine(row).substring(0, column); + if (column === 0) { + do { + row--; + line = this.doc.getLine(row); + } while (row > 0 && /^\s*$/.test(line)); + + column = line.length; + if (!/\s+$/.test(line)) + line = ""; + } + + var leftOfCursor = lang.stringReverse(line); + var index = this.$shortWordEndIndex(leftOfCursor); + + return this.moveCursorTo(row, column - index); + }; + + this.moveCursorWordRight = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordRight(); + else + this.moveCursorShortWordRight(); + }; + + this.moveCursorWordLeft = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordLeft(); + else + this.moveCursorShortWordLeft(); + }; + this.moveCursorBy = function(rows, chars) { + var screenPos = this.session.documentToScreenPosition( + this.lead.row, + this.lead.column + ); + + if (chars === 0) { + if (this.$desiredColumn) + screenPos.column = this.$desiredColumn; + else + this.$desiredColumn = screenPos.column; + } + + var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column); + + if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) { + if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) { + if (docPos.row > 0 || rows > 0) + docPos.row++; + } + } + this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); + }; + this.moveCursorToPosition = function(position) { + this.moveCursorTo(position.row, position.column); + }; + this.moveCursorTo = function(row, column, keepDesiredColumn) { + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + row = fold.start.row; + column = fold.start.column; + } + + this.$keepDesiredColumnOnChange = true; + this.lead.setPosition(row, column); + this.$keepDesiredColumnOnChange = false; + + if (!keepDesiredColumn) + this.$desiredColumn = null; + }; + this.moveCursorToScreen = function(row, column, keepDesiredColumn) { + var pos = this.session.screenToDocumentPosition(row, column); + this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); + }; + this.detach = function() { + this.lead.detach(); + this.anchor.detach(); + this.session = this.doc = null; + }; + + this.fromOrientedRange = function(range) { + this.setSelectionRange(range, range.cursor == range.start); + this.$desiredColumn = range.desiredColumn || this.$desiredColumn; + }; + + this.toOrientedRange = function(range) { + var r = this.getRange(); + if (range) { + range.start.column = r.start.column; + range.start.row = r.start.row; + range.end.column = r.end.column; + range.end.row = r.end.row; + } else { + range = r; + } + + range.cursor = this.isBackwards() ? range.start : range.end; + range.desiredColumn = this.$desiredColumn; + return range; + }; + this.getRangeOfMovements = function(func) { + var start = this.getCursor(); + try { + func(this); + var end = this.getCursor(); + return Range.fromPoints(start,end); + } catch(e) { + return Range.fromPoints(start,start); + } finally { + this.moveCursorToPosition(start); + } + }; + + this.toJSON = function() { + if (this.rangeCount) { + var data = this.ranges.map(function(r) { + var r1 = r.clone(); + r1.isBackwards = r.cursor == r.start; + return r1; + }); + } else { + var data = this.getRange(); + data.isBackwards = this.isBackwards(); + } + return data; + }; + + this.fromJSON = function(data) { + if (data.start == undefined) { + if (this.rangeList) { + this.toSingleRange(data[0]); + for (var i = data.length; i--; ) { + var r = Range.fromPoints(data[i].start, data[i].end); + if (data[i].isBackwards) + r.cursor = r.start; + this.addRange(r, true); + } + return; + } else + data = data[0]; + } + if (this.rangeList) + this.toSingleRange(data); + this.setSelectionRange(data, data.isBackwards); + }; + + this.isEqual = function(data) { + if ((data.length || this.rangeCount) && data.length != this.rangeCount) + return false; + if (!data.length || !this.ranges) + return this.getRange().isEqual(data); + + for (var i = this.ranges.length; i--; ) { + if (!this.ranges[i].isEqual(data[i])) + return false; + } + return true; + }; + +}).call(Selection.prototype); + +exports.Selection = Selection; +}); + +ace.define("ace/tokenizer",["require","exports","module","ace/config"], function(require, exports, module) { +"use strict"; + +var config = require("./config"); +var MAX_TOKEN_COUNT = 2000; +var Tokenizer = function(rules) { + this.states = rules; + + this.regExps = {}; + this.matchMappings = {}; + for (var key in this.states) { + var state = this.states[key]; + var ruleRegExps = []; + var matchTotal = 0; + var mapping = this.matchMappings[key] = {defaultToken: "text"}; + var flag = "g"; + + var splitterRurles = []; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.defaultToken) + mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive) + flag = "gi"; + if (rule.regex == null) + continue; + + if (rule.regex instanceof RegExp) + rule.regex = rule.regex.toString().slice(1, -1); + var adjustedregex = rule.regex; + var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; + if (Array.isArray(rule.token)) { + if (rule.token.length == 1 || matchcount == 1) { + rule.token = rule.token[0]; + } else if (matchcount - 1 != rule.token.length) { + this.reportError("number of classes and regexp groups doesn't match", { + rule: rule, + groupCount: matchcount - 1 + }); + rule.token = rule.token[0]; + } else { + rule.tokenArray = rule.token; + rule.token = null; + rule.onMatch = this.$arrayTokens; + } + } else if (typeof rule.token == "function" && !rule.onMatch) { + if (matchcount > 1) + rule.onMatch = this.$applyToken; + else + rule.onMatch = rule.token; + } + + if (matchcount > 1) { + if (/\\\d/.test(rule.regex)) { + adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) { + return "\\" + (parseInt(digit, 10) + matchTotal + 1); + }); + } else { + matchcount = 1; + adjustedregex = this.removeCapturingGroups(rule.regex); + } + if (!rule.splitRegex && typeof rule.token != "string") + splitterRurles.push(rule); // flag will be known only at the very end + } + + mapping[matchTotal] = i; + matchTotal += matchcount; + + ruleRegExps.push(adjustedregex); + if (!rule.onMatch) + rule.onMatch = null; + } + + if (!ruleRegExps.length) { + mapping[0] = 0; + ruleRegExps.push("$"); + } + + splitterRurles.forEach(function(rule) { + rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); + }, this); + + this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + } +}; + +(function() { + this.$setMaxTokenCount = function(m) { + MAX_TOKEN_COUNT = m | 0; + }; + + this.$applyToken = function(str) { + var values = this.splitRegex.exec(str).slice(1); + var types = this.token.apply(this, values); + if (typeof types === "string") + return [{type: types, value: str}]; + + var tokens = []; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i]) + tokens[tokens.length] = { + type: types[i], + value: values[i] + }; + } + return tokens; + }; + + this.$arrayTokens = function(str) { + if (!str) + return []; + var values = this.splitRegex.exec(str); + if (!values) + return "text"; + var tokens = []; + var types = this.tokenArray; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i + 1]) + tokens[tokens.length] = { + type: types[i], + value: values[i + 1] + }; + } + return tokens; + }; + + this.removeCapturingGroups = function(src) { + var r = src.replace( + /\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g, + function(x, y) {return y ? "(?:" : x;} + ); + return r; + }; + + this.createSplitterRegexp = function(src, flag) { + if (src.indexOf("(?=") != -1) { + var stack = 0; + var inChClass = false; + var lastCapture = {}; + src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( + m, esc, parenOpen, parenClose, square, index + ) { + if (inChClass) { + inChClass = square != "]"; + } else if (square) { + inChClass = true; + } else if (parenClose) { + if (stack == lastCapture.stack) { + lastCapture.end = index+1; + lastCapture.stack = -1; + } + stack--; + } else if (parenOpen) { + stack++; + if (parenOpen.length != 1) { + lastCapture.stack = stack + lastCapture.start = index; + } + } + return m; + }); + + if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) + src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); + } + if (src.charAt(0) != "^") src = "^" + src; + if (src.charAt(src.length - 1) != "$") src += "$"; + + return new RegExp(src, (flag||"").replace("g", "")); + }; + this.getLineTokens = function(line, startState) { + if (startState && typeof startState != "string") { + var stack = startState.slice(0); + startState = stack[0]; + if (startState === "#tmp") { + stack.shift() + startState = stack.shift() + } + } else + var stack = []; + + var currentState = startState || "start"; + var state = this.states[currentState]; + if (!state) { + currentState = "start"; + state = this.states[currentState]; + } + var mapping = this.matchMappings[currentState]; + var re = this.regExps[currentState]; + re.lastIndex = 0; + + var match, tokens = []; + var lastIndex = 0; + var matchAttempts = 0; + + var token = {type: null, value: ""}; + + while (match = re.exec(line)) { + var type = mapping.defaultToken; + var rule = null; + var value = match[0]; + var index = re.lastIndex; + + if (index - value.length > lastIndex) { + var skipped = line.substring(lastIndex, index - value.length); + if (token.type == type) { + token.value += skipped; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: skipped}; + } + } + + for (var i = 0; i < match.length-2; i++) { + if (match[i + 1] === undefined) + continue; + + rule = state[mapping[i]]; + + if (rule.onMatch) + type = rule.onMatch(value, currentState, stack, line); + else + type = rule.token; + + if (rule.next) { + if (typeof rule.next == "string") { + currentState = rule.next; + } else { + currentState = rule.next(currentState, stack); + } + + state = this.states[currentState]; + if (!state) { + this.reportError("state doesn't exist", currentState); + currentState = "start"; + state = this.states[currentState]; + } + mapping = this.matchMappings[currentState]; + lastIndex = index; + re = this.regExps[currentState]; + re.lastIndex = index; + } + if (rule.consumeLineEnd) + lastIndex = index; + break; + } + + if (value) { + if (typeof type === "string") { + if ((!rule || rule.merge !== false) && token.type === type) { + token.value += value; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: value}; + } + } else if (type) { + if (token.type) + tokens.push(token); + token = {type: null, value: ""}; + for (var i = 0; i < type.length; i++) + tokens.push(type[i]); + } + } + + if (lastIndex == line.length) + break; + + lastIndex = index; + + if (matchAttempts++ > MAX_TOKEN_COUNT) { + if (matchAttempts > 2 * line.length) { + this.reportError("infinite loop with in ace tokenizer", { + startState: startState, + line: line + }); + } + while (lastIndex < line.length) { + if (token.type) + tokens.push(token); + token = { + value: line.substring(lastIndex, lastIndex += 2000), + type: "overflow" + }; + } + currentState = "start"; + stack = []; + break; + } + } + + if (token.type) + tokens.push(token); + + if (stack.length > 1) { + if (stack[0] !== currentState) + stack.unshift("#tmp", currentState); + } + return { + tokens : tokens, + state : stack.length ? stack : currentState + }; + }; + + this.reportError = config.reportError; + +}).call(Tokenizer.prototype); + +exports.Tokenizer = Tokenizer; +}); + +ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); + +var TextHighlightRules = function() { + + this.$rules = { + "start" : [{ + token : "empty_line", + regex : '^$' + }, { + defaultToken : "text" + }] + }; +}; + +(function() { + + this.addRules = function(rules, prefix) { + if (!prefix) { + for (var key in rules) + this.$rules[key] = rules[key]; + return; + } + for (var key in rules) { + var state = rules[key]; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.next || rule.onMatch) { + if (typeof rule.next == "string") { + if (rule.next.indexOf(prefix) !== 0) + rule.next = prefix + rule.next; + } + if (rule.nextState && rule.nextState.indexOf(prefix) !== 0) + rule.nextState = prefix + rule.nextState; + } + } + this.$rules[prefix + key] = state; + } + }; + + this.getRules = function() { + return this.$rules; + }; + + this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { + var embedRules = typeof HighlightRules == "function" + ? new HighlightRules().getRules() + : HighlightRules; + if (states) { + for (var i = 0; i < states.length; i++) + states[i] = prefix + states[i]; + } else { + states = []; + for (var key in embedRules) + states.push(prefix + key); + } + + this.addRules(embedRules, prefix); + + if (escapeRules) { + var addRules = Array.prototype[append ? "push" : "unshift"]; + for (var i = 0; i < states.length; i++) + addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); + } + + if (!this.$embeds) + this.$embeds = []; + this.$embeds.push(prefix); + }; + + this.getEmbeds = function() { + return this.$embeds; + }; + + var pushState = function(currentState, stack) { + if (currentState != "start" || stack.length) + stack.unshift(this.nextState, currentState); + return this.nextState; + }; + var popState = function(currentState, stack) { + stack.shift(); + return stack.shift() || "start"; + }; + + this.normalizeRules = function() { + var id = 0; + var rules = this.$rules; + function processState(key) { + var state = rules[key]; + state.processed = true; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + var toInsert = null; + if (Array.isArray(rule)) { + toInsert = rule; + rule = {}; + } + if (!rule.regex && rule.start) { + rule.regex = rule.start; + if (!rule.next) + rule.next = []; + rule.next.push({ + defaultToken: rule.token + }, { + token: rule.token + ".end", + regex: rule.end || rule.start, + next: "pop" + }); + rule.token = rule.token + ".start"; + rule.push = true; + } + var next = rule.next || rule.push; + if (next && Array.isArray(next)) { + var stateName = rule.stateName; + if (!stateName) { + stateName = rule.token; + if (typeof stateName != "string") + stateName = stateName[0] || ""; + if (rules[stateName]) + stateName += id++; + } + rules[stateName] = next; + rule.next = stateName; + processState(stateName); + } else if (next == "pop") { + rule.next = popState; + } + + if (rule.push) { + rule.nextState = rule.next || rule.push; + rule.next = pushState; + delete rule.push; + } + + if (rule.rules) { + for (var r in rule.rules) { + if (rules[r]) { + if (rules[r].push) + rules[r].push.apply(rules[r], rule.rules[r]); + } else { + rules[r] = rule.rules[r]; + } + } + } + var includeName = typeof rule == "string" ? rule : rule.include; + if (includeName) { + if (Array.isArray(includeName)) + toInsert = includeName.map(function(x) { return rules[x]; }); + else + toInsert = rules[includeName]; + } + + if (toInsert) { + var args = [i, 1].concat(toInsert); + if (rule.noEscape) + args = args.filter(function(x) {return !x.next;}); + state.splice.apply(state, args); + i--; + } + + if (rule.keywordMap) { + rule.token = this.createKeywordMapper( + rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive + ); + delete rule.defaultToken; + } + } + } + Object.keys(rules).forEach(processState, this); + }; + + this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { + var keywords = Object.create(null); + Object.keys(map).forEach(function(className) { + var a = map[className]; + if (ignoreCase) + a = a.toLowerCase(); + var list = a.split(splitChar || "|"); + for (var i = list.length; i--; ) + keywords[list[i]] = className; + }); + if (Object.getPrototypeOf(keywords)) { + keywords.__proto__ = null; + } + this.$keywordList = Object.keys(keywords); + map = null; + return ignoreCase + ? function(value) {return keywords[value.toLowerCase()] || defaultToken } + : function(value) {return keywords[value] || defaultToken }; + }; + + this.getKeywords = function() { + return this.$keywords; + }; + +}).call(TextHighlightRules.prototype); + +exports.TextHighlightRules = TextHighlightRules; +}); + +ace.define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var Behaviour = function() { + this.$behaviours = {}; +}; + +(function () { + + this.add = function (name, action, callback) { + switch (undefined) { + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; + } + this.$behaviours[name][action] = callback; + } + + this.addBehaviours = function (behaviours) { + for (var key in behaviours) { + for (var action in behaviours[key]) { + this.add(key, action, behaviours[key][action]); + } + } + } + + this.remove = function (name) { + if (this.$behaviours && this.$behaviours[name]) { + delete this.$behaviours[name]; + } + } + + this.inherit = function (mode, filter) { + if (typeof mode === "function") { + var behaviours = new mode().getBehaviours(filter); + } else { + var behaviours = mode.getBehaviours(filter); + } + this.addBehaviours(behaviours); + } + + this.getBehaviours = function (filter) { + if (!filter) { + return this.$behaviours; + } else { + var ret = {} + for (var i = 0; i < filter.length; i++) { + if (this.$behaviours[filter[i]]) { + ret[filter[i]] = this.$behaviours[filter[i]]; + } + } + return ret; + } + } + +}).call(Behaviour.prototype); + +exports.Behaviour = Behaviour; +}); + +ace.define("ace/token_iterator",["require","exports","module"], function(require, exports, module) { +"use strict"; +var TokenIterator = function(session, initialRow, initialColumn) { + this.$session = session; + this.$row = initialRow; + this.$rowTokens = session.getTokens(initialRow); + + var token = session.getTokenAt(initialRow, initialColumn); + this.$tokenIndex = token ? token.index : -1; +}; + +(function() { + this.stepBackward = function() { + this.$tokenIndex -= 1; + + while (this.$tokenIndex < 0) { + this.$row -= 1; + if (this.$row < 0) { + this.$row = 0; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = this.$rowTokens.length - 1; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.stepForward = function() { + this.$tokenIndex += 1; + var rowCount; + while (this.$tokenIndex >= this.$rowTokens.length) { + this.$row += 1; + if (!rowCount) + rowCount = this.$session.getLength(); + if (this.$row >= rowCount) { + this.$row = rowCount - 1; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = 0; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.getCurrentToken = function () { + return this.$rowTokens[this.$tokenIndex]; + }; + this.getCurrentTokenRow = function () { + return this.$row; + }; + this.getCurrentTokenColumn = function() { + var rowTokens = this.$rowTokens; + var tokenIndex = this.$tokenIndex; + var column = rowTokens[tokenIndex].start; + if (column !== undefined) + return column; + + column = 0; + while (tokenIndex > 0) { + tokenIndex -= 1; + column += rowTokens[tokenIndex].value.length; + } + + return column; + }; + this.getCurrentTokenPosition = function() { + return {row: this.$row, column: this.getCurrentTokenColumn()}; + }; + +}).call(TokenIterator.prototype); + +exports.TokenIterator = TokenIterator; +}); + +ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + +var context; +var contextCache = {}; +var defaultQuotes = {'"' : '"', "'" : "'"}; + +var initContext = function(editor) { + var id = -1; + if (editor.multiSelect) { + id = editor.selection.index; + if (contextCache.rangeCount != editor.multiSelect.rangeCount) + contextCache = {rangeCount: editor.multiSelect.rangeCount}; + } + if (contextCache[id]) + return context = contextCache[id]; + context = contextCache[id] = { + autoInsertedBrackets: 0, + autoInsertedRow: -1, + autoInsertedLineEnd: "", + maybeInsertedBrackets: 0, + maybeInsertedRow: -1, + maybeInsertedLineStart: "", + maybeInsertedLineEnd: "" + }; +}; + +var getWrapped = function(selection, selected, opening, closing) { + var rowDiff = selection.end.row - selection.start.row; + return { + text: opening + selected + closing, + selection: [ + 0, + selection.start.column + 1, + rowDiff, + selection.end.column + (rowDiff ? 0 : 1) + ] + }; +}; + +var CstyleBehaviour = function(options) { + this.add("braces", "insertion", function(state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '{', '}'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + initContext(editor); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + initContext(editor); + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", context.maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === '}') { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}'); + if (!openBracePos) + return null; + var next_indent = this.$getIndent(session.getLine(openBracePos.row)); + } else if (closing) { + var next_indent = this.$getIndent(line); + } else { + CstyleBehaviour.clearMaybeInsertedClosing(); + return; + } + var indent = next_indent + session.getTabString(); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } else { + CstyleBehaviour.clearMaybeInsertedClosing(); + } + }); + + this.add("braces", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + context.maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function(state, action, editor, session, text) { + if (text == '(') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '(', ')'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function(state, action, editor, session, text) { + if (text == '[') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '[', ']'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function(state, action, editor, session, text) { + var quotes = session.$mode.$quotes || defaultQuotes; + if (text.length == 1 && quotes[text]) { + if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) + return; + initContext(editor); + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, quote, quote); + } else if (!selected) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + var rightChar = line.substring(cursor.column, cursor.column + 1); + + var token = session.getTokenAt(cursor.row, cursor.column); + var rightToken = session.getTokenAt(cursor.row, cursor.column + 1); + if (leftChar == "\\" && token && /escape/.test(token.type)) + return null; + + var stringBefore = token && /string|escape/.test(token.type); + var stringAfter = !rightToken || /string|escape/.test(rightToken.type); + + var pair; + if (rightChar == quote) { + pair = stringBefore !== stringAfter; + if (pair && /string\.end/.test(rightToken.type)) + pair = false; + } else { + if (stringBefore && !stringAfter) + return null; // wrap string with different quote + if (stringBefore && stringAfter) + return null; // do not pair quotes inside strings + var wordRe = session.$mode.tokenRe; + wordRe.lastIndex = 0; + var isWordBefore = wordRe.test(leftChar); + wordRe.lastIndex = 0; + var isWordAfter = wordRe.test(leftChar); + if (isWordBefore || isWordAfter) + return null; // before or after alphanumeric + if (rightChar && !/[\s;,.})\]\\]/.test(rightChar)) + return null; // there is rightChar and it isn't closing + pair = true; + } + return { + text: pair ? quote + quote : "", + selection: [1,1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + + +CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); +}; + +CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; +}; + +CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0])) + context.autoInsertedBrackets = 0; + context.autoInsertedRow = cursor.row; + context.autoInsertedLineEnd = bracket + line.substr(cursor.column); + context.autoInsertedBrackets++; +}; + +CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = cursor.row; + context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + context.maybeInsertedLineEnd = line.substr(cursor.column); + context.maybeInsertedBrackets++; +}; + +CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return context.autoInsertedBrackets > 0 && + cursor.row === context.autoInsertedRow && + bracket === context.autoInsertedLineEnd[0] && + line.substr(cursor.column) === context.autoInsertedLineEnd; +}; + +CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return context.maybeInsertedBrackets > 0 && + cursor.row === context.maybeInsertedRow && + line.substr(cursor.column) === context.maybeInsertedLineEnd && + line.substr(0, cursor.column) == context.maybeInsertedLineStart; +}; + +CstyleBehaviour.popAutoInsertedClosing = function() { + context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1); + context.autoInsertedBrackets--; +}; + +CstyleBehaviour.clearMaybeInsertedClosing = function() { + if (context) { + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = -1; + } +}; + + + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define("ace/unicode",["require","exports","module"], function(require, exports, module) { +"use strict"; +exports.packages = {}; + +addUnicodePackage({ + L: "0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", + Ll: "0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A", + Lu: "0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A", + Lt: "01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC", + Lm: "02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F", + Lo: "01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", + M: "0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26", + Mn: "0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26", + Mc: "0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC", + Me: "0488048906DE20DD-20E020E2-20E4A670-A672", + N: "0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", + Nd: "0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", + Nl: "16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF", + No: "00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835", + P: "0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65", + Pd: "002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D", + Ps: "0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62", + Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63", + Pi: "00AB2018201B201C201F20392E022E042E092E0C2E1C2E20", + Pf: "00BB2019201D203A2E032E052E0A2E0D2E1D2E21", + Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F", + Po: "0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65", + S: "0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD", + Sm: "002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC", + Sc: "002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6", + Sk: "005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3", + So: "00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD", + Z: "002000A01680180E2000-200A20282029202F205F3000", + Zs: "002000A01680180E2000-200A202F205F3000", + Zl: "2028", + Zp: "2029", + C: "0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF", + Cc: "0000-001F007F-009F", + Cf: "00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB", + Co: "E000-F8FF", + Cs: "D800-DFFF", + Cn: "03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF" +}); + +function addUnicodePackage (pack) { + var codePoint = /\w{4}/g; + for (var name in pack) + exports.packages[name] = pack[name].replace(codePoint, "\\u$&"); +} + +}); + +ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module) { +"use strict"; + +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var unicode = require("../unicode"); +var lang = require("../lib/lang"); +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = TextHighlightRules; +}; + +(function() { + this.$defaultBehaviour = new CstyleBehaviour(); + + this.tokenRe = new RegExp("^[" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\\$_]+", "g" + ); + + this.nonTokenRe = new RegExp("^(?:[^" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\\$_]|\\s])+", "g" + ); + + this.getTokenizer = function() { + if (!this.$tokenizer) { + this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig); + this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); + } + return this.$tokenizer; + }; + + this.lineCommentStart = ""; + this.blockComment = ""; + + this.toggleCommentLines = function(state, session, startRow, endRow) { + var doc = session.doc; + + var ignoreBlankLines = true; + var shouldRemove = true; + var minIndent = Infinity; + var tabSize = session.getTabSize(); + var insertAtTabStop = false; + + if (!this.lineCommentStart) { + if (!this.blockComment) + return false; + var lineCommentStart = this.blockComment.start; + var lineCommentEnd = this.blockComment.end; + var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); + var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); + + var comment = function(line, i) { + if (testRemove(line, i)) + return; + if (!ignoreBlankLines || /\S/.test(line)) { + doc.insertInLine({row: i, column: line.length}, lineCommentEnd); + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + + var uncomment = function(line, i) { + var m; + if (m = line.match(regexpEnd)) + doc.removeInLine(i, line.length - m[0].length, line.length); + if (m = line.match(regexpStart)) + doc.removeInLine(i, m[1].length, m[0].length); + }; + + var testRemove = function(line, row) { + if (regexpStart.test(line)) + return true; + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + if (tokens[i].type === "comment") + return true; + } + }; + } else { + if (Array.isArray(this.lineCommentStart)) { + var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); + var lineCommentStart = this.lineCommentStart[0]; + } else { + var regexpStart = lang.escapeRegExp(this.lineCommentStart); + var lineCommentStart = this.lineCommentStart; + } + regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); + + insertAtTabStop = session.getUseSoftTabs(); + + var uncomment = function(line, i) { + var m = line.match(regexpStart); + if (!m) return; + var start = m[1].length, end = m[0].length; + if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") + end--; + doc.removeInLine(i, start, end); + }; + var commentWithSpace = lineCommentStart + " "; + var comment = function(line, i) { + if (!ignoreBlankLines || /\S/.test(line)) { + if (shouldInsertSpace(line, minIndent, minIndent)) + doc.insertInLine({row: i, column: minIndent}, commentWithSpace); + else + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + var testRemove = function(line, i) { + return regexpStart.test(line); + }; + + var shouldInsertSpace = function(line, before, after) { + var spaces = 0; + while (before-- && line.charAt(before) == " ") + spaces++; + if (spaces % tabSize != 0) + return false; + var spaces = 0; + while (line.charAt(after++) == " ") + spaces++; + if (tabSize > 2) + return spaces % tabSize != tabSize - 1; + else + return spaces % tabSize == 0; + return true; + }; + } + + function iter(fun) { + for (var i = startRow; i <= endRow; i++) + fun(doc.getLine(i), i); + } + + + var minEmptyLength = Infinity; + iter(function(line, i) { + var indent = line.search(/\S/); + if (indent !== -1) { + if (indent < minIndent) + minIndent = indent; + if (shouldRemove && !testRemove(line, i)) + shouldRemove = false; + } else if (minEmptyLength > line.length) { + minEmptyLength = line.length; + } + }); + + if (minIndent == Infinity) { + minIndent = minEmptyLength; + ignoreBlankLines = false; + shouldRemove = false; + } + + if (insertAtTabStop && minIndent % tabSize != 0) + minIndent = Math.floor(minIndent / tabSize) * tabSize; + + iter(shouldRemove ? uncomment : comment); + }; + + this.toggleBlockComment = function(state, session, range, cursor) { + var comment = this.blockComment; + if (!comment) + return; + if (!comment.start && comment[0]) + comment = comment[0]; + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + var sel = session.selection; + var initialRange = session.selection.toOrientedRange(); + var startRow, colDiff; + + if (token && /comment/.test(token.type)) { + var startRange, endRange; + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.start); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + startRange = new Range(row, column, row, column + comment.start.length); + break; + } + token = iterator.stepBackward(); + } + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.end); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + endRange = new Range(row, column, row, column + comment.end.length); + break; + } + token = iterator.stepForward(); + } + if (endRange) + session.remove(endRange); + if (startRange) { + session.remove(startRange); + startRow = startRange.start.row; + colDiff = -comment.start.length; + } + } else { + colDiff = comment.start.length; + startRow = range.start.row; + session.insert(range.end, comment.end); + session.insert(range.start, comment.start); + } + if (initialRange.start.row == startRow) + initialRange.start.column += colDiff; + if (initialRange.end.row == startRow) + initialRange.end.column += colDiff; + session.selection.fromOrientedRange(initialRange); + }; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.autoOutdent = function(state, doc, row) { + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + + this.createWorker = function(session) { + return null; + }; + + this.createModeDelegates = function (mapping) { + this.$embeds = []; + this.$modes = {}; + for (var i in mapping) { + if (mapping[i]) { + this.$embeds.push(i); + this.$modes[i] = new mapping[i](); + } + } + + var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", + "checkOutdent", "autoOutdent", "transformAction", "getCompletions"]; + + for (var i = 0; i < delegations.length; i++) { + (function(scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = function() { + return this.$delegator(functionName, arguments, defaultHandler); + }; + }(this)); + } + }; + + this.$delegator = function(method, args, defaultHandler) { + var state = args[0]; + if (typeof state != "string") + state = state[0]; + for (var i = 0; i < this.$embeds.length; i++) { + if (!this.$modes[this.$embeds[i]]) continue; + + var split = state.split(this.$embeds[i]); + if (!split[0] && split[1]) { + args[0] = split[1]; + var mode = this.$modes[this.$embeds[i]]; + return mode[method].apply(mode, args); + } + } + var ret = defaultHandler.apply(this, args); + return defaultHandler ? ret : undefined; + }; + + this.transformAction = function(state, action, editor, session, param) { + if (this.$behaviour) { + var behaviours = this.$behaviour.getBehaviours(); + for (var key in behaviours) { + if (behaviours[key][action]) { + var ret = behaviours[key][action].apply(this, arguments); + if (ret) { + return ret; + } + } + } + } + }; + + this.getKeywords = function(append) { + if (!this.completionKeywords) { + var rules = this.$tokenizer.rules; + var completionKeywords = []; + for (var rule in rules) { + var ruleItr = rules[rule]; + for (var r = 0, l = ruleItr.length; r < l; r++) { + if (typeof ruleItr[r].token === "string") { + if (/keyword|support|storage/.test(ruleItr[r].token)) + completionKeywords.push(ruleItr[r].regex); + } + else if (typeof ruleItr[r].token === "object") { + for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { + if (/keyword|support|storage/.test(ruleItr[r].token[a])) { + var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; + completionKeywords.push(rule.substr(1, rule.length - 2)); + } + } + } + } + } + this.completionKeywords = completionKeywords; + } + if (!append) + return this.$keywordList; + return completionKeywords.concat(this.$keywordList || []); + }; + + this.$createKeywordList = function() { + if (!this.$highlightRules) + this.getTokenizer(); + return this.$keywordList = this.$highlightRules.$keywordList || []; + }; + + this.getCompletions = function(state, session, pos, prefix) { + var keywords = this.$keywordList || this.$createKeywordList(); + return keywords.map(function(word) { + return { + name: word, + value: word, + score: 0, + meta: "keyword" + }; + }); + }; + + this.$id = "ace/mode/text"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +} +}); + +ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var Anchor = exports.Anchor = function(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + this.getDocument = function() { + return this.document; + }; + this.$insertRight = false; + this.onChange = function(delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + + if (delta.start.row > this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) + this.$splitAndapplyLargeDelta(delta, 20000); + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length; + var row = delta.start.row; + var column = delta.start.column; + var from = 0, to = 0; + do { + from = to; + to += MAX - 1; + var chunk = lines.slice(from, to); + if (to > l) { + delta.lines = chunk; + delta.start.row = row + from; + delta.start.column = column; + break; + } + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } while(true); + }; + this.revertDelta = function(delta) { + this.applyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +ace.define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var BackgroundTokenizer = function(tokenizer, editor) { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.tokenizer = tokenizer; + + var self = this; + + this.$worker = function() { + if (!self.running) { return; } + + var workerStart = new Date(); + var currentLine = self.currentLine; + var endLine = -1; + var doc = self.doc; + + var startLine = currentLine; + while (self.lines[currentLine]) + currentLine++; + + var len = doc.getLength(); + var processedLines = 0; + self.running = false; + while (currentLine < len) { + self.$tokenizeRow(currentLine); + endLine = currentLine; + do { + currentLine++; + } while (self.lines[currentLine]); + processedLines ++; + if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { + self.running = setTimeout(self.$worker, 20); + break; + } + } + self.currentLine = currentLine; + + if (endLine == -1) + endLine = currentLine; + + if (startLine <= endLine) + self.fireUpdateEvent(startLine, endLine); + }; +}; + +(function(){ + + oop.implement(this, EventEmitter); + this.setTokenizer = function(tokenizer) { + this.tokenizer = tokenizer; + this.lines = []; + this.states = []; + + this.start(0); + }; + this.setDocument = function(doc) { + this.doc = doc; + this.lines = []; + this.states = []; + + this.stop(); + }; + this.fireUpdateEvent = function(firstRow, lastRow) { + var data = { + first: firstRow, + last: lastRow + }; + this._signal("update", {data: data}); + }; + this.start = function(startRow) { + this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); + this.lines.splice(this.currentLine, this.lines.length); + this.states.splice(this.currentLine, this.states.length); + + this.stop(); + this.running = setTimeout(this.$worker, 700); + }; + + this.scheduleStart = function() { + if (!this.running) + this.running = setTimeout(this.$worker, 700); + } + + this.$updateOnChange = function(delta) { + var startRow = delta.start.row; + var len = delta.end.row - startRow; + + if (len === 0) { + this.lines[startRow] = null; + } else if (delta.action == "remove") { + this.lines.splice(startRow, len + 1, null); + this.states.splice(startRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(startRow, 1); + this.lines.splice.apply(this.lines, args); + this.states.splice.apply(this.states, args); + } + + this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); + + this.stop(); + }; + this.stop = function() { + if (this.running) + clearTimeout(this.running); + this.running = false; + }; + this.getTokens = function(row) { + return this.lines[row] || this.$tokenizeRow(row); + }; + this.getState = function(row) { + if (this.currentLine == row) + this.$tokenizeRow(row); + return this.states[row] || "start"; + }; + + this.$tokenizeRow = function(row) { + var line = this.doc.getLine(row); + var state = this.states[row - 1]; + + var data = this.tokenizer.getLineTokens(line, state, row); + + if (this.states[row] + "" !== data.state + "") { + this.states[row] = data.state; + this.lines[row + 1] = null; + if (this.currentLine > row + 1) + this.currentLine = row + 1; + } else if (this.currentLine == row) { + this.currentLine = row + 1; + } + + return this.lines[row] = data.tokens; + }; + +}).call(BackgroundTokenizer.prototype); + +exports.BackgroundTokenizer = BackgroundTokenizer; +}); + +ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var SearchHighlight = function(regExp, clazz, type) { + this.setRegexp(regExp); + this.clazz = clazz; + this.type = type || "text"; +}; + +(function() { + this.MAX_RANGES = 500; + + this.setRegexp = function(regExp) { + if (this.regExp+"" == regExp+"") + return; + this.regExp = regExp; + this.cache = []; + }; + + this.update = function(html, markerLayer, session, config) { + if (!this.regExp) + return; + var start = config.firstRow, end = config.lastRow; + + for (var i = start; i <= end; i++) { + var ranges = this.cache[i]; + if (ranges == null) { + ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + ranges = ranges.map(function(match) { + return new Range(i, match.offset, i, match.offset + match.length); + }); + this.cache[i] = ranges.length ? ranges : ""; + } + + for (var j = ranges.length; j --; ) { + markerLayer.drawSingleLineMarker( + html, ranges[j].toScreenRange(session), this.clazz, config); + } + } + }; + +}).call(SearchHighlight.prototype); + +exports.SearchHighlight = SearchHighlight; +}); + +ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +function FoldLine(foldData, folds) { + this.foldData = foldData; + if (Array.isArray(folds)) { + this.folds = folds; + } else { + folds = this.folds = [ folds ]; + } + + var last = folds[folds.length - 1]; + this.range = new Range(folds[0].start.row, folds[0].start.column, + last.end.row, last.end.column); + this.start = this.range.start; + this.end = this.range.end; + + this.folds.forEach(function(fold) { + fold.setFoldLine(this); + }, this); +} + +(function() { + this.shiftRow = function(shift) { + this.start.row += shift; + this.end.row += shift; + this.folds.forEach(function(fold) { + fold.start.row += shift; + fold.end.row += shift; + }); + }; + + this.addFold = function(fold) { + if (fold.sameRow) { + if (fold.start.row < this.startRow || fold.endRow > this.endRow) { + throw new Error("Can't add a fold to this FoldLine as it has no connection"); + } + this.folds.push(fold); + this.folds.sort(function(a, b) { + return -a.range.compareEnd(b.start.row, b.start.column); + }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } + } else if (fold.start.row == this.end.row) { + this.folds.push(fold); + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (fold.end.row == this.start.row) { + this.folds.unshift(fold); + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } else { + throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + } + fold.foldLine = this; + }; + + this.containsRow = function(row) { + return row >= this.start.row && row <= this.end.row; + }; + + this.walk = function(callback, endRow, endColumn) { + var lastEnd = 0, + folds = this.folds, + fold, + cmp, stop, isNewRow = true; + + if (endRow == null) { + endRow = this.end.row; + endColumn = this.end.column; + } + + for (var i = 0; i < folds.length; i++) { + fold = folds[i]; + + cmp = fold.range.compareStart(endRow, endColumn); + if (cmp == -1) { + callback(null, endRow, endColumn, lastEnd, isNewRow); + return; + } + + stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); + if (stop || cmp === 0) { + return; + } + isNewRow = !fold.sameRow; + lastEnd = fold.end.column; + } + callback(null, endRow, endColumn, lastEnd, isNewRow); + }; + + this.getNextFoldTo = function(row, column) { + var fold, cmp; + for (var i = 0; i < this.folds.length; i++) { + fold = this.folds[i]; + cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + return { + fold: fold, + kind: "after" + }; + } else if (cmp === 0) { + return { + fold: fold, + kind: "inside" + }; + } + } + return null; + }; + + this.addRemoveChars = function(row, column, len) { + var ret = this.getNextFoldTo(row, column), + fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) + { + window.console && window.console.log(row, column, fold); + } else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i === 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; + } + fold.end.column += len; + } + this.end.column += len; + } + } + }; + + this.split = function(row, column) { + var pos = this.getNextFoldTo(row, column); + + if (!pos || pos.kind == "inside") + return null; + + var fold = pos.fold; + var folds = this.folds; + var foldData = this.foldData; + + var i = folds.indexOf(fold); + var foldBefore = folds[i - 1]; + this.end.row = foldBefore.end.row; + this.end.column = foldBefore.end.column; + folds = folds.splice(i, folds.length - i); + + var newFoldLine = new FoldLine(foldData, folds); + foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); + return newFoldLine; + }; + + this.merge = function(foldLineNext) { + var folds = foldLineNext.folds; + for (var i = 0; i < folds.length; i++) { + this.addFold(folds[i]); + } + var foldData = this.foldData; + foldData.splice(foldData.indexOf(foldLineNext), 1); + }; + + this.toString = function() { + var ret = [this.range.toString() + ": [" ]; + + this.folds.forEach(function(fold) { + ret.push(" " + fold.toString()); + }); + ret.push("]"); + return ret.join("\n"); + }; + + this.idxToPosition = function(idx) { + var lastFoldEndColumn = 0; + + for (var i = 0; i < this.folds.length; i++) { + var fold = this.folds[i]; + + idx -= fold.start.column - lastFoldEndColumn; + if (idx < 0) { + return { + row: fold.start.row, + column: fold.start.column + idx + }; + } + + idx -= fold.placeholder.length; + if (idx < 0) { + return fold.start; + } + + lastFoldEndColumn = fold.end.column; + } + + return { + row: this.end.row, + column: this.end.column + idx + }; + }; +}).call(FoldLine.prototype); + +exports.FoldLine = FoldLine; +}); + +ace.define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; +var Range = require("./range").Range; +var comparePoints = Range.comparePoints; + +var RangeList = function() { + this.ranges = []; +}; + +(function() { + this.comparePoints = comparePoints; + + this.pointIndex = function(pos, excludeEdges, startIndex) { + var list = this.ranges; + + for (var i = startIndex || 0; i < list.length; i++) { + var range = list[i]; + var cmpEnd = comparePoints(pos, range.end); + if (cmpEnd > 0) + continue; + var cmpStart = comparePoints(pos, range.start); + if (cmpEnd === 0) + return excludeEdges && cmpStart !== 0 ? -i-2 : i; + if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) + return i; + + return -i-1; + } + return -i - 1; + }; + + this.add = function(range) { + var excludeEdges = !range.isEmpty(); + var startIndex = this.pointIndex(range.start, excludeEdges); + if (startIndex < 0) + startIndex = -startIndex - 1; + + var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); + + if (endIndex < 0) + endIndex = -endIndex - 1; + else + endIndex++; + return this.ranges.splice(startIndex, endIndex - startIndex, range); + }; + + this.addList = function(list) { + var removed = []; + for (var i = list.length; i--; ) { + removed.push.apply(removed, this.add(list[i])); + } + return removed; + }; + + this.substractPoint = function(pos) { + var i = this.pointIndex(pos); + + if (i >= 0) + return this.ranges.splice(i, 1); + }; + this.merge = function() { + var removed = []; + var list = this.ranges; + + list = list.sort(function(a, b) { + return comparePoints(a.start, b.start); + }); + + var next = list[0], range; + for (var i = 1; i < list.length; i++) { + range = next; + next = list[i]; + var cmp = comparePoints(range.end, next.start); + if (cmp < 0) + continue; + + if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) + continue; + + if (comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; + } + + list.splice(i, 1); + removed.push(next); + next = range; + i--; + } + + this.ranges = list; + + return removed; + }; + + this.contains = function(row, column) { + return this.pointIndex({row: row, column: column}) >= 0; + }; + + this.containsPoint = function(pos) { + return this.pointIndex(pos) >= 0; + }; + + this.rangeAtPoint = function(pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges[i]; + }; + + + this.clipRows = function(startRow, endRow) { + var list = this.ranges; + if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) + return []; + + var startIndex = this.pointIndex({row: startRow, column: 0}); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + + var clipped = []; + for (var i = startIndex; i < endIndex; i++) { + clipped.push(list[i]); + } + return clipped; + }; + + this.removeAll = function() { + return this.ranges.splice(0, this.ranges.length); + }; + + this.attach = function(session) { + if (this.session) + this.detach(); + + this.session = session; + this.onChange = this.$onChange.bind(this); + + this.session.on('change', this.onChange); + }; + + this.detach = function() { + if (!this.session) + return; + this.session.removeListener('change', this.onChange); + this.session = null; + }; + + this.$onChange = function(delta) { + if (delta.action == "insert"){ + var start = delta.start; + var end = delta.end; + } else { + var end = delta.start; + var start = delta.end; + } + var startRow = start.row; + var endRow = end.row; + var lineDif = endRow - startRow; + + var colDiff = -start.column + end.column; + var ranges = this.ranges; + + for (var i = 0, n = ranges.length; i < n; i++) { + var r = ranges[i]; + if (r.end.row < startRow) + continue; + if (r.start.row > startRow) + break; + + if (r.start.row == startRow && r.start.column >= start.column ) { + if (r.start.column == start.column && this.$insertRight) { + } else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + if (r.end.row == startRow && r.end.column >= start.column) { + if (r.end.column == start.column && this.$insertRight) { + continue; + } + if (r.end.column == start.column && colDiff > 0 && i < n - 1) { + if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) + r.end.column -= colDiff; + } + r.end.column += colDiff; + r.end.row += lineDif; + } + } + + if (lineDif != 0 && i < n) { + for (; i < n; i++) { + var r = ranges[i]; + r.start.row += lineDif; + r.end.row += lineDif; + } + } + }; + +}).call(RangeList.prototype); + +exports.RangeList = RangeList; +}); + +ace.define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var RangeList = require("../range_list").RangeList; +var oop = require("../lib/oop") +var Fold = exports.Fold = function(range, placeholder) { + this.foldLine = null; + this.placeholder = placeholder; + this.range = range; + this.start = range.start; + this.end = range.end; + + this.sameRow = range.start.row == range.end.row; + this.subFolds = this.ranges = []; +}; + +oop.inherits(Fold, RangeList); + +(function() { + + this.toString = function() { + return '"' + this.placeholder + '" ' + this.range.toString(); + }; + + this.setFoldLine = function(foldLine) { + this.foldLine = foldLine; + this.subFolds.forEach(function(fold) { + fold.setFoldLine(foldLine); + }); + }; + + this.clone = function() { + var range = this.range.clone(); + var fold = new Fold(range, this.placeholder); + this.subFolds.forEach(function(subFold) { + fold.subFolds.push(subFold.clone()); + }); + fold.collapseChildren = this.collapseChildren; + return fold; + }; + + this.addSubFold = function(fold) { + if (this.range.isEqual(fold)) + return; + + if (!this.range.containsRange(fold)) + throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); + consumeRange(fold, this.start); + + var row = fold.start.row, column = fold.start.column; + for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { + cmp = this.subFolds[i].range.compare(row, column); + if (cmp != 1) + break; + } + var afterStart = this.subFolds[i]; + + if (cmp == 0) + return afterStart.addSubFold(fold); + var row = fold.range.end.row, column = fold.range.end.column; + for (var j = i, cmp = -1; j < this.subFolds.length; j++) { + cmp = this.subFolds[j].range.compare(row, column); + if (cmp != 1) + break; + } + var afterEnd = this.subFolds[j]; + + if (cmp == 0) + throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); + + var consumedFolds = this.subFolds.splice(i, j - i, fold); + fold.setFoldLine(this.foldLine); + + return fold; + }; + + this.restoreRange = function(range) { + return restoreRange(range, this.start); + }; + +}).call(Fold.prototype); + +function consumePoint(point, anchor) { + point.row -= anchor.row; + if (point.row == 0) + point.column -= anchor.column; +} +function consumeRange(range, anchor) { + consumePoint(range.start, anchor); + consumePoint(range.end, anchor); +} +function restorePoint(point, anchor) { + if (point.row == 0) + point.column += anchor.column; + point.row += anchor.row; +} +function restoreRange(range, anchor) { + restorePoint(range.start, anchor); + restorePoint(range.end, anchor); +} + +}); + +ace.define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var FoldLine = require("./fold_line").FoldLine; +var Fold = require("./fold").Fold; +var TokenIterator = require("../token_iterator").TokenIterator; + +function Folding() { + this.getFoldAt = function(row, column, side) { + var foldLine = this.getFoldLine(row); + if (!foldLine) + return null; + + var folds = foldLine.folds; + for (var i = 0; i < folds.length; i++) { + var fold = folds[i]; + if (fold.range.contains(row, column)) { + if (side == 1 && fold.range.isEnd(row, column)) { + continue; + } else if (side == -1 && fold.range.isStart(row, column)) { + continue; + } + return fold; + } + } + }; + this.getFoldsInRange = function(range) { + var start = range.start; + var end = range.end; + var foldLines = this.$foldData; + var foundFolds = []; + + start.column += 1; + end.column -= 1; + + for (var i = 0; i < foldLines.length; i++) { + var cmp = foldLines[i].range.compareRange(range); + if (cmp == 2) { + continue; + } + else if (cmp == -2) { + break; + } + + var folds = foldLines[i].folds; + for (var j = 0; j < folds.length; j++) { + var fold = folds[j]; + cmp = fold.range.compareRange(range); + if (cmp == -2) { + break; + } else if (cmp == 2) { + continue; + } else + if (cmp == 42) { + break; + } + foundFolds.push(fold); + } + } + start.column -= 1; + end.column += 1; + + return foundFolds; + }; + + this.getFoldsInRangeList = function(ranges) { + if (Array.isArray(ranges)) { + var folds = []; + ranges.forEach(function(range) { + folds = folds.concat(this.getFoldsInRange(range)); + }, this); + } else { + var folds = this.getFoldsInRange(ranges); + } + return folds; + }; + this.getAllFolds = function() { + var folds = []; + var foldLines = this.$foldData; + + for (var i = 0; i < foldLines.length; i++) + for (var j = 0; j < foldLines[i].folds.length; j++) + folds.push(foldLines[i].folds[j]); + + return folds; + }; + this.getFoldStringAt = function(row, column, trim, foldLine) { + foldLine = foldLine || this.getFoldLine(row); + if (!foldLine) + return null; + + var lastFold = { + end: { column: 0 } + }; + var str, fold; + for (var i = 0; i < foldLine.folds.length; i++) { + fold = foldLine.folds[i]; + var cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + str = this + .getLine(fold.start.row) + .substring(lastFold.end.column, fold.start.column); + break; + } + else if (cmp === 0) { + return null; + } + lastFold = fold; + } + if (!str) + str = this.getLine(fold.start.row).substring(lastFold.end.column); + + if (trim == -1) + return str.substring(0, column - lastFold.end.column); + else if (trim == 1) + return str.substring(column - lastFold.end.column); + else + return str; + }; + + this.getFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { + return foldLine; + } else if (foldLine.end.row > docRow) { + return null; + } + } + return null; + }; + this.getNextFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.end.row >= docRow) { + return foldLine; + } + } + return null; + }; + + this.getFoldedRowCount = function(first, last) { + var foldData = this.$foldData, rowCount = last-first+1; + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i], + end = foldLine.end.row, + start = foldLine.start.row; + if (end >= last) { + if (start < last) { + if (start >= first) + rowCount -= last-start; + else + rowCount = 0; // in one fold + } + break; + } else if (end >= first){ + if (start >= first) // fold inside range + rowCount -= end-start; + else + rowCount -= end-first+1; + } + } + return rowCount; + }; + + this.$addFoldLine = function(foldLine) { + this.$foldData.push(foldLine); + this.$foldData.sort(function(a, b) { + return a.start.row - b.start.row; + }); + return foldLine; + }; + this.addFold = function(placeholder, range) { + var foldData = this.$foldData; + var added = false; + var fold; + + if (placeholder instanceof Fold) + fold = placeholder; + else { + fold = new Fold(range, placeholder); + fold.collapseChildren = range.collapseChildren; + } + this.$clipRangeToDocument(fold.range); + + var startRow = fold.start.row; + var startColumn = fold.start.column; + var endRow = fold.end.row; + var endColumn = fold.end.column; + if (!(startRow < endRow || + startRow == endRow && startColumn <= endColumn - 2)) + throw new Error("The range has to be at least 2 characters width"); + + var startFold = this.getFoldAt(startRow, startColumn, 1); + var endFold = this.getFoldAt(endRow, endColumn, -1); + if (startFold && endFold == startFold) + return startFold.addSubFold(fold); + + if (startFold && !startFold.range.isStart(startRow, startColumn)) + this.removeFold(startFold); + + if (endFold && !endFold.range.isEnd(endRow, endColumn)) + this.removeFold(endFold); + var folds = this.getFoldsInRange(fold.range); + if (folds.length > 0) { + this.removeFolds(folds); + folds.forEach(function(subFold) { + fold.addSubFold(subFold); + }); + } + + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (endRow == foldLine.start.row) { + foldLine.addFold(fold); + added = true; + break; + } else if (startRow == foldLine.end.row) { + foldLine.addFold(fold); + added = true; + if (!fold.sameRow) { + var foldLineNext = foldData[i + 1]; + if (foldLineNext && foldLineNext.start.row == endRow) { + foldLine.merge(foldLineNext); + break; + } + } + break; + } else if (endRow <= foldLine.start.row) { + break; + } + } + + if (!added) + foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); + + if (this.$useWrapMode) + this.$updateWrapData(foldLine.start.row, foldLine.start.row); + else + this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); + this.$modified = true; + this._signal("changeFold", { data: fold, action: "add" }); + + return fold; + }; + + this.addFolds = function(folds) { + folds.forEach(function(fold) { + this.addFold(fold); + }, this); + }; + + this.removeFold = function(fold) { + var foldLine = fold.foldLine; + var startRow = foldLine.start.row; + var endRow = foldLine.end.row; + + var foldLines = this.$foldData; + var folds = foldLine.folds; + if (folds.length == 1) { + foldLines.splice(foldLines.indexOf(foldLine), 1); + } else + if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { + folds.pop(); + foldLine.end.row = folds[folds.length - 1].end.row; + foldLine.end.column = folds[folds.length - 1].end.column; + } else + if (foldLine.range.isStart(fold.start.row, fold.start.column)) { + folds.shift(); + foldLine.start.row = folds[0].start.row; + foldLine.start.column = folds[0].start.column; + } else + if (fold.sameRow) { + folds.splice(folds.indexOf(fold), 1); + } else + { + var newFoldLine = foldLine.split(fold.start.row, fold.start.column); + folds = newFoldLine.folds; + folds.shift(); + newFoldLine.start.row = folds[0].start.row; + newFoldLine.start.column = folds[0].start.column; + } + + if (!this.$updating) { + if (this.$useWrapMode) + this.$updateWrapData(startRow, endRow); + else + this.$updateRowLengthCache(startRow, endRow); + } + this.$modified = true; + this._signal("changeFold", { data: fold, action: "remove" }); + }; + + this.removeFolds = function(folds) { + var cloneFolds = []; + for (var i = 0; i < folds.length; i++) { + cloneFolds.push(folds[i]); + } + + cloneFolds.forEach(function(fold) { + this.removeFold(fold); + }, this); + this.$modified = true; + }; + + this.expandFold = function(fold) { + this.removeFold(fold); + fold.subFolds.forEach(function(subFold) { + fold.restoreRange(subFold); + this.addFold(subFold); + }, this); + if (fold.collapseChildren > 0) { + this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); + } + fold.subFolds = []; + }; + + this.expandFolds = function(folds) { + folds.forEach(function(fold) { + this.expandFold(fold); + }, this); + }; + + this.unfold = function(location, expandInner) { + var range, folds; + if (location == null) { + range = new Range(0, 0, this.getLength(), 0); + expandInner = true; + } else if (typeof location == "number") + range = new Range(location, 0, location, this.getLine(location).length); + else if ("row" in location) + range = Range.fromPoints(location, location); + else + range = location; + + folds = this.getFoldsInRangeList(range); + if (expandInner) { + this.removeFolds(folds); + } else { + var subFolds = folds; + while (subFolds.length) { + this.expandFolds(subFolds); + subFolds = this.getFoldsInRangeList(range); + } + } + if (folds.length) + return folds; + }; + this.isRowFolded = function(docRow, startFoldRow) { + return !!this.getFoldLine(docRow, startFoldRow); + }; + + this.getRowFoldEnd = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.end.row : docRow; + }; + + this.getRowFoldStart = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.start.row : docRow; + }; + + this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) + startRow = foldLine.start.row; + if (startColumn == null) + startColumn = 0; + if (endRow == null) + endRow = foldLine.end.row; + if (endColumn == null) + endColumn = this.getLine(endRow).length; + var doc = this.doc; + var textLine = ""; + + foldLine.walk(function(placeholder, row, column, lastColumn) { + if (row < startRow) + return; + if (row == startRow) { + if (column < startColumn) + return; + lastColumn = Math.max(startColumn, lastColumn); + } + + if (placeholder != null) { + textLine += placeholder; + } else { + textLine += doc.getLine(row).substring(lastColumn, column); + } + }, endRow, endColumn); + return textLine; + }; + + this.getDisplayLine = function(row, endColumn, startRow, startColumn) { + var foldLine = this.getFoldLine(row); + + if (!foldLine) { + var line; + line = this.doc.getLine(row); + return line.substring(startColumn || 0, endColumn || line.length); + } else { + return this.getFoldDisplayLine( + foldLine, row, endColumn, startRow, startColumn); + } + }; + + this.$cloneFoldData = function() { + var fd = []; + fd = this.$foldData.map(function(foldLine) { + var folds = foldLine.folds.map(function(fold) { + return fold.clone(); + }); + return new FoldLine(fd, folds); + }); + + return fd; + }; + + this.toggleFold = function(tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + var fold; + var bracketPos; + + if (range.isEmpty()) { + var cursor = range.start; + fold = this.getFoldAt(cursor.row, cursor.column); + + if (fold) { + this.expandFold(fold); + return; + } else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } else { + range.start = bracketPos; + range.start.column++; + range.end.column--; + } + } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + + range.start.column++; + } else { + range = this.getCommentFoldRange(cursor.row, cursor.column) || range; + } + } else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } else if (folds.length == 1 ) { + fold = folds[0]; + } + } + + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + + if (fold && fold.range.toString() == range.toString()) { + this.expandFold(fold); + return; + } + + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if (placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".."; + } + + this.addFold(placeholder, range); + }; + + this.getCommentFoldRange = function(row, column, dir) { + var iterator = new TokenIterator(this, row, column); + var token = iterator.getCurrentToken(); + var type = token.type; + if (token && /^comment|string/.test(type)) { + type = type.match(/comment|string/)[0]; + if (type == "comment") + type += "|doc-start"; + var re = new RegExp(type); + var range = new Range(); + if (dir != 1) { + do { + token = iterator.stepBackward(); + } while (token && re.test(token.type)); + iterator.stepForward(); + } + + range.start.row = iterator.getCurrentTokenRow(); + range.start.column = iterator.getCurrentTokenColumn() + 2; + + iterator = new TokenIterator(this, row, column); + + if (dir != -1) { + var lastRow = -1; + do { + token = iterator.stepForward(); + if (lastRow == -1) { + var state = this.getState(iterator.$row); + if (!re.test(state)) + lastRow = iterator.$row; + } else if (iterator.$row > lastRow) { + break; + } + } while (token && re.test(token.type)); + token = iterator.stepBackward(); + } else + token = iterator.getCurrentToken(); + + range.end.row = iterator.getCurrentTokenRow(); + range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; + return range; + } + }; + + this.foldAll = function(startRow, endRow, depth) { + if (depth == undefined) + depth = 100000; // JSON.stringify doesn't hanle Infinity + var foldWidgets = this.foldWidgets; + if (!foldWidgets) + return; // mode doesn't support folding + endRow = endRow || this.getLength(); + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { + if (foldWidgets[row] == null) + foldWidgets[row] = this.getFoldWidget(row); + if (foldWidgets[row] != "start") + continue; + + var range = this.getFoldWidgetRange(row); + if (range && range.isMultiLine() + && range.end.row <= endRow + && range.start.row >= startRow + ) { + row = range.end.row; + try { + var fold = this.addFold("...", range); + if (fold) + fold.collapseChildren = depth; + } catch(e) {} + } + } + }; + this.$foldStyles = { + "manual": 1, + "markbegin": 1, + "markbeginend": 1 + }; + this.$foldStyle = "markbegin"; + this.setFoldStyle = function(style) { + if (!this.$foldStyles[style]) + throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); + + if (this.$foldStyle == style) + return; + + this.$foldStyle = style; + + if (style == "manual") + this.unfold(); + var mode = this.$foldMode; + this.$setFolding(null); + this.$setFolding(mode); + }; + + this.$setFolding = function(foldMode) { + if (this.$foldMode == foldMode) + return; + + this.$foldMode = foldMode; + + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + this._signal("changeAnnotation"); + + if (!foldMode || this.$foldStyle == "manual") { + this.foldWidgets = null; + return; + } + + this.foldWidgets = []; + this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); + this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); + + this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); + this.on('change', this.$updateFoldWidgets); + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + }; + + this.getParentFoldRangeData = function (row, ignoreCurrent) { + var fw = this.foldWidgets; + if (!fw || (ignoreCurrent && fw[row])) + return {}; + + var i = row - 1, firstRange; + while (i >= 0) { + var c = fw[i]; + if (c == null) + c = fw[i] = this.getFoldWidget(i); + + if (c == "start") { + var range = this.getFoldWidgetRange(i); + if (!firstRange) + firstRange = range; + if (range && range.end.row >= row) + break; + } + i--; + } + + return { + range: i !== -1 && range, + firstRange: firstRange + }; + }; + + this.onFoldWidgetClick = function(row, e) { + e = e.domEvent; + var options = { + children: e.shiftKey, + all: e.ctrlKey || e.metaKey, + siblings: e.altKey + }; + + var range = this.$toggleFoldWidget(row, options); + if (!range) { + var el = (e.target || e.srcElement); + if (el && /ace_fold-widget/.test(el.className)) + el.className += " ace_invalid"; + } + }; + + this.$toggleFoldWidget = function(row, options) { + if (!this.getFoldWidget) + return; + var type = this.getFoldWidget(row); + var line = this.getLine(row); + + var dir = type === "end" ? -1 : 1; + var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); + + if (fold) { + if (options.children || options.all) + this.removeFold(fold); + else + this.expandFold(fold); + return fold; + } + + var range = this.getFoldWidgetRange(row, true); + if (range && !range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEqual(fold.range)) { + this.removeFold(fold); + return fold; + } + } + + if (options.siblings) { + var data = this.getParentFoldRangeData(row); + if (data.range) { + var startRow = data.range.start.row + 1; + var endRow = data.range.end.row; + } + this.foldAll(startRow, endRow, options.all ? 10000 : 0); + } else if (options.children) { + endRow = range ? range.end.row : this.getLength(); + this.foldAll(row + 1, endRow, options.all ? 10000 : 0); + } else if (range) { + if (options.all) + range.collapseChildren = 10000; + this.addFold("...", range); + } + + return range; + }; + + + + this.toggleFoldWidget = function(toggleParent) { + var row = this.selection.getCursor().row; + row = this.getRowFoldStart(row); + var range = this.$toggleFoldWidget(row, {}); + + if (range) + return; + var data = this.getParentFoldRangeData(row, true); + range = data.range || data.firstRange; + + if (range) { + row = range.start.row; + var fold = this.getFoldAt(row, this.getLine(row).length, 1); + + if (fold) { + this.removeFold(fold); + } else { + this.addFold("...", range); + } + } + }; + + this.updateFoldWidgets = function(delta) { + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + + if (len === 0) { + this.foldWidgets[firstRow] = null; + } else if (delta.action == 'remove') { + this.foldWidgets.splice(firstRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.foldWidgets.splice.apply(this.foldWidgets, args); + } + }; + this.tokenizerUpdateFoldWidgets = function(e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); + } + }; +} + +exports.Folding = Folding; + +}); + +ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + + +function BracketMatch() { + + this.findMatchingBracket = function(position, chr) { + if (position.column == 0) return null; + + var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); + if (charBeforeCursor == "") return null; + + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) + return null; + + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); + }; + + this.getBracketRange = function(pos) { + var line = this.getLine(pos.row); + var before = true, range; + + var chr = line.charAt(pos.column-1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = {row: pos.row, column: pos.column + 1}; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; + } + if (!match) + return null; + + if (match[1]) { + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) { + range.end.column++; + range.start.column--; + } + range.cursor = range.end; + } else { + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } + range.cursor = range.start; + } + + return range; + }; + + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{" + }; + + this.$findOpeningBracket = function(bracket, position, typeRe) { + var openBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("rparen", ".paren") + .replace(/\b(?:end)\b/, "(?:start|begin|end)") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; + var value = token.value; + + while (true) { + + while (valueIndex >= 0) { + var chr = value.charAt(valueIndex); + if (chr == openBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex -= 1; + } + do { + token = iterator.stepBackward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + value = token.value; + valueIndex = value.length - 1; + } + + return null; + }; + + this.$findClosingBracket = function(bracket, position, typeRe) { + var closingBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("lparen", ".paren") + .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn(); + + while (true) { + + var value = token.value; + var valueLength = value.length; + while (valueIndex < valueLength) { + var chr = value.charAt(valueIndex); + if (chr == closingBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex += 1; + } + do { + token = iterator.stepForward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + valueIndex = 0; + } + + return null; + }; +} +exports.BracketMatch = BracketMatch; + +}); + +ace.define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var config = require("./config"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Selection = require("./selection").Selection; +var TextMode = require("./mode/text").Mode; +var Range = require("./range").Range; +var Document = require("./document").Document; +var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer; +var SearchHighlight = require("./search_highlight").SearchHighlight; + +var EditSession = function(text, mode) { + this.$breakpoints = []; + this.$decorations = []; + this.$frontMarkers = {}; + this.$backMarkers = {}; + this.$markerId = 1; + this.$undoSelect = true; + + this.$foldData = []; + this.id = "session" + (++EditSession.$uid); + this.$foldData.toString = function() { + return this.join("\n"); + }; + this.on("changeFold", this.onChangeFold.bind(this)); + this.$onChange = this.onChange.bind(this); + + if (typeof text != "object" || !text.getLine) + text = new Document(text); + + this.setDocument(text); + this.selection = new Selection(this); + + config.resetOptions(this); + this.setMode(mode); + config._signal("session", this); +}; + + +EditSession.$uid = 0; + +(function() { + + oop.implement(this, EventEmitter); + this.setDocument = function(doc) { + if (this.doc) + this.doc.removeListener("change", this.$onChange); + + this.doc = doc; + doc.on("change", this.$onChange); + + if (this.bgTokenizer) + this.bgTokenizer.setDocument(this.getDocument()); + + this.resetCaches(); + }; + this.getDocument = function() { + return this.doc; + }; + this.$resetRowCache = function(docRow) { + if (!docRow) { + this.$docRowCache = []; + this.$screenRowCache = []; + return; + } + var l = this.$docRowCache.length; + var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1; + if (l > i) { + this.$docRowCache.splice(i, l); + this.$screenRowCache.splice(i, l); + } + }; + + this.$getRowCacheIndex = function(cacheArray, val) { + var low = 0; + var hi = cacheArray.length - 1; + + while (low <= hi) { + var mid = (low + hi) >> 1; + var c = cacheArray[mid]; + + if (val > c) + low = mid + 1; + else if (val < c) + hi = mid - 1; + else + return mid; + } + + return low -1; + }; + + this.resetCaches = function() { + this.$modified = true; + this.$wrapData = []; + this.$rowLengthCache = []; + this.$resetRowCache(0); + if (this.bgTokenizer) + this.bgTokenizer.start(0); + }; + + this.onChangeFold = function(e) { + var fold = e.data; + this.$resetRowCache(fold.start.row); + }; + + this.onChange = function(delta) { + this.$modified = true; + + this.$resetRowCache(delta.start.row); + + var removedFolds = this.$updateInternalDataOnChange(delta); + if (!this.$fromUndo && this.$undoManager && !delta.ignore) { + this.$deltasDoc.push(delta); + if (removedFolds && removedFolds.length != 0) { + this.$deltasFold.push({ + action: "removeFolds", + folds: removedFolds + }); + } + + this.$informUndoManager.schedule(); + } + + this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta); + this._signal("change", delta); + }; + this.setValue = function(text) { + this.doc.setValue(text); + this.selection.moveTo(0, 0); + + this.$resetRowCache(0); + this.$deltas = []; + this.$deltasDoc = []; + this.$deltasFold = []; + this.setUndoManager(this.$undoManager); + this.getUndoManager().reset(); + }; + this.getValue = + this.toString = function() { + return this.doc.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.getState = function(row) { + return this.bgTokenizer.getState(row); + }; + this.getTokens = function(row) { + return this.bgTokenizer.getTokens(row); + }; + this.getTokenAt = function(row, column) { + var tokens = this.bgTokenizer.getTokens(row); + var token, c = 0; + if (column == null) { + i = tokens.length - 1; + c = this.getLine(row).length; + } else { + for (var i = 0; i < tokens.length; i++) { + c += tokens[i].value.length; + if (c >= column) + break; + } + } + token = tokens[i]; + if (!token) + return null; + token.index = i; + token.start = c - token.value.length; + return token; + }; + this.setUndoManager = function(undoManager) { + this.$undoManager = undoManager; + this.$deltas = []; + this.$deltasDoc = []; + this.$deltasFold = []; + + if (this.$informUndoManager) + this.$informUndoManager.cancel(); + + if (undoManager) { + var self = this; + + this.$syncInformUndoManager = function() { + self.$informUndoManager.cancel(); + + if (self.$deltasFold.length) { + self.$deltas.push({ + group: "fold", + deltas: self.$deltasFold + }); + self.$deltasFold = []; + } + + if (self.$deltasDoc.length) { + self.$deltas.push({ + group: "doc", + deltas: self.$deltasDoc + }); + self.$deltasDoc = []; + } + + if (self.$deltas.length > 0) { + undoManager.execute({ + action: "aceupdate", + args: [self.$deltas, self], + merge: self.mergeUndoDeltas + }); + } + self.mergeUndoDeltas = false; + self.$deltas = []; + }; + this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); + } + }; + this.markUndoGroup = function() { + if (this.$syncInformUndoManager) + this.$syncInformUndoManager(); + }; + + this.$defaultUndoManager = { + undo: function() {}, + redo: function() {}, + reset: function() {} + }; + this.getUndoManager = function() { + return this.$undoManager || this.$defaultUndoManager; + }; + this.getTabString = function() { + if (this.getUseSoftTabs()) { + return lang.stringRepeat(" ", this.getTabSize()); + } else { + return "\t"; + } + }; + this.setUseSoftTabs = function(val) { + this.setOption("useSoftTabs", val); + }; + this.getUseSoftTabs = function() { + return this.$useSoftTabs && !this.$mode.$indentWithTabs; + }; + this.setTabSize = function(tabSize) { + this.setOption("tabSize", tabSize); + }; + this.getTabSize = function() { + return this.$tabSize; + }; + this.isTabStop = function(position) { + return this.$useSoftTabs && (position.column % this.$tabSize === 0); + }; + this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) { + this.setOption("navigateWithinSoftTabs", navigateWithinSoftTabs) + } + this.getNavigateWithinSoftTabs = function() { + return this.$navigateWithinSoftTabs; + } + + this.$overwrite = false; + this.setOverwrite = function(overwrite) { + this.setOption("overwrite", overwrite); + }; + this.getOverwrite = function() { + return this.$overwrite; + }; + this.toggleOverwrite = function() { + this.setOverwrite(!this.$overwrite); + }; + this.addGutterDecoration = function(row, className) { + if (!this.$decorations[row]) + this.$decorations[row] = ""; + this.$decorations[row] += " " + className; + this._signal("changeBreakpoint", {}); + }; + this.removeGutterDecoration = function(row, className) { + this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); + this._signal("changeBreakpoint", {}); + }; + this.getBreakpoints = function() { + return this.$breakpoints; + }; + this.setBreakpoints = function(rows) { + this.$breakpoints = []; + for (var i=0; i 0) + inToken = !!line.charAt(column - 1).match(this.tokenRe); + + if (!inToken) + inToken = !!line.charAt(column).match(this.tokenRe); + + if (inToken) + var re = this.tokenRe; + else if (/^\s+$/.test(line.slice(column-1, column+1))) + var re = /\s/; + else + var re = this.nonTokenRe; + + var start = column; + if (start > 0) { + do { + start--; + } + while (start >= 0 && line.charAt(start).match(re)); + start++; + } + + var end = column; + while (end < line.length && line.charAt(end).match(re)) { + end++; + } + + return new Range(row, start, row, end); + }; + this.getAWordRange = function(row, column) { + var wordRange = this.getWordRange(row, column); + var line = this.getLine(wordRange.end.row); + + while (line.charAt(wordRange.end.column).match(/[ \t]/)) { + wordRange.end.column += 1; + } + return wordRange; + }; + this.setNewLineMode = function(newLineMode) { + this.doc.setNewLineMode(newLineMode); + }; + this.getNewLineMode = function() { + return this.doc.getNewLineMode(); + }; + this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); }; + this.getUseWorker = function() { return this.$useWorker; }; + this.onReloadTokenizer = function(e) { + var rows = e.data; + this.bgTokenizer.start(rows.first); + this._signal("tokenizerUpdate", e); + }; + + this.$modes = {}; + this.$mode = null; + this.$modeId = null; + this.setMode = function(mode, cb) { + if (mode && typeof mode === "object") { + if (mode.getTokenizer) + return this.$onChangeMode(mode); + var options = mode; + var path = options.path; + } else { + path = mode || "ace/mode/text"; + } + if (!this.$modes["ace/mode/text"]) + this.$modes["ace/mode/text"] = new TextMode(); + + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + cb && cb(); + return; + } + this.$modeId = path; + config.loadModule(["mode", path], function(m) { + if (this.$modeId !== path) + return cb && cb(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + } else if (m && m.Mode) { + m = new m.Mode(options); + if (!options) { + this.$modes[path] = m; + m.$id = path; + } + this.$onChangeMode(m); + } + cb && cb(); + }.bind(this)); + if (!this.$mode) + this.$onChangeMode(this.$modes["ace/mode/text"], true); + }; + + this.$onChangeMode = function(mode, $isPlaceholder) { + if (!$isPlaceholder) + this.$modeId = mode.$id; + if (this.$mode === mode) + return; + + this.$mode = mode; + + this.$stopWorker(); + + if (this.$useWorker) + this.$startWorker(); + + var tokenizer = mode.getTokenizer(); + + if(tokenizer.addEventListener !== undefined) { + var onReloadTokenizer = this.onReloadTokenizer.bind(this); + tokenizer.addEventListener("update", onReloadTokenizer); + } + + if (!this.bgTokenizer) { + this.bgTokenizer = new BackgroundTokenizer(tokenizer); + var _self = this; + this.bgTokenizer.addEventListener("update", function(e) { + _self._signal("tokenizerUpdate", e); + }); + } else { + this.bgTokenizer.setTokenizer(tokenizer); + } + + this.bgTokenizer.setDocument(this.getDocument()); + + this.tokenRe = mode.tokenRe; + this.nonTokenRe = mode.nonTokenRe; + + + if (!$isPlaceholder) { + if (mode.attachToSession) + mode.attachToSession(this); + this.$options.wrapMethod.set.call(this, this.$wrapMethod); + this.$setFolding(mode.foldingRules); + this.bgTokenizer.start(0); + this._emit("changeMode"); + } + }; + + this.$stopWorker = function() { + if (this.$worker) { + this.$worker.terminate(); + this.$worker = null; + } + }; + + this.$startWorker = function() { + try { + this.$worker = this.$mode.createWorker(this); + } catch (e) { + config.warn("Could not load worker", e); + this.$worker = null; + } + }; + this.getMode = function() { + return this.$mode; + }; + + this.$scrollTop = 0; + this.setScrollTop = function(scrollTop) { + if (this.$scrollTop === scrollTop || isNaN(scrollTop)) + return; + + this.$scrollTop = scrollTop; + this._signal("changeScrollTop", scrollTop); + }; + this.getScrollTop = function() { + return this.$scrollTop; + }; + + this.$scrollLeft = 0; + this.setScrollLeft = function(scrollLeft) { + if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) + return; + + this.$scrollLeft = scrollLeft; + this._signal("changeScrollLeft", scrollLeft); + }; + this.getScrollLeft = function() { + return this.$scrollLeft; + }; + this.getScreenWidth = function() { + this.$computeWidth(); + if (this.lineWidgets) + return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth); + return this.screenWidth; + }; + + this.getLineWidgetMaxWidth = function() { + if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth; + var width = 0; + this.lineWidgets.forEach(function(w) { + if (w && w.screenWidth > width) + width = w.screenWidth; + }); + return this.lineWidgetWidth = width; + }; + + this.$computeWidth = function(force) { + if (this.$modified || force) { + this.$modified = false; + + if (this.$useWrapMode) + return this.screenWidth = this.$wrapLimit; + + var lines = this.doc.getAllLines(); + var cache = this.$rowLengthCache; + var longestScreenLine = 0; + var foldIndex = 0; + var foldLine = this.$foldData[foldIndex]; + var foldStart = foldLine ? foldLine.start.row : Infinity; + var len = lines.length; + + for (var i = 0; i < len; i++) { + if (i > foldStart) { + i = foldLine.end.row + 1; + if (i >= len) + break; + foldLine = this.$foldData[foldIndex++]; + foldStart = foldLine ? foldLine.start.row : Infinity; + } + + if (cache[i] == null) + cache[i] = this.$getStringScreenWidth(lines[i])[0]; + + if (cache[i] > longestScreenLine) + longestScreenLine = cache[i]; + } + this.screenWidth = longestScreenLine; + } + }; + this.getLine = function(row) { + return this.doc.getLine(row); + }; + this.getLines = function(firstRow, lastRow) { + return this.doc.getLines(firstRow, lastRow); + }; + this.getLength = function() { + return this.doc.getLength(); + }; + this.getTextRange = function(range) { + return this.doc.getTextRange(range || this.selection.getRange()); + }; + this.insert = function(position, text) { + return this.doc.insert(position, text); + }; + this.remove = function(range) { + return this.doc.remove(range); + }; + this.removeFullLines = function(firstRow, lastRow){ + return this.doc.removeFullLines(firstRow, lastRow); + }; + this.undoChanges = function(deltas, dontSelect) { + if (!deltas.length) + return; + + this.$fromUndo = true; + var lastUndoRange = null; + for (var i = deltas.length - 1; i != -1; i--) { + var delta = deltas[i]; + if (delta.group == "doc") { + this.doc.revertDeltas(delta.deltas); + lastUndoRange = + this.$getUndoSelection(delta.deltas, true, lastUndoRange); + } else { + delta.deltas.forEach(function(foldDelta) { + this.addFolds(foldDelta.folds); + }, this); + } + } + this.$fromUndo = false; + lastUndoRange && + this.$undoSelect && + !dontSelect && + this.selection.setSelectionRange(lastUndoRange); + return lastUndoRange; + }; + this.redoChanges = function(deltas, dontSelect) { + if (!deltas.length) + return; + + this.$fromUndo = true; + var lastUndoRange = null; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.group == "doc") { + this.doc.applyDeltas(delta.deltas); + lastUndoRange = + this.$getUndoSelection(delta.deltas, false, lastUndoRange); + } + } + this.$fromUndo = false; + lastUndoRange && + this.$undoSelect && + !dontSelect && + this.selection.setSelectionRange(lastUndoRange); + return lastUndoRange; + }; + this.setUndoSelect = function(enable) { + this.$undoSelect = enable; + }; + + this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) { + function isInsert(delta) { + return isUndo ? delta.action !== "insert" : delta.action === "insert"; + } + + var delta = deltas[0]; + var range, point; + var lastDeltaIsInsert = false; + if (isInsert(delta)) { + range = Range.fromPoints(delta.start, delta.end); + lastDeltaIsInsert = true; + } else { + range = Range.fromPoints(delta.start, delta.start); + lastDeltaIsInsert = false; + } + + for (var i = 1; i < deltas.length; i++) { + delta = deltas[i]; + if (isInsert(delta)) { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range.setStart(point); + } + point = delta.end; + if (range.compare(point.row, point.column) == 1) { + range.setEnd(point); + } + lastDeltaIsInsert = true; + } else { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range = Range.fromPoints(delta.start, delta.start); + } + lastDeltaIsInsert = false; + } + } + if (lastUndoRange != null) { + if (Range.comparePoints(lastUndoRange.start, range.start) === 0) { + lastUndoRange.start.column += range.end.column - range.start.column; + lastUndoRange.end.column += range.end.column - range.start.column; + } + + var cmp = lastUndoRange.compareRange(range); + if (cmp == 1) { + range.setStart(lastUndoRange.start); + } else if (cmp == -1) { + range.setEnd(lastUndoRange.end); + } + } + + return range; + }; + this.replace = function(range, text) { + return this.doc.replace(range, text); + }; + this.moveText = function(fromRange, toPosition, copy) { + var text = this.getTextRange(fromRange); + var folds = this.getFoldsInRange(fromRange); + + var toRange = Range.fromPoints(toPosition, toPosition); + if (!copy) { + this.remove(fromRange); + var rowDiff = fromRange.start.row - fromRange.end.row; + var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; + if (collDiff) { + if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) + toRange.start.column += collDiff; + if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) + toRange.end.column += collDiff; + } + if (rowDiff && toRange.start.row >= fromRange.end.row) { + toRange.start.row += rowDiff; + toRange.end.row += rowDiff; + } + } + + toRange.end = this.insert(toRange.start, text); + if (folds.length) { + var oldStart = fromRange.start; + var newStart = toRange.start; + var rowDiff = newStart.row - oldStart.row; + var collDiff = newStart.column - oldStart.column; + this.addFolds(folds.map(function(x) { + x = x.clone(); + if (x.start.row == oldStart.row) + x.start.column += collDiff; + if (x.end.row == oldStart.row) + x.end.column += collDiff; + x.start.row += rowDiff; + x.end.row += rowDiff; + return x; + })); + } + + return toRange; + }; + this.indentRows = function(startRow, endRow, indentString) { + indentString = indentString.replace(/\t/g, this.getTabString()); + for (var row=startRow; row<=endRow; row++) + this.doc.insertInLine({row: row, column: 0}, indentString); + }; + this.outdentRows = function (range) { + var rowRange = range.collapseRows(); + var deleteRange = new Range(0, 0, 0, 0); + var size = this.getTabSize(); + + for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { + var line = this.getLine(i); + + deleteRange.start.row = i; + deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } else { + deleteRange.start.column = 0; + deleteRange.end.column = j; + } + this.remove(deleteRange); + } + }; + + this.$moveLines = function(firstRow, lastRow, dir) { + firstRow = this.getRowFoldStart(firstRow); + lastRow = this.getRowFoldEnd(lastRow); + if (dir < 0) { + var row = this.getRowFoldStart(firstRow + dir); + if (row < 0) return 0; + var diff = row-firstRow; + } else if (dir > 0) { + var row = this.getRowFoldEnd(lastRow + dir); + if (row > this.doc.getLength()-1) return 0; + var diff = row-lastRow; + } else { + firstRow = this.$clipRowToDocument(firstRow); + lastRow = this.$clipRowToDocument(lastRow); + var diff = lastRow - firstRow + 1; + } + + var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); + var folds = this.getFoldsInRange(range).map(function(x){ + x = x.clone(); + x.start.row += diff; + x.end.row += diff; + return x; + }); + + var lines = dir == 0 + ? this.doc.getLines(firstRow, lastRow) + : this.doc.removeFullLines(firstRow, lastRow); + this.doc.insertFullLines(firstRow+diff, lines); + folds.length && this.addFolds(folds); + return diff; + }; + this.moveLinesUp = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, -1); + }; + this.moveLinesDown = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 1); + }; + this.duplicateLines = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 0); + }; + + + this.$clipRowToDocument = function(row) { + return Math.max(0, Math.min(row, this.doc.getLength()-1)); + }; + + this.$clipColumnToRow = function(row, column) { + if (column < 0) + return 0; + return Math.min(this.doc.getLine(row).length, column); + }; + + + this.$clipPositionToDocument = function(row, column) { + column = Math.max(0, column); + + if (row < 0) { + row = 0; + column = 0; + } else { + var len = this.doc.getLength(); + if (row >= len) { + row = len - 1; + column = this.doc.getLine(len-1).length; + } else { + column = Math.min(this.doc.getLine(row).length, column); + } + } + + return { + row: row, + column: column + }; + }; + + this.$clipRangeToDocument = function(range) { + if (range.start.row < 0) { + range.start.row = 0; + range.start.column = 0; + } else { + range.start.column = this.$clipColumnToRow( + range.start.row, + range.start.column + ); + } + + var len = this.doc.getLength() - 1; + if (range.end.row > len) { + range.end.row = len; + range.end.column = this.doc.getLine(len).length; + } else { + range.end.column = this.$clipColumnToRow( + range.end.row, + range.end.column + ); + } + return range; + }; + this.$wrapLimit = 80; + this.$useWrapMode = false; + this.$wrapLimitRange = { + min : null, + max : null + }; + this.setUseWrapMode = function(useWrapMode) { + if (useWrapMode != this.$useWrapMode) { + this.$useWrapMode = useWrapMode; + this.$modified = true; + this.$resetRowCache(0); + if (useWrapMode) { + var len = this.getLength(); + this.$wrapData = Array(len); + this.$updateWrapData(0, len - 1); + } + + this._signal("changeWrapMode"); + } + }; + this.getUseWrapMode = function() { + return this.$useWrapMode; + }; + this.setWrapLimitRange = function(min, max) { + if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { + this.$wrapLimitRange = { min: min, max: max }; + this.$modified = true; + if (this.$useWrapMode) + this._signal("changeWrapMode"); + } + }; + this.adjustWrapLimit = function(desiredLimit, $printMargin) { + var limits = this.$wrapLimitRange; + if (limits.max < 0) + limits = {min: $printMargin, max: $printMargin}; + var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); + if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { + this.$wrapLimit = wrapLimit; + this.$modified = true; + if (this.$useWrapMode) { + this.$updateWrapData(0, this.getLength() - 1); + this.$resetRowCache(0); + this._signal("changeWrapLimit"); + } + return true; + } + return false; + }; + + this.$constrainWrapLimit = function(wrapLimit, min, max) { + if (min) + wrapLimit = Math.max(min, wrapLimit); + + if (max) + wrapLimit = Math.min(max, wrapLimit); + + return wrapLimit; + }; + this.getWrapLimit = function() { + return this.$wrapLimit; + }; + this.setWrapLimit = function (limit) { + this.setWrapLimitRange(limit, limit); + }; + this.getWrapLimitRange = function() { + return { + min : this.$wrapLimitRange.min, + max : this.$wrapLimitRange.max + }; + }; + + this.$updateInternalDataOnChange = function(delta) { + var useWrapMode = this.$useWrapMode; + var action = delta.action; + var start = delta.start; + var end = delta.end; + var firstRow = start.row; + var lastRow = end.row; + var len = lastRow - firstRow; + var removedFolds = null; + + this.$updating = true; + if (len != 0) { + if (action === "remove") { + this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); + + var foldLines = this.$foldData; + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + + var foldLine = this.getFoldLine(end.row); + var idx = 0; + if (foldLine) { + foldLine.addRemoveChars(end.row, end.column, start.column - end.column); + foldLine.shiftRow(-len); + + var foldLineBefore = this.getFoldLine(firstRow); + if (foldLineBefore && foldLineBefore !== foldLine) { + foldLineBefore.merge(foldLine); + foldLine = foldLineBefore; + } + idx = foldLines.indexOf(foldLine) + 1; + } + + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= end.row) { + foldLine.shiftRow(-len); + } + } + + lastRow = firstRow; + } else { + var args = Array(len); + args.unshift(firstRow, 0); + var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache + arr.splice.apply(arr, args); + var foldLines = this.$foldData; + var foldLine = this.getFoldLine(firstRow); + var idx = 0; + if (foldLine) { + var cmp = foldLine.range.compareInside(start.row, start.column); + if (cmp == 0) { + foldLine = foldLine.split(start.row, start.column); + if (foldLine) { + foldLine.shiftRow(len); + foldLine.addRemoveChars(lastRow, 0, end.column - start.column); + } + } else + if (cmp == -1) { + foldLine.addRemoveChars(firstRow, 0, end.column - start.column); + foldLine.shiftRow(len); + } + idx = foldLines.indexOf(foldLine) + 1; + } + + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= firstRow) { + foldLine.shiftRow(len); + } + } + } + } else { + len = Math.abs(delta.start.column - delta.end.column); + if (action === "remove") { + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + + len = -len; + } + var foldLine = this.getFoldLine(firstRow); + if (foldLine) { + foldLine.addRemoveChars(firstRow, start.column, len); + } + } + + if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { + console.error("doc.getLength() and $wrapData.length have to be the same!"); + } + this.$updating = false; + + if (useWrapMode) + this.$updateWrapData(firstRow, lastRow); + else + this.$updateRowLengthCache(firstRow, lastRow); + + return removedFolds; + }; + + this.$updateRowLengthCache = function(firstRow, lastRow, b) { + this.$rowLengthCache[firstRow] = null; + this.$rowLengthCache[lastRow] = null; + }; + + this.$updateWrapData = function(firstRow, lastRow) { + var lines = this.doc.getAllLines(); + var tabSize = this.getTabSize(); + var wrapData = this.$wrapData; + var wrapLimit = this.$wrapLimit; + var tokens; + var foldLine; + + var row = firstRow; + lastRow = Math.min(lastRow, lines.length - 1); + while (row <= lastRow) { + foldLine = this.getFoldLine(row, foldLine); + if (!foldLine) { + tokens = this.$getDisplayTokens(lines[row]); + wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row ++; + } else { + tokens = []; + foldLine.walk(function(placeholder, row, column, lastColumn) { + var walkTokens; + if (placeholder != null) { + walkTokens = this.$getDisplayTokens( + placeholder, tokens.length); + walkTokens[0] = PLACEHOLDER_START; + for (var i = 1; i < walkTokens.length; i++) { + walkTokens[i] = PLACEHOLDER_BODY; + } + } else { + walkTokens = this.$getDisplayTokens( + lines[row].substring(lastColumn, column), + tokens.length); + } + tokens = tokens.concat(walkTokens); + }.bind(this), + foldLine.end.row, + lines[foldLine.end.row].length + 1 + ); + + wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row = foldLine.end.row + 1; + } + } + }; + var CHAR = 1, + CHAR_EXT = 2, + PLACEHOLDER_START = 3, + PLACEHOLDER_BODY = 4, + PUNCTUATION = 9, + SPACE = 10, + TAB = 11, + TAB_SPACE = 12; + + + this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) { + if (tokens.length == 0) { + return []; + } + + var splits = []; + var displayLength = tokens.length; + var lastSplit = 0, lastDocSplit = 0; + + var isCode = this.$wrapAsCode; + + var indentedSoftWrap = this.$indentedSoftWrap; + var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) + || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); + + function getWrapIndent() { + var indentation = 0; + if (maxIndent === 0) + return indentation; + if (indentedSoftWrap) { + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token == SPACE) + indentation += 1; + else if (token == TAB) + indentation += tabSize; + else if (token == TAB_SPACE) + continue; + else + break; + } + } + if (isCode && indentedSoftWrap !== false) + indentation += tabSize; + return Math.min(indentation, maxIndent); + } + function addSplit(screenPos) { + var displayed = tokens.slice(lastSplit, screenPos); + var len = displayed.length; + displayed.join("") + .replace(/12/g, function() { + len -= 1; + }) + .replace(/2/g, function() { + len -= 1; + }); + + if (!splits.length) { + indent = getWrapIndent(); + splits.indent = indent; + } + lastDocSplit += len; + splits.push(lastDocSplit); + lastSplit = screenPos; + } + var indent = 0; + while (displayLength - lastSplit > wrapLimit - indent) { + var split = lastSplit + wrapLimit - indent; + if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { + addSplit(split); + continue; + } + if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { + for (split; split != lastSplit - 1; split--) { + if (tokens[split] == PLACEHOLDER_START) { + break; + } + } + if (split > lastSplit) { + addSplit(split); + continue; + } + split = lastSplit + wrapLimit; + for (split; split < tokens.length; split++) { + if (tokens[split] != PLACEHOLDER_BODY) { + break; + } + } + if (split == tokens.length) { + break; // Breaks the while-loop. + } + addSplit(split); + continue; + } + var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1); + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split --; + } + if (isCode) { + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split --; + } + while (split > minSplit && tokens[split] == PUNCTUATION) { + split --; + } + } else { + while (split > minSplit && tokens[split] < SPACE) { + split --; + } + } + if (split > minSplit) { + addSplit(++split); + continue; + } + split = lastSplit + wrapLimit; + if (tokens[split] == CHAR_EXT) + split--; + addSplit(split - indent); + } + return splits; + }; + this.$getDisplayTokens = function(str, offset) { + var arr = []; + var tabSize; + offset = offset || 0; + + for (var i = 0; i < str.length; i++) { + var c = str.charCodeAt(i); + if (c == 9) { + tabSize = this.getScreenTabSize(arr.length + offset); + arr.push(TAB); + for (var n = 1; n < tabSize; n++) { + arr.push(TAB_SPACE); + } + } + else if (c == 32) { + arr.push(SPACE); + } else if((c > 39 && c < 48) || (c > 57 && c < 64)) { + arr.push(PUNCTUATION); + } + else if (c >= 0x1100 && isFullWidth(c)) { + arr.push(CHAR, CHAR_EXT); + } else { + arr.push(CHAR); + } + } + return arr; + }; + this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { + if (maxScreenColumn == 0) + return [0, 0]; + if (maxScreenColumn == null) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charCodeAt(column); + if (c == 9) { + screenColumn += this.getScreenTabSize(screenColumn); + } + else if (c >= 0x1100 && isFullWidth(c)) { + screenColumn += 2; + } else { + screenColumn += 1; + } + if (screenColumn > maxScreenColumn) { + break; + } + } + + return [screenColumn, column]; + }; + + this.lineWidgets = null; + this.getRowLength = function(row) { + if (this.lineWidgets) + var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0 + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1 + h; + } else { + return this.$wrapData[row].length + 1 + h; + } + }; + this.getRowLineCount = function(row) { + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1; + } else { + return this.$wrapData[row].length + 1; + } + }; + + this.getRowWrapIndent = function(screenRow) { + if (this.$useWrapMode) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + var splits = this.$wrapData[pos.row]; + return splits.length && splits[0] < pos.column ? splits.indent : 0; + } else { + return 0; + } + } + this.getScreenLastRowColumn = function(screenRow) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + return this.documentToScreenColumn(pos.row, pos.column); + }; + this.getDocumentLastRowColumn = function(docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.getScreenLastRowColumn(screenRow); + }; + this.getDocumentLastRowColumnPosition = function(docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); + }; + this.getRowSplitData = function(row) { + if (!this.$useWrapMode) { + return undefined; + } else { + return this.$wrapData[row]; + } + }; + this.getScreenTabSize = function(screenColumn) { + return this.$tabSize - screenColumn % this.$tabSize; + }; + + + this.screenToDocumentRow = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).row; + }; + + + this.screenToDocumentColumn = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).column; + }; + this.screenToDocumentPosition = function(screenRow, screenColumn) { + if (screenRow < 0) + return {row: 0, column: 0}; + + var line; + var docRow = 0; + var docColumn = 0; + var column; + var row = 0; + var rowLength = 0; + + var rowCache = this.$screenRowCache; + var i = this.$getRowCacheIndex(rowCache, screenRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var docRow = this.$docRowCache[i]; + var doCache = screenRow > rowCache[l - 1]; + } else { + var doCache = !l; + } + + var maxRow = this.getLength() - 1; + var foldLine = this.getNextFoldLine(docRow); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (row <= screenRow) { + rowLength = this.getRowLength(docRow); + if (row + rowLength > screenRow || docRow >= maxRow) { + break; + } else { + row += rowLength; + docRow++; + if (docRow > foldStart) { + docRow = foldLine.end.row+1; + foldLine = this.getNextFoldLine(docRow, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + } + + if (doCache) { + this.$docRowCache.push(docRow); + this.$screenRowCache.push(row); + } + } + + if (foldLine && foldLine.start.row <= docRow) { + line = this.getFoldDisplayLine(foldLine); + docRow = foldLine.start.row; + } else if (row + rowLength <= screenRow || docRow > maxRow) { + return { + row: maxRow, + column: this.getLine(maxRow).length + }; + } else { + line = this.getLine(docRow); + foldLine = null; + } + var wrapIndent = 0; + if (this.$useWrapMode) { + var splits = this.$wrapData[docRow]; + if (splits) { + var splitIndex = Math.floor(screenRow - row); + column = splits[splitIndex]; + if(splitIndex > 0 && splits.length) { + wrapIndent = splits.indent; + docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; + line = line.substring(docColumn); + } + } + } + + docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; + if (this.$useWrapMode && docColumn >= column) + docColumn = column - 1; + + if (foldLine) + return foldLine.idxToPosition(docColumn); + + return {row: docRow, column: docColumn}; + }; + this.documentToScreenPosition = function(docRow, docColumn) { + if (typeof docColumn === "undefined") + var pos = this.$clipPositionToDocument(docRow.row, docRow.column); + else + pos = this.$clipPositionToDocument(docRow, docColumn); + + docRow = pos.row; + docColumn = pos.column; + + var screenRow = 0; + var foldStartRow = null; + var fold = null; + fold = this.getFoldAt(docRow, docColumn, 1); + if (fold) { + docRow = fold.start.row; + docColumn = fold.start.column; + } + + var rowEnd, row = 0; + + + var rowCache = this.$docRowCache; + var i = this.$getRowCacheIndex(rowCache, docRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var screenRow = this.$screenRowCache[i]; + var doCache = docRow > rowCache[l - 1]; + } else { + var doCache = !l; + } + + var foldLine = this.getNextFoldLine(row); + var foldStart = foldLine ?foldLine.start.row :Infinity; + + while (row < docRow) { + if (row >= foldStart) { + rowEnd = foldLine.end.row + 1; + if (rowEnd > docRow) + break; + foldLine = this.getNextFoldLine(rowEnd, foldLine); + foldStart = foldLine ?foldLine.start.row :Infinity; + } + else { + rowEnd = row + 1; + } + + screenRow += this.getRowLength(row); + row = rowEnd; + + if (doCache) { + this.$docRowCache.push(row); + this.$screenRowCache.push(screenRow); + } + } + var textLine = ""; + if (foldLine && row >= foldStart) { + textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); + foldStartRow = foldLine.start.row; + } else { + textLine = this.getLine(docRow).substring(0, docColumn); + foldStartRow = docRow; + } + var wrapIndent = 0; + if (this.$useWrapMode) { + var wrapRow = this.$wrapData[foldStartRow]; + if (wrapRow) { + var screenRowOffset = 0; + while (textLine.length >= wrapRow[screenRowOffset]) { + screenRow ++; + screenRowOffset++; + } + textLine = textLine.substring( + wrapRow[screenRowOffset - 1] || 0, textLine.length + ); + wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; + } + } + + return { + row: screenRow, + column: wrapIndent + this.$getStringScreenWidth(textLine)[0] + }; + }; + this.documentToScreenColumn = function(row, docColumn) { + return this.documentToScreenPosition(row, docColumn).column; + }; + this.documentToScreenRow = function(docRow, docColumn) { + return this.documentToScreenPosition(docRow, docColumn).row; + }; + this.getScreenLength = function() { + var screenRows = 0; + var fold = null; + if (!this.$useWrapMode) { + screenRows = this.getLength(); + var foldData = this.$foldData; + for (var i = 0; i < foldData.length; i++) { + fold = foldData[i]; + screenRows -= fold.end.row - fold.start.row; + } + } else { + var lastRow = this.$wrapData.length; + var row = 0, i = 0; + var fold = this.$foldData[i++]; + var foldStart = fold ? fold.start.row :Infinity; + + while (row < lastRow) { + var splits = this.$wrapData[row]; + screenRows += splits ? splits.length + 1 : 1; + row ++; + if (row > foldStart) { + row = fold.end.row+1; + fold = this.$foldData[i++]; + foldStart = fold ?fold.start.row :Infinity; + } + } + } + if (this.lineWidgets) + screenRows += this.$getWidgetScreenLength(); + + return screenRows; + }; + this.$setFontMetrics = function(fm) { + if (!this.$enableVarChar) return; + this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { + if (maxScreenColumn === 0) + return [0, 0]; + if (!maxScreenColumn) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charAt(column); + if (c === "\t") { + screenColumn += this.getScreenTabSize(screenColumn); + } else { + screenColumn += fm.getCharacterWidth(c); + } + if (screenColumn > maxScreenColumn) { + break; + } + } + + return [screenColumn, column]; + }; + }; + + this.destroy = function() { + if (this.bgTokenizer) { + this.bgTokenizer.setDocument(null); + this.bgTokenizer = null; + } + this.$stopWorker(); + }; + function isFullWidth(c) { + if (c < 0x1100) + return false; + return c >= 0x1100 && c <= 0x115F || + c >= 0x11A3 && c <= 0x11A7 || + c >= 0x11FA && c <= 0x11FF || + c >= 0x2329 && c <= 0x232A || + c >= 0x2E80 && c <= 0x2E99 || + c >= 0x2E9B && c <= 0x2EF3 || + c >= 0x2F00 && c <= 0x2FD5 || + c >= 0x2FF0 && c <= 0x2FFB || + c >= 0x3000 && c <= 0x303E || + c >= 0x3041 && c <= 0x3096 || + c >= 0x3099 && c <= 0x30FF || + c >= 0x3105 && c <= 0x312D || + c >= 0x3131 && c <= 0x318E || + c >= 0x3190 && c <= 0x31BA || + c >= 0x31C0 && c <= 0x31E3 || + c >= 0x31F0 && c <= 0x321E || + c >= 0x3220 && c <= 0x3247 || + c >= 0x3250 && c <= 0x32FE || + c >= 0x3300 && c <= 0x4DBF || + c >= 0x4E00 && c <= 0xA48C || + c >= 0xA490 && c <= 0xA4C6 || + c >= 0xA960 && c <= 0xA97C || + c >= 0xAC00 && c <= 0xD7A3 || + c >= 0xD7B0 && c <= 0xD7C6 || + c >= 0xD7CB && c <= 0xD7FB || + c >= 0xF900 && c <= 0xFAFF || + c >= 0xFE10 && c <= 0xFE19 || + c >= 0xFE30 && c <= 0xFE52 || + c >= 0xFE54 && c <= 0xFE66 || + c >= 0xFE68 && c <= 0xFE6B || + c >= 0xFF01 && c <= 0xFF60 || + c >= 0xFFE0 && c <= 0xFFE6; + } + +}).call(EditSession.prototype); + +require("./edit_session/folding").Folding.call(EditSession.prototype); +require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); + + +config.defineOptions(EditSession.prototype, "session", { + wrap: { + set: function(value) { + if (!value || value == "off") + value = false; + else if (value == "free") + value = true; + else if (value == "printMargin") + value = -1; + else if (typeof value == "string") + value = parseInt(value, 10) || false; + + if (this.$wrap == value) + return; + this.$wrap = value; + if (!value) { + this.setUseWrapMode(false); + } else { + var col = typeof value == "number" ? value : null; + this.setWrapLimitRange(col, col); + this.setUseWrapMode(true); + } + }, + get: function() { + if (this.getUseWrapMode()) { + if (this.$wrap == -1) + return "printMargin"; + if (!this.getWrapLimitRange().min) + return "free"; + return this.$wrap; + } + return "off"; + }, + handlesSet: true + }, + wrapMethod: { + set: function(val) { + val = val == "auto" + ? this.$mode.type != "text" + : val != "text"; + if (val != this.$wrapAsCode) { + this.$wrapAsCode = val; + if (this.$useWrapMode) { + this.$modified = true; + this.$resetRowCache(0); + this.$updateWrapData(0, this.getLength() - 1); + } + } + }, + initialValue: "auto" + }, + indentedSoftWrap: { initialValue: true }, + firstLineNumber: { + set: function() {this._signal("changeBreakpoint");}, + initialValue: 1 + }, + useWorker: { + set: function(useWorker) { + this.$useWorker = useWorker; + + this.$stopWorker(); + if (useWorker) + this.$startWorker(); + }, + initialValue: true + }, + useSoftTabs: {initialValue: true}, + tabSize: { + set: function(tabSize) { + if (isNaN(tabSize) || this.$tabSize === tabSize) return; + + this.$modified = true; + this.$rowLengthCache = []; + this.$tabSize = tabSize; + this._signal("changeTabSize"); + }, + initialValue: 4, + handlesSet: true + }, + navigateWithinSoftTabs: {initialValue: false}, + overwrite: { + set: function(val) {this._signal("changeOverwrite");}, + initialValue: false + }, + newLineMode: { + set: function(val) {this.doc.setNewLineMode(val)}, + get: function() {return this.doc.getNewLineMode()}, + handlesSet: true + }, + mode: { + set: function(val) { this.setMode(val) }, + get: function() { return this.$modeId } + } +}); + +exports.EditSession = EditSession; +}); + +ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var Search = function() { + this.$options = {}; +}; + +(function() { + this.set = function(options) { + oop.mixin(this.$options, options); + return this; + }; + this.getOptions = function() { + return lang.copyObject(this.$options); + }; + this.setOptions = function(options) { + this.$options = options; + }; + this.find = function(session) { + var options = this.$options; + var iterator = this.$matchIterator(session, options); + if (!iterator) + return false; + + var firstRange = null; + iterator.forEach(function(sr, sc, er, ec) { + firstRange = new Range(sr, sc, er, ec); + if (sc == ec && options.start && options.start.start + && options.skipCurrent != false && firstRange.isEqual(options.start) + ) { + firstRange = null; + return false; + } + + return true; + }); + + return firstRange; + }; + this.findAll = function(session) { + var options = this.$options; + if (!options.needle) + return []; + this.$assembleRegExp(options); + + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); + + var ranges = []; + var re = options.re; + if (options.$isMultiLine) { + var len = re.length; + var maxRow = lines.length - len; + var prevRange; + outer: for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) + if (lines[row + j].search(re[j]) == -1) + continue outer; + + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.length - startLine.match(re[0])[0].length; + var endIndex = line.match(re[len - 1])[0].length; + + if (prevRange && prevRange.end.row === row && + prevRange.end.column > startIndex + ) { + continue; + } + ranges.push(prevRange = new Range( + row, startIndex, row + len - 1, endIndex + )); + if (len > 2) + row = row + len - 2; + } + } else { + for (var i = 0; i < lines.length; i++) { + var matches = lang.getMatchOffsets(lines[i], re); + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + ranges.push(new Range(i, match.offset, i, match.offset + match.length)); + } + } + } + + if (range) { + var startColumn = range.start.column; + var endColumn = range.start.column; + var i = 0, j = ranges.length - 1; + while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row) + i++; + + while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row) + j--; + + ranges = ranges.slice(i, j + 1); + for (i = 0, j = ranges.length; i < j; i++) { + ranges[i].start.row += range.start.row; + ranges[i].end.row += range.start.row; + } + } + + return ranges; + }; + this.replace = function(input, replacement) { + var options = this.$options; + + var re = this.$assembleRegExp(options); + if (options.$isMultiLine) + return replacement; + + if (!re) + return; + + var match = re.exec(input); + if (!match || match[0].length != input.length) + return null; + + replacement = input.replace(re, replacement); + if (options.preserveCase) { + replacement = replacement.split(""); + for (var i = Math.min(input.length, input.length); i--; ) { + var ch = input[i]; + if (ch && ch.toLowerCase() != ch) + replacement[i] = replacement[i].toUpperCase(); + else + replacement[i] = replacement[i].toLowerCase(); + } + replacement = replacement.join(""); + } + + return replacement; + }; + + this.$assembleRegExp = function(options, $disableFakeMultiline) { + if (options.needle instanceof RegExp) + return options.re = options.needle; + + var needle = options.needle; + + if (!options.needle) + return options.re = false; + + if (!options.regExp) + needle = lang.escapeRegExp(needle); + + if (options.wholeWord) + needle = addWordBoundary(needle, options); + + var modifier = options.caseSensitive ? "gm" : "gmi"; + + options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); + if (options.$isMultiLine) + return options.re = this.$assembleMultilineRegExp(needle, modifier); + + try { + var re = new RegExp(needle, modifier); + } catch(e) { + re = false; + } + return options.re = re; + }; + + this.$assembleMultilineRegExp = function(needle, modifier) { + var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); + var re = []; + for (var i = 0; i < parts.length; i++) try { + re.push(new RegExp(parts[i], modifier)); + } catch(e) { + return false; + } + return re; + }; + + this.$matchIterator = function(session, options) { + var re = this.$assembleRegExp(options); + if (!re) + return false; + var backwards = options.backwards == true; + var skipCurrent = options.skipCurrent != false; + + var range = options.range; + var start = options.start; + if (!start) + start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); + + if (start.start) + start = start[skipCurrent != backwards ? "end" : "start"]; + + var firstRow = range ? range.start.row : 0; + var lastRow = range ? range.end.row : session.getLength() - 1; + + if (backwards) { + var forEach = function(callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row--; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + if (options.wrap == false) + return; + for (row = lastRow, firstRow = start.row; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + }; + } + else { + var forEach = function(callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row = row + 1; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + if (options.wrap == false) + return; + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + }; + } + + if (options.$isMultiLine) { + var len = re.length; + var forEachInLine = function(row, offset, callback) { + var startRow = backwards ? row - len + 1 : row; + if (startRow < 0) return; + var line = session.getLine(startRow); + var startIndex = line.search(re[0]) + if (!backwards && startIndex < offset || startIndex === -1) return; + for (var i = 1; i < len; i++) { + line = session.getLine(startRow + i); + if (line.search(re[i]) == -1) + return; + } + var endIndex = line.match(re[len - 1])[0].length; + if (backwards && endIndex > offset) return; + if (callback(startRow, startIndex, startRow + len - 1, endIndex)) + return true; + }; + } + else if (backwards) { + var forEachInLine = function(row, endIndex, callback) { + var line = session.getLine(row); + var matches = []; + var m, last = 0; + re.lastIndex = 0; + while((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (!length) { + if (last >= line.length) break; + re.lastIndex = last += 1; + } + if (m.index + length > endIndex) + break; + matches.push(m.index, length) + } + for (var i = matches.length - 1; i >= 0; i -= 2) { + var column = matches[i - 1]; + var length = matches[i]; + if (callback(row, column, row, column + length)) + return true; + } + }; + } + else { + var forEachInLine = function(row, startIndex, callback) { + var line = session.getLine(row); + var m; + var last = startIndex; + re.lastIndex = startIndex; + while((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (callback(row, last, row,last + length)) + return true; + if (!length) { + re.lastIndex = last += 1; + if (last >= line.length) return false; + } + } + }; + } + return {forEach: forEach}; + }; + +}).call(Search.prototype); + +function addWordBoundary(needle, options) { + function wordBoundary(c) { + if (/\w/.test(c) || options.regExp) return "\\b"; + return ""; + } + return wordBoundary(needle[0]) + needle + + wordBoundary(needle[needle.length - 1]); +} + +exports.Search = Search; +}); + +ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var keyUtil = require("../lib/keys"); +var useragent = require("../lib/useragent"); +var KEY_MODS = keyUtil.KEY_MODS; + +function HashHandler(config, platform) { + this.platform = platform || (useragent.isMac ? "mac" : "win"); + this.commands = {}; + this.commandKeyBinding = {}; + this.addCommands(config); + this.$singleCommand = true; +} + +function MultiHashHandler(config, platform) { + HashHandler.call(this, config, platform); + this.$singleCommand = false; +} + +MultiHashHandler.prototype = HashHandler.prototype; + +(function() { + + + this.addCommand = function(command) { + if (this.commands[command.name]) + this.removeCommand(command); + + this.commands[command.name] = command; + + if (command.bindKey) + this._buildKeyHash(command); + }; + + this.removeCommand = function(command, keepCommand) { + var name = command && (typeof command === 'string' ? command : command.name); + command = this.commands[name]; + if (!keepCommand) + delete this.commands[name]; + var ckb = this.commandKeyBinding; + for (var keyId in ckb) { + var cmdGroup = ckb[keyId]; + if (cmdGroup == command) { + delete ckb[keyId]; + } else if (Array.isArray(cmdGroup)) { + var i = cmdGroup.indexOf(command); + if (i != -1) { + cmdGroup.splice(i, 1); + if (cmdGroup.length == 1) + ckb[keyId] = cmdGroup[0]; + } + } + } + }; + + this.bindKey = function(key, command, position) { + if (typeof key == "object" && key) { + if (position == undefined) + position = key.position; + key = key[this.platform]; + } + if (!key) + return; + if (typeof command == "function") + return this.addCommand({exec: command, bindKey: key, name: command.name || key}); + + key.split("|").forEach(function(keyPart) { + var chain = ""; + if (keyPart.indexOf(" ") != -1) { + var parts = keyPart.split(/\s+/); + keyPart = parts.pop(); + parts.forEach(function(keyPart) { + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + chain += (chain ? " " : "") + id; + this._addCommandToBinding(chain, "chainKeys"); + }, this); + chain += " "; + } + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + this._addCommandToBinding(chain + id, command, position); + }, this); + }; + + function getPosition(command) { + return typeof command == "object" && command.bindKey + && command.bindKey.position + || (command.isDefault ? -100 : 0); + } + this._addCommandToBinding = function(keyId, command, position) { + var ckb = this.commandKeyBinding, i; + if (!command) { + delete ckb[keyId]; + } else if (!ckb[keyId] || this.$singleCommand) { + ckb[keyId] = command; + } else { + if (!Array.isArray(ckb[keyId])) { + ckb[keyId] = [ckb[keyId]]; + } else if ((i = ckb[keyId].indexOf(command)) != -1) { + ckb[keyId].splice(i, 1); + } + + if (typeof position != "number") { + position = getPosition(command); + } + + var commands = ckb[keyId]; + for (i = 0; i < commands.length; i++) { + var other = commands[i]; + var otherPos = getPosition(other); + if (otherPos > position) + break; + } + commands.splice(i, 0, command); + } + }; + + this.addCommands = function(commands) { + commands && Object.keys(commands).forEach(function(name) { + var command = commands[name]; + if (!command) + return; + + if (typeof command === "string") + return this.bindKey(command, name); + + if (typeof command === "function") + command = { exec: command }; + + if (typeof command !== "object") + return; + + if (!command.name) + command.name = name; + + this.addCommand(command); + }, this); + }; + + this.removeCommands = function(commands) { + Object.keys(commands).forEach(function(name) { + this.removeCommand(commands[name]); + }, this); + }; + + this.bindKeys = function(keyList) { + Object.keys(keyList).forEach(function(key) { + this.bindKey(key, keyList[key]); + }, this); + }; + + this._buildKeyHash = function(command) { + this.bindKey(command.bindKey, command); + }; + this.parseKeys = function(keys) { + var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x}); + var key = parts.pop(); + + var keyCode = keyUtil[key]; + if (keyUtil.FUNCTION_KEYS[keyCode]) + key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); + else if (!parts.length) + return {key: key, hashId: -1}; + else if (parts.length == 1 && parts[0] == "shift") + return {key: key.toUpperCase(), hashId: -1}; + + var hashId = 0; + for (var i = parts.length; i--;) { + var modifier = keyUtil.KEY_MODS[parts[i]]; + if (modifier == null) { + if (typeof console != "undefined") + console.error("invalid modifier " + parts[i] + " in " + keys); + return false; + } + hashId |= modifier; + } + return {key: key, hashId: hashId}; + }; + + this.findKeyCommand = function findKeyCommand(hashId, keyString) { + var key = KEY_MODS[hashId] + keyString; + return this.commandKeyBinding[key]; + }; + + this.handleKeyboard = function(data, hashId, keyString, keyCode) { + if (keyCode < 0) return; + var key = KEY_MODS[hashId] + keyString; + var command = this.commandKeyBinding[key]; + if (data.$keyChain) { + data.$keyChain += " " + key; + command = this.commandKeyBinding[data.$keyChain] || command; + } + + if (command) { + if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { + data.$keyChain = data.$keyChain || key; + return {command: "null"}; + } + } + + if (data.$keyChain) { + if ((!hashId || hashId == 4) && keyString.length == 1) + data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input + else if (hashId == -1 || keyCode > 0) + data.$keyChain = ""; // reset keyChain + } + return {command: command}; + }; + + this.getStatusText = function(editor, data) { + return data.$keyChain || ""; + }; + +}).call(HashHandler.prototype); + +exports.HashHandler = HashHandler; +exports.MultiHashHandler = MultiHashHandler; +}); + +ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var CommandManager = function(platform, commands) { + MultiHashHandler.call(this, commands, platform); + this.byName = this.commands; + this.setDefaultHandler("exec", function(e) { + return e.command.exec(e.editor, e.args || {}); + }); +}; + +oop.inherits(CommandManager, MultiHashHandler); + +(function() { + + oop.implement(this, EventEmitter); + + this.exec = function(command, editor, args) { + if (Array.isArray(command)) { + for (var i = command.length; i--; ) { + if (this.exec(command[i], editor, args)) return true; + } + return false; + } + + if (typeof command === "string") + command = this.commands[command]; + + if (!command) + return false; + + if (editor && editor.$readOnly && !command.readOnly) + return false; + + if (command.isAvailable && !command.isAvailable(editor)) + return false; + + var e = {editor: editor, command: command, args: args}; + e.returnValue = this._emit("exec", e); + this._signal("afterExec", e); + + return e.returnValue === false ? false : true; + }; + + this.toggleRecording = function(editor) { + if (this.$inReplay) + return; + + editor && editor._emit("changeStatus"); + if (this.recording) { + this.macro.pop(); + this.removeEventListener("exec", this.$addCommandToMacro); + + if (!this.macro.length) + this.macro = this.oldMacro; + + return this.recording = false; + } + if (!this.$addCommandToMacro) { + this.$addCommandToMacro = function(e) { + this.macro.push([e.command, e.args]); + }.bind(this); + } + + this.oldMacro = this.macro; + this.macro = []; + this.on("exec", this.$addCommandToMacro); + return this.recording = true; + }; + + this.replay = function(editor) { + if (this.$inReplay || !this.macro) + return; + + if (this.recording) + return this.toggleRecording(editor); + + try { + this.$inReplay = true; + this.macro.forEach(function(x) { + if (typeof x == "string") + this.exec(x, editor); + else + this.exec(x[0], editor, x[1]); + }, this); + } finally { + this.$inReplay = false; + } + }; + + this.trimMacro = function(m) { + return m.map(function(x){ + if (typeof x[0] != "string") + x[0] = x[0].name; + if (!x[1]) + x = x[0]; + return x; + }); + }; + +}).call(CommandManager.prototype); + +exports.CommandManager = CommandManager; + +}); + +ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); +var config = require("../config"); +var Range = require("../range").Range; + +function bindKey(win, mac) { + return {win: win, mac: mac}; +} +exports.commands = [{ + name: "showSettingsMenu", + bindKey: bindKey("Ctrl-,", "Command-,"), + exec: function(editor) { + config.loadModule("ace/ext/settings_menu", function(module) { + module.init(editor); + editor.showSettingsMenu(); + }); + }, + readOnly: true +}, { + name: "goToNextError", + bindKey: bindKey("Alt-E", "F4"), + exec: function(editor) { + config.loadModule("ace/ext/error_marker", function(module) { + module.showErrorMarker(editor, 1); + }); + }, + scrollIntoView: "animate", + readOnly: true +}, { + name: "goToPreviousError", + bindKey: bindKey("Alt-Shift-E", "Shift-F4"), + exec: function(editor) { + config.loadModule("ace/ext/error_marker", function(module) { + module.showErrorMarker(editor, -1); + }); + }, + scrollIntoView: "animate", + readOnly: true +}, { + name: "selectall", + bindKey: bindKey("Ctrl-A", "Command-A"), + exec: function(editor) { editor.selectAll(); }, + readOnly: true +}, { + name: "centerselection", + bindKey: bindKey(null, "Ctrl-L"), + exec: function(editor) { editor.centerSelection(); }, + readOnly: true +}, { + name: "gotoline", + bindKey: bindKey("Ctrl-L", "Command-L"), + exec: function(editor) { + var line = parseInt(prompt("Enter line number:"), 10); + if (!isNaN(line)) { + editor.gotoLine(line); + } + }, + readOnly: true +}, { + name: "fold", + bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), + exec: function(editor) { editor.session.toggleFold(false); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "unfold", + bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), + exec: function(editor) { editor.session.toggleFold(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "toggleFoldWidget", + bindKey: bindKey("F2", "F2"), + exec: function(editor) { editor.session.toggleFoldWidget(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "toggleParentFoldWidget", + bindKey: bindKey("Alt-F2", "Alt-F2"), + exec: function(editor) { editor.session.toggleFoldWidget(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "foldall", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function(editor) { editor.session.foldAll(); }, + scrollIntoView: "center", + readOnly: true +}, { + name: "foldOther", + bindKey: bindKey("Alt-0", "Command-Option-0"), + exec: function(editor) { + editor.session.foldAll(); + editor.session.unfold(editor.selection.getAllRanges()); + }, + scrollIntoView: "center", + readOnly: true +}, { + name: "unfoldall", + bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), + exec: function(editor) { editor.session.unfold(); }, + scrollIntoView: "center", + readOnly: true +}, { + name: "findnext", + bindKey: bindKey("Ctrl-K", "Command-G"), + exec: function(editor) { editor.findNext(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "findprevious", + bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), + exec: function(editor) { editor.findPrevious(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "selectOrFindNext", + bindKey: bindKey("Alt-K", "Ctrl-G"), + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + else + editor.findNext(); + }, + readOnly: true +}, { + name: "selectOrFindPrevious", + bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"), + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + else + editor.findPrevious(); + }, + readOnly: true +}, { + name: "find", + bindKey: bindKey("Ctrl-F", "Command-F"), + exec: function(editor) { + config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor)}); + }, + readOnly: true +}, { + name: "overwrite", + bindKey: "Insert", + exec: function(editor) { editor.toggleOverwrite(); }, + readOnly: true +}, { + name: "selecttostart", + bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"), + exec: function(editor) { editor.getSelection().selectFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "gotostart", + bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), + exec: function(editor) { editor.navigateFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "selectup", + bindKey: bindKey("Shift-Up", "Shift-Up|Ctrl-Shift-P"), + exec: function(editor) { editor.getSelection().selectUp(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "golineup", + bindKey: bindKey("Up", "Up|Ctrl-P"), + exec: function(editor, args) { editor.navigateUp(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttoend", + bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"), + exec: function(editor) { editor.getSelection().selectFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "gotoend", + bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), + exec: function(editor) { editor.navigateFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "selectdown", + bindKey: bindKey("Shift-Down", "Shift-Down|Ctrl-Shift-N"), + exec: function(editor) { editor.getSelection().selectDown(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "golinedown", + bindKey: bindKey("Down", "Down|Ctrl-N"), + exec: function(editor, args) { editor.navigateDown(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectwordleft", + bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), + exec: function(editor) { editor.getSelection().selectWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotowordleft", + bindKey: bindKey("Ctrl-Left", "Option-Left"), + exec: function(editor) { editor.navigateWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttolinestart", + bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"), + exec: function(editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotolinestart", + bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), + exec: function(editor) { editor.navigateLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectleft", + bindKey: bindKey("Shift-Left", "Shift-Left|Ctrl-Shift-B"), + exec: function(editor) { editor.getSelection().selectLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotoleft", + bindKey: bindKey("Left", "Left|Ctrl-B"), + exec: function(editor, args) { editor.navigateLeft(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectwordright", + bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), + exec: function(editor) { editor.getSelection().selectWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotowordright", + bindKey: bindKey("Ctrl-Right", "Option-Right"), + exec: function(editor) { editor.navigateWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttolineend", + bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"), + exec: function(editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotolineend", + bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), + exec: function(editor) { editor.navigateLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectright", + bindKey: bindKey("Shift-Right", "Shift-Right"), + exec: function(editor) { editor.getSelection().selectRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotoright", + bindKey: bindKey("Right", "Right|Ctrl-F"), + exec: function(editor, args) { editor.navigateRight(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectpagedown", + bindKey: "Shift-PageDown", + exec: function(editor) { editor.selectPageDown(); }, + readOnly: true +}, { + name: "pagedown", + bindKey: bindKey(null, "Option-PageDown"), + exec: function(editor) { editor.scrollPageDown(); }, + readOnly: true +}, { + name: "gotopagedown", + bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), + exec: function(editor) { editor.gotoPageDown(); }, + readOnly: true +}, { + name: "selectpageup", + bindKey: "Shift-PageUp", + exec: function(editor) { editor.selectPageUp(); }, + readOnly: true +}, { + name: "pageup", + bindKey: bindKey(null, "Option-PageUp"), + exec: function(editor) { editor.scrollPageUp(); }, + readOnly: true +}, { + name: "gotopageup", + bindKey: "PageUp", + exec: function(editor) { editor.gotoPageUp(); }, + readOnly: true +}, { + name: "scrollup", + bindKey: bindKey("Ctrl-Up", null), + exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true +}, { + name: "scrolldown", + bindKey: bindKey("Ctrl-Down", null), + exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true +}, { + name: "selectlinestart", + bindKey: "Shift-Home", + exec: function(editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectlineend", + bindKey: "Shift-End", + exec: function(editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "togglerecording", + bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), + exec: function(editor) { editor.commands.toggleRecording(editor); }, + readOnly: true +}, { + name: "replaymacro", + bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), + exec: function(editor) { editor.commands.replay(editor); }, + readOnly: true +}, { + name: "jumptomatching", + bindKey: bindKey("Ctrl-P", "Ctrl-P"), + exec: function(editor) { editor.jumpToMatching(); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "selecttomatching", + bindKey: bindKey("Ctrl-Shift-P", "Ctrl-Shift-P"), + exec: function(editor) { editor.jumpToMatching(true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "expandToMatching", + bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), + exec: function(editor) { editor.jumpToMatching(true, true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "passKeysToBrowser", + bindKey: bindKey(null, null), + exec: function() {}, + passEvent: true, + readOnly: true +}, { + name: "copy", + exec: function(editor) { + }, + readOnly: true +}, +{ + name: "cut", + exec: function(editor) { + var range = editor.getSelectionRange(); + editor._emit("cut", range); + + if (!editor.selection.isEmpty()) { + editor.session.remove(range); + editor.clearSelection(); + } + }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "paste", + exec: function(editor, args) { + editor.$handlePaste(args); + }, + scrollIntoView: "cursor" +}, { + name: "removeline", + bindKey: bindKey("Ctrl-D", "Command-D"), + exec: function(editor) { editor.removeLines(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEachLine" +}, { + name: "duplicateSelection", + bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), + exec: function(editor) { editor.duplicateSelection(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "sortlines", + bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), + exec: function(editor) { editor.sortLines(); }, + scrollIntoView: "selection", + multiSelectAction: "forEachLine" +}, { + name: "togglecomment", + bindKey: bindKey("Ctrl-/", "Command-/"), + exec: function(editor) { editor.toggleCommentLines(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "toggleBlockComment", + bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), + exec: function(editor) { editor.toggleBlockComment(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "modifyNumberUp", + bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), + exec: function(editor) { editor.modifyNumber(1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "modifyNumberDown", + bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), + exec: function(editor) { editor.modifyNumber(-1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "replace", + bindKey: bindKey("Ctrl-H", "Command-Option-F"), + exec: function(editor) { + config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true)}); + } +}, { + name: "undo", + bindKey: bindKey("Ctrl-Z", "Command-Z"), + exec: function(editor) { editor.undo(); } +}, { + name: "redo", + bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), + exec: function(editor) { editor.redo(); } +}, { + name: "copylinesup", + bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), + exec: function(editor) { editor.copyLinesUp(); }, + scrollIntoView: "cursor" +}, { + name: "movelinesup", + bindKey: bindKey("Alt-Up", "Option-Up"), + exec: function(editor) { editor.moveLinesUp(); }, + scrollIntoView: "cursor" +}, { + name: "copylinesdown", + bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), + exec: function(editor) { editor.copyLinesDown(); }, + scrollIntoView: "cursor" +}, { + name: "movelinesdown", + bindKey: bindKey("Alt-Down", "Option-Down"), + exec: function(editor) { editor.moveLinesDown(); }, + scrollIntoView: "cursor" +}, { + name: "del", + bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), + exec: function(editor) { editor.remove("right"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "backspace", + bindKey: bindKey( + "Shift-Backspace|Backspace", + "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H" + ), + exec: function(editor) { editor.remove("left"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "cut_or_delete", + bindKey: bindKey("Shift-Delete", null), + exec: function(editor) { + if (editor.selection.isEmpty()) { + editor.remove("left"); + } else { + return false; + } + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removetolinestart", + bindKey: bindKey("Alt-Backspace", "Command-Backspace"), + exec: function(editor) { editor.removeToLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removetolineend", + bindKey: bindKey("Alt-Delete", "Ctrl-K"), + exec: function(editor) { editor.removeToLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removewordleft", + bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), + exec: function(editor) { editor.removeWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removewordright", + bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), + exec: function(editor) { editor.removeWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "outdent", + bindKey: bindKey("Shift-Tab", "Shift-Tab"), + exec: function(editor) { editor.blockOutdent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "indent", + bindKey: bindKey("Tab", "Tab"), + exec: function(editor) { editor.indent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "blockoutdent", + bindKey: bindKey("Ctrl-[", "Ctrl-["), + exec: function(editor) { editor.blockOutdent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "blockindent", + bindKey: bindKey("Ctrl-]", "Ctrl-]"), + exec: function(editor) { editor.blockIndent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "insertstring", + exec: function(editor, str) { editor.insert(str); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "inserttext", + exec: function(editor, args) { + editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "splitline", + bindKey: bindKey(null, "Ctrl-O"), + exec: function(editor) { editor.splitLine(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "transposeletters", + bindKey: bindKey("Alt-Shift-X", "Ctrl-T"), + exec: function(editor) { editor.transposeLetters(); }, + multiSelectAction: function(editor) {editor.transposeSelections(1); }, + scrollIntoView: "cursor" +}, { + name: "touppercase", + bindKey: bindKey("Ctrl-U", "Ctrl-U"), + exec: function(editor) { editor.toUpperCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "tolowercase", + bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), + exec: function(editor) { editor.toLowerCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "expandtoline", + bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), + exec: function(editor) { + var range = editor.selection.getRange(); + + range.start.column = range.end.column = 0; + range.end.row++; + editor.selection.setRange(range, false); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "joinlines", + bindKey: bindKey(null, null), + exec: function(editor) { + var isBackwards = editor.selection.isBackwards(); + var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); + var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); + var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; + var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); + var selectedCount = selectedText.replace(/\n\s*/, " ").length; + var insertLine = editor.session.doc.getLine(selectionStart.row); + + for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { + var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); + if (curLine.length !== 0) { + curLine = " " + curLine; + } + insertLine += curLine; + } + + if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { + insertLine += editor.session.doc.getNewLineCharacter(); + } + + editor.clearSelection(); + editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); + + if (selectedCount > 0) { + editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); + editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); + } else { + firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; + editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + } + }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "invertSelection", + bindKey: bindKey(null, null), + exec: function(editor) { + var endRow = editor.session.doc.getLength() - 1; + var endCol = editor.session.doc.getLine(endRow).length; + var ranges = editor.selection.rangeList.ranges; + var newRanges = []; + if (ranges.length < 1) { + ranges = [editor.selection.getRange()]; + } + + for (var i = 0; i < ranges.length; i++) { + if (i == (ranges.length - 1)) { + if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { + newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); + } + } + + if (i === 0) { + if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { + newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); + } + } else { + newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column)); + } + } + + editor.exitMultiSelectMode(); + editor.clearSelection(); + + for(var i = 0; i < newRanges.length; i++) { + editor.selection.addRange(newRanges[i], false); + } + }, + readOnly: true, + scrollIntoView: "none" +}]; + +}); + +ace.define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var useragent = require("./lib/useragent"); +var TextInput = require("./keyboard/textinput").TextInput; +var MouseHandler = require("./mouse/mouse_handler").MouseHandler; +var FoldHandler = require("./mouse/fold_handler").FoldHandler; +var KeyBinding = require("./keyboard/keybinding").KeyBinding; +var EditSession = require("./edit_session").EditSession; +var Search = require("./search").Search; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var CommandManager = require("./commands/command_manager").CommandManager; +var defaultCommands = require("./commands/default_commands").commands; +var config = require("./config"); +var TokenIterator = require("./token_iterator").TokenIterator; +var Editor = function(renderer, session) { + var container = renderer.getContainerElement(); + this.container = container; + this.renderer = renderer; + this.id = "editor" + (++Editor.$uid); + + this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); + if (typeof document == "object") { + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); + this.renderer.textarea = this.textInput.getElement(); + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); + } + + this.keyBinding = new KeyBinding(this); + + this.$blockScrolling = 0; + this.$search = new Search().set({ + wrap: true + }); + + this.$historyTracker = this.$historyTracker.bind(this); + this.commands.on("exec", this.$historyTracker); + + this.$initOperationListeners(); + + this._$emitInputEvent = lang.delayedCall(function() { + this._signal("input", {}); + if (this.session && this.session.bgTokenizer) + this.session.bgTokenizer.scheduleStart(); + }.bind(this)); + + this.on("change", function(_, _self) { + _self._$emitInputEvent.schedule(31); + }); + + this.setSession(session || new EditSession("")); + config.resetOptions(this); + config._signal("editor", this); +}; + +Editor.$uid = 0; + +(function(){ + + oop.implement(this, EventEmitter); + + this.$initOperationListeners = function() { + function last(a) {return a[a.length - 1]} + + this.selections = []; + this.commands.on("exec", this.startOperation.bind(this), true); + this.commands.on("afterExec", this.endOperation.bind(this), true); + + this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this)); + + this.on("change", function() { + this.curOp || this.startOperation(); + this.curOp.docChanged = true; + }.bind(this), true); + + this.on("changeSelection", function() { + this.curOp || this.startOperation(); + this.curOp.selectionChanged = true; + }.bind(this), true); + }; + + this.curOp = null; + this.prevOp = {}; + this.startOperation = function(commadEvent) { + if (this.curOp) { + if (!commadEvent || this.curOp.command) + return; + this.prevOp = this.curOp; + } + if (!commadEvent) { + this.previousCommand = null; + commadEvent = {}; + } + + this.$opResetTimer.schedule(); + this.curOp = { + command: commadEvent.command || {}, + args: commadEvent.args, + scrollTop: this.renderer.scrollTop + }; + if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined) + this.$blockScrolling++; + }; + + this.endOperation = function(e) { + if (this.curOp) { + if (e && e.returnValue === false) + return this.curOp = null; + this._signal("beforeEndOperation"); + var command = this.curOp.command; + if (command.name && this.$blockScrolling > 0) + this.$blockScrolling--; + var scrollIntoView = command && command.scrollIntoView; + if (scrollIntoView) { + switch (scrollIntoView) { + case "center-animate": + scrollIntoView = "animate"; + case "center": + this.renderer.scrollCursorIntoView(null, 0.5); + break; + case "animate": + case "cursor": + this.renderer.scrollCursorIntoView(); + break; + case "selectionPart": + var range = this.selection.getRange(); + var config = this.renderer.layerConfig; + if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { + this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); + } + break; + default: + break; + } + if (scrollIntoView == "animate") + this.renderer.animateScrolling(this.curOp.scrollTop); + } + + this.prevOp = this.curOp; + this.curOp = null; + } + }; + this.$mergeableCommands = ["backspace", "del", "insertstring"]; + this.$historyTracker = function(e) { + if (!this.$mergeUndoDeltas) + return; + + var prev = this.prevOp; + var mergeableCommands = this.$mergeableCommands; + var shouldMerge = prev.command && (e.command.name == prev.command.name); + if (e.command.name == "insertstring") { + var text = e.args; + if (this.mergeNextCommand === undefined) + this.mergeNextCommand = true; + + shouldMerge = shouldMerge + && this.mergeNextCommand // previous command allows to coalesce with + && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type + + this.mergeNextCommand = true; + } else { + shouldMerge = shouldMerge + && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable + } + + if ( + this.$mergeUndoDeltas != "always" + && Date.now() - this.sequenceStartTime > 2000 + ) { + shouldMerge = false; // the sequence is too long + } + + if (shouldMerge) + this.session.mergeUndoDeltas = true; + else if (mergeableCommands.indexOf(e.command.name) !== -1) + this.sequenceStartTime = Date.now(); + }; + this.setKeyboardHandler = function(keyboardHandler, cb) { + if (keyboardHandler && typeof keyboardHandler === "string") { + this.$keybindingId = keyboardHandler; + var _self = this; + config.loadModule(["keybinding", keyboardHandler], function(module) { + if (_self.$keybindingId == keyboardHandler) + _self.keyBinding.setKeyboardHandler(module && module.handler); + cb && cb(); + }); + } else { + this.$keybindingId = null; + this.keyBinding.setKeyboardHandler(keyboardHandler); + cb && cb(); + } + }; + this.getKeyboardHandler = function() { + return this.keyBinding.getKeyboardHandler(); + }; + this.setSession = function(session) { + if (this.session == session) + return; + if (this.curOp) this.endOperation(); + this.curOp = {}; + + var oldSession = this.session; + if (oldSession) { + this.session.off("change", this.$onDocumentChange); + this.session.off("changeMode", this.$onChangeMode); + this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); + this.session.off("changeTabSize", this.$onChangeTabSize); + this.session.off("changeWrapLimit", this.$onChangeWrapLimit); + this.session.off("changeWrapMode", this.$onChangeWrapMode); + this.session.off("changeFold", this.$onChangeFold); + this.session.off("changeFrontMarker", this.$onChangeFrontMarker); + this.session.off("changeBackMarker", this.$onChangeBackMarker); + this.session.off("changeBreakpoint", this.$onChangeBreakpoint); + this.session.off("changeAnnotation", this.$onChangeAnnotation); + this.session.off("changeOverwrite", this.$onCursorChange); + this.session.off("changeScrollTop", this.$onScrollTopChange); + this.session.off("changeScrollLeft", this.$onScrollLeftChange); + + var selection = this.session.getSelection(); + selection.off("changeCursor", this.$onCursorChange); + selection.off("changeSelection", this.$onSelectionChange); + } + + this.session = session; + if (session) { + this.$onDocumentChange = this.onDocumentChange.bind(this); + session.on("change", this.$onDocumentChange); + this.renderer.setSession(session); + + this.$onChangeMode = this.onChangeMode.bind(this); + session.on("changeMode", this.$onChangeMode); + + this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); + session.on("tokenizerUpdate", this.$onTokenizerUpdate); + + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); + session.on("changeTabSize", this.$onChangeTabSize); + + this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); + session.on("changeWrapLimit", this.$onChangeWrapLimit); + + this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); + session.on("changeWrapMode", this.$onChangeWrapMode); + + this.$onChangeFold = this.onChangeFold.bind(this); + session.on("changeFold", this.$onChangeFold); + + this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); + this.session.on("changeFrontMarker", this.$onChangeFrontMarker); + + this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); + this.session.on("changeBackMarker", this.$onChangeBackMarker); + + this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); + this.session.on("changeBreakpoint", this.$onChangeBreakpoint); + + this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); + this.session.on("changeAnnotation", this.$onChangeAnnotation); + + this.$onCursorChange = this.onCursorChange.bind(this); + this.session.on("changeOverwrite", this.$onCursorChange); + + this.$onScrollTopChange = this.onScrollTopChange.bind(this); + this.session.on("changeScrollTop", this.$onScrollTopChange); + + this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); + this.session.on("changeScrollLeft", this.$onScrollLeftChange); + + this.selection = session.getSelection(); + this.selection.on("changeCursor", this.$onCursorChange); + + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + + this.onChangeMode(); + + this.$blockScrolling += 1; + this.onCursorChange(); + this.$blockScrolling -= 1; + + this.onScrollTopChange(); + this.onScrollLeftChange(); + this.onSelectionChange(); + this.onChangeFrontMarker(); + this.onChangeBackMarker(); + this.onChangeBreakpoint(); + this.onChangeAnnotation(); + this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); + this.renderer.updateFull(); + } else { + this.selection = null; + this.renderer.setSession(session); + } + + this._signal("changeSession", { + session: session, + oldSession: oldSession + }); + + this.curOp = null; + + oldSession && oldSession._signal("changeEditor", {oldEditor: this}); + session && session._signal("changeEditor", {editor: this}); + + if (session && session.bgTokenizer) + session.bgTokenizer.scheduleStart(); + }; + this.getSession = function() { + return this.session; + }; + this.setValue = function(val, cursorPos) { + this.session.doc.setValue(val); + + if (!cursorPos) + this.selectAll(); + else if (cursorPos == 1) + this.navigateFileEnd(); + else if (cursorPos == -1) + this.navigateFileStart(); + + return val; + }; + this.getValue = function() { + return this.session.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.resize = function(force) { + this.renderer.onResize(force); + }; + this.setTheme = function(theme, cb) { + this.renderer.setTheme(theme, cb); + }; + this.getTheme = function() { + return this.renderer.getTheme(); + }; + this.setStyle = function(style) { + this.renderer.setStyle(style); + }; + this.unsetStyle = function(style) { + this.renderer.unsetStyle(style); + }; + this.getFontSize = function () { + return this.getOption("fontSize") || + dom.computedStyle(this.container, "fontSize"); + }; + this.setFontSize = function(size) { + this.setOption("fontSize", size); + }; + + this.$highlightBrackets = function() { + if (this.session.$bracketHighlight) { + this.session.removeMarker(this.session.$bracketHighlight); + this.session.$bracketHighlight = null; + } + + if (this.$highlightPending) { + return; + } + var self = this; + this.$highlightPending = true; + setTimeout(function() { + self.$highlightPending = false; + var session = self.session; + if (!session || !session.bgTokenizer) return; + var pos = session.findMatchingBracket(self.getCursorPosition()); + if (pos) { + var range = new Range(pos.row, pos.column, pos.row, pos.column + 1); + } else if (session.$mode.getMatching) { + var range = session.$mode.getMatching(self.session); + } + if (range) + session.$bracketHighlight = session.addMarker(range, "ace_bracket", "text"); + }, 50); + }; + this.$highlightTags = function() { + if (this.$highlightTagPending) + return; + var self = this; + this.$highlightTagPending = true; + setTimeout(function() { + self.$highlightTagPending = false; + + var session = self.session; + if (!session || !session.bgTokenizer) return; + + var pos = self.getCursorPosition(); + var iterator = new TokenIterator(self.session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + + if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; + return; + } + + if (token.type.indexOf("tag-open") != -1) { + token = iterator.stepForward(); + if (!token) + return; + } + + var tag = token.value; + var depth = 0; + var prevToken = iterator.stepBackward(); + + if (prevToken.value == '<'){ + do { + prevToken = token; + token = iterator.stepForward(); + + if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) { + if (prevToken.value === '<'){ + depth++; + } else if (prevToken.value === '= 0); + } else { + do { + token = prevToken; + prevToken = iterator.stepBackward(); + + if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) { + if (prevToken.value === '<') { + depth++; + } else if (prevToken.value === ' 1)) + highlight = false; + } + + if (session.$highlightLineMarker && !highlight) { + session.removeMarker(session.$highlightLineMarker.id); + session.$highlightLineMarker = null; + } else if (!session.$highlightLineMarker && highlight) { + var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); + range.id = session.addMarker(range, "ace_active-line", "screenLine"); + session.$highlightLineMarker = range; + } else if (highlight) { + session.$highlightLineMarker.start.row = highlight.row; + session.$highlightLineMarker.end.row = highlight.row; + session.$highlightLineMarker.start.column = highlight.column; + session._signal("changeBackMarker"); + } + }; + + this.onSelectionChange = function(e) { + var session = this.session; + + if (session.$selectionMarker) { + session.removeMarker(session.$selectionMarker); + } + session.$selectionMarker = null; + + if (!this.selection.isEmpty()) { + var range = this.selection.getRange(); + var style = this.getSelectionStyle(); + session.$selectionMarker = session.addMarker(range, "ace_selection", style); + } else { + this.$updateHighlightActiveLine(); + } + + var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); + this.session.highlight(re); + + this._signal("changeSelection"); + }; + + this.$getSelectionHighLightRegexp = function() { + var session = this.session; + + var selection = this.getSelectionRange(); + if (selection.isEmpty() || selection.isMultiLine()) + return; + + var startOuter = selection.start.column - 1; + var endOuter = selection.end.column + 1; + var line = session.getLine(selection.start.row); + var lineCols = line.length; + var needle = line.substring(Math.max(startOuter, 0), + Math.min(endOuter, lineCols)); + if ((startOuter >= 0 && /^[\w\d]/.test(needle)) || + (endOuter <= lineCols && /[\w\d]$/.test(needle))) + return; + + needle = line.substring(selection.start.column, selection.end.column); + if (!/^[\w\d]+$/.test(needle)) + return; + + var re = this.$search.$assembleRegExp({ + wholeWord: true, + caseSensitive: true, + needle: needle + }); + + return re; + }; + + + this.onChangeFrontMarker = function() { + this.renderer.updateFrontMarkers(); + }; + + this.onChangeBackMarker = function() { + this.renderer.updateBackMarkers(); + }; + + + this.onChangeBreakpoint = function() { + this.renderer.updateBreakpoints(); + }; + + this.onChangeAnnotation = function() { + this.renderer.setAnnotations(this.session.getAnnotations()); + }; + + + this.onChangeMode = function(e) { + this.renderer.updateText(); + this._emit("changeMode", e); + }; + + + this.onChangeWrapLimit = function() { + this.renderer.updateFull(); + }; + + this.onChangeWrapMode = function() { + this.renderer.onResize(true); + }; + + + this.onChangeFold = function() { + this.$updateHighlightActiveLine(); + this.renderer.updateFull(); + }; + this.getSelectedText = function() { + return this.session.getTextRange(this.getSelectionRange()); + }; + this.getCopyText = function() { + var text = this.getSelectedText(); + this._signal("copy", text); + return text; + }; + this.onCopy = function() { + this.commands.exec("copy", this); + }; + this.onCut = function() { + this.commands.exec("cut", this); + }; + this.onPaste = function(text, event) { + var e = {text: text, event: event}; + this.commands.exec("paste", this, e); + }; + + this.$handlePaste = function(e) { + if (typeof e == "string") + e = {text: e}; + this._signal("paste", e); + var text = e.text; + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { + this.insert(text); + } else { + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + + if (lines.length > ranges.length || lines.length < 2 || !lines[1]) + return this.commands.exec("insertstring", this, text); + + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + this.session.remove(range); + + this.session.insert(range.start, lines[i]); + } + } + }; + + this.execCommand = function(command, args) { + return this.commands.exec(command, this, args); + }; + this.insert = function(text, pasted) { + var session = this.session; + var mode = session.getMode(); + var cursor = this.getCursorPosition(); + + if (this.getBehavioursEnabled() && !pasted) { + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); + if (transform) { + if (text !== transform.text) { + this.session.mergeUndoDeltas = false; + this.$mergeNextCommand = false; + } + text = transform.text; + + } + } + + if (text == "\t") + text = this.session.getTabString(); + if (!this.selection.isEmpty()) { + var range = this.getSelectionRange(); + cursor = this.session.remove(range); + this.clearSelection(); + } + else if (this.session.getOverwrite() && text.indexOf("\n") == -1) { + var range = new Range.fromPoints(cursor, cursor); + range.end.column += text.length; + this.session.remove(range); + } + + if (text == "\n" || text == "\r\n") { + var line = session.getLine(cursor.row); + if (cursor.column > line.search(/\S|$/)) { + var d = line.substr(cursor.column).search(/\S|$/); + session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + } + } + this.clearSelection(); + + var start = cursor.column; + var lineState = session.getState(cursor.row); + var line = session.getLine(cursor.row); + var shouldOutdent = mode.checkOutdent(lineState, line, text); + var end = session.insert(cursor, text); + + if (transform && transform.selection) { + if (transform.selection.length == 2) { // Transform relative to the current column + this.selection.setSelectionRange( + new Range(cursor.row, start + transform.selection[0], + cursor.row, start + transform.selection[1])); + } else { // Transform relative to the current row. + this.selection.setSelectionRange( + new Range(cursor.row + transform.selection[0], + transform.selection[1], + cursor.row + transform.selection[2], + transform.selection[3])); + } + } + + if (session.getDocument().isNewLine(text)) { + var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); + + session.insert({row: cursor.row+1, column: 0}, lineIndent); + } + if (shouldOutdent) + mode.autoOutdent(lineState, session, cursor.row); + }; + + this.onTextInput = function(text) { + this.keyBinding.onTextInput(text); + }; + + this.onCommandKey = function(e, hashId, keyCode) { + this.keyBinding.onCommandKey(e, hashId, keyCode); + }; + this.setOverwrite = function(overwrite) { + this.session.setOverwrite(overwrite); + }; + this.getOverwrite = function() { + return this.session.getOverwrite(); + }; + this.toggleOverwrite = function() { + this.session.toggleOverwrite(); + }; + this.setScrollSpeed = function(speed) { + this.setOption("scrollSpeed", speed); + }; + this.getScrollSpeed = function() { + return this.getOption("scrollSpeed"); + }; + this.setDragDelay = function(dragDelay) { + this.setOption("dragDelay", dragDelay); + }; + this.getDragDelay = function() { + return this.getOption("dragDelay"); + }; + this.setSelectionStyle = function(val) { + this.setOption("selectionStyle", val); + }; + this.getSelectionStyle = function() { + return this.getOption("selectionStyle"); + }; + this.setHighlightActiveLine = function(shouldHighlight) { + this.setOption("highlightActiveLine", shouldHighlight); + }; + this.getHighlightActiveLine = function() { + return this.getOption("highlightActiveLine"); + }; + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + this.setHighlightSelectedWord = function(shouldHighlight) { + this.setOption("highlightSelectedWord", shouldHighlight); + }; + this.getHighlightSelectedWord = function() { + return this.$highlightSelectedWord; + }; + + this.setAnimatedScroll = function(shouldAnimate){ + this.renderer.setAnimatedScroll(shouldAnimate); + }; + + this.getAnimatedScroll = function(){ + return this.renderer.getAnimatedScroll(); + }; + this.setShowInvisibles = function(showInvisibles) { + this.renderer.setShowInvisibles(showInvisibles); + }; + this.getShowInvisibles = function() { + return this.renderer.getShowInvisibles(); + }; + + this.setDisplayIndentGuides = function(display) { + this.renderer.setDisplayIndentGuides(display); + }; + + this.getDisplayIndentGuides = function() { + return this.renderer.getDisplayIndentGuides(); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.renderer.setShowPrintMargin(showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.renderer.getShowPrintMargin(); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.renderer.setPrintMarginColumn(showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.renderer.getPrintMarginColumn(); + }; + this.setReadOnly = function(readOnly) { + this.setOption("readOnly", readOnly); + }; + this.getReadOnly = function() { + return this.getOption("readOnly"); + }; + this.setBehavioursEnabled = function (enabled) { + this.setOption("behavioursEnabled", enabled); + }; + this.getBehavioursEnabled = function () { + return this.getOption("behavioursEnabled"); + }; + this.setWrapBehavioursEnabled = function (enabled) { + this.setOption("wrapBehavioursEnabled", enabled); + }; + this.getWrapBehavioursEnabled = function () { + return this.getOption("wrapBehavioursEnabled"); + }; + this.setShowFoldWidgets = function(show) { + this.setOption("showFoldWidgets", show); + + }; + this.getShowFoldWidgets = function() { + return this.getOption("showFoldWidgets"); + }; + + this.setFadeFoldWidgets = function(fade) { + this.setOption("fadeFoldWidgets", fade); + }; + + this.getFadeFoldWidgets = function() { + return this.getOption("fadeFoldWidgets"); + }; + this.remove = function(dir) { + if (this.selection.isEmpty()){ + if (dir == "left") + this.selection.selectLeft(); + else + this.selection.selectRight(); + } + + var range = this.getSelectionRange(); + if (this.getBehavioursEnabled()) { + var session = this.session; + var state = session.getState(range.start.row); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + + if (range.end.column === 0) { + var text = session.getTextRange(range); + if (text[text.length - 1] == "\n") { + var line = session.getLine(range.end.row); + if (/^\s+$/.test(line)) { + range.end.column = line.length; + } + } + } + if (new_range) + range = new_range; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.removeWordRight = function() { + if (this.selection.isEmpty()) + this.selection.selectWordRight(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeWordLeft = function() { + if (this.selection.isEmpty()) + this.selection.selectWordLeft(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineStart = function() { + if (this.selection.isEmpty()) + this.selection.selectLineStart(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineEnd = function() { + if (this.selection.isEmpty()) + this.selection.selectLineEnd(); + + var range = this.getSelectionRange(); + if (range.start.column == range.end.column && range.start.row == range.end.row) { + range.end.column = 0; + range.end.row++; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.splitLine = function() { + if (!this.selection.isEmpty()) { + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + + var cursor = this.getCursorPosition(); + this.insert("\n"); + this.moveCursorToPosition(cursor); + }; + this.transposeLetters = function() { + if (!this.selection.isEmpty()) { + return; + } + + var cursor = this.getCursorPosition(); + var column = cursor.column; + if (column === 0) + return; + + var line = this.session.getLine(cursor.row); + var swap, range; + if (column < line.length) { + swap = line.charAt(column) + line.charAt(column-1); + range = new Range(cursor.row, column-1, cursor.row, column+1); + } + else { + swap = line.charAt(column-1) + line.charAt(column-2); + range = new Range(cursor.row, column-2, cursor.row, column); + } + this.session.replace(range, swap); + this.session.selection.moveToPosition(range.end); + }; + this.toLowerCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toLowerCase()); + this.selection.setSelectionRange(originalRange); + }; + this.toUpperCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toUpperCase()); + this.selection.setSelectionRange(originalRange); + }; + this.indent = function() { + var session = this.session; + var range = this.getSelectionRange(); + + if (range.start.row < range.end.row) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } else if (range.start.column < range.end.column) { + var text = session.getTextRange(range); + if (!/^\s+$/.test(text)) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + } + + var line = session.getLine(range.start.row); + var position = range.start; + var size = session.getTabSize(); + var column = session.documentToScreenColumn(position.row, position.column); + + if (this.session.getUseSoftTabs()) { + var count = (size - column % size); + var indentString = lang.stringRepeat(" ", count); + } else { + var count = column % size; + while (line[range.start.column - 1] == " " && count) { + range.start.column--; + count--; + } + this.selection.setSelectionRange(range); + indentString = "\t"; + } + return this.insert(indentString); + }; + this.blockIndent = function() { + var rows = this.$getSelectedRows(); + this.session.indentRows(rows.first, rows.last, "\t"); + }; + this.blockOutdent = function() { + var selection = this.session.getSelection(); + this.session.outdentRows(selection.getRange()); + }; + this.sortLines = function() { + var rows = this.$getSelectedRows(); + var session = this.session; + + var lines = []; + for (i = rows.first; i <= rows.last; i++) + lines.push(session.getLine(i)); + + lines.sort(function(a, b) { + if (a.toLowerCase() < b.toLowerCase()) return -1; + if (a.toLowerCase() > b.toLowerCase()) return 1; + return 0; + }); + + var deleteRange = new Range(0, 0, 0, 0); + for (var i = rows.first; i <= rows.last; i++) { + var line = session.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length; + session.replace(deleteRange, lines[i-rows.first]); + } + }; + this.toggleCommentLines = function() { + var state = this.session.getState(this.getCursorPosition().row); + var rows = this.$getSelectedRows(); + this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + }; + + this.toggleBlockComment = function() { + var cursor = this.getCursorPosition(); + var state = this.session.getState(cursor.row); + var range = this.getSelectionRange(); + this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + }; + this.getNumberAt = function(row, column) { + var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; + _numberRx.lastIndex = 0; + + var s = this.session.getLine(row); + while (_numberRx.lastIndex < column) { + var m = _numberRx.exec(s); + if(m.index <= column && m.index+m[0].length >= column){ + var number = { + value: m[0], + start: m.index, + end: m.index+m[0].length + }; + return number; + } + } + return null; + }; + this.modifyNumber = function(amount) { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + var charRange = new Range(row, column-1, row, column); + + var c = this.session.getTextRange(charRange); + if (!isNaN(parseFloat(c)) && isFinite(c)) { + var nr = this.getNumberAt(row, column); + if (nr) { + var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; + var decimals = nr.start + nr.value.length - fp; + + var t = parseFloat(nr.value); + t *= Math.pow(10, decimals); + + + if(fp !== nr.end && column < fp){ + amount *= Math.pow(10, nr.end - column - 1); + } else { + amount *= Math.pow(10, nr.end - column); + } + + t += amount; + t /= Math.pow(10, decimals); + var nnr = t.toFixed(decimals); + var replaceRange = new Range(row, nr.start, row, nr.end); + this.session.replace(replaceRange, nnr); + this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); + + } + } + }; + this.removeLines = function() { + var rows = this.$getSelectedRows(); + this.session.removeFullLines(rows.first, rows.last); + this.clearSelection(); + }; + + this.duplicateSelection = function() { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + var reverse = sel.isBackwards(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } else { + var point = reverse ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range), false); + range.start = point; + range.end = endPoint; + + sel.setSelectionRange(range, reverse); + } + }; + this.moveLinesDown = function() { + this.$moveLines(1, false); + }; + this.moveLinesUp = function() { + this.$moveLines(-1, false); + }; + this.moveText = function(range, toPosition, copy) { + return this.session.moveText(range, toPosition, copy); + }; + this.copyLinesUp = function() { + this.$moveLines(-1, true); + }; + this.copyLinesDown = function() { + this.$moveLines(1, true); + }; + this.$moveLines = function(dir, copy) { + var rows, moved; + var selection = this.selection; + if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { + var range = selection.toOrientedRange(); + rows = this.$getSelectedRows(range); + moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); + if (copy && dir == -1) moved = 0; + range.moveBy(moved, 0); + selection.fromOrientedRange(range); + } else { + var ranges = selection.rangeList.ranges; + selection.rangeList.detach(this.session); + this.inVirtualSelectionMode = true; + + var diff = 0; + var totalDiff = 0; + var l = ranges.length; + for (var i = 0; i < l; i++) { + var rangeIndex = i; + ranges[i].moveBy(diff, 0); + rows = this.$getSelectedRows(ranges[i]); + var first = rows.first; + var last = rows.last; + while (++i < l) { + if (totalDiff) ranges[i].moveBy(totalDiff, 0); + var subRows = this.$getSelectedRows(ranges[i]); + if (copy && subRows.first != last) + break; + else if (!copy && subRows.first > last + 1) + break; + last = subRows.last; + } + i--; + diff = this.session.$moveLines(first, last, copy ? 0 : dir); + if (copy && dir == -1) rangeIndex = i + 1; + while (rangeIndex <= i) { + ranges[rangeIndex].moveBy(diff, 0); + rangeIndex++; + } + if (!copy) diff = 0; + totalDiff += diff; + } + + selection.fromOrientedRange(selection.ranges[0]); + selection.rangeList.attach(this.session); + this.inVirtualSelectionMode = false; + } + }; + this.$getSelectedRows = function(range) { + range = (range || this.getSelectionRange()).collapseRows(); + + return { + first: this.session.getRowFoldStart(range.start.row), + last: this.session.getRowFoldEnd(range.end.row) + }; + }; + + this.onCompositionStart = function(text) { + this.renderer.showComposition(this.getCursorPosition()); + }; + + this.onCompositionUpdate = function(text) { + this.renderer.setCompositionText(text); + }; + + this.onCompositionEnd = function() { + this.renderer.hideComposition(); + }; + this.getFirstVisibleRow = function() { + return this.renderer.getFirstVisibleRow(); + }; + this.getLastVisibleRow = function() { + return this.renderer.getLastVisibleRow(); + }; + this.isRowVisible = function(row) { + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); + }; + this.isRowFullyVisible = function(row) { + return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); + }; + this.$getVisibleRowCount = function() { + return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; + }; + + this.$moveByPage = function(dir, select) { + var renderer = this.renderer; + var config = this.renderer.layerConfig; + var rows = dir * Math.floor(config.height / config.lineHeight); + + this.$blockScrolling++; + if (select === true) { + this.selection.$moveSelection(function(){ + this.moveCursorBy(rows, 0); + }); + } else if (select === false) { + this.selection.moveCursorBy(rows, 0); + this.selection.clearSelection(); + } + this.$blockScrolling--; + + var scrollTop = renderer.scrollTop; + + renderer.scrollBy(0, rows * config.lineHeight); + if (select != null) + renderer.scrollCursorIntoView(null, 0.5); + + renderer.animateScrolling(scrollTop); + }; + this.selectPageDown = function() { + this.$moveByPage(1, true); + }; + this.selectPageUp = function() { + this.$moveByPage(-1, true); + }; + this.gotoPageDown = function() { + this.$moveByPage(1, false); + }; + this.gotoPageUp = function() { + this.$moveByPage(-1, false); + }; + this.scrollPageDown = function() { + this.$moveByPage(1); + }; + this.scrollPageUp = function() { + this.$moveByPage(-1); + }; + this.scrollToRow = function(row) { + this.renderer.scrollToRow(row); + }; + this.scrollToLine = function(line, center, animate, callback) { + this.renderer.scrollToLine(line, center, animate, callback); + }; + this.centerSelection = function() { + var range = this.getSelectionRange(); + var pos = { + row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), + column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) + }; + this.renderer.alignCursor(pos, 0.5); + }; + this.getCursorPosition = function() { + return this.selection.getCursor(); + }; + this.getCursorPositionScreen = function() { + return this.session.documentToScreenPosition(this.getCursorPosition()); + }; + this.getSelectionRange = function() { + return this.selection.getRange(); + }; + this.selectAll = function() { + this.$blockScrolling += 1; + this.selection.selectAll(); + this.$blockScrolling -= 1; + }; + this.clearSelection = function() { + this.selection.clearSelection(); + }; + this.moveCursorTo = function(row, column) { + this.selection.moveCursorTo(row, column); + }; + this.moveCursorToPosition = function(pos) { + this.selection.moveCursorToPosition(pos); + }; + this.jumpToMatching = function(select, expand) { + var cursor = this.getCursorPosition(); + var iterator = new TokenIterator(this.session, cursor.row, cursor.column); + var prevToken = iterator.getCurrentToken(); + var token = prevToken || iterator.stepForward(); + + if (!token) return; + var matchType; + var found = false; + var depth = {}; + var i = cursor.column - token.start; + var bracketType; + var brackets = { + ")": "(", + "(": "(", + "]": "[", + "[": "[", + "{": "{", + "}": "{" + }; + + do { + if (token.value.match(/[{}()\[\]]/g)) { + for (; i < token.value.length && !found; i++) { + if (!brackets[token.value[i]]) { + continue; + } + + bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); + + if (isNaN(depth[bracketType])) { + depth[bracketType] = 0; + } + + switch (token.value[i]) { + case '(': + case '[': + case '{': + depth[bracketType]++; + break; + case ')': + case ']': + case '}': + depth[bracketType]--; + + if (depth[bracketType] === -1) { + matchType = 'bracket'; + found = true; + } + break; + } + } + } + else if (token && token.type.indexOf('tag-name') !== -1) { + if (isNaN(depth[token.value])) { + depth[token.value] = 0; + } + + if (prevToken.value === '<') { + depth[token.value]++; + } + else if (prevToken.value === '= 0; --i) { + if(this.$tryReplace(ranges[i], replacement)) { + replaced++; + } + } + + this.selection.setSelectionRange(selection); + this.$blockScrolling -= 1; + + return replaced; + }; + + this.$tryReplace = function(range, replacement) { + var input = this.session.getTextRange(range); + replacement = this.$search.replace(input, replacement); + if (replacement !== null) { + range.end = this.session.replace(range, replacement); + return range; + } else { + return null; + } + }; + this.getLastSearchOptions = function() { + return this.$search.getOptions(); + }; + this.find = function(needle, options, animate) { + if (!options) + options = {}; + + if (typeof needle == "string" || needle instanceof RegExp) + options.needle = needle; + else if (typeof needle == "object") + oop.mixin(options, needle); + + var range = this.selection.getRange(); + if (options.needle == null) { + needle = this.session.getTextRange(range) + || this.$search.$options.needle; + if (!needle) { + range = this.session.getWordRange(range.start.row, range.start.column); + needle = this.session.getTextRange(range); + } + this.$search.set({needle: needle}); + } + + this.$search.set(options); + if (!options.start) + this.$search.set({start: range}); + + var newRange = this.$search.find(this.session); + if (options.preventScroll) + return newRange; + if (newRange) { + this.revealRange(newRange, animate); + return newRange; + } + if (options.backwards) + range.start = range.end; + else + range.end = range.start; + this.selection.setRange(range); + }; + this.findNext = function(options, animate) { + this.find({skipCurrent: true, backwards: false}, options, animate); + }; + this.findPrevious = function(options, animate) { + this.find(options, {skipCurrent: true, backwards: true}, animate); + }; + + this.revealRange = function(range, animate) { + this.$blockScrolling += 1; + this.session.unfold(range); + this.selection.setSelectionRange(range); + this.$blockScrolling -= 1; + + var scrollTop = this.renderer.scrollTop; + this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); + if (animate !== false) + this.renderer.animateScrolling(scrollTop); + }; + this.undo = function() { + this.$blockScrolling++; + this.session.getUndoManager().undo(); + this.$blockScrolling--; + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.redo = function() { + this.$blockScrolling++; + this.session.getUndoManager().redo(); + this.$blockScrolling--; + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.destroy = function() { + this.renderer.destroy(); + this._signal("destroy", this); + if (this.session) { + this.session.destroy(); + } + }; + this.setAutoScrollEditorIntoView = function(enable) { + if (!enable) + return; + var rect; + var self = this; + var shouldScroll = false; + if (!this.$scrollAnchor) + this.$scrollAnchor = document.createElement("div"); + var scrollAnchor = this.$scrollAnchor; + scrollAnchor.style.cssText = "position:absolute"; + this.container.insertBefore(scrollAnchor, this.container.firstChild); + var onChangeSelection = this.on("changeSelection", function() { + shouldScroll = true; + }); + var onBeforeRender = this.renderer.on("beforeRender", function() { + if (shouldScroll) + rect = self.renderer.container.getBoundingClientRect(); + }); + var onAfterRender = this.renderer.on("afterRender", function() { + if (shouldScroll && rect && (self.isFocused() + || self.searchBox && self.searchBox.isFocused()) + ) { + var renderer = self.renderer; + var pos = renderer.$cursorLayer.$pixelPos; + var config = renderer.layerConfig; + var top = pos.top - config.offset; + if (pos.top >= 0 && top + rect.top < 0) { + shouldScroll = true; + } else if (pos.top < config.height && + pos.top + rect.top + config.lineHeight > window.innerHeight) { + shouldScroll = false; + } else { + shouldScroll = null; + } + if (shouldScroll != null) { + scrollAnchor.style.top = top + "px"; + scrollAnchor.style.left = pos.left + "px"; + scrollAnchor.style.height = config.lineHeight + "px"; + scrollAnchor.scrollIntoView(shouldScroll); + } + shouldScroll = rect = null; + } + }); + this.setAutoScrollEditorIntoView = function(enable) { + if (enable) + return; + delete this.setAutoScrollEditorIntoView; + this.off("changeSelection", onChangeSelection); + this.renderer.off("afterRender", onAfterRender); + this.renderer.off("beforeRender", onBeforeRender); + }; + }; + + + this.$resetCursorStyle = function() { + var style = this.$cursorStyle || "ace"; + var cursorLayer = this.renderer.$cursorLayer; + if (!cursorLayer) + return; + cursorLayer.setSmoothBlinking(/smooth/.test(style)); + cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + }; + +}).call(Editor.prototype); + + + +config.defineOptions(Editor.prototype, "editor", { + selectionStyle: { + set: function(style) { + this.onSelectionChange(); + this._signal("changeSelectionStyle", {data: style}); + }, + initialValue: "line" + }, + highlightActiveLine: { + set: function() {this.$updateHighlightActiveLine();}, + initialValue: true + }, + highlightSelectedWord: { + set: function(shouldHighlight) {this.$onSelectionChange();}, + initialValue: true + }, + readOnly: { + set: function(readOnly) { + this.$resetCursorStyle(); + }, + initialValue: false + }, + cursorStyle: { + set: function(val) { this.$resetCursorStyle(); }, + values: ["ace", "slim", "smooth", "wide"], + initialValue: "ace" + }, + mergeUndoDeltas: { + values: [false, true, "always"], + initialValue: true + }, + behavioursEnabled: {initialValue: true}, + wrapBehavioursEnabled: {initialValue: true}, + autoScrollEditorIntoView: { + set: function(val) {this.setAutoScrollEditorIntoView(val)} + }, + keyboardHandler: { + set: function(val) { this.setKeyboardHandler(val); }, + get: function() { return this.keybindingId; }, + handlesSet: true + }, + + hScrollBarAlwaysVisible: "renderer", + vScrollBarAlwaysVisible: "renderer", + highlightGutterLine: "renderer", + animatedScroll: "renderer", + showInvisibles: "renderer", + showPrintMargin: "renderer", + printMarginColumn: "renderer", + printMargin: "renderer", + fadeFoldWidgets: "renderer", + showFoldWidgets: "renderer", + showLineNumbers: "renderer", + showGutter: "renderer", + displayIndentGuides: "renderer", + fontSize: "renderer", + fontFamily: "renderer", + maxLines: "renderer", + minLines: "renderer", + scrollPastEnd: "renderer", + fixedWidthGutter: "renderer", + theme: "renderer", + + scrollSpeed: "$mouseHandler", + dragDelay: "$mouseHandler", + dragEnabled: "$mouseHandler", + focusTimout: "$mouseHandler", + tooltipFollowsMouse: "$mouseHandler", + + firstLineNumber: "session", + overwrite: "session", + newLineMode: "session", + useWorker: "session", + useSoftTabs: "session", + tabSize: "session", + wrap: "session", + indentedSoftWrap: "session", + foldStyle: "session", + mode: "session" +}); + +exports.Editor = Editor; +}); + +ace.define("ace/undomanager",["require","exports","module"], function(require, exports, module) { +"use strict"; +var UndoManager = function() { + this.reset(); +}; + +(function() { + this.execute = function(options) { + var deltaSets = options.args[0]; + this.$doc = options.args[1]; + if (options.merge && this.hasUndo()){ + this.dirtyCounter--; + deltaSets = this.$undoStack.pop().concat(deltaSets); + } + this.$undoStack.push(deltaSets); + this.$redoStack = []; + if (this.dirtyCounter < 0) { + this.dirtyCounter = NaN; + } + this.dirtyCounter++; + }; + this.undo = function(dontSelect) { + var deltaSets = this.$undoStack.pop(); + var undoSelectionRange = null; + if (deltaSets) { + undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect); + this.$redoStack.push(deltaSets); + this.dirtyCounter--; + } + + return undoSelectionRange; + }; + this.redo = function(dontSelect) { + var deltaSets = this.$redoStack.pop(); + var redoSelectionRange = null; + if (deltaSets) { + redoSelectionRange = + this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect); + this.$undoStack.push(deltaSets); + this.dirtyCounter++; + } + return redoSelectionRange; + }; + this.reset = function() { + this.$undoStack = []; + this.$redoStack = []; + this.dirtyCounter = 0; + }; + this.hasUndo = function() { + return this.$undoStack.length > 0; + }; + this.hasRedo = function() { + return this.$redoStack.length > 0; + }; + this.markClean = function() { + this.dirtyCounter = 0; + }; + this.isClean = function() { + return this.dirtyCounter === 0; + }; + this.$serializeDeltas = function(deltaSets) { + return cloneDeltaSetsObj(deltaSets, $serializeDelta); + }; + this.$deserializeDeltas = function(deltaSets) { + return cloneDeltaSetsObj(deltaSets, $deserializeDelta); + }; + + function $serializeDelta(delta){ + return { + action: delta.action, + start: delta.start, + end: delta.end, + lines: delta.lines.length == 1 ? null : delta.lines, + text: delta.lines.length == 1 ? delta.lines[0] : null + }; + } + + function $deserializeDelta(delta) { + return { + action: delta.action, + start: delta.start, + end: delta.end, + lines: delta.lines || [delta.text] + }; + } + + function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) { + var deltaSets_new = new Array(deltaSets_old.length); + for (var i = 0; i < deltaSets_old.length; i++) { + var deltaSet_old = deltaSets_old[i]; + var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)}; + + for (var j = 0; j < deltaSet_old.deltas.length; j++) { + var delta_old = deltaSet_old.deltas[j]; + deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old); + } + + deltaSets_new[i] = deltaSet_new; + } + return deltaSets_new; + } + +}).call(UndoManager.prototype); + +exports.UndoManager = UndoManager; +}); + +ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var Gutter = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_gutter-layer"; + parentEl.appendChild(this.element); + this.setShowFoldWidgets(this.$showFoldWidgets); + + this.gutterWidth = 0; + + this.$annotations = []; + this.$updateAnnotations = this.$updateAnnotations.bind(this); + + this.$cells = []; +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.setSession = function(session) { + if (this.session) + this.session.removeEventListener("change", this.$updateAnnotations); + this.session = session; + if (session) + session.on("change", this.$updateAnnotations); + }; + + this.addGutterDecoration = function(row, className){ + if (window.console) + console.warn && console.warn("deprecated use session.addGutterDecoration"); + this.session.addGutterDecoration(row, className); + }; + + this.removeGutterDecoration = function(row, className){ + if (window.console) + console.warn && console.warn("deprecated use session.removeGutterDecoration"); + this.session.removeGutterDecoration(row, className); + }; + + this.setAnnotations = function(annotations) { + this.$annotations = []; + for (var i = 0; i < annotations.length; i++) { + var annotation = annotations[i]; + var row = annotation.row; + var rowInfo = this.$annotations[row]; + if (!rowInfo) + rowInfo = this.$annotations[row] = {text: []}; + + var annoText = annotation.text; + annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || ""; + + if (rowInfo.text.indexOf(annoText) === -1) + rowInfo.text.push(annoText); + + var type = annotation.type; + if (type == "error") + rowInfo.className = " ace_error"; + else if (type == "warning" && rowInfo.className != " ace_error") + rowInfo.className = " ace_warning"; + else if (type == "info" && (!rowInfo.className)) + rowInfo.className = " ace_info"; + } + }; + + this.$updateAnnotations = function (delta) { + if (!this.$annotations.length) + return; + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + if (len === 0) { + } else if (delta.action == 'remove') { + this.$annotations.splice(firstRow, len + 1, null); + } else { + var args = new Array(len + 1); + args.unshift(firstRow, 1); + this.$annotations.splice.apply(this.$annotations, args); + } + }; + + this.update = function(config) { + var session = this.session; + var firstRow = config.firstRow; + var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar + session.getLength() - 1); + var fold = session.getNextFoldLine(firstRow); + var foldStart = fold ? fold.start.row : Infinity; + var foldWidgets = this.$showFoldWidgets && session.foldWidgets; + var breakpoints = session.$breakpoints; + var decorations = session.$decorations; + var firstLineNumber = session.$firstLineNumber; + var lastLineNumber = 0; + + var gutterRenderer = session.gutterRenderer || this.$renderer; + + var cell = null; + var index = -1; + var row = firstRow; + while (true) { + if (row > foldStart) { + row = fold.end.row + 1; + fold = session.getNextFoldLine(row, fold); + foldStart = fold ? fold.start.row : Infinity; + } + if (row > lastRow) { + while (this.$cells.length > index + 1) { + cell = this.$cells.pop(); + this.element.removeChild(cell.element); + } + break; + } + + cell = this.$cells[++index]; + if (!cell) { + cell = {element: null, textNode: null, foldWidget: null}; + cell.element = dom.createElement("div"); + cell.textNode = document.createTextNode(''); + cell.element.appendChild(cell.textNode); + this.element.appendChild(cell.element); + this.$cells[index] = cell; + } + + var className = "ace_gutter-cell "; + if (breakpoints[row]) + className += breakpoints[row]; + if (decorations[row]) + className += decorations[row]; + if (this.$annotations[row]) + className += this.$annotations[row].className; + if (cell.element.className != className) + cell.element.className = className; + + var height = session.getRowLength(row) * config.lineHeight + "px"; + if (height != cell.element.style.height) + cell.element.style.height = height; + + if (foldWidgets) { + var c = foldWidgets[row]; + if (c == null) + c = foldWidgets[row] = session.getFoldWidget(row); + } + + if (c) { + if (!cell.foldWidget) { + cell.foldWidget = dom.createElement("span"); + cell.element.appendChild(cell.foldWidget); + } + var className = "ace_fold-widget ace_" + c; + if (c == "start" && row == foldStart && row < fold.end.row) + className += " ace_closed"; + else + className += " ace_open"; + if (cell.foldWidget.className != className) + cell.foldWidget.className = className; + + var height = config.lineHeight + "px"; + if (cell.foldWidget.style.height != height) + cell.foldWidget.style.height = height; + } else { + if (cell.foldWidget) { + cell.element.removeChild(cell.foldWidget); + cell.foldWidget = null; + } + } + + var text = lastLineNumber = gutterRenderer + ? gutterRenderer.getText(session, row) + : row + firstLineNumber; + if (text !== cell.textNode.data) + cell.textNode.data = text; + + row++; + } + + this.element.style.height = config.minHeight + "px"; + + if (this.$fixedWidth || session.$useWrapMode) + lastLineNumber = session.getLength() + firstLineNumber; + + var gutterWidth = gutterRenderer + ? gutterRenderer.getWidth(session, lastLineNumber, config) + : lastLineNumber.toString().length * config.characterWidth; + + var padding = this.$padding || this.$computePadding(); + gutterWidth += padding.left + padding.right; + if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) { + this.gutterWidth = gutterWidth; + this.element.style.width = Math.ceil(this.gutterWidth) + "px"; + this._emit("changeGutterWidth", gutterWidth); + } + }; + + this.$fixedWidth = false; + + this.$showLineNumbers = true; + this.$renderer = ""; + this.setShowLineNumbers = function(show) { + this.$renderer = !show && { + getWidth: function() {return ""}, + getText: function() {return ""} + }; + }; + + this.getShowLineNumbers = function() { + return this.$showLineNumbers; + }; + + this.$showFoldWidgets = true; + this.setShowFoldWidgets = function(show) { + if (show) + dom.addCssClass(this.element, "ace_folding-enabled"); + else + dom.removeCssClass(this.element, "ace_folding-enabled"); + + this.$showFoldWidgets = show; + this.$padding = null; + }; + + this.getShowFoldWidgets = function() { + return this.$showFoldWidgets; + }; + + this.$computePadding = function() { + if (!this.element.firstChild) + return {left: 0, right: 0}; + var style = dom.computedStyle(this.element.firstChild); + this.$padding = {}; + this.$padding.left = parseInt(style.paddingLeft) + 1 || 0; + this.$padding.right = parseInt(style.paddingRight) || 0; + return this.$padding; + }; + + this.getRegion = function(point) { + var padding = this.$padding || this.$computePadding(); + var rect = this.element.getBoundingClientRect(); + if (point.x < padding.left + rect.left) + return "markers"; + if (this.$showFoldWidgets && point.x > rect.right - padding.right) + return "foldWidgets"; + }; + +}).call(Gutter.prototype); + +exports.Gutter = Gutter; + +}); + +ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var dom = require("../lib/dom"); + +var Marker = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_marker-layer"; + parentEl.appendChild(this.element); +}; + +(function() { + + this.$padding = 0; + + this.setPadding = function(padding) { + this.$padding = padding; + }; + this.setSession = function(session) { + this.session = session; + }; + + this.setMarkers = function(markers) { + this.markers = markers; + }; + + this.update = function(config) { + if (!config) return; + + this.config = config; + + + var html = []; + for (var key in this.markers) { + var marker = this.markers[key]; + + if (!marker.range) { + marker.update(html, this, this.session, config); + continue; + } + + var range = marker.range.clipRows(config.firstRow, config.lastRow); + if (range.isEmpty()) continue; + + range = range.toScreenRange(this.session); + if (marker.renderer) { + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + marker.renderer(html, range, left, top, config); + } else if (marker.type == "fullLine") { + this.drawFullLineMarker(html, range, marker.clazz, config); + } else if (marker.type == "screenLine") { + this.drawScreenLineMarker(html, range, marker.clazz, config); + } else if (range.isMultiLine()) { + if (marker.type == "text") + this.drawTextMarker(html, range, marker.clazz, config); + else + this.drawMultiLineMarker(html, range, marker.clazz, config); + } else { + this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config); + } + } + this.element.innerHTML = html.join(""); + }; + + this.$getTop = function(row, layerConfig) { + return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; + }; + + function getBorderClass(tl, tr, br, bl) { + return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); + } + this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) { + var session = this.session; + var start = range.start.row; + var end = range.end.row; + var row = start; + var prev = 0; + var curr = 0; + var next = session.getScreenLastRowColumn(row); + var lineRange = new Range(row, range.start.column, row, curr); + for (; row <= end; row++) { + lineRange.start.row = lineRange.end.row = row; + lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row); + lineRange.end.column = next; + prev = curr; + curr = next; + next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column; + this.drawSingleLineMarker(stringBuilder, lineRange, + clazz + (row == start ? " ace_start" : "") + " ace_br" + + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), + layerConfig, row == end ? 0 : 1, extraStyle); + } + }; + this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var padding = this.$padding; + var height = config.lineHeight; + var top = this.$getTop(range.start.row, config); + var left = padding + range.start.column * config.characterWidth; + extraStyle = extraStyle || ""; + + stringBuilder.push( + "
      " + ); + top = this.$getTop(range.end.row, config); + var width = range.end.column * config.characterWidth; + + stringBuilder.push( + "
      " + ); + height = (range.end.row - range.start.row - 1) * config.lineHeight; + if (height <= 0) + return; + top = this.$getTop(range.start.row + 1, config); + + var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8); + + stringBuilder.push( + "
      " + ); + }; + this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + var height = config.lineHeight; + var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth; + + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + + stringBuilder.push( + "
      " + ); + }; + + this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + if (range.start.row != range.end.row) + height += this.$getTop(range.end.row, config) - top; + + stringBuilder.push( + "
      " + ); + }; + + this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + + stringBuilder.push( + "
      " + ); + }; + +}).call(Marker.prototype); + +exports.Marker = Marker; + +}); + +ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var useragent = require("../lib/useragent"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var Text = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_text-layer"; + parentEl.appendChild(this.element); + this.$updateEolChar = this.$updateEolChar.bind(this); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.EOF_CHAR = "\xB6"; + this.EOL_CHAR_LF = "\xAC"; + this.EOL_CHAR_CRLF = "\xa4"; + this.EOL_CHAR = this.EOL_CHAR_LF; + this.TAB_CHAR = "\u2014"; //"\u21E5"; + this.SPACE_CHAR = "\xB7"; + this.$padding = 0; + + this.$updateEolChar = function() { + var EOL_CHAR = this.session.doc.getNewLineCharacter() == "\n" + ? this.EOL_CHAR_LF + : this.EOL_CHAR_CRLF; + if (this.EOL_CHAR != EOL_CHAR) { + this.EOL_CHAR = EOL_CHAR; + return true; + } + } + + this.setPadding = function(padding) { + this.$padding = padding; + this.element.style.padding = "0 " + padding + "px"; + }; + + this.getLineHeight = function() { + return this.$fontMetrics.$characterSize.height || 0; + }; + + this.getCharacterWidth = function() { + return this.$fontMetrics.$characterSize.width || 0; + }; + + this.$setFontMetrics = function(measure) { + this.$fontMetrics = measure; + this.$fontMetrics.on("changeCharacterSize", function(e) { + this._signal("changeCharacterSize", e); + }.bind(this)); + this.$pollSizeChanges(); + } + + this.checkForSizeChanges = function() { + this.$fontMetrics.checkForSizeChanges(); + }; + this.$pollSizeChanges = function() { + return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges(); + }; + this.setSession = function(session) { + this.session = session; + if (session) + this.$computeTabString(); + }; + + this.showInvisibles = false; + this.setShowInvisibles = function(showInvisibles) { + if (this.showInvisibles == showInvisibles) + return false; + + this.showInvisibles = showInvisibles; + this.$computeTabString(); + return true; + }; + + this.displayIndentGuides = true; + this.setDisplayIndentGuides = function(display) { + if (this.displayIndentGuides == display) + return false; + + this.displayIndentGuides = display; + this.$computeTabString(); + return true; + }; + + this.$tabStrings = []; + this.onChangeTabSize = + this.$computeTabString = function() { + var tabSize = this.session.getTabSize(); + this.tabSize = tabSize; + var tabStr = this.$tabStrings = [0]; + for (var i = 1; i < tabSize + 1; i++) { + if (this.showInvisibles) { + tabStr.push("" + + lang.stringRepeat(this.TAB_CHAR, i) + + ""); + } else { + tabStr.push(lang.stringRepeat(" ", i)); + } + } + if (this.displayIndentGuides) { + this.$indentGuideRe = /\s\S| \t|\t |\s$/; + var className = "ace_indent-guide"; + var spaceClass = ""; + var tabClass = ""; + if (this.showInvisibles) { + className += " ace_invisible"; + spaceClass = " ace_invisible_space"; + tabClass = " ace_invisible_tab"; + var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize); + var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize); + } else{ + var spaceContent = lang.stringRepeat(" ", this.tabSize); + var tabContent = spaceContent; + } + + this.$tabStrings[" "] = "" + spaceContent + ""; + this.$tabStrings["\t"] = "" + tabContent + ""; + } + }; + + this.updateLines = function(config, firstRow, lastRow) { + if (this.config.lastRow != config.lastRow || + this.config.firstRow != config.firstRow) { + this.scrollLines(config); + } + this.config = config; + + var first = Math.max(firstRow, config.firstRow); + var last = Math.min(lastRow, config.lastRow); + + var lineElements = this.element.childNodes; + var lineElementsIdx = 0; + + for (var row = config.firstRow; row < first; row++) { + var foldLine = this.session.getFoldLine(row); + if (foldLine) { + if (foldLine.containsRow(first)) { + first = foldLine.start.row; + break; + } else { + row = foldLine.end.row; + } + } + lineElementsIdx ++; + } + + var row = first; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row :Infinity; + } + if (row > last) + break; + + var lineElement = lineElements[lineElementsIdx++]; + if (lineElement) { + var html = []; + this.$renderLine( + html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false + ); + lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + "px"; + lineElement.innerHTML = html.join(""); + } + row++; + } + }; + + this.scrollLines = function(config) { + var oldConfig = this.config; + this.config = config; + + if (!oldConfig || oldConfig.lastRow < config.firstRow) + return this.update(config); + + if (config.lastRow < oldConfig.firstRow) + return this.update(config); + + var el = this.element; + if (oldConfig.firstRow < config.firstRow) + for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + el.removeChild(el.firstChild); + + if (oldConfig.lastRow > config.lastRow) + for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--) + el.removeChild(el.lastChild); + + if (config.firstRow < oldConfig.firstRow) { + var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1); + if (el.firstChild) + el.insertBefore(fragment, el.firstChild); + else + el.appendChild(fragment); + } + + if (config.lastRow > oldConfig.lastRow) { + var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow); + el.appendChild(fragment); + } + }; + + this.$renderLinesFragment = function(config, firstRow, lastRow) { + var fragment = this.element.ownerDocument.createDocumentFragment(); + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (row > lastRow) + break; + + var container = dom.createElement("div"); + + var html = []; + this.$renderLine(html, row, false, row == foldStart ? foldLine : false); + container.innerHTML = html.join(""); + if (this.$useLineGroups()) { + container.className = 'ace_line_group'; + fragment.appendChild(container); + container.style.height = config.lineHeight * this.session.getRowLength(row) + "px"; + + } else { + while(container.firstChild) + fragment.appendChild(container.firstChild); + } + + row++; + } + return fragment; + }; + + this.update = function(config) { + this.config = config; + + var html = []; + var firstRow = config.firstRow, lastRow = config.lastRow; + + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row :Infinity; + } + if (row > lastRow) + break; + + if (this.$useLineGroups()) + html.push("
      ") + + this.$renderLine(html, row, false, row == foldStart ? foldLine : false); + + if (this.$useLineGroups()) + html.push("
      "); // end the line group + + row++; + } + this.element.innerHTML = html.join(""); + }; + + this.$textToken = { + "text": true, + "rparen": true, + "lparen": true + }; + + this.$renderToken = function(stringBuilder, screenColumn, token, value) { + var self = this; + var replaceReg = /\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g; + var replaceFunc = function(c, a, b, tabIdx, idx4) { + if (a) { + return self.showInvisibles + ? "" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "" + : c; + } else if (c == "&") { + return "&"; + } else if (c == "<") { + return "<"; + } else if (c == ">") { + return ">"; + } else if (c == "\t") { + var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx); + screenColumn += tabSize - 1; + return self.$tabStrings[tabSize]; + } else if (c == "\u3000") { + var classToUse = self.showInvisibles ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk"; + var space = self.showInvisibles ? self.SPACE_CHAR : ""; + screenColumn += 1; + return "" + space + ""; + } else if (b) { + return "" + self.SPACE_CHAR + ""; + } else { + screenColumn += 1; + return "" + c + ""; + } + }; + + var output = value.replace(replaceReg, replaceFunc); + + if (!this.$textToken[token.type]) { + var classes = "ace_" + token.type.replace(/\./g, " ace_"); + var style = ""; + if (token.type == "fold") + style = " style='width:" + (token.value.length * this.config.characterWidth) + "px;' "; + stringBuilder.push("", output, ""); + } + else { + stringBuilder.push(output); + } + return screenColumn + value.length; + }; + + this.renderIndentGuide = function(stringBuilder, value, max) { + var cols = value.search(this.$indentGuideRe); + if (cols <= 0 || cols >= max) + return value; + if (value[0] == " ") { + cols -= cols % this.tabSize; + stringBuilder.push(lang.stringRepeat(this.$tabStrings[" "], cols/this.tabSize)); + return value.substr(cols); + } else if (value[0] == "\t") { + stringBuilder.push(lang.stringRepeat(this.$tabStrings["\t"], cols)); + return value.substr(cols); + } + return value; + }; + + this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) { + var chars = 0; + var split = 0; + var splitChars = splits[0]; + var screenColumn = 0; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + var value = token.value; + if (i == 0 && this.displayIndentGuides) { + chars = value.length; + value = this.renderIndentGuide(stringBuilder, value, splitChars); + if (!value) + continue; + chars -= value.length; + } + + if (chars + value.length < splitChars) { + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + chars += value.length; + } else { + while (chars + value.length >= splitChars) { + screenColumn = this.$renderToken( + stringBuilder, screenColumn, + token, value.substring(0, splitChars - chars) + ); + value = value.substring(splitChars - chars); + chars = splitChars; + + if (!onlyContents) { + stringBuilder.push("
      ", + "
      " + ); + } + + stringBuilder.push(lang.stringRepeat("\xa0", splits.indent)); + + split ++; + screenColumn = 0; + splitChars = splits[split] || Number.MAX_VALUE; + } + if (value.length != 0) { + chars += value.length; + screenColumn = this.$renderToken( + stringBuilder, screenColumn, token, value + ); + } + } + } + }; + + this.$renderSimpleLine = function(stringBuilder, tokens) { + var screenColumn = 0; + var token = tokens[0]; + var value = token.value; + if (this.displayIndentGuides) + value = this.renderIndentGuide(stringBuilder, value); + if (value) + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + for (var i = 1; i < tokens.length; i++) { + token = tokens[i]; + value = token.value; + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + } + }; + this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) { + if (!foldLine && foldLine != false) + foldLine = this.session.getFoldLine(row); + + if (foldLine) + var tokens = this.$getFoldLineTokens(row, foldLine); + else + var tokens = this.session.getTokens(row); + + + if (!onlyContents) { + stringBuilder.push( + "
      " + ); + } + + if (tokens.length) { + var splits = this.session.getRowSplitData(row); + if (splits && splits.length) + this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents); + else + this.$renderSimpleLine(stringBuilder, tokens); + } + + if (this.showInvisibles) { + if (foldLine) + row = foldLine.end.row + + stringBuilder.push( + "", + row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR, + "" + ); + } + if (!onlyContents) + stringBuilder.push("
      "); + }; + + this.$getFoldLineTokens = function(row, foldLine) { + var session = this.session; + var renderTokens = []; + + function addTokens(tokens, from, to) { + var idx = 0, col = 0; + while ((col + tokens[idx].value.length) < from) { + col += tokens[idx].value.length; + idx++; + + if (idx == tokens.length) + return; + } + if (col != from) { + var value = tokens[idx].value.substring(from - col); + if (value.length > (to - from)) + value = value.substring(0, to - from); + + renderTokens.push({ + type: tokens[idx].type, + value: value + }); + + col = from + value.length; + idx += 1; + } + + while (col < to && idx < tokens.length) { + var value = tokens[idx].value; + if (value.length + col > to) { + renderTokens.push({ + type: tokens[idx].type, + value: value.substring(0, to - col) + }); + } else + renderTokens.push(tokens[idx]); + col += value.length; + idx += 1; + } + } + + var tokens = session.getTokens(row); + foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { + if (placeholder != null) { + renderTokens.push({ + type: "fold", + value: placeholder + }); + } else { + if (isNewRow) + tokens = session.getTokens(row); + + if (tokens.length) + addTokens(tokens, lastColumn, column); + } + }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); + + return renderTokens; + }; + + this.$useLineGroups = function() { + return this.session.getUseWrapMode(); + }; + + this.destroy = function() { + clearInterval(this.$pollSizeChangesTimer); + if (this.$measureNode) + this.$measureNode.parentNode.removeChild(this.$measureNode); + delete this.$measureNode; + }; + +}).call(Text.prototype); + +exports.Text = Text; + +}); + +ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var isIE8; + +var Cursor = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_cursor-layer"; + parentEl.appendChild(this.element); + + if (isIE8 === undefined) + isIE8 = !("opacity" in this.element.style); + + this.isVisible = false; + this.isBlinking = true; + this.blinkInterval = 1000; + this.smoothBlinking = false; + + this.cursors = []; + this.cursor = this.addCursor(); + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.$updateCursors = (isIE8 + ? this.$updateVisibility + : this.$updateOpacity).bind(this); +}; + +(function() { + + this.$updateVisibility = function(val) { + var cursors = this.cursors; + for (var i = cursors.length; i--; ) + cursors[i].style.visibility = val ? "" : "hidden"; + }; + this.$updateOpacity = function(val) { + var cursors = this.cursors; + for (var i = cursors.length; i--; ) + cursors[i].style.opacity = val ? "" : "0"; + }; + + + this.$padding = 0; + this.setPadding = function(padding) { + this.$padding = padding; + }; + + this.setSession = function(session) { + this.session = session; + }; + + this.setBlinking = function(blinking) { + if (blinking != this.isBlinking){ + this.isBlinking = blinking; + this.restartTimer(); + } + }; + + this.setBlinkInterval = function(blinkInterval) { + if (blinkInterval != this.blinkInterval){ + this.blinkInterval = blinkInterval; + this.restartTimer(); + } + }; + + this.setSmoothBlinking = function(smoothBlinking) { + if (smoothBlinking != this.smoothBlinking && !isIE8) { + this.smoothBlinking = smoothBlinking; + dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking); + this.$updateCursors(true); + this.$updateCursors = (this.$updateOpacity).bind(this); + this.restartTimer(); + } + }; + + this.addCursor = function() { + var el = dom.createElement("div"); + el.className = "ace_cursor"; + this.element.appendChild(el); + this.cursors.push(el); + return el; + }; + + this.removeCursor = function() { + if (this.cursors.length > 1) { + var el = this.cursors.pop(); + el.parentNode.removeChild(el); + return el; + } + }; + + this.hideCursor = function() { + this.isVisible = false; + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + + this.showCursor = function() { + this.isVisible = true; + dom.removeCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + + this.restartTimer = function() { + var update = this.$updateCursors; + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + if (this.smoothBlinking) { + dom.removeCssClass(this.element, "ace_smooth-blinking"); + } + + update(true); + + if (!this.isBlinking || !this.blinkInterval || !this.isVisible) + return; + + if (this.smoothBlinking) { + setTimeout(function(){ + dom.addCssClass(this.element, "ace_smooth-blinking"); + }.bind(this)); + } + + var blink = function(){ + this.timeoutId = setTimeout(function() { + update(false); + }, 0.6 * this.blinkInterval); + }.bind(this); + + this.intervalId = setInterval(function() { + update(true); + blink(); + }, this.blinkInterval); + + blink(); + }; + + this.getPixelPosition = function(position, onScreen) { + if (!this.config || !this.session) + return {left : 0, top : 0}; + + if (!position) + position = this.session.selection.getCursor(); + var pos = this.session.documentToScreenPosition(position); + var cursorLeft = this.$padding + pos.column * this.config.characterWidth; + var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * + this.config.lineHeight; + + return {left : cursorLeft, top : cursorTop}; + }; + + this.update = function(config) { + this.config = config; + + var selections = this.session.$selectionMarkers; + var i = 0, cursorIndex = 0; + + if (selections === undefined || selections.length === 0){ + selections = [{cursor: null}]; + } + + for (var i = 0, n = selections.length; i < n; i++) { + var pixelPos = this.getPixelPosition(selections[i].cursor, true); + if ((pixelPos.top > config.height + config.offset || + pixelPos.top < 0) && i > 1) { + continue; + } + + var style = (this.cursors[cursorIndex++] || this.addCursor()).style; + + if (!this.drawCursor) { + style.left = pixelPos.left + "px"; + style.top = pixelPos.top + "px"; + style.width = config.characterWidth + "px"; + style.height = config.lineHeight + "px"; + } else { + this.drawCursor(style, pixelPos, config, selections[i], this.session); + } + } + while (this.cursors.length > cursorIndex) + this.removeCursor(); + + var overwrite = this.session.getOverwrite(); + this.$setOverwrite(overwrite); + this.$pixelPos = pixelPos; + this.restartTimer(); + }; + + this.drawCursor = null; + + this.$setOverwrite = function(overwrite) { + if (overwrite != this.overwrite) { + this.overwrite = overwrite; + if (overwrite) + dom.addCssClass(this.element, "ace_overwrite-cursors"); + else + dom.removeCssClass(this.element, "ace_overwrite-cursors"); + } + }; + + this.destroy = function() { + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + }; + +}).call(Cursor.prototype); + +exports.Cursor = Cursor; + +}); + +ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var MAX_SCROLL_H = 0x8000; +var ScrollBar = function(parent) { + this.element = dom.createElement("div"); + this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix; + + this.inner = dom.createElement("div"); + this.inner.className = "ace_scrollbar-inner"; + this.element.appendChild(this.inner); + + parent.appendChild(this.element); + + this.setVisible(false); + this.skipEvent = false; + + event.addListener(this.element, "scroll", this.onScroll.bind(this)); + event.addListener(this.element, "mousedown", event.preventDefault); +}; + +(function() { + oop.implement(this, EventEmitter); + + this.setVisible = function(isVisible) { + this.element.style.display = isVisible ? "" : "none"; + this.isVisible = isVisible; + this.coeff = 1; + }; +}).call(ScrollBar.prototype); +var VScrollBar = function(parent, renderer) { + ScrollBar.call(this, parent); + this.scrollTop = 0; + this.scrollHeight = 0; + renderer.$scrollbarWidth = + this.width = dom.scrollbarWidth(parent.ownerDocument); + this.inner.style.width = + this.element.style.width = (this.width || 15) + 5 + "px"; + this.$minWidth = 0; +}; + +oop.inherits(VScrollBar, ScrollBar); + +(function() { + + this.classSuffix = '-v'; + this.onScroll = function() { + if (!this.skipEvent) { + this.scrollTop = this.element.scrollTop; + if (this.coeff != 1) { + var h = this.element.clientHeight / this.scrollHeight; + this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h); + } + this._emit("scroll", {data: this.scrollTop}); + } + this.skipEvent = false; + }; + this.getWidth = function() { + return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0); + }; + this.setHeight = function(height) { + this.element.style.height = height + "px"; + }; + this.setInnerHeight = + this.setScrollHeight = function(height) { + this.scrollHeight = height; + if (height > MAX_SCROLL_H) { + this.coeff = MAX_SCROLL_H / height; + height = MAX_SCROLL_H; + } else if (this.coeff != 1) { + this.coeff = 1 + } + this.inner.style.height = height + "px"; + }; + this.setScrollTop = function(scrollTop) { + if (this.scrollTop != scrollTop) { + this.skipEvent = true; + this.scrollTop = scrollTop; + this.element.scrollTop = scrollTop * this.coeff; + } + }; + +}).call(VScrollBar.prototype); +var HScrollBar = function(parent, renderer) { + ScrollBar.call(this, parent); + this.scrollLeft = 0; + this.height = renderer.$scrollbarWidth; + this.inner.style.height = + this.element.style.height = (this.height || 15) + 5 + "px"; +}; + +oop.inherits(HScrollBar, ScrollBar); + +(function() { + + this.classSuffix = '-h'; + this.onScroll = function() { + if (!this.skipEvent) { + this.scrollLeft = this.element.scrollLeft; + this._emit("scroll", {data: this.scrollLeft}); + } + this.skipEvent = false; + }; + this.getHeight = function() { + return this.isVisible ? this.height : 0; + }; + this.setWidth = function(width) { + this.element.style.width = width + "px"; + }; + this.setInnerWidth = function(width) { + this.inner.style.width = width + "px"; + }; + this.setScrollWidth = function(width) { + this.inner.style.width = width + "px"; + }; + this.setScrollLeft = function(scrollLeft) { + if (this.scrollLeft != scrollLeft) { + this.skipEvent = true; + this.scrollLeft = this.element.scrollLeft = scrollLeft; + } + }; + +}).call(HScrollBar.prototype); + + +exports.ScrollBar = VScrollBar; // backward compatibility +exports.ScrollBarV = VScrollBar; // backward compatibility +exports.ScrollBarH = HScrollBar; // backward compatibility + +exports.VScrollBar = VScrollBar; +exports.HScrollBar = HScrollBar; +}); + +ace.define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module) { +"use strict"; + +var event = require("./lib/event"); + + +var RenderLoop = function(onRender, win) { + this.onRender = onRender; + this.pending = false; + this.changes = 0; + this.window = win || window; +}; + +(function() { + + + this.schedule = function(change) { + this.changes = this.changes | change; + if (!this.pending && this.changes) { + this.pending = true; + var _self = this; + event.nextFrame(function() { + _self.pending = false; + var changes; + while (changes = _self.changes) { + _self.changes = 0; + _self.onRender(changes); + } + }, this.window); + } + }; + +}).call(RenderLoop.prototype); + +exports.RenderLoop = RenderLoop; +}); + +ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var useragent = require("../lib/useragent"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var CHAR_COUNT = 0; + +var FontMetrics = exports.FontMetrics = function(parentEl) { + this.el = dom.createElement("div"); + this.$setMeasureNodeStyles(this.el.style, true); + + this.$main = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$main.style); + + this.$measureNode = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$measureNode.style); + + + this.el.appendChild(this.$main); + this.el.appendChild(this.$measureNode); + parentEl.appendChild(this.el); + + if (!CHAR_COUNT) + this.$testFractionalRect(); + this.$measureNode.innerHTML = lang.stringRepeat("X", CHAR_COUNT); + + this.$characterSize = {width: 0, height: 0}; + this.checkForSizeChanges(); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.$characterSize = {width: 0, height: 0}; + + this.$testFractionalRect = function() { + var el = dom.createElement("div"); + this.$setMeasureNodeStyles(el.style); + el.style.width = "0.2px"; + document.documentElement.appendChild(el); + var w = el.getBoundingClientRect().width; + if (w > 0 && w < 1) + CHAR_COUNT = 50; + else + CHAR_COUNT = 100; + el.parentNode.removeChild(el); + }; + + this.$setMeasureNodeStyles = function(style, isRoot) { + style.width = style.height = "auto"; + style.left = style.top = "0px"; + style.visibility = "hidden"; + style.position = "absolute"; + style.whiteSpace = "pre"; + + if (useragent.isIE < 8) { + style["font-family"] = "inherit"; + } else { + style.font = "inherit"; + } + style.overflow = isRoot ? "hidden" : "visible"; + }; + + this.checkForSizeChanges = function() { + var size = this.$measureSizes(); + if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) { + this.$measureNode.style.fontWeight = "bold"; + var boldSize = this.$measureSizes(); + this.$measureNode.style.fontWeight = ""; + this.$characterSize = size; + this.charSizes = Object.create(null); + this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height; + this._emit("changeCharacterSize", {data: size}); + } + }; + + this.$pollSizeChanges = function() { + if (this.$pollSizeChangesTimer) + return this.$pollSizeChangesTimer; + var self = this; + return this.$pollSizeChangesTimer = setInterval(function() { + self.checkForSizeChanges(); + }, 500); + }; + + this.setPolling = function(val) { + if (val) { + this.$pollSizeChanges(); + } else if (this.$pollSizeChangesTimer) { + clearInterval(this.$pollSizeChangesTimer); + this.$pollSizeChangesTimer = 0; + } + }; + + this.$measureSizes = function() { + if (CHAR_COUNT === 50) { + var rect = null; + try { + rect = this.$measureNode.getBoundingClientRect(); + } catch(e) { + rect = {width: 0, height:0 }; + } + var size = { + height: rect.height, + width: rect.width / CHAR_COUNT + }; + } else { + var size = { + height: this.$measureNode.clientHeight, + width: this.$measureNode.clientWidth / CHAR_COUNT + }; + } + if (size.width === 0 || size.height === 0) + return null; + return size; + }; + + this.$measureCharWidth = function(ch) { + this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT); + var rect = this.$main.getBoundingClientRect(); + return rect.width / CHAR_COUNT; + }; + + this.getCharacterWidth = function(ch) { + var w = this.charSizes[ch]; + if (w === undefined) { + w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width; + } + return w; + }; + + this.destroy = function() { + clearInterval(this.$pollSizeChangesTimer); + if (this.el && this.el.parentNode) + this.el.parentNode.removeChild(this.el); + }; + +}).call(FontMetrics.prototype); + +}); + +ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var config = require("./config"); +var useragent = require("./lib/useragent"); +var GutterLayer = require("./layer/gutter").Gutter; +var MarkerLayer = require("./layer/marker").Marker; +var TextLayer = require("./layer/text").Text; +var CursorLayer = require("./layer/cursor").Cursor; +var HScrollBar = require("./scrollbar").HScrollBar; +var VScrollBar = require("./scrollbar").VScrollBar; +var RenderLoop = require("./renderloop").RenderLoop; +var FontMetrics = require("./layer/font_metrics").FontMetrics; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var editorCss = ".ace_editor {\ +position: relative;\ +overflow: hidden;\ +font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ +direction: ltr;\ +text-align: left;\ +-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\ +}\ +.ace_scroller {\ +position: absolute;\ +overflow: hidden;\ +top: 0;\ +bottom: 0;\ +background-color: inherit;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +cursor: text;\ +}\ +.ace_content {\ +position: absolute;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +min-width: 100%;\ +}\ +.ace_dragging .ace_scroller:before{\ +position: absolute;\ +top: 0;\ +left: 0;\ +right: 0;\ +bottom: 0;\ +content: '';\ +background: rgba(250, 250, 250, 0.01);\ +z-index: 1000;\ +}\ +.ace_dragging.ace_dark .ace_scroller:before{\ +background: rgba(0, 0, 0, 0.01);\ +}\ +.ace_selecting, .ace_selecting * {\ +cursor: text !important;\ +}\ +.ace_gutter {\ +position: absolute;\ +overflow : hidden;\ +width: auto;\ +top: 0;\ +bottom: 0;\ +left: 0;\ +cursor: default;\ +z-index: 4;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +}\ +.ace_gutter-active-line {\ +position: absolute;\ +left: 0;\ +right: 0;\ +}\ +.ace_scroller.ace_scroll-left {\ +box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\ +}\ +.ace_gutter-cell {\ +padding-left: 19px;\ +padding-right: 6px;\ +background-repeat: no-repeat;\ +}\ +.ace_gutter-cell.ace_error {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\ +background-repeat: no-repeat;\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_warning {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\ +background-position: 2px center;\ +}\ +.ace_dark .ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\ +}\ +.ace_scrollbar {\ +position: absolute;\ +right: 0;\ +bottom: 0;\ +z-index: 6;\ +}\ +.ace_scrollbar-inner {\ +position: absolute;\ +cursor: text;\ +left: 0;\ +top: 0;\ +}\ +.ace_scrollbar-v{\ +overflow-x: hidden;\ +overflow-y: scroll;\ +top: 0;\ +}\ +.ace_scrollbar-h {\ +overflow-x: scroll;\ +overflow-y: hidden;\ +left: 0;\ +}\ +.ace_print-margin {\ +position: absolute;\ +height: 100%;\ +}\ +.ace_text-input {\ +position: absolute;\ +z-index: 0;\ +width: 0.5em;\ +height: 1em;\ +opacity: 0;\ +background: transparent;\ +-moz-appearance: none;\ +appearance: none;\ +border: none;\ +resize: none;\ +outline: none;\ +overflow: hidden;\ +font: inherit;\ +padding: 0 1px;\ +margin: 0 -1px;\ +text-indent: -1em;\ +-ms-user-select: text;\ +-moz-user-select: text;\ +-webkit-user-select: text;\ +user-select: text;\ +white-space: pre!important;\ +}\ +.ace_text-input.ace_composition {\ +background: inherit;\ +color: inherit;\ +z-index: 1000;\ +opacity: 1;\ +text-indent: 0;\ +}\ +.ace_layer {\ +z-index: 1;\ +position: absolute;\ +overflow: hidden;\ +word-wrap: normal;\ +white-space: pre;\ +height: 100%;\ +width: 100%;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +pointer-events: none;\ +}\ +.ace_gutter-layer {\ +position: relative;\ +width: auto;\ +text-align: right;\ +pointer-events: auto;\ +}\ +.ace_text-layer {\ +font: inherit !important;\ +}\ +.ace_cjk {\ +display: inline-block;\ +text-align: center;\ +}\ +.ace_cursor-layer {\ +z-index: 4;\ +}\ +.ace_cursor {\ +z-index: 4;\ +position: absolute;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +border-left: 2px solid;\ +transform: translatez(0);\ +}\ +.ace_multiselect .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_slim-cursors .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_overwrite-cursors .ace_cursor {\ +border-left-width: 0;\ +border-bottom: 1px solid;\ +}\ +.ace_hidden-cursors .ace_cursor {\ +opacity: 0.2;\ +}\ +.ace_smooth-blinking .ace_cursor {\ +-webkit-transition: opacity 0.18s;\ +transition: opacity 0.18s;\ +}\ +.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\ +position: absolute;\ +z-index: 3;\ +}\ +.ace_marker-layer .ace_selection {\ +position: absolute;\ +z-index: 5;\ +}\ +.ace_marker-layer .ace_bracket {\ +position: absolute;\ +z-index: 6;\ +}\ +.ace_marker-layer .ace_active-line {\ +position: absolute;\ +z-index: 2;\ +}\ +.ace_marker-layer .ace_selected-word {\ +position: absolute;\ +z-index: 4;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +}\ +.ace_line .ace_fold {\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +display: inline-block;\ +height: 11px;\ +margin-top: -2px;\ +vertical-align: middle;\ +background-image:\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\ +background-repeat: no-repeat, repeat-x;\ +background-position: center center, top left;\ +color: transparent;\ +border: 1px solid black;\ +border-radius: 2px;\ +cursor: pointer;\ +pointer-events: auto;\ +}\ +.ace_dark .ace_fold {\ +}\ +.ace_fold:hover{\ +background-image:\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\ +}\ +.ace_tooltip {\ +background-color: #FFF;\ +background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\ +background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\ +border: 1px solid gray;\ +border-radius: 1px;\ +box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\ +color: black;\ +max-width: 100%;\ +padding: 3px 4px;\ +position: fixed;\ +z-index: 999999;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +cursor: default;\ +white-space: pre;\ +word-wrap: break-word;\ +line-height: normal;\ +font-style: normal;\ +font-weight: normal;\ +letter-spacing: normal;\ +pointer-events: none;\ +}\ +.ace_folding-enabled > .ace_gutter-cell {\ +padding-right: 13px;\ +}\ +.ace_fold-widget {\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +margin: 0 -12px 0 1px;\ +display: none;\ +width: 11px;\ +vertical-align: top;\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\ +background-repeat: no-repeat;\ +background-position: center;\ +border-radius: 3px;\ +border: 1px solid transparent;\ +cursor: pointer;\ +}\ +.ace_folding-enabled .ace_fold-widget {\ +display: inline-block; \ +}\ +.ace_fold-widget.ace_end {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\ +}\ +.ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\ +}\ +.ace_fold-widget:hover {\ +border: 1px solid rgba(0, 0, 0, 0.3);\ +background-color: rgba(255, 255, 255, 0.2);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ +}\ +.ace_fold-widget:active {\ +border: 1px solid rgba(0, 0, 0, 0.4);\ +background-color: rgba(0, 0, 0, 0.05);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ +}\ +.ace_dark .ace_fold-widget {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\ +}\ +.ace_dark .ace_fold-widget.ace_end {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\ +}\ +.ace_dark .ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\ +}\ +.ace_dark .ace_fold-widget:hover {\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +background-color: rgba(255, 255, 255, 0.1);\ +}\ +.ace_dark .ace_fold-widget:active {\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +}\ +.ace_fold-widget.ace_invalid {\ +background-color: #FFB4B4;\ +border-color: #DE5555;\ +}\ +.ace_fade-fold-widgets .ace_fold-widget {\ +-webkit-transition: opacity 0.4s ease 0.05s;\ +transition: opacity 0.4s ease 0.05s;\ +opacity: 0;\ +}\ +.ace_fade-fold-widgets:hover .ace_fold-widget {\ +-webkit-transition: opacity 0.05s ease 0.05s;\ +transition: opacity 0.05s ease 0.05s;\ +opacity:1;\ +}\ +.ace_underline {\ +text-decoration: underline;\ +}\ +.ace_bold {\ +font-weight: bold;\ +}\ +.ace_nobold .ace_bold {\ +font-weight: normal;\ +}\ +.ace_italic {\ +font-style: italic;\ +}\ +.ace_error-marker {\ +background-color: rgba(255, 0, 0,0.2);\ +position: absolute;\ +z-index: 9;\ +}\ +.ace_highlight-marker {\ +background-color: rgba(255, 255, 0,0.2);\ +position: absolute;\ +z-index: 8;\ +}\ +.ace_br1 {border-top-left-radius : 3px;}\ +.ace_br2 {border-top-right-radius : 3px;}\ +.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\ +.ace_br4 {border-bottom-right-radius: 3px;}\ +.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\ +.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\ +.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\ +.ace_br8 {border-bottom-left-radius : 3px;}\ +.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\ +.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\ +.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_text-input-ios {\ +position: absolute !important;\ +top: -100000px !important;\ +left: -100000px !important;\ +}\ +"; + +dom.importCssString(editorCss, "ace_editor.css"); + +var VirtualRenderer = function(container, theme) { + var _self = this; + + this.container = container || dom.createElement("div"); + this.$keepTextAreaAtCursor = !useragent.isOldIE; + + dom.addCssClass(this.container, "ace_editor"); + + this.setTheme(theme); + + this.$gutter = dom.createElement("div"); + this.$gutter.className = "ace_gutter"; + this.container.appendChild(this.$gutter); + + this.scroller = dom.createElement("div"); + this.scroller.className = "ace_scroller"; + this.container.appendChild(this.scroller); + + this.content = dom.createElement("div"); + this.content.className = "ace_content"; + this.scroller.appendChild(this.content); + + this.$gutterLayer = new GutterLayer(this.$gutter); + this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); + + this.$markerBack = new MarkerLayer(this.content); + + var textLayer = this.$textLayer = new TextLayer(this.content); + this.canvas = textLayer.element; + + this.$markerFront = new MarkerLayer(this.content); + + this.$cursorLayer = new CursorLayer(this.content); + this.$horizScroll = false; + this.$vScroll = false; + + this.scrollBar = + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.addEventListener("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + + this.scrollTop = 0; + this.scrollLeft = 0; + + this.cursorPos = { + row : 0, + column : 0 + }; + + this.$fontMetrics = new FontMetrics(this.container); + this.$textLayer.$setFontMetrics(this.$fontMetrics); + this.$textLayer.addEventListener("changeCharacterSize", function(e) { + _self.updateCharacterSize(); + _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); + _self._signal("changeCharacterSize", e); + }); + + this.$size = { + width: 0, + height: 0, + scrollerHeight: 0, + scrollerWidth: 0, + $dirty: true + }; + + this.layerConfig = { + width : 1, + padding : 0, + firstRow : 0, + firstRowScreen: 0, + lastRow : 0, + lineHeight : 0, + characterWidth : 0, + minHeight : 1, + maxHeight : 1, + offset : 0, + height : 1, + gutterOffset: 1 + }; + + this.scrollMargin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + + this.$loop = new RenderLoop( + this.$renderChanges.bind(this), + this.container.ownerDocument.defaultView + ); + this.$loop.schedule(this.CHANGE_FULL); + + this.updateCharacterSize(); + this.setPadding(4); + config.resetOptions(this); + config._emit("renderer", this); +}; + +(function() { + + this.CHANGE_CURSOR = 1; + this.CHANGE_MARKER = 2; + this.CHANGE_GUTTER = 4; + this.CHANGE_SCROLL = 8; + this.CHANGE_LINES = 16; + this.CHANGE_TEXT = 32; + this.CHANGE_SIZE = 64; + this.CHANGE_MARKER_BACK = 128; + this.CHANGE_MARKER_FRONT = 256; + this.CHANGE_FULL = 512; + this.CHANGE_H_SCROLL = 1024; + + oop.implement(this, EventEmitter); + + this.updateCharacterSize = function() { + if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { + this.$allowBoldFonts = this.$textLayer.allowBoldFonts; + this.setStyle("ace_nobold", !this.$allowBoldFonts); + } + + this.layerConfig.characterWidth = + this.characterWidth = this.$textLayer.getCharacterWidth(); + this.layerConfig.lineHeight = + this.lineHeight = this.$textLayer.getLineHeight(); + this.$updatePrintMargin(); + }; + this.setSession = function(session) { + if (this.session) + this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); + + this.session = session; + if (session && this.scrollMargin.top && session.getScrollTop() <= 0) + session.setScrollTop(-this.scrollMargin.top); + + this.$cursorLayer.setSession(session); + this.$markerBack.setSession(session); + this.$markerFront.setSession(session); + this.$gutterLayer.setSession(session); + this.$textLayer.setSession(session); + if (!session) + return; + + this.$loop.schedule(this.CHANGE_FULL); + this.session.$setFontMetrics(this.$fontMetrics); + this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; + + this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this); + this.onChangeNewLineMode() + this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); + }; + this.updateLines = function(firstRow, lastRow, force) { + if (lastRow === undefined) + lastRow = Infinity; + + if (!this.$changedLines) { + this.$changedLines = { + firstRow: firstRow, + lastRow: lastRow + }; + } + else { + if (this.$changedLines.firstRow > firstRow) + this.$changedLines.firstRow = firstRow; + + if (this.$changedLines.lastRow < lastRow) + this.$changedLines.lastRow = lastRow; + } + if (this.$changedLines.lastRow < this.layerConfig.firstRow) { + if (force) + this.$changedLines.lastRow = this.layerConfig.lastRow; + else + return; + } + if (this.$changedLines.firstRow > this.layerConfig.lastRow) + return; + this.$loop.schedule(this.CHANGE_LINES); + }; + + this.onChangeNewLineMode = function() { + this.$loop.schedule(this.CHANGE_TEXT); + this.$textLayer.$updateEolChar(); + }; + + this.onChangeTabSize = function() { + this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); + this.$textLayer.onChangeTabSize(); + }; + this.updateText = function() { + this.$loop.schedule(this.CHANGE_TEXT); + }; + this.updateFull = function(force) { + if (force) + this.$renderChanges(this.CHANGE_FULL, true); + else + this.$loop.schedule(this.CHANGE_FULL); + }; + this.updateFontSize = function() { + this.$textLayer.checkForSizeChanges(); + }; + + this.$changes = 0; + this.$updateSizeAsync = function() { + if (this.$loop.pending) + this.$size.$dirty = true; + else + this.onResize(); + }; + this.onResize = function(force, gutterWidth, width, height) { + if (this.resizing > 2) + return; + else if (this.resizing > 0) + this.resizing++; + else + this.resizing = force ? 1 : 0; + var el = this.container; + if (!height) + height = el.clientHeight || el.scrollHeight; + if (!width) + width = el.clientWidth || el.scrollWidth; + var changes = this.$updateCachedSize(force, gutterWidth, width, height); + + + if (!this.$size.scrollerHeight || (!width && !height)) + return this.resizing = 0; + + if (force) + this.$gutterLayer.$padding = null; + + if (force) + this.$renderChanges(changes | this.$changes, true); + else + this.$loop.schedule(changes | this.$changes); + + if (this.resizing) + this.resizing = 0; + this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null; + }; + + this.$updateCachedSize = function(force, gutterWidth, width, height) { + height -= (this.$extraHeight || 0); + var changes = 0; + var size = this.$size; + var oldSize = { + width: size.width, + height: size.height, + scrollerHeight: size.scrollerHeight, + scrollerWidth: size.scrollerWidth + }; + if (height && (force || size.height != height)) { + size.height = height; + changes |= this.CHANGE_SIZE; + + size.scrollerHeight = size.height; + if (this.$horizScroll) + size.scrollerHeight -= this.scrollBarH.getHeight(); + this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; + + changes = changes | this.CHANGE_SCROLL; + } + + if (width && (force || size.width != width)) { + changes |= this.CHANGE_SIZE; + size.width = width; + + if (gutterWidth == null) + gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + + this.gutterWidth = gutterWidth; + + this.scrollBarH.element.style.left = + this.scroller.style.left = gutterWidth + "px"; + size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); + + this.scrollBarH.element.style.right = + this.scroller.style.right = this.scrollBarV.getWidth() + "px"; + this.scroller.style.bottom = this.scrollBarH.getHeight() + "px"; + + if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) + changes |= this.CHANGE_FULL; + } + + size.$dirty = !width || !height; + + if (changes) + this._signal("resize", oldSize); + + return changes; + }; + + this.onGutterResize = function() { + var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + if (gutterWidth != this.gutterWidth) + this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); + + if (this.session.getUseWrapMode() && this.adjustWrapLimit()) { + this.$loop.schedule(this.CHANGE_FULL); + } else if (this.$size.$dirty) { + this.$loop.schedule(this.CHANGE_FULL); + } else { + this.$computeLayerConfig(); + this.$loop.schedule(this.CHANGE_MARKER); + } + }; + this.adjustWrapLimit = function() { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth); + return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); + }; + this.setAnimatedScroll = function(shouldAnimate){ + this.setOption("animatedScroll", shouldAnimate); + }; + this.getAnimatedScroll = function() { + return this.$animatedScroll; + }; + this.setShowInvisibles = function(showInvisibles) { + this.setOption("showInvisibles", showInvisibles); + }; + this.getShowInvisibles = function() { + return this.getOption("showInvisibles"); + }; + this.getDisplayIndentGuides = function() { + return this.getOption("displayIndentGuides"); + }; + + this.setDisplayIndentGuides = function(display) { + this.setOption("displayIndentGuides", display); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.setOption("showPrintMargin", showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.getOption("showPrintMargin"); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.setOption("printMarginColumn", showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.getOption("printMarginColumn"); + }; + this.getShowGutter = function(){ + return this.getOption("showGutter"); + }; + this.setShowGutter = function(show){ + return this.setOption("showGutter", show); + }; + + this.getFadeFoldWidgets = function(){ + return this.getOption("fadeFoldWidgets") + }; + + this.setFadeFoldWidgets = function(show) { + this.setOption("fadeFoldWidgets", show); + }; + + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + + this.$updateGutterLineHighlight = function() { + var pos = this.$cursorLayer.$pixelPos; + var height = this.layerConfig.lineHeight; + if (this.session.getUseWrapMode()) { + var cursor = this.session.selection.getCursor(); + cursor.column = 0; + pos = this.$cursorLayer.getPixelPosition(cursor, true); + height *= this.session.getRowLength(cursor.row); + } + this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + "px"; + this.$gutterLineHighlight.style.height = height + "px"; + }; + + this.$updatePrintMargin = function() { + if (!this.$showPrintMargin && !this.$printMarginEl) + return; + + if (!this.$printMarginEl) { + var containerEl = dom.createElement("div"); + containerEl.className = "ace_layer ace_print-margin-layer"; + this.$printMarginEl = dom.createElement("div"); + this.$printMarginEl.className = "ace_print-margin"; + containerEl.appendChild(this.$printMarginEl); + this.content.insertBefore(containerEl, this.content.firstChild); + } + + var style = this.$printMarginEl.style; + style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + "px"; + style.visibility = this.$showPrintMargin ? "visible" : "hidden"; + + if (this.session && this.session.$wrap == -1) + this.adjustWrapLimit(); + }; + this.getContainerElement = function() { + return this.container; + }; + this.getMouseEventTarget = function() { + return this.scroller; + }; + this.getTextAreaContainer = function() { + return this.container; + }; + this.$moveTextAreaToCursor = function() { + if (!this.$keepTextAreaAtCursor) + return; + var config = this.layerConfig; + var posTop = this.$cursorLayer.$pixelPos.top; + var posLeft = this.$cursorLayer.$pixelPos.left; + posTop -= config.offset; + + var style = this.textarea.style; + var h = this.lineHeight; + if (posTop < 0 || posTop > config.height - h) { + style.top = style.left = "0"; + return; + } + + var w = this.characterWidth; + if (this.$composition) { + var val = this.textarea.value.replace(/^\x01+/, ""); + w *= (this.session.$getStringScreenWidth(val)[0]+2); + h += 2; + } + posLeft -= this.scrollLeft; + if (posLeft > this.$size.scrollerWidth - w) + posLeft = this.$size.scrollerWidth - w; + + posLeft += this.gutterWidth; + style.height = h + "px"; + style.width = w + "px"; + style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + "px"; + style.top = Math.min(posTop, this.$size.height - h) + "px"; + }; + this.getFirstVisibleRow = function() { + return this.layerConfig.firstRow; + }; + this.getFirstFullyVisibleRow = function() { + return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); + }; + this.getLastFullyVisibleRow = function() { + var config = this.layerConfig; + var lastRow = config.lastRow + var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight; + if (top - this.session.getScrollTop() > config.height - config.lineHeight) + return lastRow - 1; + return lastRow; + }; + this.getLastVisibleRow = function() { + return this.layerConfig.lastRow; + }; + + this.$padding = null; + this.setPadding = function(padding) { + this.$padding = padding; + this.$textLayer.setPadding(padding); + this.$cursorLayer.setPadding(padding); + this.$markerFront.setPadding(padding); + this.$markerBack.setPadding(padding); + this.$loop.schedule(this.CHANGE_FULL); + this.$updatePrintMargin(); + }; + + this.setScrollMargin = function(top, bottom, left, right) { + var sm = this.scrollMargin; + sm.top = top|0; + sm.bottom = bottom|0; + sm.right = right|0; + sm.left = left|0; + sm.v = sm.top + sm.bottom; + sm.h = sm.left + sm.right; + if (sm.top && this.scrollTop <= 0 && this.session) + this.session.setScrollTop(-sm.top); + this.updateFull(); + }; + this.getHScrollBarAlwaysVisible = function() { + return this.$hScrollBarAlwaysVisible; + }; + this.setHScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("hScrollBarAlwaysVisible", alwaysVisible); + }; + this.getVScrollBarAlwaysVisible = function() { + return this.$vScrollBarAlwaysVisible; + }; + this.setVScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("vScrollBarAlwaysVisible", alwaysVisible); + }; + + this.$updateScrollBarV = function() { + var scrollHeight = this.layerConfig.maxHeight; + var scrollerHeight = this.$size.scrollerHeight; + if (!this.$maxLines && this.$scrollPastEnd) { + scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd; + if (this.scrollTop > scrollHeight - scrollerHeight) { + scrollHeight = this.scrollTop + scrollerHeight; + this.scrollBarV.scrollTop = null; + } + } + this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v); + this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); + }; + this.$updateScrollBarH = function() { + this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); + this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); + }; + + this.$frozen = false; + this.freeze = function() { + this.$frozen = true; + }; + + this.unfreeze = function() { + this.$frozen = false; + }; + + this.$renderChanges = function(changes, force) { + if (this.$changes) { + changes |= this.$changes; + this.$changes = 0; + } + if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) { + this.$changes |= changes; + return; + } + if (this.$size.$dirty) { + this.$changes |= changes; + return this.onResize(true); + } + if (!this.lineHeight) { + this.$textLayer.checkForSizeChanges(); + } + + this._signal("beforeRender"); + var config = this.layerConfig; + if (changes & this.CHANGE_FULL || + changes & this.CHANGE_SIZE || + changes & this.CHANGE_TEXT || + changes & this.CHANGE_LINES || + changes & this.CHANGE_SCROLL || + changes & this.CHANGE_H_SCROLL + ) { + changes |= this.$computeLayerConfig(); + if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) { + var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight; + if (st > 0) { + this.scrollTop = st; + changes = changes | this.CHANGE_SCROLL; + changes |= this.$computeLayerConfig(); + } + } + config = this.layerConfig; + this.$updateScrollBarV(); + if (changes & this.CHANGE_H_SCROLL) + this.$updateScrollBarH(); + this.$gutterLayer.element.style.marginTop = (-config.offset) + "px"; + this.content.style.marginTop = (-config.offset) + "px"; + this.content.style.width = config.width + 2 * this.$padding + "px"; + this.content.style.height = config.minHeight + "px"; + } + if (changes & this.CHANGE_H_SCROLL) { + this.content.style.marginLeft = -this.scrollLeft + "px"; + this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; + } + if (changes & this.CHANGE_FULL) { + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + this._signal("afterRender"); + return; + } + if (changes & this.CHANGE_SCROLL) { + if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES) + this.$textLayer.update(config); + else + this.$textLayer.scrollLines(config); + + if (this.$showGutter) + this.$gutterLayer.update(config); + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + this.$moveTextAreaToCursor(); + this._signal("afterRender"); + return; + } + + if (changes & this.CHANGE_TEXT) { + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_LINES) { + if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { + if (this.$showGutter) + this.$gutterLayer.update(config); + } + + if (changes & this.CHANGE_CURSOR) { + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { + this.$markerFront.update(config); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { + this.$markerBack.update(config); + } + + this._signal("afterRender"); + }; + + + this.$autosize = function() { + var height = this.session.getScreenLength() * this.lineHeight; + var maxHeight = this.$maxLines * this.lineHeight; + var desiredHeight = Math.min(maxHeight, + Math.max((this.$minLines || 1) * this.lineHeight, height) + ) + this.scrollMargin.v + (this.$extraHeight || 0); + if (this.$horizScroll) + desiredHeight += this.scrollBarH.getHeight(); + if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight) + desiredHeight = this.$maxPixelHeight; + var vScroll = height > maxHeight; + + if (desiredHeight != this.desiredHeight || + this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { + if (vScroll != this.$vScroll) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + + var w = this.container.clientWidth; + this.container.style.height = desiredHeight + "px"; + this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); + this.desiredHeight = desiredHeight; + + this._signal("autosize"); + } + }; + + this.$computeLayerConfig = function() { + var session = this.session; + var size = this.$size; + + var hideScrollbars = size.height <= 2 * this.lineHeight; + var screenLines = this.session.getScreenLength(); + var maxHeight = screenLines * this.lineHeight; + + var longestLine = this.$getLongestLine(); + + var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || + size.scrollerWidth - longestLine - 2 * this.$padding < 0); + + var hScrollChanged = this.$horizScroll !== horizScroll; + if (hScrollChanged) { + this.$horizScroll = horizScroll; + this.scrollBarH.setVisible(horizScroll); + } + var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine + if (this.$maxLines && this.lineHeight > 1) + this.$autosize(); + + var offset = this.scrollTop % this.lineHeight; + var minHeight = size.scrollerHeight + this.lineHeight; + + var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd + ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd + : 0; + maxHeight += scrollPastEnd; + + var sm = this.scrollMargin; + this.session.setScrollTop(Math.max(-sm.top, + Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); + + this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, + longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); + + var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || + size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top); + var vScrollChanged = vScrollBefore !== vScroll; + if (vScrollChanged) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + + var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; + var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); + var lastRow = firstRow + lineCount; + var firstRowScreen, firstRowHeight; + var lineHeight = this.lineHeight; + firstRow = session.screenToDocumentRow(firstRow, 0); + var foldLine = session.getFoldLine(firstRow); + if (foldLine) { + firstRow = foldLine.start.row; + } + + firstRowScreen = session.documentToScreenRow(firstRow, 0); + firstRowHeight = session.getRowLength(firstRow) * lineHeight; + + lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); + minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + + firstRowHeight; + + offset = this.scrollTop - firstRowScreen * lineHeight; + + var changes = 0; + if (this.layerConfig.width != longestLine) + changes = this.CHANGE_H_SCROLL; + if (hScrollChanged || vScrollChanged) { + changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height); + this._signal("scrollbarVisibilityChanged"); + if (vScrollChanged) + longestLine = this.$getLongestLine(); + } + + this.layerConfig = { + width : longestLine, + padding : this.$padding, + firstRow : firstRow, + firstRowScreen: firstRowScreen, + lastRow : lastRow, + lineHeight : lineHeight, + characterWidth : this.characterWidth, + minHeight : minHeight, + maxHeight : maxHeight, + offset : offset, + gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0, + height : this.$size.scrollerHeight + }; + + return changes; + }; + + this.$updateLines = function() { + if (!this.$changedLines) return; + var firstRow = this.$changedLines.firstRow; + var lastRow = this.$changedLines.lastRow; + this.$changedLines = null; + + var layerConfig = this.layerConfig; + + if (firstRow > layerConfig.lastRow + 1) { return; } + if (lastRow < layerConfig.firstRow) { return; } + if (lastRow === Infinity) { + if (this.$showGutter) + this.$gutterLayer.update(layerConfig); + this.$textLayer.update(layerConfig); + return; + } + this.$textLayer.updateLines(layerConfig, firstRow, lastRow); + return true; + }; + + this.$getLongestLine = function() { + var charCount = this.session.getScreenWidth(); + if (this.showInvisibles && !this.session.$useWrapMode) + charCount += 1; + + return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); + }; + this.updateFrontMarkers = function() { + this.$markerFront.setMarkers(this.session.getMarkers(true)); + this.$loop.schedule(this.CHANGE_MARKER_FRONT); + }; + this.updateBackMarkers = function() { + this.$markerBack.setMarkers(this.session.getMarkers()); + this.$loop.schedule(this.CHANGE_MARKER_BACK); + }; + this.addGutterDecoration = function(row, className){ + this.$gutterLayer.addGutterDecoration(row, className); + }; + this.removeGutterDecoration = function(row, className){ + this.$gutterLayer.removeGutterDecoration(row, className); + }; + this.updateBreakpoints = function(rows) { + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.setAnnotations = function(annotations) { + this.$gutterLayer.setAnnotations(annotations); + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.updateCursor = function() { + this.$loop.schedule(this.CHANGE_CURSOR); + }; + this.hideCursor = function() { + this.$cursorLayer.hideCursor(); + }; + this.showCursor = function() { + this.$cursorLayer.showCursor(); + }; + + this.scrollSelectionIntoView = function(anchor, lead, offset) { + this.scrollCursorIntoView(anchor, offset); + this.scrollCursorIntoView(lead, offset); + }; + this.scrollCursorIntoView = function(cursor, offset, $viewMargin) { + if (this.$size.scrollerHeight === 0) + return; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + + var left = pos.left; + var top = pos.top; + + var topMargin = $viewMargin && $viewMargin.top || 0; + var bottomMargin = $viewMargin && $viewMargin.bottom || 0; + + var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; + + if (scrollTop + topMargin > top) { + if (offset && scrollTop + topMargin > top + this.lineHeight) + top -= offset * this.$size.scrollerHeight; + if (top === 0) + top = -this.scrollMargin.top; + this.session.setScrollTop(top); + } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) { + if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight) + top += offset * this.$size.scrollerHeight; + this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight); + } + + var scrollLeft = this.scrollLeft; + + if (scrollLeft > left) { + if (left < this.$padding + 2 * this.layerConfig.characterWidth) + left = -this.scrollMargin.left; + this.session.setScrollLeft(left); + } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { + this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); + } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) { + this.session.setScrollLeft(0); + } + }; + this.getScrollTop = function() { + return this.session.getScrollTop(); + }; + this.getScrollLeft = function() { + return this.session.getScrollLeft(); + }; + this.getScrollTopRow = function() { + return this.scrollTop / this.lineHeight; + }; + this.getScrollBottomRow = function() { + return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); + }; + this.scrollToRow = function(row) { + this.session.setScrollTop(row * this.lineHeight); + }; + + this.alignCursor = function(cursor, alignment) { + if (typeof cursor == "number") + cursor = {row: cursor, column: 0}; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); + + this.session.setScrollTop(offset); + return offset; + }; + + this.STEPS = 8; + this.$calcSteps = function(fromValue, toValue){ + var i = 0; + var l = this.STEPS; + var steps = []; + + var func = function(t, x_min, dx) { + return dx * (Math.pow(t - 1, 3) + 1) + x_min; + }; + + for (i = 0; i < l; ++i) + steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); + + return steps; + }; + this.scrollToLine = function(line, center, animate, callback) { + var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); + var offset = pos.top; + if (center) + offset -= this.$size.scrollerHeight / 2; + + var initialScroll = this.scrollTop; + this.session.setScrollTop(offset); + if (animate !== false) + this.animateScrolling(initialScroll, callback); + }; + + this.animateScrolling = function(fromValue, callback) { + var toValue = this.scrollTop; + if (!this.$animatedScroll) + return; + var _self = this; + + if (fromValue == toValue) + return; + + if (this.$scrollAnimation) { + var oldSteps = this.$scrollAnimation.steps; + if (oldSteps.length) { + fromValue = oldSteps[0]; + if (fromValue == toValue) + return; + } + } + + var steps = _self.$calcSteps(fromValue, toValue); + this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps}; + + clearInterval(this.$timer); + + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + this.$timer = setInterval(function() { + if (steps.length) { + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + } else if (toValue != null) { + _self.session.$scrollTop = -1; + _self.session.setScrollTop(toValue); + toValue = null; + } else { + _self.$timer = clearInterval(_self.$timer); + _self.$scrollAnimation = null; + callback && callback(); + } + }, 10); + }; + this.scrollToY = function(scrollTop) { + if (this.scrollTop !== scrollTop) { + this.$loop.schedule(this.CHANGE_SCROLL); + this.scrollTop = scrollTop; + } + }; + this.scrollToX = function(scrollLeft) { + if (this.scrollLeft !== scrollLeft) + this.scrollLeft = scrollLeft; + this.$loop.schedule(this.CHANGE_H_SCROLL); + }; + this.scrollTo = function(x, y) { + this.session.setScrollTop(y); + this.session.setScrollLeft(y); + }; + this.scrollBy = function(deltaX, deltaY) { + deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); + deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); + }; + this.isScrollableBy = function(deltaX, deltaY) { + if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) + return true; + if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight + - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) + return true; + if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) + return true; + if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth + - this.layerConfig.width < -1 + this.scrollMargin.right) + return true; + }; + + this.pixelToScreenCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth; + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + var col = Math.round(offset); + + return {row: row, column: col, side: offset - col > 0 ? 1 : -1}; + }; + + this.screenToTextCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var col = Math.round( + (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth + ); + + var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight; + + return this.session.screenToDocumentPosition(row, Math.max(col, 0)); + }; + this.textToScreenCoordinates = function(row, column) { + var canvasPos = this.scroller.getBoundingClientRect(); + var pos = this.session.documentToScreenPosition(row, column); + + var x = this.$padding + Math.round(pos.column * this.characterWidth); + var y = pos.row * this.lineHeight; + + return { + pageX: canvasPos.left + x - this.scrollLeft, + pageY: canvasPos.top + y - this.scrollTop + }; + }; + this.visualizeFocus = function() { + dom.addCssClass(this.container, "ace_focus"); + }; + this.visualizeBlur = function() { + dom.removeCssClass(this.container, "ace_focus"); + }; + this.showComposition = function(position) { + if (!this.$composition) + this.$composition = { + keepTextAreaAtCursor: this.$keepTextAreaAtCursor, + cssText: this.textarea.style.cssText + }; + + this.$keepTextAreaAtCursor = true; + dom.addCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = ""; + this.$moveTextAreaToCursor(); + }; + this.setCompositionText = function(text) { + this.$moveTextAreaToCursor(); + }; + this.hideComposition = function() { + if (!this.$composition) + return; + + dom.removeCssClass(this.textarea, "ace_composition"); + this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor; + this.textarea.style.cssText = this.$composition.cssText; + this.$composition = null; + }; + this.setTheme = function(theme, cb) { + var _self = this; + this.$themeId = theme; + _self._dispatchEvent('themeChange',{theme:theme}); + + if (!theme || typeof theme == "string") { + var moduleName = theme || this.$options.theme.initialValue; + config.loadModule(["theme", moduleName], afterLoad); + } else { + afterLoad(theme); + } + + function afterLoad(module) { + if (_self.$themeId != theme) + return cb && cb(); + if (!module || !module.cssClass) + throw new Error("couldn't load module " + theme + " or it didn't call define"); + dom.importCssString( + module.cssText, + module.cssClass, + _self.container.ownerDocument + ); + + if (_self.theme) + dom.removeCssClass(_self.container, _self.theme.cssClass); + + var padding = "padding" in module ? module.padding + : "padding" in (_self.theme || {}) ? 4 : _self.$padding; + if (_self.$padding && padding != _self.$padding) + _self.setPadding(padding); + _self.$theme = module.cssClass; + + _self.theme = module; + dom.addCssClass(_self.container, module.cssClass); + dom.setCssClass(_self.container, "ace_dark", module.isDark); + if (_self.$size) { + _self.$size.width = 0; + _self.$updateSizeAsync(); + } + + _self._dispatchEvent('themeLoaded', {theme:module}); + cb && cb(); + } + }; + this.getTheme = function() { + return this.$themeId; + }; + this.setStyle = function(style, include) { + dom.setCssClass(this.container, style, include !== false); + }; + this.unsetStyle = function(style) { + dom.removeCssClass(this.container, style); + }; + + this.setCursorStyle = function(style) { + if (this.scroller.style.cursor != style) + this.scroller.style.cursor = style; + }; + this.setMouseCursor = function(cursorStyle) { + this.scroller.style.cursor = cursorStyle; + }; + this.destroy = function() { + this.$textLayer.destroy(); + this.$cursorLayer.destroy(); + }; + +}).call(VirtualRenderer.prototype); + + +config.defineOptions(VirtualRenderer.prototype, "renderer", { + animatedScroll: {initialValue: false}, + showInvisibles: { + set: function(value) { + if (this.$textLayer.setShowInvisibles(value)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: false + }, + showPrintMargin: { + set: function() { this.$updatePrintMargin(); }, + initialValue: true + }, + printMarginColumn: { + set: function() { this.$updatePrintMargin(); }, + initialValue: 80 + }, + printMargin: { + set: function(val) { + if (typeof val == "number") + this.$printMarginColumn = val; + this.$showPrintMargin = !!val; + this.$updatePrintMargin(); + }, + get: function() { + return this.$showPrintMargin && this.$printMarginColumn; + } + }, + showGutter: { + set: function(show){ + this.$gutter.style.display = show ? "block" : "none"; + this.$loop.schedule(this.CHANGE_FULL); + this.onGutterResize(); + }, + initialValue: true + }, + fadeFoldWidgets: { + set: function(show) { + dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); + }, + initialValue: false + }, + showFoldWidgets: { + set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)}, + initialValue: true + }, + showLineNumbers: { + set: function(show) { + this.$gutterLayer.setShowLineNumbers(show); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + displayIndentGuides: { + set: function(show) { + if (this.$textLayer.setDisplayIndentGuides(show)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: true + }, + highlightGutterLine: { + set: function(shouldHighlight) { + if (!this.$gutterLineHighlight) { + this.$gutterLineHighlight = dom.createElement("div"); + this.$gutterLineHighlight.className = "ace_gutter-active-line"; + this.$gutter.appendChild(this.$gutterLineHighlight); + return; + } + + this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none"; + if (this.$cursorLayer.$pixelPos) + this.$updateGutterLineHighlight(); + }, + initialValue: false, + value: true + }, + hScrollBarAlwaysVisible: { + set: function(val) { + if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + vScrollBarAlwaysVisible: { + set: function(val) { + if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + fontSize: { + set: function(size) { + if (typeof size == "number") + size = size + "px"; + this.container.style.fontSize = size; + this.updateFontSize(); + }, + initialValue: 12 + }, + fontFamily: { + set: function(name) { + this.container.style.fontFamily = name; + this.updateFontSize(); + } + }, + maxLines: { + set: function(val) { + this.updateFull(); + } + }, + minLines: { + set: function(val) { + this.updateFull(); + } + }, + maxPixelHeight: { + set: function(val) { + this.updateFull(); + }, + initialValue: 0 + }, + scrollPastEnd: { + set: function(val) { + val = +val || 0; + if (this.$scrollPastEnd == val) + return; + this.$scrollPastEnd = val; + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: 0, + handlesSet: true + }, + fixedWidthGutter: { + set: function(val) { + this.$gutterLayer.$fixedWidth = !!val; + this.$loop.schedule(this.CHANGE_GUTTER); + } + }, + theme: { + set: function(val) { this.setTheme(val) }, + get: function() { return this.$themeId || this.theme; }, + initialValue: "./theme/textmate", + handlesSet: true + } +}); + +exports.VirtualRenderer = VirtualRenderer; +}); + +ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var net = require("../lib/net"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var config = require("../config"); + +function $workerBlob(workerUrl) { + var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; + try { + return new Blob([script], {"type": "application/javascript"}); + } catch (e) { // Backwards-compatibility + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; + var blobBuilder = new BlobBuilder(); + blobBuilder.append(script); + return blobBuilder.getBlob("application/javascript"); + } +} + +function createWorker(workerUrl) { + var blob = $workerBlob(workerUrl); + var URL = window.URL || window.webkitURL; + var blobURL = URL.createObjectURL(blob); + return new Worker(blobURL); +} + +var WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) { + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); + if (require.nameToUrl && !require.toUrl) + require.toUrl = require.nameToUrl; + + if (config.get("packaged") || !require.toUrl) { + workerUrl = workerUrl || config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; + workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); + + var tlns = {}; + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); + }); + } + + this.$worker = createWorker(workerUrl); + if (importScripts) { + this.send("importScripts", importScripts); + } + this.$worker.postMessage({ + init : true, + tlns : tlns, + module : mod, + classname : classname + }); + + this.callbackId = 1; + this.callbacks = {}; + + this.$worker.onmessage = this.onMessage; +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.onMessage = function(e) { + var msg = e.data; + switch (msg.type) { + case "event": + this._signal(msg.name, {data: msg.data}); + break; + case "call": + var callback = this.callbacks[msg.id]; + if (callback) { + callback(msg.data); + delete this.callbacks[msg.id]; + } + break; + case "error": + this.reportError(msg.data); + break; + case "log": + window.console && console.log && console.log.apply(console, msg.data); + break; + } + }; + + this.reportError = function(err) { + window.console && console.error && console.error(err); + }; + + this.$normalizePath = function(path) { + return net.qualifyURL(path); + }; + + this.terminate = function() { + this._signal("terminate", {}); + this.deltaQueue = null; + this.$worker.terminate(); + this.$worker = null; + if (this.$doc) + this.$doc.off("change", this.changeListener); + this.$doc = null; + }; + + this.send = function(cmd, args) { + this.$worker.postMessage({command: cmd, args: args}); + }; + + this.call = function(cmd, args, callback) { + if (callback) { + var id = this.callbackId++; + this.callbacks[id] = callback; + args.push(id); + } + this.send(cmd, args); + }; + + this.emit = function(event, data) { + try { + this.$worker.postMessage({event: event, data: {data: data.data}}); + } + catch(ex) { + console.error(ex.stack); + } + }; + + this.attachToDocument = function(doc) { + if (this.$doc) + this.terminate(); + + this.$doc = doc; + this.call("setValue", [doc.getValue()]); + doc.on("change", this.changeListener); + }; + + this.changeListener = function(delta) { + if (!this.deltaQueue) { + this.deltaQueue = []; + setTimeout(this.$sendDeltaQueue, 0); + } + if (delta.action == "insert") + this.deltaQueue.push(delta.start, delta.lines); + else + this.deltaQueue.push(delta.start, delta.end); + }; + + this.$sendDeltaQueue = function() { + var q = this.deltaQueue; + if (!q) return; + this.deltaQueue = null; + if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { + this.call("setValue", [this.$doc.getValue()]); + } else + this.emit("change", {data: q}); + }; + +}).call(WorkerClient.prototype); + + +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.callbackId = 1; + this.callbacks = {}; + this.messageBuffer = []; + + var main = null; + var emitSync = false; + var sender = Object.create(EventEmitter); + var _self = this; + + this.$worker = {}; + this.$worker.terminate = function() {}; + this.$worker.postMessage = function(e) { + _self.messageBuffer.push(e); + if (main) { + if (emitSync) + setTimeout(processNext); + else + processNext(); + } + }; + this.setEmitSync = function(val) { emitSync = val }; + + var processNext = function() { + var msg = _self.messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._signal(msg.event, msg.data); + }; + + sender.postMessage = function(msg) { + _self.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); + }; + + config.loadModule(["worker", mod], function(Main) { + main = new Main[classname](sender); + while (_self.messageBuffer.length) + processNext(); + }); +}; + +UIWorkerClient.prototype = WorkerClient.prototype; + +exports.UIWorkerClient = UIWorkerClient; +exports.WorkerClient = WorkerClient; +exports.createWorker = createWorker; + + +}); + +ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var oop = require("./lib/oop"); + +var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { + var _self = this; + this.length = length; + this.session = session; + this.doc = session.getDocument(); + this.mainClass = mainClass; + this.othersClass = othersClass; + this.$onUpdate = this.onUpdate.bind(this); + this.doc.on("change", this.$onUpdate); + this.$others = others; + + this.$onCursorChange = function() { + setTimeout(function() { + _self.onCursorChange(); + }); + }; + + this.$pos = pos; + var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; + this.$undoStackDepth = undoStack.length; + this.setup(); + + session.selection.on("changeCursor", this.$onCursorChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setup = function() { + var _self = this; + var doc = this.doc; + var session = this.session; + + this.selectionBefore = session.selection.toJSON(); + if (session.selection.inMultiSelectMode) + session.selection.toSingleRange(); + + this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); + var pos = this.pos; + pos.$insertRight = true; + pos.detach(); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); + this.others = []; + this.$others.forEach(function(other) { + var anchor = doc.createAnchor(other.row, other.column); + anchor.$insertRight = true; + anchor.detach(); + _self.others.push(anchor); + }); + session.setUndoSelect(false); + }; + this.showOtherMarkers = function() { + if (this.othersActive) return; + var session = this.session; + var _self = this; + this.othersActive = true; + this.others.forEach(function(anchor) { + anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); + }); + }; + this.hideOtherMarkers = function() { + if (!this.othersActive) return; + this.othersActive = false; + for (var i = 0; i < this.others.length; i++) { + this.session.removeMarker(this.others[i].markerId); + } + }; + this.onUpdate = function(delta) { + if (this.$updating) + return this.updateAnchors(delta); + + var range = delta; + if (range.start.row !== range.end.row) return; + if (range.start.row !== this.pos.row) return; + this.$updating = true; + var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; + var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; + var distanceFromStart = range.start.column - this.pos.column; + + this.updateAnchors(delta); + + if (inMainRange) + this.length += lengthDiff; + + if (inMainRange && !this.session.$fromUndo) { + if (delta.action === 'insert') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + this.doc.insertMergedLines(newPos, delta.lines); + } + } else if (delta.action === 'remove') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + } + } + } + + this.$updating = false; + this.updateMarkers(); + }; + + this.updateAnchors = function(delta) { + this.pos.onChange(delta); + for (var i = this.others.length; i--;) + this.others[i].onChange(delta); + this.updateMarkers(); + }; + + this.updateMarkers = function() { + if (this.$updating) + return; + var _self = this; + var session = this.session; + var updateMarker = function(pos, className) { + session.removeMarker(pos.markerId); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false); + }; + updateMarker(this.pos, this.mainClass); + for (var i = this.others.length; i--;) + updateMarker(this.others[i], this.othersClass); + }; + + this.onCursorChange = function(event) { + if (this.$updating || !this.session) return; + var pos = this.session.selection.getCursor(); + if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + this.showOtherMarkers(); + this._emit("cursorEnter", event); + } else { + this.hideOtherMarkers(); + this._emit("cursorLeave", event); + } + }; + this.detach = function() { + this.session.removeMarker(this.pos && this.pos.markerId); + this.hideOtherMarkers(); + this.doc.removeEventListener("change", this.$onUpdate); + this.session.selection.removeEventListener("changeCursor", this.$onCursorChange); + this.session.setUndoSelect(true); + this.session = null; + }; + this.cancel = function() { + if (this.$undoStackDepth === -1) + return; + var undoManager = this.session.getUndoManager(); + var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; + for (var i = 0; i < undosRequired; i++) { + undoManager.undo(true); + } + if (this.selectionBefore) + this.session.selection.fromJSON(this.selectionBefore); + }; +}).call(PlaceHolder.prototype); + + +exports.PlaceHolder = PlaceHolder; +}); + +ace.define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} + +function onMouseDown(e) { + var ev = e.domEvent; + var alt = ev.altKey; + var shift = ev.shiftKey; + var ctrl = ev.ctrlKey; + var accel = e.getAccelKey(); + var button = e.getButton(); + + if (ctrl && useragent.isMac) + button = ev.button; + + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + + if (!ctrl && !alt && !accel) { + if (button === 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); + return; + } + + if (button !== 0) + return; + + var editor = e.editor; + var selection = editor.selection; + var isMultiSelect = editor.inMultiSelectMode; + var pos = e.getDocumentPosition(); + var cursor = selection.getCursor(); + var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); + + var mouseX = e.x, mouseY = e.y; + var onMouseSelection = function(e) { + mouseX = e.clientX; + mouseY = e.clientY; + }; + + var session = editor.session; + var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var screenCursor = screenAnchor; + + var selectionMode; + if (editor.$mouseHandler.$enableJumpToDef) { + if (ctrl && alt || accel && alt) + selectionMode = shift ? "block" : "add"; + else if (alt && editor.$blockSelectEnabled) + selectionMode = "block"; + } else { + if (accel && !alt) { + selectionMode = "add"; + if (!isMultiSelect && shift) + return; + } else if (alt && editor.$blockSelectEnabled) { + selectionMode = "block"; + } + } + + if (selectionMode && useragent.isMac && ev.ctrlKey) { + editor.$mouseHandler.cancelContextMenu(); + } + + if (selectionMode == "add") { + if (!isMultiSelect && inSelection) + return; // dragging + + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } + + var oldRange = selection.rangeList.rangeAtPoint(pos); + + + editor.$blockScrolling++; + editor.inVirtualSelectionMode = true; + + if (shift) { + oldRange = null; + range = selection.ranges[0] || range; + editor.removeSelectionMarker(range); + } + editor.once("mouseup", function() { + var tmpSel = selection.toOrientedRange(); + + if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) + selection.substractPoint(tmpSel.cursor); + else { + if (shift) { + selection.substractPoint(range.cursor); + } else if (range) { + editor.removeSelectionMarker(range); + selection.addRange(range); + } + selection.addRange(tmpSel); + } + editor.$blockScrolling--; + editor.inVirtualSelectionMode = false; + }); + + } else if (selectionMode == "block") { + e.stop(); + editor.inVirtualSelectionMode = true; + var initialRange; + var rectSel = []; + var blockSelect = function() { + var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column); + + if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) + return; + screenCursor = newCursor; + + editor.$blockScrolling++; + editor.selection.moveToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + + editor.removeSelectionMarkers(rectSel); + rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); + if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) + rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); + rectSel.forEach(editor.addSelectionMarker, editor); + editor.updateSelectionMarkers(); + editor.$blockScrolling--; + }; + editor.$blockScrolling++; + if (isMultiSelect && !accel) { + selection.toSingleRange(); + } else if (!isMultiSelect && accel) { + initialRange = selection.toOrientedRange(); + editor.addSelectionMarker(initialRange); + } + + if (shift) + screenAnchor = session.documentToScreenPosition(selection.lead); + else + selection.moveToPosition(pos); + editor.$blockScrolling--; + + screenCursor = {row: -1, column: -1}; + + var onMouseSelectionEnd = function(e) { + clearInterval(timerId); + editor.removeSelectionMarkers(rectSel); + if (!rectSel.length) + rectSel = [selection.toOrientedRange()]; + editor.$blockScrolling++; + if (initialRange) { + editor.removeSelectionMarker(initialRange); + selection.toSingleRange(initialRange); + } + for (var i = 0; i < rectSel.length; i++) + selection.addRange(rectSel[i]); + editor.inVirtualSelectionMode = false; + editor.$mouseHandler.$clickSelection = null; + editor.$blockScrolling--; + }; + + var onSelectionInterval = blockSelect; + + event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); + var timerId = setInterval(function() {onSelectionInterval();}, 20); + + return e.preventDefault(); + } +} + + +exports.onMouseDown = onMouseDown; + +}); + +ace.define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { +exports.defaultCommands = [{ + name: "addCursorAbove", + exec: function(editor) { editor.selectMoreLines(-1); }, + bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorBelow", + exec: function(editor) { editor.selectMoreLines(1); }, + bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorAboveSkipCurrent", + exec: function(editor) { editor.selectMoreLines(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorBelowSkipCurrent", + exec: function(editor) { editor.selectMoreLines(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectMoreBefore", + exec: function(editor) { editor.selectMore(-1); }, + bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectMoreAfter", + exec: function(editor) { editor.selectMore(1); }, + bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectNextBefore", + exec: function(editor) { editor.selectMore(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectNextAfter", + exec: function(editor) { editor.selectMore(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "splitIntoLines", + exec: function(editor) { editor.multiSelect.splitIntoLines(); }, + bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, + readOnly: true +}, { + name: "alignCursors", + exec: function(editor) { editor.alignCursors(); }, + bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, + scrollIntoView: "cursor" +}, { + name: "findAll", + exec: function(editor) { editor.findAll(); }, + bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, + scrollIntoView: "cursor", + readOnly: true +}]; +exports.multiSelectCommands = [{ + name: "singleSelection", + bindKey: "esc", + exec: function(editor) { editor.exitMultiSelectMode(); }, + scrollIntoView: "cursor", + readOnly: true, + isAvailable: function(editor) {return editor && editor.inMultiSelectMode} +}]; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); + +}); + +ace.define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module) { + +var RangeList = require("./range_list").RangeList; +var Range = require("./range").Range; +var Selection = require("./selection").Selection; +var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; +var event = require("./lib/event"); +var lang = require("./lib/lang"); +var commands = require("./commands/multi_select_commands"); +exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); +var Search = require("./search").Search; +var search = new Search(); + +function find(session, needle, dir) { + search.$options.wrap = true; + search.$options.needle = needle; + search.$options.backwards = dir == -1; + return search.find(session); +} +var EditSession = require("./edit_session").EditSession; +(function() { + this.getSelectionMarkers = function() { + return this.$selectionMarkers; + }; +}).call(EditSession.prototype); +(function() { + this.ranges = null; + this.rangeList = null; + this.addRange = function(range, $blockChangeEvents) { + if (!range) + return; + + if (!this.inMultiSelectMode && this.rangeCount === 0) { + var oldRange = this.toOrientedRange(); + this.rangeList.add(oldRange); + this.rangeList.add(range); + if (this.rangeList.ranges.length != 2) { + this.rangeList.removeAll(); + return $blockChangeEvents || this.fromOrientedRange(range); + } + this.rangeList.removeAll(); + this.rangeList.add(oldRange); + this.$onAddRange(oldRange); + } + + if (!range.cursor) + range.cursor = range.end; + + var removed = this.rangeList.add(range); + + this.$onAddRange(range); + + if (removed.length) + this.$onRemoveRange(removed); + + if (this.rangeCount > 1 && !this.inMultiSelectMode) { + this._signal("multiSelect"); + this.inMultiSelectMode = true; + this.session.$undoSelect = false; + this.rangeList.attach(this.session); + } + + return $blockChangeEvents || this.fromOrientedRange(range); + }; + + this.toSingleRange = function(range) { + range = range || this.ranges[0]; + var removed = this.rangeList.removeAll(); + if (removed.length) + this.$onRemoveRange(removed); + + range && this.fromOrientedRange(range); + }; + this.substractPoint = function(pos) { + var removed = this.rangeList.substractPoint(pos); + if (removed) { + this.$onRemoveRange(removed); + return removed[0]; + } + }; + this.mergeOverlappingRanges = function() { + var removed = this.rangeList.merge(); + if (removed.length) + this.$onRemoveRange(removed); + else if(this.ranges[0]) + this.fromOrientedRange(this.ranges[0]); + }; + + this.$onAddRange = function(range) { + this.rangeCount = this.rangeList.ranges.length; + this.ranges.unshift(range); + this._signal("addRange", {range: range}); + }; + + this.$onRemoveRange = function(removed) { + this.rangeCount = this.rangeList.ranges.length; + if (this.rangeCount == 1 && this.inMultiSelectMode) { + var lastRange = this.rangeList.ranges.pop(); + removed.push(lastRange); + this.rangeCount = 0; + } + + for (var i = removed.length; i--; ) { + var index = this.ranges.indexOf(removed[i]); + this.ranges.splice(index, 1); + } + + this._signal("removeRange", {ranges: removed}); + + if (this.rangeCount === 0 && this.inMultiSelectMode) { + this.inMultiSelectMode = false; + this._signal("singleSelect"); + this.session.$undoSelect = true; + this.rangeList.detach(this.session); + } + + lastRange = lastRange || this.ranges[0]; + if (lastRange && !lastRange.isEqual(this.getRange())) + this.fromOrientedRange(lastRange); + }; + this.$initRangeList = function() { + if (this.rangeList) + return; + + this.rangeList = new RangeList(); + this.ranges = []; + this.rangeCount = 0; + }; + this.getAllRanges = function() { + return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; + }; + + this.splitIntoLines = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } else { + var range = this.getRange(); + var isBackwards = this.isBackwards(); + var startRow = range.start.row; + var endRow = range.end.row; + if (startRow == endRow) { + if (isBackwards) + var start = range.end, end = range.start; + else + var start = range.start, end = range.end; + + this.addRange(Range.fromPoints(end, end)); + this.addRange(Range.fromPoints(start, start)); + return; + } + + var rectSel = []; + var r = this.getLineRange(startRow, true); + r.start.column = range.start.column; + rectSel.push(r); + + for (var i = startRow + 1; i < endRow; i++) + rectSel.push(this.getLineRange(i, true)); + + r = this.getLineRange(endRow, true); + r.end.column = range.end.column; + rectSel.push(r); + + rectSel.forEach(this.addRange, this); + } + }; + this.toggleBlockSelection = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } else { + var cursor = this.session.documentToScreenPosition(this.selectionLead); + var anchor = this.session.documentToScreenPosition(this.selectionAnchor); + + var rectSel = this.rectangularRangeBlock(cursor, anchor); + rectSel.forEach(this.addRange, this); + } + }; + this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) { + var rectSel = []; + + var xBackwards = screenCursor.column < screenAnchor.column; + if (xBackwards) { + var startColumn = screenCursor.column; + var endColumn = screenAnchor.column; + } else { + var startColumn = screenAnchor.column; + var endColumn = screenCursor.column; + } + + var yBackwards = screenCursor.row < screenAnchor.row; + if (yBackwards) { + var startRow = screenCursor.row; + var endRow = screenAnchor.row; + } else { + var startRow = screenAnchor.row; + var endRow = screenCursor.row; + } + + if (startColumn < 0) + startColumn = 0; + if (startRow < 0) + startRow = 0; + + if (startRow == endRow) + includeEmptyLines = true; + + for (var row = startRow; row <= endRow; row++) { + var range = Range.fromPoints( + this.session.screenToDocumentPosition(row, startColumn), + this.session.screenToDocumentPosition(row, endColumn) + ); + if (range.isEmpty()) { + if (docEnd && isSamePoint(range.end, docEnd)) + break; + var docEnd = range.end; + } + range.cursor = xBackwards ? range.start : range.end; + rectSel.push(range); + } + + if (yBackwards) + rectSel.reverse(); + + if (!includeEmptyLines) { + var end = rectSel.length - 1; + while (rectSel[end].isEmpty() && end > 0) + end--; + if (end > 0) { + var start = 0; + while (rectSel[start].isEmpty()) + start++; + } + for (var i = end; i >= start; i--) { + if (rectSel[i].isEmpty()) + rectSel.splice(i, 1); + } + } + + return rectSel; + }; +}).call(Selection.prototype); +var Editor = require("./editor").Editor; +(function() { + this.updateSelectionMarkers = function() { + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.addSelectionMarker = function(orientedRange) { + if (!orientedRange.cursor) + orientedRange.cursor = orientedRange.end; + + var style = this.getSelectionStyle(); + orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + + this.session.$selectionMarkers.push(orientedRange); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + return orientedRange; + }; + this.removeSelectionMarker = function(range) { + if (!range.marker) + return; + this.session.removeMarker(range.marker); + var index = this.session.$selectionMarkers.indexOf(range); + if (index != -1) + this.session.$selectionMarkers.splice(index, 1); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + }; + + this.removeSelectionMarkers = function(ranges) { + var markerList = this.session.$selectionMarkers; + for (var i = ranges.length; i--; ) { + var range = ranges[i]; + if (!range.marker) + continue; + this.session.removeMarker(range.marker); + var index = markerList.indexOf(range); + if (index != -1) + markerList.splice(index, 1); + } + this.session.selectionMarkerCount = markerList.length; + }; + + this.$onAddRange = function(e) { + this.addSelectionMarker(e.range); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onRemoveRange = function(e) { + this.removeSelectionMarkers(e.ranges); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onMultiSelect = function(e) { + if (this.inMultiSelectMode) + return; + this.inMultiSelectMode = true; + + this.setStyle("ace_multiselect"); + this.keyBinding.addKeyboardHandler(commands.keyboardHandler); + this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); + + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onSingleSelect = function(e) { + if (this.session.multiSelect.inVirtualMode) + return; + this.inMultiSelectMode = false; + + this.unsetStyle("ace_multiselect"); + this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + + this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + this._emit("changeSelection"); + }; + + this.$onMultiSelectExec = function(e) { + var command = e.command; + var editor = e.editor; + if (!editor.multiSelect) + return; + if (!command.multiSelectAction) { + var result = command.exec(editor, e.args || {}); + editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); + editor.multiSelect.mergeOverlappingRanges(); + } else if (command.multiSelectAction == "forEach") { + result = editor.forEachSelection(command, e.args); + } else if (command.multiSelectAction == "forEachLine") { + result = editor.forEachSelection(command, e.args, true); + } else if (command.multiSelectAction == "single") { + editor.exitMultiSelectMode(); + result = command.exec(editor, e.args || {}); + } else { + result = command.multiSelectAction(editor, e.args || {}); + } + return result; + }; + this.forEachSelection = function(cmd, args, options) { + if (this.inVirtualSelectionMode) + return; + var keepOrder = options && options.keepOrder; + var $byLines = options == true || options && options.$byLines + var session = this.session; + var selection = this.selection; + var rangeList = selection.rangeList; + var ranges = (keepOrder ? selection : rangeList).ranges; + var result; + + if (!ranges.length) + return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + + var reg = selection._eventRegistry; + selection._eventRegistry = {}; + + var tmpSel = new Selection(session); + this.inVirtualSelectionMode = true; + for (var i = ranges.length; i--;) { + if ($byLines) { + while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) + i--; + } + tmpSel.fromOrientedRange(ranges[i]); + tmpSel.index = i; + this.selection = session.selection = tmpSel; + var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + if (!result && cmdResult !== undefined) + result = cmdResult; + tmpSel.toOrientedRange(ranges[i]); + } + tmpSel.detach(); + + this.selection = session.selection = selection; + this.inVirtualSelectionMode = false; + selection._eventRegistry = reg; + selection.mergeOverlappingRanges(); + + var anim = this.renderer.$scrollAnimation; + this.onCursorChange(); + this.onSelectionChange(); + if (anim && anim.from == anim.to) + this.renderer.animateScrolling(anim.from); + + return result; + }; + this.exitMultiSelectMode = function() { + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) + return; + this.multiSelect.toSingleRange(); + }; + + this.getSelectedText = function() { + var text = ""; + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var ranges = this.multiSelect.rangeList.ranges; + var buf = []; + for (var i = 0; i < ranges.length; i++) { + buf.push(this.session.getTextRange(ranges[i])); + } + var nl = this.session.getDocument().getNewLineCharacter(); + text = buf.join(nl); + if (text.length == (buf.length - 1) * nl.length) + text = ""; + } else if (!this.selection.isEmpty()) { + text = this.session.getTextRange(this.getSelectionRange()); + } + return text; + }; + + this.$checkMultiselectChange = function(e, anchor) { + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var range = this.multiSelect.ranges[0]; + if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) + return; + var pos = anchor == this.multiSelect.anchor + ? range.cursor == range.start ? range.end : range.start + : range.cursor; + if (pos.row != anchor.row + || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) + this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); + } + }; + this.findAll = function(needle, options, additive) { + options = options || {}; + options.needle = needle || options.needle; + if (options.needle == undefined) { + var range = this.selection.isEmpty() + ? this.selection.getWordRange() + : this.selection.getRange(); + options.needle = this.session.getTextRange(range); + } + this.$search.set(options); + + var ranges = this.$search.findAll(this.session); + if (!ranges.length) + return 0; + + this.$blockScrolling += 1; + var selection = this.multiSelect; + + if (!additive) + selection.toSingleRange(ranges[0]); + + for (var i = ranges.length; i--; ) + selection.addRange(ranges[i], true); + if (range && selection.rangeList.rangeAtPoint(range.start)) + selection.addRange(range, true); + + this.$blockScrolling -= 1; + + return ranges.length; + }; + this.selectMoreLines = function(dir, skip) { + var range = this.selection.toOrientedRange(); + var isBackwards = range.cursor == range.end; + + var screenLead = this.session.documentToScreenPosition(range.cursor); + if (this.selection.$desiredColumn) + screenLead.column = this.selection.$desiredColumn; + + var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); + + if (!range.isEmpty()) { + var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); + var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); + } else { + var anchor = lead; + } + + if (isBackwards) { + var newRange = Range.fromPoints(lead, anchor); + newRange.cursor = newRange.start; + } else { + var newRange = Range.fromPoints(anchor, lead); + newRange.cursor = newRange.end; + } + + newRange.desiredColumn = screenLead.column; + if (!this.selection.inMultiSelectMode) { + this.selection.addRange(range); + } else { + if (skip) + var toRemove = range.cursor; + } + + this.selection.addRange(newRange); + if (toRemove) + this.selection.substractPoint(toRemove); + }; + this.transposeSelections = function(dir) { + var session = this.session; + var sel = session.multiSelect; + var all = sel.ranges; + + for (var i = all.length; i--; ) { + var range = all[i]; + if (range.isEmpty()) { + var tmp = session.getWordRange(range.start.row, range.start.column); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + range.end.row = tmp.end.row; + range.end.column = tmp.end.column; + } + } + sel.mergeOverlappingRanges(); + + var words = []; + for (var i = all.length; i--; ) { + var range = all[i]; + words.unshift(session.getTextRange(range)); + } + + if (dir < 0) + words.unshift(words.pop()); + else + words.push(words.shift()); + + for (var i = all.length; i--; ) { + var range = all[i]; + var tmp = range.clone(); + session.replace(range, words[i]); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + } + }; + this.selectMore = function(dir, skip, stopAtFirst) { + var session = this.session; + var sel = session.multiSelect; + + var range = sel.toOrientedRange(); + if (range.isEmpty()) { + range = session.getWordRange(range.start.row, range.start.column); + range.cursor = dir == -1 ? range.start : range.end; + this.multiSelect.addRange(range); + if (stopAtFirst) + return; + } + var needle = session.getTextRange(range); + + var newRange = find(session, needle, dir); + if (newRange) { + newRange.cursor = dir == -1 ? newRange.start : newRange.end; + this.$blockScrolling += 1; + this.session.unfold(newRange); + this.multiSelect.addRange(newRange); + this.$blockScrolling -= 1; + this.renderer.scrollCursorIntoView(null, 0.5); + } + if (skip) + this.multiSelect.substractPoint(range.cursor); + }; + this.alignCursors = function() { + var session = this.session; + var sel = session.multiSelect; + var ranges = sel.ranges; + var row = -1; + var sameRowRanges = ranges.filter(function(r) { + if (r.cursor.row == row) + return true; + row = r.cursor.row; + }); + + if (!ranges.length || sameRowRanges.length == ranges.length - 1) { + var range = this.selection.getRange(); + var fr = range.start.row, lr = range.end.row; + var guessRange = fr == lr; + if (guessRange) { + var max = this.session.getLength(); + var line; + do { + line = this.session.getLine(lr); + } while (/[=:]/.test(line) && ++lr < max); + do { + line = this.session.getLine(fr); + } while (/[=:]/.test(line) && --fr > 0); + + if (fr < 0) fr = 0; + if (lr >= max) lr = max - 1; + } + var lines = this.session.removeFullLines(fr, lr); + lines = this.$reAlignText(lines, guessRange); + this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n"); + if (!guessRange) { + range.start.column = 0; + range.end.column = lines[lines.length - 1].length; + } + this.selection.setRange(range); + } else { + sameRowRanges.forEach(function(r) { + sel.substractPoint(r.cursor); + }); + + var maxCol = 0; + var minSpace = Infinity; + var spaceOffsets = ranges.map(function(r) { + var p = r.cursor; + var line = session.getLine(p.row); + var spaceOffset = line.substr(p.column).search(/\S/g); + if (spaceOffset == -1) + spaceOffset = 0; + + if (p.column > maxCol) + maxCol = p.column; + if (spaceOffset < minSpace) + minSpace = spaceOffset; + return spaceOffset; + }); + ranges.forEach(function(r, i) { + var p = r.cursor; + var l = maxCol - p.column; + var d = spaceOffsets[i] - minSpace; + if (l > d) + session.insert(p, lang.stringRepeat(" ", l - d)); + else + session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); + + r.start.column = r.end.column = maxCol; + r.start.row = r.end.row = p.row; + r.cursor = r.end; + }); + sel.fromOrientedRange(ranges[0]); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + } + }; + + this.$reAlignText = function(lines, forceLeft) { + var isLeftAligned = true, isRightAligned = true; + var startW, textW, endW; + + return lines.map(function(line) { + var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); + if (!m) + return [line]; + + if (startW == null) { + startW = m[1].length; + textW = m[2].length; + endW = m[3].length; + return m; + } + + if (startW + textW + endW != m[1].length + m[2].length + m[3].length) + isRightAligned = false; + if (startW != m[1].length) + isLeftAligned = false; + + if (startW > m[1].length) + startW = m[1].length; + if (textW < m[2].length) + textW = m[2].length; + if (endW > m[3].length) + endW = m[3].length; + + return m; + }).map(forceLeft ? alignLeft : + isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); + + function spaces(n) { + return lang.stringRepeat(" ", n); + } + + function alignLeft(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(textW - m[2].length + endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function alignRight(m) { + return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + + spaces(endW, " ") + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function unAlign(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + }; +}).call(Editor.prototype); + + +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +exports.onSessionChange = function(e) { + var session = e.session; + if (session && !session.multiSelect) { + session.$selectionMarkers = []; + session.selection.$initRangeList(); + session.multiSelect = session.selection; + } + this.multiSelect = session && session.multiSelect; + + var oldSession = e.oldSession; + if (oldSession) { + oldSession.multiSelect.off("addRange", this.$onAddRange); + oldSession.multiSelect.off("removeRange", this.$onRemoveRange); + oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); + oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); + } + + if (session) { + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + session.multiSelect.lead.on("change", this.$checkMultiselectChange); + session.multiSelect.anchor.on("change", this.$checkMultiselectChange); + } + + if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session.selection.inMultiSelectMode) + this.$onMultiSelect(); + else + this.$onSingleSelect(); + } +}; +function MultiSelect(editor) { + if (editor.$multiselectOnSessionChange) + return; + editor.$onAddRange = editor.$onAddRange.bind(editor); + editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); + editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); + editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); + editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); + editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); + + editor.$multiselectOnSessionChange(editor); + editor.on("changeSession", editor.$multiselectOnSessionChange); + + editor.on("mousedown", onMouseDown); + editor.commands.addCommands(commands.defaultCommands); + + addAltCursorListeners(editor); +} + +function addAltCursorListeners(editor){ + var el = editor.textInput.getElement(); + var altCursor = false; + event.addListener(el, "keydown", function(e) { + var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); + if (editor.$blockSelectEnabled && altDown) { + if (!altCursor) { + editor.renderer.setMouseCursor("crosshair"); + altCursor = true; + } + } else if (altCursor) { + reset(); + } + }); + + event.addListener(el, "keyup", reset); + event.addListener(el, "blur", reset); + function reset(e) { + if (altCursor) { + editor.renderer.setMouseCursor(""); + altCursor = false; + } + } +} + +exports.MultiSelect = MultiSelect; + + +require("./config").defineOptions(Editor.prototype, "editor", { + enableMultiselect: { + set: function(val) { + MultiSelect(this); + if (val) { + this.on("changeSession", this.$multiselectOnSessionChange); + this.on("mousedown", onMouseDown); + } else { + this.off("changeSession", this.$multiselectOnSessionChange); + this.off("mousedown", onMouseDown); + } + }, + value: true + }, + enableBlockSelect: { + set: function(val) { + this.$blockSelectEnabled = val; + }, + value: true + } +}); + + + +}); + +ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; + +(function() { + + this.foldingStartMarker = null; + this.foldingStopMarker = null; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + if (this.foldingStartMarker.test(line)) + return "start"; + if (foldStyle == "markbeginend" + && this.foldingStopMarker + && this.foldingStopMarker.test(line)) + return "end"; + return ""; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + return null; + }; + + this.indentationBlock = function(session, row, column) { + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1) + return; + + var startColumn = column || line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + var level = session.getLine(row).search(re); + + if (level == -1) + continue; + + if (level <= startLevel) + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + + this.openingBracketBlock = function(session, bracket, row, column, typeRe) { + var start = {row: row, column: column + 1}; + var end = session.$findClosingBracket(bracket, start, typeRe); + if (!end) + return; + + var fw = session.foldWidgets[end.row]; + if (fw == null) + fw = session.getFoldWidget(end.row); + + if (fw == "start" && end.row > start.row) { + end.row --; + end.column = session.getLine(end.row).length; + } + return Range.fromPoints(start, end); + }; + + this.closingBracketBlock = function(session, bracket, row, column, typeRe) { + var end = {row: row, column: column}; + var start = session.$findOpeningBracket(bracket, end); + + if (!start) + return; + + start.column++; + end.column--; + + return Range.fromPoints(start, end); + }; +}).call(FoldMode.prototype); + +}); + +ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = ".ace-tm .ace_gutter {\ +background: #f0f0f0;\ +color: #333;\ +}\ +.ace-tm .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-tm .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-tm {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-tm .ace_cursor {\ +color: black;\ +}\ +.ace-tm .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-tm .ace_storage,\ +.ace-tm .ace_keyword {\ +color: blue;\ +}\ +.ace-tm .ace_constant {\ +color: rgb(197, 6, 11);\ +}\ +.ace-tm .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-tm .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-tm .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_invalid {\ +background-color: rgba(255, 0, 0, 0.1);\ +color: red;\ +}\ +.ace-tm .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-tm .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_support.ace_type,\ +.ace-tm .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-tm .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-tm .ace_string {\ +color: rgb(3, 106, 7);\ +}\ +.ace-tm .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-tm .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-tm .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-tm .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-tm .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-tm .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-tm .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-tm .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-tm .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-tm .ace_meta.ace_tag {\ +color:rgb(0, 22, 142);\ +}\ +.ace-tm .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-tm .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-tm.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-tm .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-tm .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-tm .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-tm .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-tm .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-tm .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-tm .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); + +ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var Range = require("./range").Range; + + +function LineWidgets(session) { + this.session = session; + this.session.widgetManager = this; + this.session.getRowLength = this.getRowLength; + this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; + this.updateOnChange = this.updateOnChange.bind(this); + this.renderWidgets = this.renderWidgets.bind(this); + this.measureWidgets = this.measureWidgets.bind(this); + this.session._changedWidgets = []; + this.$onChangeEditor = this.$onChangeEditor.bind(this); + + this.session.on("change", this.updateOnChange); + this.session.on("changeFold", this.updateOnFold); + this.session.on("changeEditor", this.$onChangeEditor); +} + +(function() { + this.getRowLength = function(row) { + var h; + if (this.lineWidgets) + h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0; + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1 + h; + } else { + return this.$wrapData[row].length + 1 + h; + } + }; + + this.$getWidgetScreenLength = function() { + var screenRows = 0; + this.lineWidgets.forEach(function(w){ + if (w && w.rowCount && !w.hidden) + screenRows += w.rowCount; + }); + return screenRows; + }; + + this.$onChangeEditor = function(e) { + this.attach(e.editor); + }; + + this.attach = function(editor) { + if (editor && editor.widgetManager && editor.widgetManager != this) + editor.widgetManager.detach(); + + if (this.editor == editor) + return; + + this.detach(); + this.editor = editor; + + if (editor) { + editor.widgetManager = this; + editor.renderer.on("beforeRender", this.measureWidgets); + editor.renderer.on("afterRender", this.renderWidgets); + } + }; + this.detach = function(e) { + var editor = this.editor; + if (!editor) + return; + + this.editor = null; + editor.widgetManager = null; + + editor.renderer.off("beforeRender", this.measureWidgets); + editor.renderer.off("afterRender", this.renderWidgets); + var lineWidgets = this.session.lineWidgets; + lineWidgets && lineWidgets.forEach(function(w) { + if (w && w.el && w.el.parentNode) { + w._inDocument = false; + w.el.parentNode.removeChild(w.el); + } + }); + }; + + this.updateOnFold = function(e, session) { + var lineWidgets = session.lineWidgets; + if (!lineWidgets || !e.action) + return; + var fold = e.data; + var start = fold.start.row; + var end = fold.end.row; + var hide = e.action == "add"; + for (var i = start + 1; i < end; i++) { + if (lineWidgets[i]) + lineWidgets[i].hidden = hide; + } + if (lineWidgets[end]) { + if (hide) { + if (!lineWidgets[start]) + lineWidgets[start] = lineWidgets[end]; + else + lineWidgets[end].hidden = hide; + } else { + if (lineWidgets[start] == lineWidgets[end]) + lineWidgets[start] = undefined; + lineWidgets[end].hidden = hide; + } + } + }; + + this.updateOnChange = function(delta) { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; + + var startRow = delta.start.row; + var len = delta.end.row - startRow; + + if (len === 0) { + } else if (delta.action == 'remove') { + var removed = lineWidgets.splice(startRow + 1, len); + removed.forEach(function(w) { + w && this.removeLineWidget(w); + }, this); + this.$updateRows(); + } else { + var args = new Array(len); + args.unshift(startRow, 0); + lineWidgets.splice.apply(lineWidgets, args); + this.$updateRows(); + } + }; + + this.$updateRows = function() { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; + var noWidgets = true; + lineWidgets.forEach(function(w, i) { + if (w) { + noWidgets = false; + w.row = i; + while (w.$oldWidget) { + w.$oldWidget.row = i; + w = w.$oldWidget; + } + } + }); + if (noWidgets) + this.session.lineWidgets = null; + }; + + this.addLineWidget = function(w) { + if (!this.session.lineWidgets) + this.session.lineWidgets = new Array(this.session.getLength()); + + var old = this.session.lineWidgets[w.row]; + if (old) { + w.$oldWidget = old; + if (old.el && old.el.parentNode) { + old.el.parentNode.removeChild(old.el); + old._inDocument = false; + } + } + + this.session.lineWidgets[w.row] = w; + + w.session = this.session; + + var renderer = this.editor.renderer; + if (w.html && !w.el) { + w.el = dom.createElement("div"); + w.el.innerHTML = w.html; + } + if (w.el) { + dom.addCssClass(w.el, "ace_lineWidgetContainer"); + w.el.style.position = "absolute"; + w.el.style.zIndex = 5; + renderer.container.appendChild(w.el); + w._inDocument = true; + } + + if (!w.coverGutter) { + w.el.style.zIndex = 3; + } + if (w.pixelHeight == null) { + w.pixelHeight = w.el.offsetHeight; + } + if (w.rowCount == null) { + w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + } + + var fold = this.session.getFoldAt(w.row, 0); + w.$fold = fold; + if (fold) { + var lineWidgets = this.session.lineWidgets; + if (w.row == fold.end.row && !lineWidgets[fold.start.row]) + lineWidgets[fold.start.row] = w; + else + w.hidden = true; + } + + this.session._emit("changeFold", {data:{start:{row: w.row}}}); + + this.$updateRows(); + this.renderWidgets(null, renderer); + this.onWidgetChanged(w); + return w; + }; + + this.removeLineWidget = function(w) { + w._inDocument = false; + w.session = null; + if (w.el && w.el.parentNode) + w.el.parentNode.removeChild(w.el); + if (w.editor && w.editor.destroy) try { + w.editor.destroy(); + } catch(e){} + if (this.session.lineWidgets) { + var w1 = this.session.lineWidgets[w.row] + if (w1 == w) { + this.session.lineWidgets[w.row] = w.$oldWidget; + if (w.$oldWidget) + this.onWidgetChanged(w.$oldWidget); + } else { + while (w1) { + if (w1.$oldWidget == w) { + w1.$oldWidget = w.$oldWidget; + break; + } + w1 = w1.$oldWidget; + } + } + } + this.session._emit("changeFold", {data:{start:{row: w.row}}}); + this.$updateRows(); + }; + + this.getWidgetsAtRow = function(row) { + var lineWidgets = this.session.lineWidgets; + var w = lineWidgets && lineWidgets[row]; + var list = []; + while (w) { + list.push(w); + w = w.$oldWidget; + } + return list; + }; + + this.onWidgetChanged = function(w) { + this.session._changedWidgets.push(w); + this.editor && this.editor.renderer.updateFull(); + }; + + this.measureWidgets = function(e, renderer) { + var changedWidgets = this.session._changedWidgets; + var config = renderer.layerConfig; + + if (!changedWidgets || !changedWidgets.length) return; + var min = Infinity; + for (var i = 0; i < changedWidgets.length; i++) { + var w = changedWidgets[i]; + if (!w || !w.el) continue; + if (w.session != this.session) continue; + if (!w._inDocument) { + if (this.session.lineWidgets[w.row] != w) + continue; + w._inDocument = true; + renderer.container.appendChild(w.el); + } + + w.h = w.el.offsetHeight; + + if (!w.fixedWidth) { + w.w = w.el.offsetWidth; + w.screenWidth = Math.ceil(w.w / config.characterWidth); + } + + var rowCount = w.h / config.lineHeight; + if (w.coverLine) { + rowCount -= this.session.getRowLineCount(w.row); + if (rowCount < 0) + rowCount = 0; + } + if (w.rowCount != rowCount) { + w.rowCount = rowCount; + if (w.row < min) + min = w.row; + } + } + if (min != Infinity) { + this.session._emit("changeFold", {data:{start:{row: min}}}); + this.session.lineWidgetWidth = null; + } + this.session._changedWidgets = []; + }; + + this.renderWidgets = function(e, renderer) { + var config = renderer.layerConfig; + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var first = Math.min(this.firstRow, config.firstRow); + var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); + + while (first > 0 && !lineWidgets[first]) + first--; + + this.firstRow = config.firstRow; + this.lastRow = config.lastRow; + + renderer.$cursorLayer.config = config; + for (var i = first; i <= last; i++) { + var w = lineWidgets[i]; + if (!w || !w.el) continue; + if (w.hidden) { + w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; + continue; + } + if (!w._inDocument) { + w._inDocument = true; + renderer.container.appendChild(w.el); + } + var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top; + if (!w.coverLine) + top += config.lineHeight * this.session.getRowLineCount(w.row); + w.el.style.top = top - config.offset + "px"; + + var left = w.coverGutter ? 0 : renderer.gutterWidth; + if (!w.fixedWidth) + left -= renderer.scrollLeft; + w.el.style.left = left + "px"; + + if (w.fullWidth && w.screenWidth) { + w.el.style.minWidth = config.width + 2 * config.padding + "px"; + } + + if (w.fixedWidth) { + w.el.style.right = renderer.scrollBar.getWidth() + "px"; + } else { + w.el.style.right = ""; + } + } + }; + +}).call(LineWidgets.prototype); + + +exports.LineWidgets = LineWidgets; + +}); + +ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"], function(require, exports, module) { +"use strict"; +var LineWidgets = require("../line_widgets").LineWidgets; +var dom = require("../lib/dom"); +var Range = require("../range").Range; + +function binarySearch(array, needle, comparator) { + var first = 0; + var last = array.length - 1; + + while (first <= last) { + var mid = (first + last) >> 1; + var c = comparator(needle, array[mid]); + if (c > 0) + first = mid + 1; + else if (c < 0) + last = mid - 1; + else + return mid; + } + return -(first + 1); +} + +function findAnnotations(session, row, dir) { + var annotations = session.getAnnotations().sort(Range.comparePoints); + if (!annotations.length) + return; + + var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints); + if (i < 0) + i = -i - 1; + + if (i >= annotations.length) + i = dir > 0 ? 0 : annotations.length - 1; + else if (i === 0 && dir < 0) + i = annotations.length - 1; + + var annotation = annotations[i]; + if (!annotation || !dir) + return; + + if (annotation.row === row) { + do { + annotation = annotations[i += dir]; + } while (annotation && annotation.row === row); + if (!annotation) + return annotations.slice(); + } + + + var matched = []; + row = annotation.row; + do { + matched[dir < 0 ? "unshift" : "push"](annotation); + annotation = annotations[i += dir]; + } while (annotation && annotation.row == row); + return matched.length && matched; +} + +exports.showErrorMarker = function(editor, dir) { + var session = editor.session; + if (!session.widgetManager) { + session.widgetManager = new LineWidgets(session); + session.widgetManager.attach(editor); + } + + var pos = editor.getCursorPosition(); + var row = pos.row; + var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) { + return w.type == "errorMarker"; + })[0]; + if (oldWidget) { + oldWidget.destroy(); + } else { + row -= dir; + } + var annotations = findAnnotations(session, row, dir); + var gutterAnno; + if (annotations) { + var annotation = annotations[0]; + pos.column = (annotation.pos && typeof annotation.column != "number" + ? annotation.pos.sc + : annotation.column) || 0; + pos.row = annotation.row; + gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row]; + } else if (oldWidget) { + return; + } else { + gutterAnno = { + text: ["Looks good!"], + className: "ace_ok" + }; + } + editor.session.unfold(pos.row); + editor.selection.moveToPosition(pos); + + var w = { + row: pos.row, + fixedWidth: true, + coverGutter: true, + el: dom.createElement("div"), + type: "errorMarker" + }; + var el = w.el.appendChild(dom.createElement("div")); + var arrow = w.el.appendChild(dom.createElement("div")); + arrow.className = "error_widget_arrow " + gutterAnno.className; + + var left = editor.renderer.$cursorLayer + .getPixelPosition(pos).left; + arrow.style.left = left + editor.renderer.gutterWidth - 5 + "px"; + + w.el.className = "error_widget_wrapper"; + el.className = "error_widget " + gutterAnno.className; + el.innerHTML = gutterAnno.text.join("
      "); + + el.appendChild(dom.createElement("div")); + + var kb = function(_, hashId, keyString) { + if (hashId === 0 && (keyString === "esc" || keyString === "return")) { + w.destroy(); + return {command: "null"}; + } + }; + + w.destroy = function() { + if (editor.$mouseHandler.isMousePressed) + return; + editor.keyBinding.removeKeyboardHandler(kb); + session.widgetManager.removeLineWidget(w); + editor.off("changeSelection", w.destroy); + editor.off("changeSession", w.destroy); + editor.off("mouseup", w.destroy); + editor.off("change", w.destroy); + }; + + editor.keyBinding.addKeyboardHandler(kb); + editor.on("changeSelection", w.destroy); + editor.on("changeSession", w.destroy); + editor.on("mouseup", w.destroy); + editor.on("change", w.destroy); + + editor.session.widgetManager.addLineWidget(w); + + w.el.onmousedown = editor.focus.bind(editor); + + editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight}); +}; + + +dom.importCssString("\ + .error_widget_wrapper {\ + background: inherit;\ + color: inherit;\ + border:none\ + }\ + .error_widget {\ + border-top: solid 2px;\ + border-bottom: solid 2px;\ + margin: 5px 0;\ + padding: 10px 40px;\ + white-space: pre-wrap;\ + }\ + .error_widget.ace_error, .error_widget_arrow.ace_error{\ + border-color: #ff5a5a\ + }\ + .error_widget.ace_warning, .error_widget_arrow.ace_warning{\ + border-color: #F1D817\ + }\ + .error_widget.ace_info, .error_widget_arrow.ace_info{\ + border-color: #5a5a5a\ + }\ + .error_widget.ace_ok, .error_widget_arrow.ace_ok{\ + border-color: #5aaa5a\ + }\ + .error_widget_arrow {\ + position: absolute;\ + border: solid 5px;\ + border-top-color: transparent!important;\ + border-right-color: transparent!important;\ + border-left-color: transparent!important;\ + top: -5px;\ + }\ +", ""); + +}); + +ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); + +var dom = require("./lib/dom"); +var event = require("./lib/event"); + +var Editor = require("./editor").Editor; +var EditSession = require("./edit_session").EditSession; +var UndoManager = require("./undomanager").UndoManager; +var Renderer = require("./virtual_renderer").VirtualRenderer; +require("./worker/worker_client"); +require("./keyboard/hash_handler"); +require("./placeholder"); +require("./multi_select"); +require("./mode/folding/fold_mode"); +require("./theme/textmate"); +require("./ext/error_marker"); + +exports.config = require("./config"); +exports.require = require; + +if (typeof define === "function") + exports.define = define; +exports.edit = function(el) { + if (typeof el == "string") { + var _id = el; + el = document.getElementById(_id); + if (!el) + throw new Error("ace.edit can't find div #" + _id); + } + + if (el && el.env && el.env.editor instanceof Editor) + return el.env.editor; + + var value = ""; + if (el && /input|textarea/i.test(el.tagName)) { + var oldNode = el; + value = oldNode.value; + el = dom.createElement("pre"); + oldNode.parentNode.replaceChild(el, oldNode); + } else if (el) { + value = dom.getInnerText(el); + el.innerHTML = ""; + } + + var doc = exports.createEditSession(value); + + var editor = new Editor(new Renderer(el)); + editor.setSession(doc); + + var env = { + document: doc, + editor: editor, + onResize: editor.resize.bind(editor, null) + }; + if (oldNode) env.textarea = oldNode; + event.addListener(window, "resize", env.onResize); + editor.on("destroy", function() { + event.removeListener(window, "resize", env.onResize); + env.editor.container.env = null; // prevent memory leak on old ie + }); + editor.container.env = editor.env = env; + return editor; +}; +exports.createEditSession = function(text, mode) { + var doc = new EditSession(text, mode); + doc.setUndoManager(new UndoManager()); + return doc; +} +exports.EditSession = EditSession; +exports.UndoManager = UndoManager; +exports.version = "1.2.8"; +}); + (function() { + ace.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = ace.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + }); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-beautify.js b/src/libs/ace/ext-beautify.js new file mode 100755 index 0000000..ba499b7 --- /dev/null +++ b/src/libs/ace/ext-beautify.js @@ -0,0 +1,334 @@ +ace.define("ace/ext/beautify/php_rules",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; +var TokenIterator = require("ace/token_iterator").TokenIterator; +exports.newLines = [{ + type: 'support.php_tag', + value: '' +}, { + type: 'paren.lparen', + value: '{', + indent: true +}, { + type: 'paren.rparen', + breakBefore: true, + value: '}', + indent: false +}, { + type: 'paren.rparen', + breakBefore: true, + value: '})', + indent: false, + dontBreak: true +}, { + type: 'comment' +}, { + type: 'text', + value: ';' +}, { + type: 'text', + value: ':', + context: 'php' +}, { + type: 'keyword', + value: 'case', + indent: true, + dontBreak: true +}, { + type: 'keyword', + value: 'default', + indent: true, + dontBreak: true +}, { + type: 'keyword', + value: 'break', + indent: false, + dontBreak: true +}, { + type: 'punctuation.doctype.end', + value: '>' +}, { + type: 'meta.tag.punctuation.end', + value: '>' +}, { + type: 'meta.tag.punctuation.begin', + value: '<', + blockTag: true, + indent: true, + dontBreak: true +}, { + type: 'meta.tag.punctuation.begin', + value: '' ){ + context = 'php'; + } + else if( token.type == 'support.php_tag' && token.value == '?>' ){ + context = 'html'; + } + else if( token.type == 'meta.tag.name.style' && context != 'css' ){ + context = 'css'; + } + else if( token.type == 'meta.tag.name.style' && context == 'css' ){ + context = 'html'; + } + else if( token.type == 'meta.tag.name.script' && context != 'js' ){ + context = 'js'; + } + else if( token.type == 'meta.tag.name.script' && context == 'js' ){ + context = 'html'; + } + + nextToken = iterator.stepForward(); + if (nextToken && nextToken.type.indexOf('meta.tag.name') == 0) { + nextTag = nextToken.value; + } + if ( lastToken.type == 'support.php_tag' && lastToken.value == '' ) { + dontBreak = false; + } + lastTag = tag; + + lastToken = token; + + token = nextToken; + + if (token===null) { + break; + } + } + + return code; +}; + + + +}); + +ace.define("ace/ext/beautify",["require","exports","module","ace/token_iterator","ace/ext/beautify/php_rules"], function(require, exports, module) { +"use strict"; +var TokenIterator = require("ace/token_iterator").TokenIterator; + +var phpTransform = require("./beautify/php_rules").transform; + +exports.beautify = function(session) { + var iterator = new TokenIterator(session, 0, 0); + var token = iterator.getCurrentToken(); + + var context = session.$modeId.split("/").pop(); + + var code = phpTransform(iterator, context); + session.doc.setValue(code); +}; + +exports.commands = [{ + name: "beautify", + exec: function(editor) { + exports.beautify(editor.session); + }, + bindKey: "Ctrl-Shift-B" +}] + +}); + (function() { + ace.require(["ace/ext/beautify"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-chromevox.js b/src/libs/ace/ext-chromevox.js new file mode 100755 index 0000000..a321335 --- /dev/null +++ b/src/libs/ace/ext-chromevox.js @@ -0,0 +1,540 @@ +ace.define("ace/ext/chromevox",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { +var cvoxAce = {}; +cvoxAce.SpeechProperty; +cvoxAce.Cursor; +cvoxAce.Token; +cvoxAce.Annotation; +var CONSTANT_PROP = { + 'rate': 0.8, + 'pitch': 0.4, + 'volume': 0.9 +}; +var DEFAULT_PROP = { + 'rate': 1, + 'pitch': 0.5, + 'volume': 0.9 +}; +var ENTITY_PROP = { + 'rate': 0.8, + 'pitch': 0.8, + 'volume': 0.9 +}; +var KEYWORD_PROP = { + 'rate': 0.8, + 'pitch': 0.3, + 'volume': 0.9 +}; +var STORAGE_PROP = { + 'rate': 0.8, + 'pitch': 0.7, + 'volume': 0.9 +}; +var VARIABLE_PROP = { + 'rate': 0.8, + 'pitch': 0.8, + 'volume': 0.9 +}; +var DELETED_PROP = { + 'punctuationEcho': 'none', + 'relativePitch': -0.6 +}; +var ERROR_EARCON = 'ALERT_NONMODAL'; +var MODE_SWITCH_EARCON = 'ALERT_MODAL'; +var NO_MATCH_EARCON = 'INVALID_KEYPRESS'; +var INSERT_MODE_STATE = 'insertMode'; +var COMMAND_MODE_STATE = 'start'; + +var REPLACE_LIST = [ + { + substr: ';', + newSubstr: ' semicolon ' + }, + { + substr: ':', + newSubstr: ' colon ' + } +]; +var Command = { + SPEAK_ANNOT: 'annots', + SPEAK_ALL_ANNOTS: 'all_annots', + TOGGLE_LOCATION: 'toggle_location', + SPEAK_MODE: 'mode', + SPEAK_ROW_COL: 'row_col', + TOGGLE_DISPLACEMENT: 'toggle_displacement', + FOCUS_TEXT: 'focus_text' +}; +var KEY_PREFIX = 'CONTROL + SHIFT '; +cvoxAce.editor = null; +var lastCursor = null; +var annotTable = {}; +var shouldSpeakRowLocation = false; +var shouldSpeakDisplacement = false; +var changed = false; +var vimState = null; +var keyCodeToShortcutMap = {}; +var cmdToShortcutMap = {}; +var getKeyShortcutString = function(keyCode) { + return KEY_PREFIX + String.fromCharCode(keyCode); +}; +var isVimMode = function() { + var keyboardHandler = cvoxAce.editor.keyBinding.getKeyboardHandler(); + return keyboardHandler.$id === 'ace/keyboard/vim'; +}; +var getCurrentToken = function(cursor) { + return cvoxAce.editor.getSession().getTokenAt(cursor.row, cursor.column + 1); +}; +var getCurrentLine = function(cursor) { + return cvoxAce.editor.getSession().getLine(cursor.row); +}; +var onRowChange = function(currCursor) { + if (annotTable[currCursor.row]) { + cvox.Api.playEarcon(ERROR_EARCON); + } + if (shouldSpeakRowLocation) { + cvox.Api.stop(); + speakChar(currCursor); + speakTokenQueue(getCurrentToken(currCursor)); + speakLine(currCursor.row, 1); + } else { + speakLine(currCursor.row, 0); + } +}; +var isWord = function(cursor) { + var line = getCurrentLine(cursor); + var lineSuffix = line.substr(cursor.column - 1); + if (cursor.column === 0) { + lineSuffix = ' ' + line; + } + var firstWordRegExp = /^\W(\w+)/; + var words = firstWordRegExp.exec(lineSuffix); + return words !== null; +}; +var rules = { + 'constant': { + prop: CONSTANT_PROP + }, + 'entity': { + prop: ENTITY_PROP + }, + 'keyword': { + prop: KEYWORD_PROP + }, + 'storage': { + prop: STORAGE_PROP + }, + 'variable': { + prop: VARIABLE_PROP + }, + 'meta': { + prop: DEFAULT_PROP, + replace: [ + { + substr: '', + newSubstr: ' close tag ' + }, + { + substr: '<', + newSubstr: ' tag start ' + }, + { + substr: '>', + newSubstr: ' tag end ' + } + ] + } +}; +var DEFAULT_RULE = { + prop: DEFAULT_RULE +}; +var expand = function(value, replaceRules) { + var newValue = value; + for (var i = 0; i < replaceRules.length; i++) { + var replaceRule = replaceRules[i]; + var regexp = new RegExp(replaceRule.substr, 'g'); + newValue = newValue.replace(regexp, replaceRule.newSubstr); + } + return newValue; +}; +var mergeTokens = function(tokens, start, end) { + var newToken = {}; + newToken.value = ''; + newToken.type = tokens[start].type; + for (var j = start; j < end; j++) { + newToken.value += tokens[j].value; + } + return newToken; +}; +var mergeLikeTokens = function(tokens) { + if (tokens.length <= 1) { + return tokens; + } + var newTokens = []; + var lastLikeIndex = 0; + for (var i = 1; i < tokens.length; i++) { + var lastLikeToken = tokens[lastLikeIndex]; + var currToken = tokens[i]; + if (getTokenRule(lastLikeToken) !== getTokenRule(currToken)) { + newTokens.push(mergeTokens(tokens, lastLikeIndex, i)); + lastLikeIndex = i; + } + } + newTokens.push(mergeTokens(tokens, lastLikeIndex, tokens.length)); + return newTokens; +}; +var isRowWhiteSpace = function(row) { + var line = cvoxAce.editor.getSession().getLine(row); + var whiteSpaceRegexp = /^\s*$/; + return whiteSpaceRegexp.exec(line) !== null; +}; +var speakLine = function(row, queue) { + var tokens = cvoxAce.editor.getSession().getTokens(row); + if (tokens.length === 0 || isRowWhiteSpace(row)) { + cvox.Api.playEarcon('EDITABLE_TEXT'); + return; + } + tokens = mergeLikeTokens(tokens); + var firstToken = tokens[0]; + tokens = tokens.filter(function(token) { + return token !== firstToken; + }); + speakToken_(firstToken, queue); + tokens.forEach(speakTokenQueue); +}; +var speakTokenFlush = function(token) { + speakToken_(token, 0); +}; +var speakTokenQueue = function(token) { + speakToken_(token, 1); +}; +var getTokenRule = function(token) { + if (!token || !token.type) { + return; + } + var split = token.type.split('.'); + if (split.length === 0) { + return; + } + var type = split[0]; + var rule = rules[type]; + if (!rule) { + return DEFAULT_RULE; + } + return rule; +}; +var speakToken_ = function(token, queue) { + var rule = getTokenRule(token); + var value = expand(token.value, REPLACE_LIST); + if (rule.replace) { + value = expand(value, rule.replace); + } + cvox.Api.speak(value, queue, rule.prop); +}; +var speakChar = function(cursor) { + var line = getCurrentLine(cursor); + cvox.Api.speak(line[cursor.column], 1); +}; +var speakDisplacement = function(lastCursor, currCursor) { + var line = getCurrentLine(currCursor); + var displace = line.substring(lastCursor.column, currCursor.column); + displace = displace.replace(/ /g, ' space '); + cvox.Api.speak(displace); +}; +var speakCharOrWordOrLine = function(lastCursor, currCursor) { + if (Math.abs(lastCursor.column - currCursor.column) !== 1) { + var currLineLength = getCurrentLine(currCursor).length; + if (currCursor.column === 0 || currCursor.column === currLineLength) { + speakLine(currCursor.row, 0); + return; + } + if (isWord(currCursor)) { + cvox.Api.stop(); + speakTokenQueue(getCurrentToken(currCursor)); + return; + } + } + speakChar(currCursor); +}; +var onColumnChange = function(lastCursor, currCursor) { + if (!cvoxAce.editor.selection.isEmpty()) { + speakDisplacement(lastCursor, currCursor); + cvox.Api.speak('selected', 1); + } + else if (shouldSpeakDisplacement) { + speakDisplacement(lastCursor, currCursor); + } else { + speakCharOrWordOrLine(lastCursor, currCursor); + } +}; +var onCursorChange = function(evt) { + if (changed) { + changed = false; + return; + } + var currCursor = cvoxAce.editor.selection.getCursor(); + if (currCursor.row !== lastCursor.row) { + onRowChange(currCursor); + } else { + onColumnChange(lastCursor, currCursor); + } + lastCursor = currCursor; +}; +var onSelectionChange = function(evt) { + if (cvoxAce.editor.selection.isEmpty()) { + cvox.Api.speak('unselected'); + } +}; +var onChange = function(delta) { + switch (delta.action) { + case 'remove': + cvox.Api.speak(delta.text, 0, DELETED_PROP); + changed = true; + break; + case 'insert': + cvox.Api.speak(delta.text, 0); + changed = true; + break; + } +}; +var isNewAnnotation = function(annot) { + var row = annot.row; + var col = annot.column; + return !annotTable[row] || !annotTable[row][col]; +}; +var populateAnnotations = function(annotations) { + annotTable = {}; + for (var i = 0; i < annotations.length; i++) { + var annotation = annotations[i]; + var row = annotation.row; + var col = annotation.column; + if (!annotTable[row]) { + annotTable[row] = {}; + } + annotTable[row][col] = annotation; + } +}; +var onAnnotationChange = function(evt) { + var annotations = cvoxAce.editor.getSession().getAnnotations(); + var newAnnotations = annotations.filter(isNewAnnotation); + if (newAnnotations.length > 0) { + cvox.Api.playEarcon(ERROR_EARCON); + } + populateAnnotations(annotations); +}; +var speakAnnot = function(annot) { + var annotText = annot.type + ' ' + annot.text + ' on ' + + rowColToString(annot.row, annot.column); + annotText = annotText.replace(';', 'semicolon'); + cvox.Api.speak(annotText, 1); +}; +var speakAnnotsByRow = function(row) { + var annots = annotTable[row]; + for (var col in annots) { + speakAnnot(annots[col]); + } +}; +var rowColToString = function(row, col) { + return 'row ' + (row + 1) + ' column ' + (col + 1); +}; +var speakCurrRowAndCol = function() { + cvox.Api.speak(rowColToString(lastCursor.row, lastCursor.column)); +}; +var speakAllAnnots = function() { + for (var row in annotTable) { + speakAnnotsByRow(row); + } +}; +var speakMode = function() { + if (!isVimMode()) { + return; + } + switch (cvoxAce.editor.keyBinding.$data.state) { + case INSERT_MODE_STATE: + cvox.Api.speak('Insert mode'); + break; + case COMMAND_MODE_STATE: + cvox.Api.speak('Command mode'); + break; + } +}; +var toggleSpeakRowLocation = function() { + shouldSpeakRowLocation = !shouldSpeakRowLocation; + if (shouldSpeakRowLocation) { + cvox.Api.speak('Speak location on row change enabled.'); + } else { + cvox.Api.speak('Speak location on row change disabled.'); + } +}; +var toggleSpeakDisplacement = function() { + shouldSpeakDisplacement = !shouldSpeakDisplacement; + if (shouldSpeakDisplacement) { + cvox.Api.speak('Speak displacement on column changes.'); + } else { + cvox.Api.speak('Speak current character or word on column changes.'); + } +}; +var onKeyDown = function(evt) { + if (evt.ctrlKey && evt.shiftKey) { + var shortcut = keyCodeToShortcutMap[evt.keyCode]; + if (shortcut) { + shortcut.func(); + } + } +}; +var onChangeStatus = function(evt, editor) { + if (!isVimMode()) { + return; + } + var state = editor.keyBinding.$data.state; + if (state === vimState) { + return; + } + switch (state) { + case INSERT_MODE_STATE: + cvox.Api.playEarcon(MODE_SWITCH_EARCON); + cvox.Api.setKeyEcho(true); + break; + case COMMAND_MODE_STATE: + cvox.Api.playEarcon(MODE_SWITCH_EARCON); + cvox.Api.setKeyEcho(false); + break; + } + vimState = state; +}; +var contextMenuHandler = function(evt) { + var cmd = evt.detail['customCommand']; + var shortcut = cmdToShortcutMap[cmd]; + if (shortcut) { + shortcut.func(); + cvoxAce.editor.focus(); + } +}; +var initContextMenu = function() { + var ACTIONS = SHORTCUTS.map(function(shortcut) { + return { + desc: shortcut.desc + getKeyShortcutString(shortcut.keyCode), + cmd: shortcut.cmd + }; + }); + var body = document.querySelector('body'); + body.setAttribute('contextMenuActions', JSON.stringify(ACTIONS)); + body.addEventListener('ATCustomEvent', contextMenuHandler, true); +}; +var onFindSearchbox = function(evt) { + if (evt.match) { + speakLine(lastCursor.row, 0); + } else { + cvox.Api.playEarcon(NO_MATCH_EARCON); + } +}; +var focus = function() { + cvoxAce.editor.focus(); +}; +var SHORTCUTS = [ + { + keyCode: 49, + func: function() { + speakAnnotsByRow(lastCursor.row); + }, + cmd: Command.SPEAK_ANNOT, + desc: 'Speak annotations on line' + }, + { + keyCode: 50, + func: speakAllAnnots, + cmd: Command.SPEAK_ALL_ANNOTS, + desc: 'Speak all annotations' + }, + { + keyCode: 51, + func: speakMode, + cmd: Command.SPEAK_MODE, + desc: 'Speak Vim mode' + }, + { + keyCode: 52, + func: toggleSpeakRowLocation, + cmd: Command.TOGGLE_LOCATION, + desc: 'Toggle speak row location' + }, + { + keyCode: 53, + func: speakCurrRowAndCol, + cmd: Command.SPEAK_ROW_COL, + desc: 'Speak row and column' + }, + { + keyCode: 54, + func: toggleSpeakDisplacement, + cmd: Command.TOGGLE_DISPLACEMENT, + desc: 'Toggle speak displacement' + }, + { + keyCode: 55, + func: focus, + cmd: Command.FOCUS_TEXT, + desc: 'Focus text' + } +]; +var onFocus = function(_, editor) { + cvoxAce.editor = editor; + editor.getSession().selection.on('changeCursor', onCursorChange); + editor.getSession().selection.on('changeSelection', onSelectionChange); + editor.getSession().on('change', onChange); + editor.getSession().on('changeAnnotation', onAnnotationChange); + editor.on('changeStatus', onChangeStatus); + editor.on('findSearchBox', onFindSearchbox); + editor.container.addEventListener('keydown', onKeyDown); + + lastCursor = editor.selection.getCursor(); +}; +var init = function(editor) { + onFocus(null, editor); + SHORTCUTS.forEach(function(shortcut) { + keyCodeToShortcutMap[shortcut.keyCode] = shortcut; + cmdToShortcutMap[shortcut.cmd] = shortcut; + }); + + editor.on('focus', onFocus); + if (isVimMode()) { + cvox.Api.setKeyEcho(false); + } + initContextMenu(); +}; +function cvoxApiExists() { + return (typeof(cvox) !== 'undefined') && cvox && cvox.Api; +} +var tries = 0; +var MAX_TRIES = 15; +function watchForCvoxLoad(editor) { + if (cvoxApiExists()) { + init(editor); + } else { + tries++; + if (tries >= MAX_TRIES) { + return; + } + window.setTimeout(watchForCvoxLoad, 500, editor); + } +} + +var Editor = require('../editor').Editor; +require('../config').defineOptions(Editor.prototype, 'editor', { + enableChromevoxEnhancements: { + set: function(val) { + if (val) { + watchForCvoxLoad(this); + } + }, + value: true // turn it on by default or check for window.cvox + } +}); + +}); + (function() { + ace.require(["ace/ext/chromevox"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-elastic_tabstops_lite.js b/src/libs/ace/ext-elastic_tabstops_lite.js new file mode 100755 index 0000000..14e8855 --- /dev/null +++ b/src/libs/ace/ext-elastic_tabstops_lite.js @@ -0,0 +1,274 @@ +ace.define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var ElasticTabstopsLite = function(editor) { + this.$editor = editor; + var self = this; + var changedRows = []; + var recordChanges = false; + this.onAfterExec = function() { + recordChanges = false; + self.processRows(changedRows); + changedRows = []; + }; + this.onExec = function() { + recordChanges = true; + }; + this.onChange = function(delta) { + if (recordChanges) { + if (changedRows.indexOf(delta.start.row) == -1) + changedRows.push(delta.start.row); + if (delta.end.row != delta.start.row) + changedRows.push(delta.end.row); + } + }; +}; + +(function() { + this.processRows = function(rows) { + this.$inChange = true; + var checkedRows = []; + + for (var r = 0, rowCount = rows.length; r < rowCount; r++) { + var row = rows[r]; + + if (checkedRows.indexOf(row) > -1) + continue; + + var cellWidthObj = this.$findCellWidthsForBlock(row); + var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths); + var rowIndex = cellWidthObj.firstRow; + + for (var w = 0, l = cellWidths.length; w < l; w++) { + var widths = cellWidths[w]; + checkedRows.push(rowIndex); + this.$adjustRow(rowIndex, widths); + rowIndex++; + } + } + this.$inChange = false; + }; + + this.$findCellWidthsForBlock = function(row) { + var cellWidths = [], widths; + var rowIter = row; + while (rowIter >= 0) { + widths = this.$cellWidthsForRow(rowIter); + if (widths.length == 0) + break; + + cellWidths.unshift(widths); + rowIter--; + } + var firstRow = rowIter + 1; + rowIter = row; + var numRows = this.$editor.session.getLength(); + + while (rowIter < numRows - 1) { + rowIter++; + + widths = this.$cellWidthsForRow(rowIter); + if (widths.length == 0) + break; + + cellWidths.push(widths); + } + + return { cellWidths: cellWidths, firstRow: firstRow }; + }; + + this.$cellWidthsForRow = function(row) { + var selectionColumns = this.$selectionColumnsForRow(row); + + var tabs = [-1].concat(this.$tabsForRow(row)); + var widths = tabs.map(function(el) { return 0; } ).slice(1); + var line = this.$editor.session.getLine(row); + + for (var i = 0, len = tabs.length - 1; i < len; i++) { + var leftEdge = tabs[i]+1; + var rightEdge = tabs[i+1]; + + var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge); + var cell = line.substring(leftEdge, rightEdge); + widths[i] = Math.max(cell.replace(/\s+$/g,'').length, rightmostSelection - leftEdge); + } + + return widths; + }; + + this.$selectionColumnsForRow = function(row) { + var selections = [], cursor = this.$editor.getCursorPosition(); + if (this.$editor.session.getSelection().isEmpty()) { + if (row == cursor.row) + selections.push(cursor.column); + } + + return selections; + }; + + this.$setBlockCellWidthsToMax = function(cellWidths) { + var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth; + var columnInfo = this.$izip_longest(cellWidths); + + for (var c = 0, l = columnInfo.length; c < l; c++) { + var column = columnInfo[c]; + if (!column.push) { + console.error(column); + continue; + } + column.push(NaN); + + for (var r = 0, s = column.length; r < s; r++) { + var width = column[r]; + if (startingNewBlock) { + blockStartRow = r; + maxWidth = 0; + startingNewBlock = false; + } + if (isNaN(width)) { + blockEndRow = r; + + for (var j = blockStartRow; j < blockEndRow; j++) { + cellWidths[j][c] = maxWidth; + } + startingNewBlock = true; + } + + maxWidth = Math.max(maxWidth, width); + } + } + + return cellWidths; + }; + + this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) { + var rightmost = 0; + + if (selectionColumns.length) { + var lengths = []; + for (var s = 0, length = selectionColumns.length; s < length; s++) { + if (selectionColumns[s] <= cellRightEdge) + lengths.push(s); + else + lengths.push(0); + } + rightmost = Math.max.apply(Math, lengths); + } + + return rightmost; + }; + + this.$tabsForRow = function(row) { + var rowTabs = [], line = this.$editor.session.getLine(row), + re = /\t/g, match; + + while ((match = re.exec(line)) != null) { + rowTabs.push(match.index); + } + + return rowTabs; + }; + + this.$adjustRow = function(row, widths) { + var rowTabs = this.$tabsForRow(row); + + if (rowTabs.length == 0) + return; + + var bias = 0, location = -1; + var expandedSet = this.$izip(widths, rowTabs); + + for (var i = 0, l = expandedSet.length; i < l; i++) { + var w = expandedSet[i][0], it = expandedSet[i][1]; + location += 1 + w; + it += bias; + var difference = location - it; + + if (difference == 0) + continue; + + var partialLine = this.$editor.session.getLine(row).substr(0, it ); + var strippedPartialLine = partialLine.replace(/\s*$/g, ""); + var ispaces = partialLine.length - strippedPartialLine.length; + + if (difference > 0) { + this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(" ") + "\t"); + this.$editor.session.getDocument().removeInLine(row, it, it + 1); + + bias += difference; + } + + if (difference < 0 && ispaces >= -difference) { + this.$editor.session.getDocument().removeInLine(row, it + difference, it); + bias += difference; + } + } + }; + this.$izip_longest = function(iterables) { + if (!iterables[0]) + return []; + var longest = iterables[0].length; + var iterablesLength = iterables.length; + + for (var i = 1; i < iterablesLength; i++) { + var iLength = iterables[i].length; + if (iLength > longest) + longest = iLength; + } + + var expandedSet = []; + + for (var l = 0; l < longest; l++) { + var set = []; + for (var i = 0; i < iterablesLength; i++) { + if (iterables[i][l] === "") + set.push(NaN); + else + set.push(iterables[i][l]); + } + + expandedSet.push(set); + } + + + return expandedSet; + }; + this.$izip = function(widths, tabs) { + var size = widths.length >= tabs.length ? tabs.length : widths.length; + + var expandedSet = []; + for (var i = 0; i < size; i++) { + var set = [ widths[i], tabs[i] ]; + expandedSet.push(set); + } + return expandedSet; + }; + +}).call(ElasticTabstopsLite.prototype); + +exports.ElasticTabstopsLite = ElasticTabstopsLite; + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + useElasticTabstops: { + set: function(val) { + if (val) { + if (!this.elasticTabstops) + this.elasticTabstops = new ElasticTabstopsLite(this); + this.commands.on("afterExec", this.elasticTabstops.onAfterExec); + this.commands.on("exec", this.elasticTabstops.onExec); + this.on("change", this.elasticTabstops.onChange); + } else if (this.elasticTabstops) { + this.commands.removeListener("afterExec", this.elasticTabstops.onAfterExec); + this.commands.removeListener("exec", this.elasticTabstops.onExec); + this.removeListener("change", this.elasticTabstops.onChange); + } + } + } +}); + +}); + (function() { + ace.require(["ace/ext/elastic_tabstops_lite"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-emmet.js b/src/libs/ace/ext-emmet.js new file mode 100755 index 0000000..c2f2d1a --- /dev/null +++ b/src/libs/ace/ext-emmet.js @@ -0,0 +1,1223 @@ +ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"], function(require, exports, module) { +"use strict"; +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var lang = require("./lib/lang"); +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; +var HashHandler = require("./keyboard/hash_handler").HashHandler; +var Tokenizer = require("./tokenizer").Tokenizer; +var comparePoints = Range.comparePoints; + +var SnippetManager = function() { + this.snippetMap = {}; + this.snippetNameMap = {}; +}; + +(function() { + oop.implement(this, EventEmitter); + + this.getTokenizer = function() { + function TabstopToken(str, _, stack) { + str = str.substr(1); + if (/^\d+$/.test(str) && !stack.inFormatString) + return [{tabstopId: parseInt(str, 10)}]; + return [{text: str}]; + } + function escape(ch) { + return "(?:[^\\\\" + ch + "]|\\\\.)"; + } + SnippetManager.$tokenizer = new Tokenizer({ + start: [ + {regex: /:/, onMatch: function(val, state, stack) { + if (stack.length && stack[0].expectIf) { + stack[0].expectIf = false; + stack[0].elseBranch = stack[0]; + return [stack[0]]; + } + return ":"; + }}, + {regex: /\\./, onMatch: function(val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + }else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } else if (stack.inFormatString) { + if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\n"; + else if ("ulULE".indexOf(ch) != -1) { + val = {changeCase: ch, local: ch > "a"}; + } + } + + return [val]; + }}, + {regex: /}/, onMatch: function(val, state, stack) { + return [stack.length ? stack.shift() : val]; + }}, + {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, + {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { + var t = TabstopToken(str.substr(1), state, stack); + stack.unshift(t[0]); + return t; + }, next: "snippetVar"}, + {regex: /\n/, token: "newline", merge: false} + ], + snippetVar: [ + {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { + stack[0].choices = val.slice(1, -1).split(","); + }, next: "start"}, + {regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\w*):?", + onMatch: function(val, state, stack) { + var ts = stack[0]; + ts.fmtString = val; + + val = this.splitRegex.exec(val); + ts.guard = val[1]; + ts.fmt = val[2]; + ts.flag = val[3]; + return ""; + }, next: "start"}, + {regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) { + stack[0].code = val.splice(1, -1); + return ""; + }, next: "start"}, + {regex: "\\?", onMatch: function(val, state, stack) { + if (stack[0]) + stack[0].expectIf = true; + }, next: "start"}, + {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + ], + formatString: [ + {regex: "/(" + escape("/") + "+)/", token: "regex"}, + {regex: "", onMatch: function(val, state, stack) { + stack.inFormatString = true; + }, next: "start"} + ] + }); + SnippetManager.prototype.getTokenizer = function() { + return SnippetManager.$tokenizer; + }; + return SnippetManager.$tokenizer; + }; + + this.tokenizeTmSnippet = function(str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + return x.value || x; + }); + }; + + this.$getDefaultValue = function(editor, name) { + if (/^[A-Z]\d+$/.test(name)) { + var i = name.substr(1); + return (this.variables[name[0] + "__"] || {})[i]; + } + if (/^\d+$/.test(name)) { + return (this.variables.__ || {})[name]; + } + name = name.replace(/^TM_/, ""); + + if (!editor) + return; + var s = editor.session; + switch(name) { + case "CURRENT_WORD": + var r = s.getWordRange(); + case "SELECTION": + case "SELECTED_TEXT": + return s.getTextRange(r); + case "CURRENT_LINE": + return s.getLine(editor.getCursorPosition().row); + case "PREV_LINE": // not possible in textmate + return s.getLine(editor.getCursorPosition().row - 1); + case "LINE_INDEX": + return editor.getCursorPosition().column; + case "LINE_NUMBER": + return editor.getCursorPosition().row + 1; + case "SOFT_TABS": + return s.getUseSoftTabs() ? "YES" : "NO"; + case "TAB_SIZE": + return s.getTabSize(); + case "FILENAME": + case "FILEPATH": + return ""; + case "FULLNAME": + return "Ace"; + } + }; + this.variables = {}; + this.getVariableValue = function(editor, varName) { + if (this.variables.hasOwnProperty(varName)) + return this.variables[varName](editor, varName) || ""; + return this.$getDefaultValue(editor, varName) || ""; + }; + this.tmStrFormat = function(str, ch, editor) { + var flag = ch.flag || ""; + var re = ch.guard; + re = new RegExp(re, flag.replace(/[^gi]/, "")); + var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString"); + var _self = this; + var formatted = str.replace(re, function() { + _self.variables.__ = arguments; + var fmtParts = _self.resolveVariables(fmtTokens, editor); + var gChangeCase = "E"; + for (var i = 0; i < fmtParts.length; i++) { + var ch = fmtParts[i]; + if (typeof ch == "object") { + fmtParts[i] = ""; + if (ch.changeCase && ch.local) { + var next = fmtParts[i + 1]; + if (next && typeof next == "string") { + if (ch.changeCase == "u") + fmtParts[i] = next[0].toUpperCase(); + else + fmtParts[i] = next[0].toLowerCase(); + fmtParts[i + 1] = next.substr(1); + } + } else if (ch.changeCase) { + gChangeCase = ch.changeCase; + } + } else if (gChangeCase == "U") { + fmtParts[i] = ch.toUpperCase(); + } else if (gChangeCase == "L") { + fmtParts[i] = ch.toLowerCase(); + } + } + return fmtParts.join(""); + }); + this.variables.__ = null; + return formatted; + }; + + this.resolveVariables = function(snippet, editor) { + var result = []; + for (var i = 0; i < snippet.length; i++) { + var ch = snippet[i]; + if (typeof ch == "string") { + result.push(ch); + } else if (typeof ch != "object") { + continue; + } else if (ch.skip) { + gotoNext(ch); + } else if (ch.processed < i) { + continue; + } else if (ch.text) { + var value = this.getVariableValue(editor, ch.text); + if (value && ch.fmtString) + value = this.tmStrFormat(value, ch); + ch.processed = i; + if (ch.expectIf == null) { + if (value) { + result.push(value); + gotoNext(ch); + } + } else { + if (value) { + ch.skip = ch.elseBranch; + } else + gotoNext(ch); + } + } else if (ch.tabstopId != null) { + result.push(ch); + } else if (ch.changeCase != null) { + result.push(ch); + } + } + function gotoNext(ch) { + var i1 = snippet.indexOf(ch, i + 1); + if (i1 != -1) + i = i1; + } + return result; + }; + + this.insertSnippetForSelection = function(editor, snippetText) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function(x) { + if (x == "\n") + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function(p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + } + if (ts.indexOf(p) !== -1) + return; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function(t) {return typeof t === "object"}); + if (isNested && !ts.value) { + ts.value = value; + } else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function(ts) {ts.length = 0}); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || {tabstopId: p.tabstopId}; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) + expanding[id] = null; + continue; + } + + var ts = tabstops[id]; + var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value); + arg.unshift(i + 1, Math.max(0, i1 - i)); + arg.push(p); + expanding[id] = p; + tokens.splice.apply(tokens, arg); + + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function(t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1){ + column = lines[lines.length - 1].length; + row += lines.length - 1; + } else + column += t.length; + text += t; + } else { + if (!t.start) + t.start = {row: row, column: column}; + else + t.end = {row: row, column: column}; + } + }); + var range = editor.getSelectionRange(); + var end = editor.session.replace(range, text); + + var tabstopManager = new TabstopManager(editor); + var selectionId = editor.inVirtualSelectionMode && editor.selection.index; + tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + }; + + this.insertSnippet = function(editor, snippetText) { + var self = this; + if (editor.inVirtualSelectionMode) + return self.insertSnippetForSelection(editor, snippetText); + + editor.forEachSelection(function() { + self.insertSnippetForSelection(editor, snippetText); + }, null, {keepOrder: true}); + + if (editor.tabstopManager) + editor.tabstopManager.tabNext(); + }; + + this.$getScope = function(editor) { + var scope = editor.session.$mode.$id || ""; + scope = scope.split("/").pop(); + if (scope === "html" || scope === "php") { + if (scope === "php" && !editor.session.$mode.inlinePhp) + scope = "html"; + var c = editor.getCursorPosition(); + var state = editor.session.getState(c.row); + if (typeof state === "object") { + state = state[0]; + } + if (state.substring) { + if (state.substring(0, 3) == "js-") + scope = "javascript"; + else if (state.substring(0, 4) == "css-") + scope = "css"; + else if (state.substring(0, 4) == "php-") + scope = "php"; + } + } + + return scope; + }; + + this.getActiveScopes = function(editor) { + var scope = this.$getScope(editor); + var scopes = [scope]; + var snippetMap = this.snippetMap; + if (snippetMap[scope] && snippetMap[scope].includeScopes) { + scopes.push.apply(scopes, snippetMap[scope].includeScopes); + } + scopes.push("_"); + return scopes; + }; + + this.expandWithTab = function(editor, options) { + var self = this; + var result = editor.forEachSelection(function() { + return self.expandSnippetForSelection(editor, options); + }, null, {keepOrder: true}); + if (result && editor.tabstopManager) + editor.tabstopManager.tabNext(); + return result; + }; + + this.expandSnippetForSelection = function(editor, options) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var before = line.substring(0, cursor.column); + var after = line.substr(cursor.column); + + var snippetMap = this.snippetMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = this.findMatchingSnippet(snippets, before, after); + return !!snippet; + }, this); + if (!snippet) + return false; + if (options && options.dryRun) + return true; + editor.session.doc.removeInLine(cursor.row, + cursor.column - snippet.replaceBefore.length, + cursor.column + snippet.replaceAfter.length + ); + + this.variables.M__ = snippet.matchBefore; + this.variables.T__ = snippet.matchAfter; + this.insertSnippetForSelection(editor, snippet.content); + + this.variables.M__ = this.variables.T__ = null; + return true; + }; + + this.findMatchingSnippet = function(snippetList, before, after) { + for (var i = snippetList.length; i--;) { + var s = snippetList[i]; + if (s.startRe && !s.startRe.test(before)) + continue; + if (s.endRe && !s.endRe.test(after)) + continue; + if (!s.startRe && !s.endRe) + continue; + + s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; + s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; + s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; + s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : ""; + return s; + } + }; + + this.snippetMap = {}; + this.snippetNameMap = {}; + this.register = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + var self = this; + + if (!snippets) + snippets = []; + + function wrapRegexp(src) { + if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) + src = "(?:" + src + ")"; + + return src || ""; + } + function guardedRegexp(re, guard, opening) { + re = wrapRegexp(re); + guard = wrapRegexp(guard); + if (opening) { + re = guard + re; + if (re && re[re.length - 1] != "$") + re = re + "$"; + } else { + re = re + guard; + if (re && re[0] != "^") + re = "^" + re; + } + return new RegExp(re); + } + + function addSnippet(s) { + if (!s.scope) + s.scope = scope || "_"; + scope = s.scope; + if (!snippetMap[scope]) { + snippetMap[scope] = []; + snippetNameMap[scope] = {}; + } + + var map = snippetNameMap[scope]; + if (s.name) { + var old = map[s.name]; + if (old) + self.unregister(old); + map[s.name] = s; + } + snippetMap[scope].push(s); + + if (s.tabTrigger && !s.trigger) { + if (!s.guard && /^\w/.test(s.tabTrigger)) + s.guard = "\\b"; + s.trigger = lang.escapeRegExp(s.tabTrigger); + } + + if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) + return; + + s.startRe = guardedRegexp(s.trigger, s.guard, true); + s.triggerRe = new RegExp(s.trigger, "", true); + + s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); + s.endTriggerRe = new RegExp(s.endTrigger, "", true); + } + + if (snippets && snippets.content) + addSnippet(snippets); + else if (Array.isArray(snippets)) + snippets.forEach(addSnippet); + + this._signal("registerSnippets", {scope: scope}); + }; + this.unregister = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + + function removeSnippet(s) { + var nameMap = snippetNameMap[s.scope||scope]; + if (nameMap && nameMap[s.name]) { + delete nameMap[s.name]; + var map = snippetMap[s.scope||scope]; + var i = map && map.indexOf(s); + if (i >= 0) + map.splice(i, 1); + } + } + if (snippets.content) + removeSnippet(snippets); + else if (Array.isArray(snippets)) + snippets.forEach(removeSnippet); + }; + this.parseSnippetFile = function(str) { + str = str.replace(/\r/g, ""); + var list = [], snippet = {}; + var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; + var m; + while (m = re.exec(str)) { + if (m[1]) { + try { + snippet = JSON.parse(m[1]); + list.push(snippet); + } catch (e) {} + } if (m[4]) { + snippet.content = m[4].replace(/^\t/gm, ""); + list.push(snippet); + snippet = {}; + } else { + var key = m[2], val = m[3]; + if (key == "regex") { + var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; + snippet.guard = guardRe.exec(val)[1]; + snippet.trigger = guardRe.exec(val)[1]; + snippet.endTrigger = guardRe.exec(val)[1]; + snippet.endGuard = guardRe.exec(val)[1]; + } else if (key == "snippet") { + snippet.tabTrigger = val.match(/^\S*/)[0]; + if (!snippet.name) + snippet.name = val; + } else { + snippet[key] = val; + } + } + } + return list; + }; + this.getSnippetByName = function(name, editor) { + var snippetMap = this.snippetNameMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = snippets[name]; + return !!snippet; + }, this); + return snippet; + }; + +}).call(SnippetManager.prototype); + + +var TabstopManager = function(editor) { + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); +}; +(function() { + this.attach = function(editor) { + this.index = 0; + this.ranges = []; + this.tabstops = []; + this.$openTabstops = null; + this.selectedTabstop = null; + + this.editor = editor; + this.editor.on("change", this.$onChange); + this.editor.on("changeSelection", this.$onChangeSelection); + this.editor.on("changeSession", this.$onChangeSession); + this.editor.commands.on("afterExec", this.$onAfterExec); + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + }; + this.detach = function() { + this.tabstops.forEach(this.removeTabstopMarkers, this); + this.ranges = null; + this.tabstops = null; + this.selectedTabstop = null; + this.editor.removeListener("change", this.$onChange); + this.editor.removeListener("changeSelection", this.$onChangeSelection); + this.editor.removeListener("changeSession", this.$onChangeSession); + this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.tabstopManager = null; + this.editor = null; + }; + + this.onChange = function(delta) { + var changeRange = delta; + var isRemove = delta.action[0] == "r"; + var start = delta.start; + var end = delta.end; + var startRow = start.row; + var endRow = end.row; + var lineDif = endRow - startRow; + var colDiff = end.column - start.column; + + if (isRemove) { + lineDif = -lineDif; + colDiff = -colDiff; + } + if (!this.$inChange && isRemove) { + var ts = this.selectedTabstop; + var changedOutside = ts && !ts.some(function(r) { + return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0; + }); + if (changedOutside) + return this.detach(); + } + var ranges = this.ranges; + for (var i = 0; i < ranges.length; i++) { + var r = ranges[i]; + if (r.end.row < start.row) + continue; + + if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) { + this.removeRange(r); + i--; + continue; + } + + if (r.start.row == startRow && r.start.column > start.column) + r.start.column += colDiff; + if (r.end.row == startRow && r.end.column >= start.column) + r.end.column += colDiff; + if (r.start.row >= startRow) + r.start.row += lineDif; + if (r.end.row >= startRow) + r.end.row += lineDif; + + if (comparePoints(r.start, r.end) > 0) + this.removeRange(r); + } + if (!ranges.length) + this.detach(); + }; + this.updateLinkedFields = function() { + var ts = this.selectedTabstop; + if (!ts || !ts.hasLinkedRanges) + return; + this.$inChange = true; + var session = this.editor.session; + var text = session.getTextRange(ts.firstNonLinked); + for (var i = ts.length; i--;) { + var range = ts[i]; + if (!range.linked) + continue; + var fmt = exports.snippetManager.tmStrFormat(text, range.original); + session.replace(range, fmt); + } + this.$inChange = false; + }; + this.onAfterExec = function(e) { + if (e.command && !e.command.readOnly) + this.updateLinkedFields(); + }; + this.onChangeSelection = function() { + if (!this.editor) + return; + var lead = this.editor.selection.lead; + var anchor = this.editor.selection.anchor; + var isEmpty = this.editor.selection.isEmpty(); + for (var i = this.ranges.length; i--;) { + if (this.ranges[i].linked) + continue; + var containsLead = this.ranges[i].contains(lead.row, lead.column); + var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column); + if (containsLead && containsAnchor) + return; + } + this.detach(); + }; + this.onChangeSession = function() { + this.detach(); + }; + this.tabNext = function(dir) { + var max = this.tabstops.length; + var index = this.index + (dir || 1); + index = Math.min(Math.max(index, 1), max); + if (index == max) + index = 0; + this.selectTabstop(index); + if (index === 0) + this.detach(); + }; + this.selectTabstop = function(index) { + this.$openTabstops = null; + var ts = this.tabstops[this.index]; + if (ts) + this.addTabstopMarkers(ts); + this.index = index; + ts = this.tabstops[this.index]; + if (!ts || !ts.length) + return; + + this.selectedTabstop = ts; + if (!this.editor.inVirtualSelectionMode) { + var sel = this.editor.multiSelect; + sel.toSingleRange(ts.firstNonLinked.clone()); + for (var i = ts.length; i--;) { + if (ts.hasLinkedRanges && ts[i].linked) + continue; + sel.addRange(ts[i].clone(), true); + } + if (sel.ranges[0]) + sel.addRange(sel.ranges[0].clone()); + } else { + this.editor.selection.setRange(ts.firstNonLinked); + } + + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + }; + this.addTabstops = function(tabstops, start, end) { + if (!this.$openTabstops) + this.$openTabstops = []; + if (!tabstops[0]) { + var p = Range.fromPoints(end, end); + moveRelative(p.start, start); + moveRelative(p.end, start); + tabstops[0] = [p]; + tabstops[0].index = 0; + } + + var i = this.index; + var arg = [i + 1, 0]; + var ranges = this.ranges; + tabstops.forEach(function(ts, index) { + var dest = this.$openTabstops[index] || ts; + + for (var i = ts.length; i--;) { + var p = ts[i]; + var range = Range.fromPoints(p.start, p.end || p.start); + movePoint(range.start, start); + movePoint(range.end, start); + range.original = p; + range.tabstop = dest; + ranges.push(range); + if (dest != ts) + dest.unshift(range); + else + dest[i] = range; + if (p.fmtString) { + range.linked = true; + dest.hasLinkedRanges = true; + } else if (!dest.firstNonLinked) + dest.firstNonLinked = range; + } + if (!dest.firstNonLinked) + dest.hasLinkedRanges = false; + if (dest === ts) { + arg.push(dest); + this.$openTabstops[index] = dest; + } + this.addTabstopMarkers(dest); + }, this); + + if (arg.length > 2) { + if (this.tabstops.length) + arg.push(arg.splice(2, 1)[0]); + this.tabstops.splice.apply(this.tabstops, arg); + } + }; + + this.addTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + if (!range.markerId) + range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); + }); + }; + this.removeTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + session.removeMarker(range.markerId); + range.markerId = null; + }); + }; + this.removeRange = function(range) { + var i = range.tabstop.indexOf(range); + range.tabstop.splice(i, 1); + i = this.ranges.indexOf(range); + this.ranges.splice(i, 1); + this.editor.session.removeMarker(range.markerId); + if (!range.tabstop.length) { + i = this.tabstops.indexOf(range.tabstop); + if (i != -1) + this.tabstops.splice(i, 1); + if (!this.tabstops.length) + this.detach(); + } + }; + + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys({ + "Tab": function(ed) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) { + return; + } + + ed.tabstopManager.tabNext(1); + }, + "Shift-Tab": function(ed) { + ed.tabstopManager.tabNext(-1); + }, + "Esc": function(ed) { + ed.tabstopManager.detach(); + }, + "Return": function(ed) { + return false; + } + }); +}).call(TabstopManager.prototype); + + + +var changeTracker = {}; +changeTracker.onChange = Anchor.prototype.onChange; +changeTracker.setPosition = function(row, column) { + this.pos.row = row; + this.pos.column = column; +}; +changeTracker.update = function(pos, delta, $insertRight) { + this.$insertRight = $insertRight; + this.pos = pos; + this.onChange(delta); +}; + +var movePoint = function(point, diff) { + if (point.row == 0) + point.column += diff.column; + point.row += diff.row; +}; + +var moveRelative = function(point, start) { + if (point.row == start.row) + point.column -= start.column; + point.row -= start.row; +}; + + +require("./lib/dom").importCssString("\ +.ace_snippet-marker {\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + background: rgba(194, 193, 208, 0.09);\ + border: 1px dotted rgba(211, 208, 235, 0.62);\ + position: absolute;\ +}"); + +exports.snippetManager = new SnippetManager(); + + +var Editor = require("./editor").Editor; +(function() { + this.insertSnippet = function(content, options) { + return exports.snippetManager.insertSnippet(this, content, options); + }; + this.expandSnippet = function(options) { + return exports.snippetManager.expandWithTab(this, options); + }; +}).call(Editor.prototype); + +}); + +ace.define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","resources","resources","tabStops","resources","utils","actions","ace/config","ace/config"], function(require, exports, module) { +"use strict"; +var HashHandler = require("ace/keyboard/hash_handler").HashHandler; +var Editor = require("ace/editor").Editor; +var snippetManager = require("ace/snippets").snippetManager; +var Range = require("ace/range").Range; +var emmet, emmetPath; +function AceEmmetEditor() {} + +AceEmmetEditor.prototype = { + setupContext: function(editor) { + this.ace = editor; + this.indentation = editor.session.getTabString(); + if (!emmet) + emmet = window.emmet; + var resources = emmet.resources || emmet.require("resources"); + resources.setVariable("indentation", this.indentation); + this.$syntax = null; + this.$syntax = this.getSyntax(); + }, + getSelectionRange: function() { + var range = this.ace.getSelectionRange(); + var doc = this.ace.session.doc; + return { + start: doc.positionToIndex(range.start), + end: doc.positionToIndex(range.end) + }; + }, + createSelection: function(start, end) { + var doc = this.ace.session.doc; + this.ace.selection.setRange({ + start: doc.indexToPosition(start), + end: doc.indexToPosition(end) + }); + }, + getCurrentLineRange: function() { + var ace = this.ace; + var row = ace.getCursorPosition().row; + var lineLength = ace.session.getLine(row).length; + var index = ace.session.doc.positionToIndex({row: row, column: 0}); + return { + start: index, + end: index + lineLength + }; + }, + getCaretPos: function(){ + var pos = this.ace.getCursorPosition(); + return this.ace.session.doc.positionToIndex(pos); + }, + setCaretPos: function(index){ + var pos = this.ace.session.doc.indexToPosition(index); + this.ace.selection.moveToPosition(pos); + }, + getCurrentLine: function() { + var row = this.ace.getCursorPosition().row; + return this.ace.session.getLine(row); + }, + replaceContent: function(value, start, end, noIndent) { + if (end == null) + end = start == null ? this.getContent().length : start; + if (start == null) + start = 0; + + var editor = this.ace; + var doc = editor.session.doc; + var range = Range.fromPoints(doc.indexToPosition(start), doc.indexToPosition(end)); + editor.session.remove(range); + + range.end = range.start; + + value = this.$updateTabstops(value); + snippetManager.insertSnippet(editor, value); + }, + getContent: function(){ + return this.ace.getValue(); + }, + getSyntax: function() { + if (this.$syntax) + return this.$syntax; + var syntax = this.ace.session.$modeId.split("/").pop(); + if (syntax == "html" || syntax == "php") { + var cursor = this.ace.getCursorPosition(); + var state = this.ace.session.getState(cursor.row); + if (typeof state != "string") + state = state[0]; + if (state) { + state = state.split("-"); + if (state.length > 1) + syntax = state[0]; + else if (syntax == "php") + syntax = "html"; + } + } + return syntax; + }, + getProfileName: function() { + var resources = emmet.resources || emmet.require("resources"); + switch (this.getSyntax()) { + case "css": return "css"; + case "xml": + case "xsl": + return "xml"; + case "html": + var profile = resources.getVariable("profile"); + if (!profile) + profile = this.ace.session.getLines(0,2).join("").search(/]+XHTML/i) != -1 ? "xhtml": "html"; + return profile; + default: + var mode = this.ace.session.$mode; + return mode.emmetConfig && mode.emmetConfig.profile || "xhtml"; + } + }, + prompt: function(title) { + return prompt(title); + }, + getSelection: function() { + return this.ace.session.getTextRange(); + }, + getFilePath: function() { + return ""; + }, + $updateTabstops: function(value) { + var base = 1000; + var zeroBase = 0; + var lastZero = null; + var ts = emmet.tabStops || emmet.require('tabStops'); + var resources = emmet.resources || emmet.require("resources"); + var settings = resources.getVocabulary("user"); + var tabstopOptions = { + tabstop: function(data) { + var group = parseInt(data.group, 10); + var isZero = group === 0; + if (isZero) + group = ++zeroBase; + else + group += base; + + var placeholder = data.placeholder; + if (placeholder) { + placeholder = ts.processText(placeholder, tabstopOptions); + } + + var result = '${' + group + (placeholder ? ':' + placeholder : '') + '}'; + + if (isZero) { + lastZero = [data.start, result]; + } + + return result; + }, + escape: function(ch) { + if (ch == '$') return '\\$'; + if (ch == '\\') return '\\\\'; + return ch; + } + }; + + value = ts.processText(value, tabstopOptions); + + if (settings.variables['insert_final_tabstop'] && !/\$\{0\}$/.test(value)) { + value += '${0}'; + } else if (lastZero) { + var common = emmet.utils ? emmet.utils.common : emmet.require('utils'); + value = common.replaceSubstring(value, '${0}', lastZero[0], lastZero[1]); + } + + return value; + } +}; + + +var keymap = { + expand_abbreviation: {"mac": "ctrl+alt+e", "win": "alt+e"}, + match_pair_outward: {"mac": "ctrl+d", "win": "ctrl+,"}, + match_pair_inward: {"mac": "ctrl+j", "win": "ctrl+shift+0"}, + matching_pair: {"mac": "ctrl+alt+j", "win": "alt+j"}, + next_edit_point: "alt+right", + prev_edit_point: "alt+left", + toggle_comment: {"mac": "command+/", "win": "ctrl+/"}, + split_join_tag: {"mac": "shift+command+'", "win": "shift+ctrl+`"}, + remove_tag: {"mac": "command+'", "win": "shift+ctrl+;"}, + evaluate_math_expression: {"mac": "shift+command+y", "win": "shift+ctrl+y"}, + increment_number_by_1: "ctrl+up", + decrement_number_by_1: "ctrl+down", + increment_number_by_01: "alt+up", + decrement_number_by_01: "alt+down", + increment_number_by_10: {"mac": "alt+command+up", "win": "shift+alt+up"}, + decrement_number_by_10: {"mac": "alt+command+down", "win": "shift+alt+down"}, + select_next_item: {"mac": "shift+command+.", "win": "shift+ctrl+."}, + select_previous_item: {"mac": "shift+command+,", "win": "shift+ctrl+,"}, + reflect_css_value: {"mac": "shift+command+r", "win": "shift+ctrl+r"}, + + encode_decode_data_url: {"mac": "shift+ctrl+d", "win": "ctrl+'"}, + expand_abbreviation_with_tab: "Tab", + wrap_with_abbreviation: {"mac": "shift+ctrl+a", "win": "shift+ctrl+a"} +}; + +var editorProxy = new AceEmmetEditor(); +exports.commands = new HashHandler(); +exports.runEmmetCommand = function runEmmetCommand(editor) { + try { + editorProxy.setupContext(editor); + var actions = emmet.actions || emmet.require("actions"); + + if (this.action == "expand_abbreviation_with_tab") { + if (!editor.selection.isEmpty()) + return false; + var pos = editor.selection.lead; + var token = editor.session.getTokenAt(pos.row, pos.column); + if (token && /\btag\b/.test(token.type)) + return false; + } + + if (this.action == "wrap_with_abbreviation") { + return setTimeout(function() { + actions.run("wrap_with_abbreviation", editorProxy); + }, 0); + } + + var result = actions.run(this.action, editorProxy); + } catch(e) { + if (!emmet) { + load(runEmmetCommand.bind(this, editor)); + return true; + } + editor._signal("changeStatus", typeof e == "string" ? e : e.message); + console.log(e); + result = false; + } + return result; +}; + +for (var command in keymap) { + exports.commands.addCommand({ + name: "emmet:" + command, + action: command, + bindKey: keymap[command], + exec: exports.runEmmetCommand, + multiSelectAction: "forEach" + }); +} + +exports.updateCommands = function(editor, enabled) { + if (enabled) { + editor.keyBinding.addKeyboardHandler(exports.commands); + } else { + editor.keyBinding.removeKeyboardHandler(exports.commands); + } +}; + +exports.isSupportedMode = function(mode) { + if (!mode) return false; + if (mode.emmetConfig) return true; + var id = mode.$id || mode; + return /css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(id); +}; + +exports.isAvailable = function(editor, command) { + if (/(evaluate_math_expression|expand_abbreviation)$/.test(command)) + return true; + var mode = editor.session.$mode; + var isSupported = exports.isSupportedMode(mode); + if (isSupported && mode.$modes) { + try { + editorProxy.setupContext(editor); + if (/js|php/.test(editorProxy.getSyntax())) + isSupported = false; + } catch(e) {} + } + return isSupported; +} + +var onChangeMode = function(e, target) { + var editor = target; + if (!editor) + return; + var enabled = exports.isSupportedMode(editor.session.$mode); + if (e.enableEmmet === false) + enabled = false; + if (enabled) + load(); + exports.updateCommands(editor, enabled); +}; + +var load = function(cb) { + if (typeof emmetPath == "string") { + require("ace/config").loadModule(emmetPath, function() { + emmetPath = null; + cb && cb(); + }); + } +}; + +exports.AceEmmetEditor = AceEmmetEditor; +require("ace/config").defineOptions(Editor.prototype, "editor", { + enableEmmet: { + set: function(val) { + this[val ? "on" : "removeListener"]("changeMode", onChangeMode); + onChangeMode({enableEmmet: !!val}, this); + }, + value: true + } +}); + +exports.setCore = function(e) { + if (typeof e == "string") + emmetPath = e; + else + emmet = e; +}; +}); + (function() { + ace.require(["ace/ext/emmet"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-error_marker.js b/src/libs/ace/ext-error_marker.js new file mode 100755 index 0000000..d4c9eb9 --- /dev/null +++ b/src/libs/ace/ext-error_marker.js @@ -0,0 +1,6 @@ + +; + (function() { + ace.require(["ace/ext/error_marker"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-keybinding_menu.js b/src/libs/ace/ext-keybinding_menu.js new file mode 100755 index 0000000..ede7d8d --- /dev/null +++ b/src/libs/ace/ext-keybinding_menu.js @@ -0,0 +1,170 @@ +ace.define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], 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);\ +-webkit-transition: all 0.5s;\ +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: 1000;\ +}\ +.ace_closeButton{\ +background: rgba(245, 146, 146, 0.9);\ +}\ +.ace_optionsMenuKey {\ +color: darkslateblue;\ +font-weight: bold;\ +}\ +.ace_optionsMenuCommand {\ +color: darkcyan;\ +font-weight: normal;\ +}"; +dom.importCssString(cssText); +module.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) { + top = top ? 'top: ' + top + ';' : ''; + bottom = bottom ? 'bottom: ' + bottom + ';' : ''; + right = right ? 'right: ' + right + ';' : ''; + left = left ? 'left: ' + left + ';' : ''; + + var closer = document.createElement('div'); + var contentContainer = document.createElement('div'); + + function documentEscListener(e) { + if (e.keyCode === 27) { + closer.click(); + } + } + + 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() { + document.removeEventListener('keydown', documentEscListener); + closer.parentNode.removeChild(closer); + editor.focus(); + closer = null; + }); + document.addEventListener('keydown', documentEscListener); + + contentContainer.style.cssText = top + right + bottom + left; + contentContainer.addEventListener('click', function(e) { + e.stopPropagation(); + }); + + var wrapper = dom.createElement("div"); + wrapper.style.position = "relative"; + + var closeButton = dom.createElement("div"); + closeButton.className = "ace_closeButton"; + closeButton.addEventListener('click', function() { + closer.click(); + }); + + wrapper.appendChild(closeButton); + contentContainer.appendChild(wrapper); + + contentContainer.appendChild(contentElement); + closer.appendChild(contentContainer); + document.body.appendChild(closer); + editor.blur(); +}; + +}); + +ace.define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], 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",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function(require, exports, module) { + "use strict"; + var Editor = require("ace/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 + '
      ' + + current.command + ' : ' + + '' + current.key + '
      '; + }, ''); + + el.id = 'kbshortcutmenu'; + el.innerHTML = '

      Keyboard Shortcuts

      ' + commands + '
      '; + overlayPage(editor, el, '0', '0', '0', null); + } + } + 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() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-language_tools.js b/src/libs/ace/ext-language_tools.js new file mode 100755 index 0000000..1336695 --- /dev/null +++ b/src/libs/ace/ext-language_tools.js @@ -0,0 +1,1956 @@ +ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/anchor","ace/keyboard/hash_handler","ace/tokenizer","ace/lib/dom","ace/editor"], function(require, exports, module) { +"use strict"; +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var lang = require("./lib/lang"); +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; +var HashHandler = require("./keyboard/hash_handler").HashHandler; +var Tokenizer = require("./tokenizer").Tokenizer; +var comparePoints = Range.comparePoints; + +var SnippetManager = function() { + this.snippetMap = {}; + this.snippetNameMap = {}; +}; + +(function() { + oop.implement(this, EventEmitter); + + this.getTokenizer = function() { + function TabstopToken(str, _, stack) { + str = str.substr(1); + if (/^\d+$/.test(str) && !stack.inFormatString) + return [{tabstopId: parseInt(str, 10)}]; + return [{text: str}]; + } + function escape(ch) { + return "(?:[^\\\\" + ch + "]|\\\\.)"; + } + SnippetManager.$tokenizer = new Tokenizer({ + start: [ + {regex: /:/, onMatch: function(val, state, stack) { + if (stack.length && stack[0].expectIf) { + stack[0].expectIf = false; + stack[0].elseBranch = stack[0]; + return [stack[0]]; + } + return ":"; + }}, + {regex: /\\./, onMatch: function(val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + }else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } else if (stack.inFormatString) { + if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\n"; + else if ("ulULE".indexOf(ch) != -1) { + val = {changeCase: ch, local: ch > "a"}; + } + } + + return [val]; + }}, + {regex: /}/, onMatch: function(val, state, stack) { + return [stack.length ? stack.shift() : val]; + }}, + {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, + {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { + var t = TabstopToken(str.substr(1), state, stack); + stack.unshift(t[0]); + return t; + }, next: "snippetVar"}, + {regex: /\n/, token: "newline", merge: false} + ], + snippetVar: [ + {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { + stack[0].choices = val.slice(1, -1).split(","); + }, next: "start"}, + {regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\w*):?", + onMatch: function(val, state, stack) { + var ts = stack[0]; + ts.fmtString = val; + + val = this.splitRegex.exec(val); + ts.guard = val[1]; + ts.fmt = val[2]; + ts.flag = val[3]; + return ""; + }, next: "start"}, + {regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) { + stack[0].code = val.splice(1, -1); + return ""; + }, next: "start"}, + {regex: "\\?", onMatch: function(val, state, stack) { + if (stack[0]) + stack[0].expectIf = true; + }, next: "start"}, + {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + ], + formatString: [ + {regex: "/(" + escape("/") + "+)/", token: "regex"}, + {regex: "", onMatch: function(val, state, stack) { + stack.inFormatString = true; + }, next: "start"} + ] + }); + SnippetManager.prototype.getTokenizer = function() { + return SnippetManager.$tokenizer; + }; + return SnippetManager.$tokenizer; + }; + + this.tokenizeTmSnippet = function(str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + return x.value || x; + }); + }; + + this.$getDefaultValue = function(editor, name) { + if (/^[A-Z]\d+$/.test(name)) { + var i = name.substr(1); + return (this.variables[name[0] + "__"] || {})[i]; + } + if (/^\d+$/.test(name)) { + return (this.variables.__ || {})[name]; + } + name = name.replace(/^TM_/, ""); + + if (!editor) + return; + var s = editor.session; + switch(name) { + case "CURRENT_WORD": + var r = s.getWordRange(); + case "SELECTION": + case "SELECTED_TEXT": + return s.getTextRange(r); + case "CURRENT_LINE": + return s.getLine(editor.getCursorPosition().row); + case "PREV_LINE": // not possible in textmate + return s.getLine(editor.getCursorPosition().row - 1); + case "LINE_INDEX": + return editor.getCursorPosition().column; + case "LINE_NUMBER": + return editor.getCursorPosition().row + 1; + case "SOFT_TABS": + return s.getUseSoftTabs() ? "YES" : "NO"; + case "TAB_SIZE": + return s.getTabSize(); + case "FILENAME": + case "FILEPATH": + return ""; + case "FULLNAME": + return "Ace"; + } + }; + this.variables = {}; + this.getVariableValue = function(editor, varName) { + if (this.variables.hasOwnProperty(varName)) + return this.variables[varName](editor, varName) || ""; + return this.$getDefaultValue(editor, varName) || ""; + }; + this.tmStrFormat = function(str, ch, editor) { + var flag = ch.flag || ""; + var re = ch.guard; + re = new RegExp(re, flag.replace(/[^gi]/, "")); + var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString"); + var _self = this; + var formatted = str.replace(re, function() { + _self.variables.__ = arguments; + var fmtParts = _self.resolveVariables(fmtTokens, editor); + var gChangeCase = "E"; + for (var i = 0; i < fmtParts.length; i++) { + var ch = fmtParts[i]; + if (typeof ch == "object") { + fmtParts[i] = ""; + if (ch.changeCase && ch.local) { + var next = fmtParts[i + 1]; + if (next && typeof next == "string") { + if (ch.changeCase == "u") + fmtParts[i] = next[0].toUpperCase(); + else + fmtParts[i] = next[0].toLowerCase(); + fmtParts[i + 1] = next.substr(1); + } + } else if (ch.changeCase) { + gChangeCase = ch.changeCase; + } + } else if (gChangeCase == "U") { + fmtParts[i] = ch.toUpperCase(); + } else if (gChangeCase == "L") { + fmtParts[i] = ch.toLowerCase(); + } + } + return fmtParts.join(""); + }); + this.variables.__ = null; + return formatted; + }; + + this.resolveVariables = function(snippet, editor) { + var result = []; + for (var i = 0; i < snippet.length; i++) { + var ch = snippet[i]; + if (typeof ch == "string") { + result.push(ch); + } else if (typeof ch != "object") { + continue; + } else if (ch.skip) { + gotoNext(ch); + } else if (ch.processed < i) { + continue; + } else if (ch.text) { + var value = this.getVariableValue(editor, ch.text); + if (value && ch.fmtString) + value = this.tmStrFormat(value, ch); + ch.processed = i; + if (ch.expectIf == null) { + if (value) { + result.push(value); + gotoNext(ch); + } + } else { + if (value) { + ch.skip = ch.elseBranch; + } else + gotoNext(ch); + } + } else if (ch.tabstopId != null) { + result.push(ch); + } else if (ch.changeCase != null) { + result.push(ch); + } + } + function gotoNext(ch) { + var i1 = snippet.indexOf(ch, i + 1); + if (i1 != -1) + i = i1; + } + return result; + }; + + this.insertSnippetForSelection = function(editor, snippetText) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function(x) { + if (x == "\n") + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function(p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + } + if (ts.indexOf(p) !== -1) + return; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function(t) {return typeof t === "object"}); + if (isNested && !ts.value) { + ts.value = value; + } else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function(ts) {ts.length = 0}); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || {tabstopId: p.tabstopId}; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) + expanding[id] = null; + continue; + } + + var ts = tabstops[id]; + var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value); + arg.unshift(i + 1, Math.max(0, i1 - i)); + arg.push(p); + expanding[id] = p; + tokens.splice.apply(tokens, arg); + + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function(t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1){ + column = lines[lines.length - 1].length; + row += lines.length - 1; + } else + column += t.length; + text += t; + } else { + if (!t.start) + t.start = {row: row, column: column}; + else + t.end = {row: row, column: column}; + } + }); + var range = editor.getSelectionRange(); + var end = editor.session.replace(range, text); + + var tabstopManager = new TabstopManager(editor); + var selectionId = editor.inVirtualSelectionMode && editor.selection.index; + tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + }; + + this.insertSnippet = function(editor, snippetText) { + var self = this; + if (editor.inVirtualSelectionMode) + return self.insertSnippetForSelection(editor, snippetText); + + editor.forEachSelection(function() { + self.insertSnippetForSelection(editor, snippetText); + }, null, {keepOrder: true}); + + if (editor.tabstopManager) + editor.tabstopManager.tabNext(); + }; + + this.$getScope = function(editor) { + var scope = editor.session.$mode.$id || ""; + scope = scope.split("/").pop(); + if (scope === "html" || scope === "php") { + if (scope === "php" && !editor.session.$mode.inlinePhp) + scope = "html"; + var c = editor.getCursorPosition(); + var state = editor.session.getState(c.row); + if (typeof state === "object") { + state = state[0]; + } + if (state.substring) { + if (state.substring(0, 3) == "js-") + scope = "javascript"; + else if (state.substring(0, 4) == "css-") + scope = "css"; + else if (state.substring(0, 4) == "php-") + scope = "php"; + } + } + + return scope; + }; + + this.getActiveScopes = function(editor) { + var scope = this.$getScope(editor); + var scopes = [scope]; + var snippetMap = this.snippetMap; + if (snippetMap[scope] && snippetMap[scope].includeScopes) { + scopes.push.apply(scopes, snippetMap[scope].includeScopes); + } + scopes.push("_"); + return scopes; + }; + + this.expandWithTab = function(editor, options) { + var self = this; + var result = editor.forEachSelection(function() { + return self.expandSnippetForSelection(editor, options); + }, null, {keepOrder: true}); + if (result && editor.tabstopManager) + editor.tabstopManager.tabNext(); + return result; + }; + + this.expandSnippetForSelection = function(editor, options) { + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var before = line.substring(0, cursor.column); + var after = line.substr(cursor.column); + + var snippetMap = this.snippetMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = this.findMatchingSnippet(snippets, before, after); + return !!snippet; + }, this); + if (!snippet) + return false; + if (options && options.dryRun) + return true; + editor.session.doc.removeInLine(cursor.row, + cursor.column - snippet.replaceBefore.length, + cursor.column + snippet.replaceAfter.length + ); + + this.variables.M__ = snippet.matchBefore; + this.variables.T__ = snippet.matchAfter; + this.insertSnippetForSelection(editor, snippet.content); + + this.variables.M__ = this.variables.T__ = null; + return true; + }; + + this.findMatchingSnippet = function(snippetList, before, after) { + for (var i = snippetList.length; i--;) { + var s = snippetList[i]; + if (s.startRe && !s.startRe.test(before)) + continue; + if (s.endRe && !s.endRe.test(after)) + continue; + if (!s.startRe && !s.endRe) + continue; + + s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; + s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; + s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; + s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : ""; + return s; + } + }; + + this.snippetMap = {}; + this.snippetNameMap = {}; + this.register = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + var self = this; + + if (!snippets) + snippets = []; + + function wrapRegexp(src) { + if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) + src = "(?:" + src + ")"; + + return src || ""; + } + function guardedRegexp(re, guard, opening) { + re = wrapRegexp(re); + guard = wrapRegexp(guard); + if (opening) { + re = guard + re; + if (re && re[re.length - 1] != "$") + re = re + "$"; + } else { + re = re + guard; + if (re && re[0] != "^") + re = "^" + re; + } + return new RegExp(re); + } + + function addSnippet(s) { + if (!s.scope) + s.scope = scope || "_"; + scope = s.scope; + if (!snippetMap[scope]) { + snippetMap[scope] = []; + snippetNameMap[scope] = {}; + } + + var map = snippetNameMap[scope]; + if (s.name) { + var old = map[s.name]; + if (old) + self.unregister(old); + map[s.name] = s; + } + snippetMap[scope].push(s); + + if (s.tabTrigger && !s.trigger) { + if (!s.guard && /^\w/.test(s.tabTrigger)) + s.guard = "\\b"; + s.trigger = lang.escapeRegExp(s.tabTrigger); + } + + if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) + return; + + s.startRe = guardedRegexp(s.trigger, s.guard, true); + s.triggerRe = new RegExp(s.trigger, "", true); + + s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); + s.endTriggerRe = new RegExp(s.endTrigger, "", true); + } + + if (snippets && snippets.content) + addSnippet(snippets); + else if (Array.isArray(snippets)) + snippets.forEach(addSnippet); + + this._signal("registerSnippets", {scope: scope}); + }; + this.unregister = function(snippets, scope) { + var snippetMap = this.snippetMap; + var snippetNameMap = this.snippetNameMap; + + function removeSnippet(s) { + var nameMap = snippetNameMap[s.scope||scope]; + if (nameMap && nameMap[s.name]) { + delete nameMap[s.name]; + var map = snippetMap[s.scope||scope]; + var i = map && map.indexOf(s); + if (i >= 0) + map.splice(i, 1); + } + } + if (snippets.content) + removeSnippet(snippets); + else if (Array.isArray(snippets)) + snippets.forEach(removeSnippet); + }; + this.parseSnippetFile = function(str) { + str = str.replace(/\r/g, ""); + var list = [], snippet = {}; + var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; + var m; + while (m = re.exec(str)) { + if (m[1]) { + try { + snippet = JSON.parse(m[1]); + list.push(snippet); + } catch (e) {} + } if (m[4]) { + snippet.content = m[4].replace(/^\t/gm, ""); + list.push(snippet); + snippet = {}; + } else { + var key = m[2], val = m[3]; + if (key == "regex") { + var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; + snippet.guard = guardRe.exec(val)[1]; + snippet.trigger = guardRe.exec(val)[1]; + snippet.endTrigger = guardRe.exec(val)[1]; + snippet.endGuard = guardRe.exec(val)[1]; + } else if (key == "snippet") { + snippet.tabTrigger = val.match(/^\S*/)[0]; + if (!snippet.name) + snippet.name = val; + } else { + snippet[key] = val; + } + } + } + return list; + }; + this.getSnippetByName = function(name, editor) { + var snippetMap = this.snippetNameMap; + var snippet; + this.getActiveScopes(editor).some(function(scope) { + var snippets = snippetMap[scope]; + if (snippets) + snippet = snippets[name]; + return !!snippet; + }, this); + return snippet; + }; + +}).call(SnippetManager.prototype); + + +var TabstopManager = function(editor) { + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); +}; +(function() { + this.attach = function(editor) { + this.index = 0; + this.ranges = []; + this.tabstops = []; + this.$openTabstops = null; + this.selectedTabstop = null; + + this.editor = editor; + this.editor.on("change", this.$onChange); + this.editor.on("changeSelection", this.$onChangeSelection); + this.editor.on("changeSession", this.$onChangeSession); + this.editor.commands.on("afterExec", this.$onAfterExec); + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + }; + this.detach = function() { + this.tabstops.forEach(this.removeTabstopMarkers, this); + this.ranges = null; + this.tabstops = null; + this.selectedTabstop = null; + this.editor.removeListener("change", this.$onChange); + this.editor.removeListener("changeSelection", this.$onChangeSelection); + this.editor.removeListener("changeSession", this.$onChangeSession); + this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.tabstopManager = null; + this.editor = null; + }; + + this.onChange = function(delta) { + var changeRange = delta; + var isRemove = delta.action[0] == "r"; + var start = delta.start; + var end = delta.end; + var startRow = start.row; + var endRow = end.row; + var lineDif = endRow - startRow; + var colDiff = end.column - start.column; + + if (isRemove) { + lineDif = -lineDif; + colDiff = -colDiff; + } + if (!this.$inChange && isRemove) { + var ts = this.selectedTabstop; + var changedOutside = ts && !ts.some(function(r) { + return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0; + }); + if (changedOutside) + return this.detach(); + } + var ranges = this.ranges; + for (var i = 0; i < ranges.length; i++) { + var r = ranges[i]; + if (r.end.row < start.row) + continue; + + if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) { + this.removeRange(r); + i--; + continue; + } + + if (r.start.row == startRow && r.start.column > start.column) + r.start.column += colDiff; + if (r.end.row == startRow && r.end.column >= start.column) + r.end.column += colDiff; + if (r.start.row >= startRow) + r.start.row += lineDif; + if (r.end.row >= startRow) + r.end.row += lineDif; + + if (comparePoints(r.start, r.end) > 0) + this.removeRange(r); + } + if (!ranges.length) + this.detach(); + }; + this.updateLinkedFields = function() { + var ts = this.selectedTabstop; + if (!ts || !ts.hasLinkedRanges) + return; + this.$inChange = true; + var session = this.editor.session; + var text = session.getTextRange(ts.firstNonLinked); + for (var i = ts.length; i--;) { + var range = ts[i]; + if (!range.linked) + continue; + var fmt = exports.snippetManager.tmStrFormat(text, range.original); + session.replace(range, fmt); + } + this.$inChange = false; + }; + this.onAfterExec = function(e) { + if (e.command && !e.command.readOnly) + this.updateLinkedFields(); + }; + this.onChangeSelection = function() { + if (!this.editor) + return; + var lead = this.editor.selection.lead; + var anchor = this.editor.selection.anchor; + var isEmpty = this.editor.selection.isEmpty(); + for (var i = this.ranges.length; i--;) { + if (this.ranges[i].linked) + continue; + var containsLead = this.ranges[i].contains(lead.row, lead.column); + var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column); + if (containsLead && containsAnchor) + return; + } + this.detach(); + }; + this.onChangeSession = function() { + this.detach(); + }; + this.tabNext = function(dir) { + var max = this.tabstops.length; + var index = this.index + (dir || 1); + index = Math.min(Math.max(index, 1), max); + if (index == max) + index = 0; + this.selectTabstop(index); + if (index === 0) + this.detach(); + }; + this.selectTabstop = function(index) { + this.$openTabstops = null; + var ts = this.tabstops[this.index]; + if (ts) + this.addTabstopMarkers(ts); + this.index = index; + ts = this.tabstops[this.index]; + if (!ts || !ts.length) + return; + + this.selectedTabstop = ts; + if (!this.editor.inVirtualSelectionMode) { + var sel = this.editor.multiSelect; + sel.toSingleRange(ts.firstNonLinked.clone()); + for (var i = ts.length; i--;) { + if (ts.hasLinkedRanges && ts[i].linked) + continue; + sel.addRange(ts[i].clone(), true); + } + if (sel.ranges[0]) + sel.addRange(sel.ranges[0].clone()); + } else { + this.editor.selection.setRange(ts.firstNonLinked); + } + + this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + }; + this.addTabstops = function(tabstops, start, end) { + if (!this.$openTabstops) + this.$openTabstops = []; + if (!tabstops[0]) { + var p = Range.fromPoints(end, end); + moveRelative(p.start, start); + moveRelative(p.end, start); + tabstops[0] = [p]; + tabstops[0].index = 0; + } + + var i = this.index; + var arg = [i + 1, 0]; + var ranges = this.ranges; + tabstops.forEach(function(ts, index) { + var dest = this.$openTabstops[index] || ts; + + for (var i = ts.length; i--;) { + var p = ts[i]; + var range = Range.fromPoints(p.start, p.end || p.start); + movePoint(range.start, start); + movePoint(range.end, start); + range.original = p; + range.tabstop = dest; + ranges.push(range); + if (dest != ts) + dest.unshift(range); + else + dest[i] = range; + if (p.fmtString) { + range.linked = true; + dest.hasLinkedRanges = true; + } else if (!dest.firstNonLinked) + dest.firstNonLinked = range; + } + if (!dest.firstNonLinked) + dest.hasLinkedRanges = false; + if (dest === ts) { + arg.push(dest); + this.$openTabstops[index] = dest; + } + this.addTabstopMarkers(dest); + }, this); + + if (arg.length > 2) { + if (this.tabstops.length) + arg.push(arg.splice(2, 1)[0]); + this.tabstops.splice.apply(this.tabstops, arg); + } + }; + + this.addTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + if (!range.markerId) + range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); + }); + }; + this.removeTabstopMarkers = function(ts) { + var session = this.editor.session; + ts.forEach(function(range) { + session.removeMarker(range.markerId); + range.markerId = null; + }); + }; + this.removeRange = function(range) { + var i = range.tabstop.indexOf(range); + range.tabstop.splice(i, 1); + i = this.ranges.indexOf(range); + this.ranges.splice(i, 1); + this.editor.session.removeMarker(range.markerId); + if (!range.tabstop.length) { + i = this.tabstops.indexOf(range.tabstop); + if (i != -1) + this.tabstops.splice(i, 1); + if (!this.tabstops.length) + this.detach(); + } + }; + + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys({ + "Tab": function(ed) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) { + return; + } + + ed.tabstopManager.tabNext(1); + }, + "Shift-Tab": function(ed) { + ed.tabstopManager.tabNext(-1); + }, + "Esc": function(ed) { + ed.tabstopManager.detach(); + }, + "Return": function(ed) { + return false; + } + }); +}).call(TabstopManager.prototype); + + + +var changeTracker = {}; +changeTracker.onChange = Anchor.prototype.onChange; +changeTracker.setPosition = function(row, column) { + this.pos.row = row; + this.pos.column = column; +}; +changeTracker.update = function(pos, delta, $insertRight) { + this.$insertRight = $insertRight; + this.pos = pos; + this.onChange(delta); +}; + +var movePoint = function(point, diff) { + if (point.row == 0) + point.column += diff.column; + point.row += diff.row; +}; + +var moveRelative = function(point, start) { + if (point.row == start.row) + point.column -= start.column; + point.row -= start.row; +}; + + +require("./lib/dom").importCssString("\ +.ace_snippet-marker {\ + -moz-box-sizing: border-box;\ + box-sizing: border-box;\ + background: rgba(194, 193, 208, 0.09);\ + border: 1px dotted rgba(211, 208, 235, 0.62);\ + position: absolute;\ +}"); + +exports.snippetManager = new SnippetManager(); + + +var Editor = require("./editor").Editor; +(function() { + this.insertSnippet = function(content, options) { + return exports.snippetManager.insertSnippet(this, content, options); + }; + this.expandSnippet = function(options) { + return exports.snippetManager.expandWithTab(this, options); + }; +}).call(Editor.prototype); + +}); + +ace.define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var Renderer = require("../virtual_renderer").VirtualRenderer; +var Editor = require("../editor").Editor; +var Range = require("../range").Range; +var event = require("../lib/event"); +var lang = require("../lib/lang"); +var dom = require("../lib/dom"); + +var $singleLineEditor = function(el) { + var renderer = new Renderer(el); + + renderer.$maxLines = 4; + + var editor = new Editor(renderer); + + editor.setHighlightActiveLine(false); + editor.setShowPrintMargin(false); + editor.renderer.setShowGutter(false); + editor.renderer.setHighlightGutterLine(false); + + editor.$mouseHandler.$focusWaitTimout = 0; + editor.$highlightTagPending = true; + + return editor; +}; + +var AcePopup = function(parentNode) { + var el = dom.createElement("div"); + var popup = new $singleLineEditor(el); + + if (parentNode) + parentNode.appendChild(el); + el.style.display = "none"; + popup.renderer.content.style.cursor = "default"; + popup.renderer.setStyle("ace_autocomplete"); + + popup.setOption("displayIndentGuides", false); + popup.setOption("dragDelay", 150); + + var noop = function(){}; + + popup.focus = noop; + popup.$isFocused = true; + + popup.renderer.$cursorLayer.restartTimer = noop; + popup.renderer.$cursorLayer.element.style.opacity = 0; + + popup.renderer.$maxLines = 8; + popup.renderer.$keepTextAreaAtCursor = false; + + popup.setHighlightActiveLine(false); + popup.session.highlight(""); + popup.session.$searchHighlight.clazz = "ace_highlight-marker"; + + popup.on("mousedown", function(e) { + var pos = e.getDocumentPosition(); + popup.selection.moveToPosition(pos); + selectionMarker.start.row = selectionMarker.end.row = pos.row; + e.stop(); + }); + + var lastMouseEvent; + var hoverMarker = new Range(-1,0,-1,Infinity); + var selectionMarker = new Range(-1,0,-1,Infinity); + selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); + popup.setSelectOnHover = function(val) { + if (!val) { + hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); + } else if (hoverMarker.id) { + popup.session.removeMarker(hoverMarker.id); + hoverMarker.id = null; + } + }; + popup.setSelectOnHover(false); + popup.on("mousemove", function(e) { + if (!lastMouseEvent) { + lastMouseEvent = e; + return; + } + if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { + return; + } + lastMouseEvent = e; + lastMouseEvent.scrollTop = popup.renderer.scrollTop; + var row = lastMouseEvent.getDocumentPosition().row; + if (hoverMarker.start.row != row) { + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row); + } + }); + popup.renderer.on("beforeRender", function() { + if (lastMouseEvent && hoverMarker.start.row != -1) { + lastMouseEvent.$pos = null; + var row = lastMouseEvent.getDocumentPosition().row; + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row, true); + } + }); + popup.renderer.on("afterRender", function() { + var row = popup.getRow(); + var t = popup.renderer.$textLayer; + var selected = t.element.childNodes[row - t.config.firstRow]; + if (selected == t.selectedNode) + return; + if (t.selectedNode) + dom.removeCssClass(t.selectedNode, "ace_selected"); + t.selectedNode = selected; + if (selected) + dom.addCssClass(selected, "ace_selected"); + }); + var hideHoverMarker = function() { setHoverMarker(-1) }; + var setHoverMarker = function(row, suppressRedraw) { + if (row !== hoverMarker.start.row) { + hoverMarker.start.row = hoverMarker.end.row = row; + if (!suppressRedraw) + popup.session._emit("changeBackMarker"); + popup._emit("changeHoverMarker"); + } + }; + popup.getHoveredRow = function() { + return hoverMarker.start.row; + }; + + event.addListener(popup.container, "mouseout", hideHoverMarker); + popup.on("hide", hideHoverMarker); + popup.on("changeSelection", hideHoverMarker); + + popup.session.doc.getLength = function() { + return popup.data.length; + }; + popup.session.doc.getLine = function(i) { + var data = popup.data[i]; + if (typeof data == "string") + return data; + return (data && data.value) || ""; + }; + + var bgTokenizer = popup.session.bgTokenizer; + bgTokenizer.$tokenizeRow = function(row) { + var data = popup.data[row]; + var tokens = []; + if (!data) + return tokens; + if (typeof data == "string") + data = {value: data}; + if (!data.caption) + data.caption = data.value || data.name; + + var last = -1; + var flag, c; + for (var i = 0; i < data.caption.length; i++) { + c = data.caption[i]; + flag = data.matchMask & (1 << i) ? 1 : 0; + if (last !== flag) { + tokens.push({type: data.className || "" + ( flag ? "completion-highlight" : ""), value: c}); + last = flag; + } else { + tokens[tokens.length - 1].value += c; + } + } + + if (data.meta) { + var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth; + var metaData = data.meta; + if (metaData.length + data.caption.length > maxW - 2) { + metaData = metaData.substr(0, maxW - data.caption.length - 3) + "\u2026" + } + tokens.push({type: "rightAlignedText", value: metaData}); + } + return tokens; + }; + bgTokenizer.$updateOnChange = noop; + bgTokenizer.start = noop; + + popup.session.$computeWidth = function() { + return this.screenWidth = 0; + }; + + popup.$blockScrolling = Infinity; + popup.isOpen = false; + popup.isTopdown = false; + popup.autoSelect = true; + + popup.data = []; + popup.setData = function(list) { + popup.setValue(lang.stringRepeat("\n", list.length), -1); + popup.data = list || []; + popup.setRow(0); + }; + popup.getData = function(row) { + return popup.data[row]; + }; + + popup.getRow = function() { + return selectionMarker.start.row; + }; + popup.setRow = function(line) { + line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line)); + if (selectionMarker.start.row != line) { + popup.selection.clearSelection(); + selectionMarker.start.row = selectionMarker.end.row = line || 0; + popup.session._emit("changeBackMarker"); + popup.moveCursorTo(line || 0, 0); + if (popup.isOpen) + popup._signal("select"); + } + }; + + popup.on("changeSelection", function() { + if (popup.isOpen) + popup.setRow(popup.selection.lead.row); + popup.renderer.scrollCursorIntoView(); + }); + + popup.hide = function() { + this.container.style.display = "none"; + this._signal("hide"); + popup.isOpen = false; + }; + popup.show = function(pos, lineHeight, topdownOnly) { + var el = this.container; + var screenHeight = window.innerHeight; + var screenWidth = window.innerWidth; + var renderer = this.renderer; + var maxH = renderer.$maxLines * lineHeight * 1.4; + var top = pos.top + this.$borderSize; + var allowTopdown = top > screenHeight / 2 && !topdownOnly; + if (allowTopdown && top + lineHeight + maxH > screenHeight) { + renderer.$maxPixelHeight = top - 2 * this.$borderSize; + el.style.top = ""; + el.style.bottom = screenHeight - top + "px"; + popup.isTopdown = false; + } else { + top += lineHeight; + renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight; + el.style.top = top + "px"; + el.style.bottom = ""; + popup.isTopdown = true; + } + + el.style.display = ""; + this.renderer.$textLayer.checkForSizeChanges(); + + var left = pos.left; + if (left + el.offsetWidth > screenWidth) + left = screenWidth - el.offsetWidth; + + el.style.left = left + "px"; + + this._signal("show"); + lastMouseEvent = null; + popup.isOpen = true; + }; + + popup.getTextLeftOffset = function() { + return this.$borderSize + this.renderer.$padding + this.$imageSize; + }; + + popup.$imageSize = 0; + popup.$borderSize = 1; + + return popup; +}; + +dom.importCssString("\ +.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ + background-color: #CAD6FA;\ + z-index: 1;\ +}\ +.ace_editor.ace_autocomplete .ace_line-hover {\ + border: 1px solid #abbffe;\ + margin-top: -1px;\ + background: rgba(233,233,253,0.4);\ +}\ +.ace_editor.ace_autocomplete .ace_line-hover {\ + position: absolute;\ + z-index: 2;\ +}\ +.ace_editor.ace_autocomplete .ace_scroller {\ + background: none;\ + border: none;\ + box-shadow: none;\ +}\ +.ace_rightAlignedText {\ + color: gray;\ + display: inline-block;\ + position: absolute;\ + right: 4px;\ + text-align: right;\ + z-index: -1;\ +}\ +.ace_editor.ace_autocomplete .ace_completion-highlight{\ + color: #000;\ + text-shadow: 0 0 0.01em;\ +}\ +.ace_editor.ace_autocomplete {\ + width: 280px;\ + z-index: 200000;\ + background: #fbfbfb;\ + color: #444;\ + border: 1px lightgray solid;\ + position: fixed;\ + box-shadow: 2px 3px 5px rgba(0,0,0,.2);\ + line-height: 1.4;\ +}"); + +exports.AcePopup = AcePopup; + +}); + +ace.define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.parForEach = function(array, fn, callback) { + var completed = 0; + var arLength = array.length; + if (arLength === 0) + callback(); + for (var i = 0; i < arLength; i++) { + fn(array[i], function(result, err) { + completed++; + if (completed === arLength) + callback(result, err); + }); + } +}; + +var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/; + +exports.retrievePrecedingIdentifier = function(text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos-1; i >= 0; i--) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf.reverse().join(""); +}; + +exports.retrieveFollowingIdentifier = function(text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos; i < text.length; i++) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf; +}; + +exports.getCompletionPrefix = function (editor) { + var pos = editor.getCursorPosition(); + var line = editor.session.getLine(pos.row); + var prefix; + editor.completers.forEach(function(completer) { + if (completer.identifierRegexps) { + completer.identifierRegexps.forEach(function(identifierRegex) { + if (!prefix && identifierRegex) + prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); + }.bind(this)); + } + }.bind(this)); + return prefix || this.retrievePrecedingIdentifier(line, pos.column); +}; + +}); + +ace.define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/snippets"], function(require, exports, module) { +"use strict"; + +var HashHandler = require("./keyboard/hash_handler").HashHandler; +var AcePopup = require("./autocomplete/popup").AcePopup; +var util = require("./autocomplete/util"); +var event = require("./lib/event"); +var lang = require("./lib/lang"); +var dom = require("./lib/dom"); +var snippetManager = require("./snippets").snippetManager; + +var Autocomplete = function() { + this.autoInsert = false; + this.autoSelect = true; + this.exactMatch = false; + this.gatherCompletionsId = 0; + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys(this.commands); + + this.blurListener = this.blurListener.bind(this); + this.changeListener = this.changeListener.bind(this); + this.mousedownListener = this.mousedownListener.bind(this); + this.mousewheelListener = this.mousewheelListener.bind(this); + + this.changeTimer = lang.delayedCall(function() { + this.updateCompletions(true); + }.bind(this)); + + this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); +}; + +(function() { + + this.$init = function() { + this.popup = new AcePopup(document.body || document.documentElement); + this.popup.on("click", function(e) { + this.insertMatch(); + e.stop(); + }.bind(this)); + this.popup.focus = this.editor.focus.bind(this.editor); + this.popup.on("show", this.tooltipTimer.bind(null, null)); + this.popup.on("select", this.tooltipTimer.bind(null, null)); + this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null)); + return this.popup; + }; + + this.getPopup = function() { + return this.popup || this.$init(); + }; + + this.openPopup = function(editor, prefix, keepPopupPosition) { + if (!this.popup) + this.$init(); + + this.popup.autoSelect = this.autoSelect; + + this.popup.setData(this.completions.filtered); + + editor.keyBinding.addKeyboardHandler(this.keyboardHandler); + + var renderer = editor.renderer; + this.popup.setRow(this.autoSelect ? 0 : -1); + if (!keepPopupPosition) { + this.popup.setTheme(editor.getTheme()); + this.popup.setFontSize(editor.getFontSize()); + + var lineHeight = renderer.layerConfig.lineHeight; + + var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); + pos.left -= this.popup.getTextLeftOffset(); + + var rect = editor.container.getBoundingClientRect(); + pos.top += rect.top - renderer.layerConfig.offset; + pos.left += rect.left - editor.renderer.scrollLeft; + pos.left += renderer.gutterWidth; + + this.popup.show(pos, lineHeight); + } else if (keepPopupPosition && !prefix) { + this.detach(); + } + }; + + this.detach = function() { + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.off("changeSelection", this.changeListener); + this.editor.off("blur", this.blurListener); + this.editor.off("mousedown", this.mousedownListener); + this.editor.off("mousewheel", this.mousewheelListener); + this.changeTimer.cancel(); + this.hideDocTooltip(); + + this.gatherCompletionsId += 1; + if (this.popup && this.popup.isOpen) + this.popup.hide(); + + if (this.base) + this.base.detach(); + this.activated = false; + this.completions = this.base = null; + }; + + this.changeListener = function(e) { + var cursor = this.editor.selection.lead; + if (cursor.row != this.base.row || cursor.column < this.base.column) { + this.detach(); + } + if (this.activated) + this.changeTimer.schedule(); + else + this.detach(); + }; + + this.blurListener = function(e) { + var el = document.activeElement; + var text = this.editor.textInput.getElement(); + var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); + var container = this.popup && this.popup.container; + if (el != text && el.parentNode != container && !fromTooltip + && el != this.tooltipNode && e.relatedTarget != text + ) { + this.detach(); + } + }; + + this.mousedownListener = function(e) { + this.detach(); + }; + + this.mousewheelListener = function(e) { + this.detach(); + }; + + this.goTo = function(where) { + var row = this.popup.getRow(); + var max = this.popup.session.getLength() - 1; + + switch(where) { + case "up": row = row <= 0 ? max : row - 1; break; + case "down": row = row >= max ? -1 : row + 1; break; + case "start": row = 0; break; + case "end": row = max; break; + } + + this.popup.setRow(row); + }; + + this.insertMatch = function(data, options) { + if (!data) + data = this.popup.getData(this.popup.getRow()); + if (!data) + return false; + + if (data.completer && data.completer.insertMatch) { + data.completer.insertMatch(this.editor, data); + } else { + if (this.completions.filterText) { + var ranges = this.editor.selection.getAllRanges(); + for (var i = 0, range; range = ranges[i]; i++) { + range.start.column -= this.completions.filterText.length; + this.editor.session.remove(range); + } + } + if (data.snippet) + snippetManager.insertSnippet(this.editor, data.snippet); + else + this.editor.execCommand("insertstring", data.value || data); + } + this.detach(); + }; + + + this.commands = { + "Up": function(editor) { editor.completer.goTo("up"); }, + "Down": function(editor) { editor.completer.goTo("down"); }, + "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); }, + "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); }, + + "Esc": function(editor) { editor.completer.detach(); }, + "Return": function(editor) { return editor.completer.insertMatch(); }, + "Shift-Return": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); }, + "Tab": function(editor) { + var result = editor.completer.insertMatch(); + if (!result && !editor.tabstopManager) + editor.completer.goTo("down"); + else + return result; + }, + + "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, + "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } + }; + + this.gatherCompletions = function(editor, callback) { + var session = editor.getSession(); + var pos = editor.getCursorPosition(); + + var prefix = util.getCompletionPrefix(editor); + + this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); + this.base.$insertRight = true; + + var matches = []; + var total = editor.completers.length; + editor.completers.forEach(function(completer, i) { + completer.getCompletions(editor, session, pos, prefix, function(err, results) { + if (!err && results) + matches = matches.concat(results); + callback(null, { + prefix: util.getCompletionPrefix(editor), + matches: matches, + finished: (--total === 0) + }); + }); + }); + return true; + }; + + this.showPopup = function(editor) { + if (this.editor) + this.detach(); + + this.activated = true; + + this.editor = editor; + if (editor.completer != this) { + if (editor.completer) + editor.completer.detach(); + editor.completer = this; + } + + editor.on("changeSelection", this.changeListener); + editor.on("blur", this.blurListener); + editor.on("mousedown", this.mousedownListener); + editor.on("mousewheel", this.mousewheelListener); + + this.updateCompletions(); + }; + + this.updateCompletions = function(keepPopupPosition) { + if (keepPopupPosition && this.base && this.completions) { + var pos = this.editor.getCursorPosition(); + var prefix = this.editor.session.getTextRange({start: this.base, end: pos}); + if (prefix == this.completions.filterText) + return; + this.completions.setFilter(prefix); + if (!this.completions.filtered.length) + return this.detach(); + if (this.completions.filtered.length == 1 + && this.completions.filtered[0].value == prefix + && !this.completions.filtered[0].snippet) + return this.detach(); + this.openPopup(this.editor, prefix, keepPopupPosition); + return; + } + var _id = this.gatherCompletionsId; + this.gatherCompletions(this.editor, function(err, results) { + var detachIfFinished = function() { + if (!results.finished) return; + return this.detach(); + }.bind(this); + + var prefix = results.prefix; + var matches = results && results.matches; + + if (!matches || !matches.length) + return detachIfFinished(); + if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId) + return; + + this.completions = new FilteredList(matches); + + if (this.exactMatch) + this.completions.exactMatch = true; + + this.completions.setFilter(prefix); + var filtered = this.completions.filtered; + if (!filtered.length) + return detachIfFinished(); + if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet) + return detachIfFinished(); + if (this.autoInsert && filtered.length == 1 && results.finished) + return this.insertMatch(filtered[0]); + + this.openPopup(this.editor, prefix, keepPopupPosition); + }.bind(this)); + }; + + this.cancelContextMenu = function() { + this.editor.$mouseHandler.cancelContextMenu(); + }; + + this.updateDocTooltip = function() { + var popup = this.popup; + var all = popup.data; + var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]); + var doc = null; + if (!selected || !this.editor || !this.popup.isOpen) + return this.hideDocTooltip(); + this.editor.completers.some(function(completer) { + if (completer.getDocTooltip) + doc = completer.getDocTooltip(selected); + return doc; + }); + if (!doc) + doc = selected; + + if (typeof doc == "string") + doc = {docText: doc}; + if (!doc || !(doc.docHTML || doc.docText)) + return this.hideDocTooltip(); + this.showDocTooltip(doc); + }; + + this.showDocTooltip = function(item) { + if (!this.tooltipNode) { + this.tooltipNode = dom.createElement("div"); + this.tooltipNode.className = "ace_tooltip ace_doc-tooltip"; + this.tooltipNode.style.margin = 0; + this.tooltipNode.style.pointerEvents = "auto"; + this.tooltipNode.tabIndex = -1; + this.tooltipNode.onblur = this.blurListener.bind(this); + this.tooltipNode.onclick = this.onTooltipClick.bind(this); + } + + var tooltipNode = this.tooltipNode; + if (item.docHTML) { + tooltipNode.innerHTML = item.docHTML; + } else if (item.docText) { + tooltipNode.textContent = item.docText; + } + + if (!tooltipNode.parentNode) + document.body.appendChild(tooltipNode); + var popup = this.popup; + var rect = popup.container.getBoundingClientRect(); + tooltipNode.style.top = popup.container.style.top; + tooltipNode.style.bottom = popup.container.style.bottom; + + if (window.innerWidth - rect.right < 320) { + tooltipNode.style.right = window.innerWidth - rect.left + "px"; + tooltipNode.style.left = ""; + } else { + tooltipNode.style.left = (rect.right + 1) + "px"; + tooltipNode.style.right = ""; + } + tooltipNode.style.display = "block"; + }; + + this.hideDocTooltip = function() { + this.tooltipTimer.cancel(); + if (!this.tooltipNode) return; + var el = this.tooltipNode; + if (!this.editor.isFocused() && document.activeElement == el) + this.editor.focus(); + this.tooltipNode = null; + if (el.parentNode) + el.parentNode.removeChild(el); + }; + + this.onTooltipClick = function(e) { + var a = e.target; + while (a && a != this.tooltipNode) { + if (a.nodeName == "A" && a.href) { + a.rel = "noreferrer"; + a.target = "_blank"; + break; + } + a = a.parentNode; + } + } + +}).call(Autocomplete.prototype); + +Autocomplete.startCommand = { + name: "startAutocomplete", + exec: function(editor) { + if (!editor.completer) + editor.completer = new Autocomplete(); + editor.completer.autoInsert = false; + editor.completer.autoSelect = true; + editor.completer.showPopup(editor); + editor.completer.cancelContextMenu(); + }, + bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" +}; + +var FilteredList = function(array, filterText) { + this.all = array; + this.filtered = array; + this.filterText = filterText || ""; + this.exactMatch = false; +}; +(function(){ + this.setFilter = function(str) { + if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0) + var matches = this.filtered; + else + var matches = this.all; + + this.filterText = str; + matches = this.filterCompletions(matches, this.filterText); + matches = matches.sort(function(a, b) { + return b.exactMatch - a.exactMatch || b.score - a.score; + }); + var prev = null; + matches = matches.filter(function(item){ + var caption = item.snippet || item.caption || item.value; + if (caption === prev) return false; + prev = caption; + return true; + }); + + this.filtered = matches; + }; + this.filterCompletions = function(items, needle) { + var results = []; + var upper = needle.toUpperCase(); + var lower = needle.toLowerCase(); + loop: for (var i = 0, item; item = items[i]; i++) { + var caption = item.value || item.caption || item.snippet; + if (!caption) continue; + var lastIndex = -1; + var matchMask = 0; + var penalty = 0; + var index, distance; + + if (this.exactMatch) { + if (needle !== caption.substr(0, needle.length)) + continue loop; + }else{ + for (var j = 0; j < needle.length; j++) { + var i1 = caption.indexOf(lower[j], lastIndex + 1); + var i2 = caption.indexOf(upper[j], lastIndex + 1); + index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2; + if (index < 0) + continue loop; + distance = index - lastIndex - 1; + if (distance > 0) { + if (lastIndex === -1) + penalty += 10; + penalty += distance; + } + matchMask = matchMask | (1 << index); + lastIndex = index; + } + } + item.matchMask = matchMask; + item.exactMatch = penalty ? 0 : 1; + item.score = (item.score || 0) - penalty; + results.push(item); + } + return results; + }; +}).call(FilteredList.prototype); + +exports.Autocomplete = Autocomplete; +exports.FilteredList = FilteredList; + +}); + +ace.define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module) { + var Range = require("../range").Range; + + var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/; + + function getWordIndex(doc, pos) { + var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos)); + return textBefore.split(splitRegex).length - 1; + } + function wordDistance(doc, pos) { + var prefixPos = getWordIndex(doc, pos); + var words = doc.getValue().split(splitRegex); + var wordScores = Object.create(null); + + var currentWord = words[prefixPos]; + + words.forEach(function(word, idx) { + if (!word || word === currentWord) return; + + var distance = Math.abs(prefixPos - idx); + var score = words.length - distance; + if (wordScores[word]) { + wordScores[word] = Math.max(score, wordScores[word]); + } else { + wordScores[word] = score; + } + }); + return wordScores; + } + + exports.getCompletions = function(editor, session, pos, prefix, callback) { + var wordScore = wordDistance(session, pos, prefix); + var wordList = Object.keys(wordScore); + callback(null, wordList.map(function(word) { + return { + caption: word, + value: word, + score: wordScore[word], + meta: "local" + }; + })); + }; +}); + +ace.define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var snippetManager = require("../snippets").snippetManager; +var Autocomplete = require("../autocomplete").Autocomplete; +var config = require("../config"); +var lang = require("../lib/lang"); +var util = require("../autocomplete/util"); + +var textCompleter = require("../autocomplete/text_completer"); +var keyWordCompleter = { + getCompletions: function(editor, session, pos, prefix, callback) { + if (session.$mode.completer) { + return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback); + } + var state = editor.session.getState(pos.row); + var completions = session.$mode.getCompletions(state, session, pos, prefix); + callback(null, completions); + } +}; + +var snippetCompleter = { + getCompletions: function(editor, session, pos, prefix, callback) { + var snippetMap = snippetManager.snippetMap; + var completions = []; + snippetManager.getActiveScopes(editor).forEach(function(scope) { + var snippets = snippetMap[scope] || []; + for (var i = snippets.length; i--;) { + var s = snippets[i]; + var caption = s.name || s.tabTrigger; + if (!caption) + continue; + completions.push({ + caption: caption, + snippet: s.content, + meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet", + type: "snippet" + }); + } + }, this); + callback(null, completions); + }, + getDocTooltip: function(item) { + if (item.type == "snippet" && !item.docHTML) { + item.docHTML = [ + "", lang.escapeHTML(item.caption), "", "
      ", + lang.escapeHTML(item.snippet) + ].join(""); + } + } +}; + +var completers = [snippetCompleter, textCompleter, keyWordCompleter]; +exports.setCompleters = function(val) { + completers.length = 0; + if (val) completers.push.apply(completers, val); +}; +exports.addCompleter = function(completer) { + completers.push(completer); +}; +exports.textCompleter = textCompleter; +exports.keyWordCompleter = keyWordCompleter; +exports.snippetCompleter = snippetCompleter; + +var expandSnippet = { + name: "expandSnippet", + exec: function(editor) { + return snippetManager.expandWithTab(editor); + }, + bindKey: "Tab" +}; + +var onChangeMode = function(e, editor) { + loadSnippetsForMode(editor.session.$mode); +}; + +var loadSnippetsForMode = function(mode) { + var id = mode.$id; + if (!snippetManager.files) + snippetManager.files = {}; + loadSnippetFile(id); + if (mode.modes) + mode.modes.forEach(loadSnippetsForMode); +}; + +var loadSnippetFile = function(id) { + if (!id || snippetManager.files[id]) + return; + var snippetFilePath = id.replace("mode", "snippets"); + snippetManager.files[id] = {}; + config.loadModule(snippetFilePath, function(m) { + if (m) { + snippetManager.files[id] = m; + if (!m.snippets && m.snippetText) + m.snippets = snippetManager.parseSnippetFile(m.snippetText); + snippetManager.register(m.snippets || [], m.scope); + if (m.includeScopes) { + snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes; + m.includeScopes.forEach(function(x) { + loadSnippetFile("ace/mode/" + x); + }); + } + } + }); +}; + +var doLiveAutocomplete = function(e) { + var editor = e.editor; + var hasCompleter = editor.completer && editor.completer.activated; + if (e.command.name === "backspace") { + if (hasCompleter && !util.getCompletionPrefix(editor)) + editor.completer.detach(); + } + else if (e.command.name === "insertstring") { + var prefix = util.getCompletionPrefix(editor); + if (prefix && !hasCompleter) { + if (!editor.completer) { + editor.completer = new Autocomplete(); + } + editor.completer.autoInsert = false; + editor.completer.showPopup(editor); + } + } +}; + +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + enableBasicAutocompletion: { + set: function(val) { + if (val) { + if (!this.completers) + this.completers = Array.isArray(val)? val: completers; + this.commands.addCommand(Autocomplete.startCommand); + } else { + this.commands.removeCommand(Autocomplete.startCommand); + } + }, + value: false + }, + enableLiveAutocompletion: { + set: function(val) { + if (val) { + if (!this.completers) + this.completers = Array.isArray(val)? val: completers; + this.commands.on('afterExec', doLiveAutocomplete); + } else { + this.commands.removeListener('afterExec', doLiveAutocomplete); + } + }, + value: false + }, + enableSnippets: { + set: function(val) { + if (val) { + this.commands.addCommand(expandSnippet); + this.on("changeMode", onChangeMode); + onChangeMode(null, this); + } else { + this.commands.removeCommand(expandSnippet); + this.off("changeMode", onChangeMode); + } + }, + value: false + } +}); +}); + (function() { + ace.require(["ace/ext/language_tools"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-linking.js b/src/libs/ace/ext-linking.js new file mode 100755 index 0000000..baa7570 --- /dev/null +++ b/src/libs/ace/ext-linking.js @@ -0,0 +1,61 @@ +ace.define("ace/ext/linking",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { + +var Editor = require("ace/editor").Editor; + +require("../config").defineOptions(Editor.prototype, "editor", { + enableLinking: { + set: function(val) { + if (val) { + this.on("click", onClick); + this.on("mousemove", onMouseMove); + } else { + this.off("click", onClick); + this.off("mousemove", onMouseMove); + } + }, + value: false + } +}) + +exports.previousLinkingHover = false; + +function onMouseMove(e) { + var editor = e.editor; + var ctrl = e.getAccelKey(); + + if (ctrl) { + var editor = e.editor; + var docPos = e.getDocumentPosition(); + var session = editor.session; + var token = session.getTokenAt(docPos.row, docPos.column); + + if (exports.previousLinkingHover && exports.previousLinkingHover != token) { + editor._emit("linkHoverOut"); + } + editor._emit("linkHover", {position: docPos, token: token}); + exports.previousLinkingHover = token; + } else if (exports.previousLinkingHover) { + editor._emit("linkHoverOut"); + exports.previousLinkingHover = false; + } +} + +function onClick(e) { + var ctrl = e.getAccelKey(); + var button = e.getButton(); + + if (button == 0 && ctrl) { + var editor = e.editor; + var docPos = e.getDocumentPosition(); + var session = editor.session; + var token = session.getTokenAt(docPos.row, docPos.column); + + editor._emit("linkClick", {position: docPos, token: token}); + } +} + +}); + (function() { + ace.require(["ace/ext/linking"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-modelist.js b/src/libs/ace/ext-modelist.js new file mode 100755 index 0000000..b0c7fd0 --- /dev/null +++ b/src/libs/ace/ext-modelist.js @@ -0,0 +1,209 @@ +ace.define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var modes = []; +function getModeForPath(path) { + var mode = modesByName.text; + var fileName = path.split(/[\/\\]/).pop(); + for (var i = 0; i < modes.length; i++) { + if (modes[i].supportsFile(fileName)) { + mode = modes[i]; + break; + } + } + return mode; +} + +var Mode = function(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function(a, b){ + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } else { + re = "^.*\\.(" + extensions + ")$"; + } + + this.extRe = new RegExp(re, "gi"); +}; + +Mode.prototype.supportsFile = function(filename) { + return filename.match(this.extRe); +}; +var supportedModes = { + ABAP: ["abap"], + ABC: ["abc"], + ActionScript:["as"], + ADA: ["ada|adb"], + Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], + AsciiDoc: ["asciidoc|adoc"], + Assembly_x86:["asm|a"], + AutoHotKey: ["ahk"], + BatchFile: ["bat|cmd"], + Bro: ["bro"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm"], + CSharp: ["cs"], + CSS: ["css"], + Curly: ["curly"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Dummy: ["dummy"], + DummySyntax: ["dummy"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], + GraphQLSchema: ["gql"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], + Haskell_Cabal: ["cabal"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml"], + HTML_Elixir: ["eex|html.eex"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|jsx"], + JSON: ["json"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MEL: ["mel"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], + Pig: ["pig"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + Python: ["py"], + R: ["r"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + RHTML: ["Rhtml"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala"], + Scheme: ["scm|sm|rkt|oak|scheme"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Smarty: ["smarty|tpl"], + snippets: ["snippets"], + Soy_Template:["soy"], + Space: ["space"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSX: ["tsx"], + Twig: ["twig|swig"], + Typescript: ["ts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Django: ["html"] +}; + +var nameOverrides = { + ObjectiveC: "Objective-C", + CSharp: "C#", + golang: "Go", + C_Cpp: "C and C++", + coffee: "CoffeeScript", + HTML_Ruby: "HTML (Ruby)", + HTML_Elixir: "HTML (Elixir)", + FTL: "FreeMarker" +}; +var modesByName = {}; +for (var name in supportedModes) { + var data = supportedModes[name]; + var displayName = (nameOverrides[name] || name).replace(/_/g, " "); + var filename = name.toLowerCase(); + var mode = new Mode(filename, displayName, data[0]); + modesByName[filename] = mode; + modes.push(mode); +} + +module.exports = { + getModeForPath: getModeForPath, + modes: modes, + modesByName: modesByName +}; + +}); + (function() { + ace.require(["ace/ext/modelist"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-old_ie.js b/src/libs/ace/ext-old_ie.js new file mode 100755 index 0000000..f0f225c --- /dev/null +++ b/src/libs/ace/ext-old_ie.js @@ -0,0 +1,502 @@ +ace.define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var event = require("../lib/event"); +var searchboxCss = "\ +.ace_search {\ +background-color: #ddd;\ +border: 1px solid #cbcbcb;\ +border-top: 0 none;\ +max-width: 325px;\ +overflow: hidden;\ +margin: 0;\ +padding: 4px;\ +padding-right: 6px;\ +padding-bottom: 0;\ +position: absolute;\ +top: 0px;\ +z-index: 99;\ +white-space: normal;\ +}\ +.ace_search.left {\ +border-left: 0 none;\ +border-radius: 0px 0px 5px 0px;\ +left: 0;\ +}\ +.ace_search.right {\ +border-radius: 0px 0px 0px 5px;\ +border-right: 0 none;\ +right: 0;\ +}\ +.ace_search_form, .ace_replace_form {\ +border-radius: 3px;\ +border: 1px solid #cbcbcb;\ +float: left;\ +margin-bottom: 4px;\ +overflow: hidden;\ +}\ +.ace_search_form.ace_nomatch {\ +outline: 1px solid red;\ +}\ +.ace_search_field {\ +background-color: white;\ +color: black;\ +border-right: 1px solid #cbcbcb;\ +border: 0 none;\ +-webkit-box-sizing: border-box;\ +-moz-box-sizing: border-box;\ +box-sizing: border-box;\ +float: left;\ +height: 22px;\ +outline: 0;\ +padding: 0 7px;\ +width: 214px;\ +margin: 0;\ +}\ +.ace_searchbtn,\ +.ace_replacebtn {\ +background: #fff;\ +border: 0 none;\ +border-left: 1px solid #dcdcdc;\ +cursor: pointer;\ +float: left;\ +height: 22px;\ +margin: 0;\ +position: relative;\ +}\ +.ace_searchbtn:last-child,\ +.ace_replacebtn:last-child {\ +border-top-right-radius: 3px;\ +border-bottom-right-radius: 3px;\ +}\ +.ace_searchbtn:disabled {\ +background: none;\ +cursor: default;\ +}\ +.ace_searchbtn {\ +background-position: 50% 50%;\ +background-repeat: no-repeat;\ +width: 27px;\ +}\ +.ace_searchbtn.prev {\ +background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); \ +}\ +.ace_searchbtn.next {\ +background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); \ +}\ +.ace_searchbtn_close {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\ +border-radius: 50%;\ +border: 0 none;\ +color: #656565;\ +cursor: pointer;\ +float: right;\ +font: 16px/16px Arial;\ +height: 14px;\ +margin: 5px 1px 9px 5px;\ +padding: 0;\ +text-align: center;\ +width: 14px;\ +}\ +.ace_searchbtn_close:hover {\ +background-color: #656565;\ +background-position: 50% 100%;\ +color: white;\ +}\ +.ace_replacebtn.prev {\ +width: 54px\ +}\ +.ace_replacebtn.next {\ +width: 27px\ +}\ +.ace_button {\ +margin-left: 2px;\ +cursor: pointer;\ +-webkit-user-select: none;\ +-moz-user-select: none;\ +-o-user-select: none;\ +-ms-user-select: none;\ +user-select: none;\ +overflow: hidden;\ +opacity: 0.7;\ +border: 1px solid rgba(100,100,100,0.23);\ +padding: 1px;\ +-moz-box-sizing: border-box;\ +box-sizing: border-box;\ +color: black;\ +}\ +.ace_button:hover {\ +background-color: #eee;\ +opacity:1;\ +}\ +.ace_button:active {\ +background-color: #ddd;\ +}\ +.ace_button.checked {\ +border-color: #3399ff;\ +opacity:1;\ +}\ +.ace_search_options{\ +margin-bottom: 3px;\ +text-align: right;\ +-webkit-user-select: none;\ +-moz-user-select: none;\ +-o-user-select: none;\ +-ms-user-select: none;\ +user-select: none;\ +}"; +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var keyUtil = require("../lib/keys"); + +dom.importCssString(searchboxCss, "ace_searchbox"); + +var html = ''.replace(/>\s+/g, ">"); + +var SearchBox = function(editor, range, showReplaceForm) { + var div = dom.createElement("div"); + div.innerHTML = html; + this.element = div.firstChild; + + this.$init(); + this.setEditor(editor); +}; + +(function() { + this.setEditor = function(editor) { + editor.searchBox = this; + editor.container.appendChild(this.element); + this.editor = editor; + }; + + this.$initElements = function(sb) { + this.searchBox = sb.querySelector(".ace_search_form"); + this.replaceBox = sb.querySelector(".ace_replace_form"); + this.searchOptions = sb.querySelector(".ace_search_options"); + this.regExpOption = sb.querySelector("[action=toggleRegexpMode]"); + this.caseSensitiveOption = sb.querySelector("[action=toggleCaseSensitive]"); + this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]"); + this.searchInput = this.searchBox.querySelector(".ace_search_field"); + this.replaceInput = this.replaceBox.querySelector(".ace_search_field"); + }; + + this.$init = function() { + var sb = this.element; + + this.$initElements(sb); + + var _this = this; + event.addListener(sb, "mousedown", function(e) { + setTimeout(function(){ + _this.activeInput.focus(); + }, 0); + event.stopPropagation(e); + }); + event.addListener(sb, "click", function(e) { + var t = e.target || e.srcElement; + var action = t.getAttribute("action"); + if (action && _this[action]) + _this[action](); + else if (_this.$searchBarKb.commands[action]) + _this.$searchBarKb.commands[action].exec(_this); + event.stopPropagation(e); + }); + + event.addCommandKeyListener(sb, function(e, hashId, keyCode) { + var keyString = keyUtil.keyCodeToString(keyCode); + var command = _this.$searchBarKb.findKeyCommand(hashId, keyString); + if (command && command.exec) { + command.exec(_this); + event.stopEvent(e); + } + }); + + this.$onChange = lang.delayedCall(function() { + _this.find(false, false); + }); + + event.addListener(this.searchInput, "input", function() { + _this.$onChange.schedule(20); + }); + event.addListener(this.searchInput, "focus", function() { + _this.activeInput = _this.searchInput; + _this.searchInput.value && _this.highlight(); + }); + event.addListener(this.replaceInput, "focus", function() { + _this.activeInput = _this.replaceInput; + _this.searchInput.value && _this.highlight(); + }); + }; + this.$closeSearchBarKb = new HashHandler([{ + bindKey: "Esc", + name: "closeSearchBar", + exec: function(editor) { + editor.searchBox.hide(); + } + }]); + this.$searchBarKb = new HashHandler(); + this.$searchBarKb.bindKeys({ + "Ctrl-f|Command-f": function(sb) { + var isReplace = sb.isReplace = !sb.isReplace; + sb.replaceBox.style.display = isReplace ? "" : "none"; + sb.searchInput.focus(); + }, + "Ctrl-H|Command-Option-F": function(sb) { + sb.replaceBox.style.display = ""; + sb.replaceInput.focus(); + }, + "Ctrl-G|Command-G": function(sb) { + sb.findNext(); + }, + "Ctrl-Shift-G|Command-Shift-G": function(sb) { + sb.findPrev(); + }, + "esc": function(sb) { + setTimeout(function() { sb.hide();}); + }, + "Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findNext(); + }, + "Shift-Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findPrev(); + }, + "Alt-Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replaceAll(); + sb.findAll(); + }, + "Tab": function(sb) { + (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus(); + } + }); + + this.$searchBarKb.addCommands([{ + name: "toggleRegexpMode", + bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"}, + exec: function(sb) { + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleCaseSensitive", + bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"}, + exec: function(sb) { + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleWholeWords", + bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"}, + exec: function(sb) { + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + } + }]); + + this.$syncOptions = function() { + dom.setCssClass(this.regExpOption, "checked", this.regExpOption.checked); + dom.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked); + dom.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked); + this.find(false, false); + }; + + this.highlight = function(re) { + this.editor.session.highlight(re || this.editor.$search.$options.re); + this.editor.renderer.updateBackMarkers() + }; + this.find = function(skipCurrent, backwards, preventScroll) { + var range = this.editor.find(this.searchInput.value, { + skipCurrent: skipCurrent, + backwards: backwards, + wrap: true, + regExp: this.regExpOption.checked, + caseSensitive: this.caseSensitiveOption.checked, + wholeWord: this.wholeWordOption.checked, + preventScroll: preventScroll + }); + var noMatch = !range && this.searchInput.value; + dom.setCssClass(this.searchBox, "ace_nomatch", noMatch); + this.editor._emit("findSearchBox", { match: !noMatch }); + this.highlight(); + }; + this.findNext = function() { + this.find(true, false); + }; + this.findPrev = function() { + this.find(true, true); + }; + this.findAll = function(){ + var range = this.editor.findAll(this.searchInput.value, { + regExp: this.regExpOption.checked, + caseSensitive: this.caseSensitiveOption.checked, + wholeWord: this.wholeWordOption.checked + }); + var noMatch = !range && this.searchInput.value; + dom.setCssClass(this.searchBox, "ace_nomatch", noMatch); + this.editor._emit("findSearchBox", { match: !noMatch }); + this.highlight(); + this.hide(); + }; + this.replace = function() { + if (!this.editor.getReadOnly()) + this.editor.replace(this.replaceInput.value); + }; + this.replaceAndFindNext = function() { + if (!this.editor.getReadOnly()) { + this.editor.replace(this.replaceInput.value); + this.findNext() + } + }; + this.replaceAll = function() { + if (!this.editor.getReadOnly()) + this.editor.replaceAll(this.replaceInput.value); + }; + + this.hide = function() { + this.element.style.display = "none"; + this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb); + this.editor.focus(); + }; + this.show = function(value, isReplace) { + this.element.style.display = ""; + this.replaceBox.style.display = isReplace ? "" : "none"; + + this.isReplace = isReplace; + + if (value) + this.searchInput.value = value; + + this.find(false, false, true); + + this.searchInput.focus(); + this.searchInput.select(); + + this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb); + }; + + this.isFocused = function() { + var el = document.activeElement; + return el == this.searchInput || el == this.replaceInput; + } +}).call(SearchBox.prototype); + +exports.SearchBox = SearchBox; + +exports.Search = function(editor, isReplace) { + var sb = editor.searchBox || new SearchBox(editor); + sb.show(editor.session.getTextRange(), isReplace); +}; + +}); + +ace.define("ace/ext/old_ie",["require","exports","module","ace/lib/useragent","ace/tokenizer","ace/ext/searchbox","ace/mode/text"], function(require, exports, module) { +"use strict"; +var MAX_TOKEN_COUNT = 1000; +var useragent = require("../lib/useragent"); +var TokenizerModule = require("../tokenizer"); + +function patch(obj, name, regexp, replacement) { + eval("obj['" + name + "']=" + obj[name].toString().replace( + regexp, replacement + )); +} + +if (useragent.isIE && useragent.isIE < 10 && window.top.document.compatMode === "BackCompat") + useragent.isOldIE = true; + +if (typeof document != "undefined" && !document.documentElement.querySelector) { + useragent.isOldIE = true; + var qs = function(el, selector) { + if (selector.charAt(0) == ".") { + var classNeme = selector.slice(1); + } else { + var m = selector.match(/(\w+)=(\w+)/); + var attr = m && m[1]; + var attrVal = m && m[2]; + } + for (var i = 0; i < el.all.length; i++) { + var ch = el.all[i]; + if (classNeme) { + if (ch.className.indexOf(classNeme) != -1) + return ch; + } else if (attr) { + if (ch.getAttribute(attr) == attrVal) + return ch; + } + } + }; + var sb = require("./searchbox").SearchBox.prototype; + patch( + sb, "$initElements", + /([^\s=]*).querySelector\((".*?")\)/g, + "qs($1, $2)" + ); +} + +var compliantExecNpcg = /()??/.exec("")[1] === undefined; +if (compliantExecNpcg) + return; +var proto = TokenizerModule.Tokenizer.prototype; +TokenizerModule.Tokenizer_orig = TokenizerModule.Tokenizer; +proto.getLineTokens_orig = proto.getLineTokens; + +patch( + TokenizerModule, "Tokenizer", + "ruleRegExps.push(adjustedregex);\n", + function(m) { + return m + '\ + if (state[i].next && RegExp(adjustedregex).test(""))\n\ + rule._qre = RegExp(adjustedregex, "g");\n\ + '; + } +); +TokenizerModule.Tokenizer.prototype = proto; +patch( + proto, "getLineTokens", + /if \(match\[i \+ 1\] === undefined\)\s*continue;/, + "if (!match[i + 1]) {\n\ + if (value)continue;\n\ + var qre = state[mapping[i]]._qre;\n\ + if (!qre) continue;\n\ + qre.lastIndex = lastIndex;\n\ + if (!qre.exec(line) || qre.lastIndex != lastIndex)\n\ + continue;\n\ + }" +); + +patch( + require("../mode/text").Mode.prototype, "getTokenizer", + /Tokenizer/, + "TokenizerModule.Tokenizer" +); + +useragent.isOldIE = true; + +}); + (function() { + ace.require(["ace/ext/old_ie"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-searchbox.js b/src/libs/ace/ext-searchbox.js new file mode 100755 index 0000000..81b936b --- /dev/null +++ b/src/libs/ace/ext-searchbox.js @@ -0,0 +1,509 @@ +ace.define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var event = require("../lib/event"); +var searchboxCss = "\ +.ace_search {\ +background-color: #ddd;\ +color: #666;\ +border: 1px solid #cbcbcb;\ +border-top: 0 none;\ +overflow: hidden;\ +margin: 0;\ +padding: 4px 6px 0 4px;\ +position: absolute;\ +top: 0;\ +z-index: 99;\ +white-space: normal;\ +}\ +.ace_search.left {\ +border-left: 0 none;\ +border-radius: 0px 0px 5px 0px;\ +left: 0;\ +}\ +.ace_search.right {\ +border-radius: 0px 0px 0px 5px;\ +border-right: 0 none;\ +right: 0;\ +}\ +.ace_search_form, .ace_replace_form {\ +margin: 0 20px 4px 0;\ +overflow: hidden;\ +line-height: 1.9;\ +}\ +.ace_replace_form {\ +margin-right: 0;\ +}\ +.ace_search_form.ace_nomatch {\ +outline: 1px solid red;\ +}\ +.ace_search_field {\ +border-radius: 3px 0 0 3px;\ +background-color: white;\ +color: black;\ +border: 1px solid #cbcbcb;\ +border-right: 0 none;\ +box-sizing: border-box!important;\ +outline: 0;\ +padding: 0;\ +font-size: inherit;\ +margin: 0;\ +line-height: inherit;\ +padding: 0 6px;\ +min-width: 17em;\ +vertical-align: top;\ +}\ +.ace_searchbtn {\ +border: 1px solid #cbcbcb;\ +line-height: inherit;\ +display: inline-block;\ +padding: 0 6px;\ +background: #fff;\ +border-right: 0 none;\ +border-left: 1px solid #dcdcdc;\ +cursor: pointer;\ +margin: 0;\ +position: relative;\ +box-sizing: content-box!important;\ +color: #666;\ +}\ +.ace_searchbtn:last-child {\ +border-radius: 0 3px 3px 0;\ +border-right: 1px solid #cbcbcb;\ +}\ +.ace_searchbtn:disabled {\ +background: none;\ +cursor: default;\ +}\ +.ace_searchbtn:hover {\ +background-color: #eef1f6;\ +}\ +.ace_searchbtn.prev, .ace_searchbtn.next {\ +padding: 0px 0.7em\ +}\ +.ace_searchbtn.prev:after, .ace_searchbtn.next:after {\ +content: \"\";\ +border: solid 2px #888;\ +width: 0.5em;\ +height: 0.5em;\ +border-width: 2px 0 0 2px;\ +display:inline-block;\ +transform: rotate(-45deg);\ +}\ +.ace_searchbtn.next:after {\ +border-width: 0 2px 2px 0 ;\ +}\ +.ace_searchbtn_close {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\ +border-radius: 50%;\ +border: 0 none;\ +color: #656565;\ +cursor: pointer;\ +font: 16px/16px Arial;\ +padding: 0;\ +height: 14px;\ +width: 14px;\ +top: 9px;\ +right: 7px;\ +position: absolute;\ +}\ +.ace_searchbtn_close:hover {\ +background-color: #656565;\ +background-position: 50% 100%;\ +color: white;\ +}\ +.ace_button {\ +margin-left: 2px;\ +cursor: pointer;\ +-webkit-user-select: none;\ +-moz-user-select: none;\ +-o-user-select: none;\ +-ms-user-select: none;\ +user-select: none;\ +overflow: hidden;\ +opacity: 0.7;\ +border: 1px solid rgba(100,100,100,0.23);\ +padding: 1px;\ +box-sizing: border-box!important;\ +color: black;\ +}\ +.ace_button:hover {\ +background-color: #eee;\ +opacity:1;\ +}\ +.ace_button:active {\ +background-color: #ddd;\ +}\ +.ace_button.checked {\ +border-color: #3399ff;\ +opacity:1;\ +}\ +.ace_search_options{\ +margin-bottom: 3px;\ +text-align: right;\ +-webkit-user-select: none;\ +-moz-user-select: none;\ +-o-user-select: none;\ +-ms-user-select: none;\ +user-select: none;\ +clear: both;\ +}\ +.ace_search_counter {\ +float: left;\ +font-family: arial;\ +padding: 0 8px;\ +}"; +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var keyUtil = require("../lib/keys"); + +var MAX_COUNT = 999; + +dom.importCssString(searchboxCss, "ace_searchbox"); + +var html = ''.replace(/> +/g, ">"); + +var SearchBox = function(editor, range, showReplaceForm) { + var div = dom.createElement("div"); + div.innerHTML = html; + this.element = div.firstChild; + + this.setSession = this.setSession.bind(this); + + this.$init(); + this.setEditor(editor); +}; + +(function() { + this.setEditor = function(editor) { + editor.searchBox = this; + editor.renderer.scroller.appendChild(this.element); + this.editor = editor; + }; + + this.setSession = function(e) { + debugger + this.searchRange = null; + this.$syncOptions(true); + } + + this.$initElements = function(sb) { + this.searchBox = sb.querySelector(".ace_search_form"); + this.replaceBox = sb.querySelector(".ace_replace_form"); + this.searchOption = sb.querySelector("[action=searchInSelection]"); + this.replaceOption = sb.querySelector("[action=toggleReplace]"); + this.regExpOption = sb.querySelector("[action=toggleRegexpMode]"); + this.caseSensitiveOption = sb.querySelector("[action=toggleCaseSensitive]"); + this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]"); + this.searchInput = this.searchBox.querySelector(".ace_search_field"); + this.replaceInput = this.replaceBox.querySelector(".ace_search_field"); + this.searchCounter = sb.querySelector(".ace_search_counter"); + }; + + this.$init = function() { + var sb = this.element; + + this.$initElements(sb); + + var _this = this; + event.addListener(sb, "mousedown", function(e) { + setTimeout(function(){ + _this.activeInput.focus(); + }, 0); + event.stopPropagation(e); + }); + event.addListener(sb, "click", function(e) { + var t = e.target || e.srcElement; + var action = t.getAttribute("action"); + if (action && _this[action]) + _this[action](); + else if (_this.$searchBarKb.commands[action]) + _this.$searchBarKb.commands[action].exec(_this); + event.stopPropagation(e); + }); + + event.addCommandKeyListener(sb, function(e, hashId, keyCode) { + var keyString = keyUtil.keyCodeToString(keyCode); + var command = _this.$searchBarKb.findKeyCommand(hashId, keyString); + if (command && command.exec) { + command.exec(_this); + event.stopEvent(e); + } + }); + + this.$onChange = lang.delayedCall(function() { + _this.find(false, false); + }); + + event.addListener(this.searchInput, "input", function() { + _this.$onChange.schedule(20); + }); + event.addListener(this.searchInput, "focus", function() { + _this.activeInput = _this.searchInput; + _this.searchInput.value && _this.highlight(); + }); + event.addListener(this.replaceInput, "focus", function() { + _this.activeInput = _this.replaceInput; + _this.searchInput.value && _this.highlight(); + }); + }; + this.$closeSearchBarKb = new HashHandler([{ + bindKey: "Esc", + name: "closeSearchBar", + exec: function(editor) { + editor.searchBox.hide(); + } + }]); + this.$searchBarKb = new HashHandler(); + this.$searchBarKb.bindKeys({ + "Ctrl-f|Command-f": function(sb) { + var isReplace = sb.isReplace = !sb.isReplace; + sb.replaceBox.style.display = isReplace ? "" : "none"; + sb.replaceOption.checked = false; + sb.$syncOptions(); + sb.searchInput.focus(); + }, + "Ctrl-H|Command-Option-F": function(sb) { + sb.replaceOption.checked = true; + sb.$syncOptions(); + sb.replaceInput.focus(); + }, + "Ctrl-G|Command-G": function(sb) { + sb.findNext(); + }, + "Ctrl-Shift-G|Command-Shift-G": function(sb) { + sb.findPrev(); + }, + "esc": function(sb) { + setTimeout(function() { sb.hide();}); + }, + "Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findNext(); + }, + "Shift-Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findPrev(); + }, + "Alt-Return": function(sb) { + if (sb.activeInput == sb.replaceInput) + sb.replaceAll(); + sb.findAll(); + }, + "Tab": function(sb) { + (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus(); + } + }); + + this.$searchBarKb.addCommands([{ + name: "toggleRegexpMode", + bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"}, + exec: function(sb) { + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleCaseSensitive", + bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"}, + exec: function(sb) { + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleWholeWords", + bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"}, + exec: function(sb) { + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleReplace", + exec: function(sb) { + sb.replaceOption.checked = !sb.replaceOption.checked; + sb.$syncOptions(); + } + }, { + name: "searchInSelection", + exec: function(sb) { + sb.searchOption.checked = !sb.searchRange; + sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); + sb.$syncOptions(); + } + }]); + + this.setSearchRange = function(range) { + this.searchRange = range; + if (range) { + this.searchRangeMarker = this.editor.session.addMarker(range, "ace_active-line"); + } else if (this.searchRangeMarker) { + this.editor.session.removeMarker(this.searchRangeMarker); + this.searchRangeMarker = null; + } + } + + this.$syncOptions = function(preventScroll) { + dom.setCssClass(this.replaceOption, "checked", this.searchRange); + dom.setCssClass(this.searchOption, "checked", this.searchOption.checked); + this.replaceOption.textContent = this.replaceOption.checked ? "-" : "+"; + dom.setCssClass(this.regExpOption, "checked", this.regExpOption.checked); + dom.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked); + dom.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked); + this.replaceBox.style.display = this.replaceOption.checked ? "" : "none"; + this.find(false, false, preventScroll); + }; + + this.highlight = function(re) { + this.editor.session.highlight(re || this.editor.$search.$options.re); + this.editor.renderer.updateBackMarkers() + }; + this.find = function(skipCurrent, backwards, preventScroll) { + var range = this.editor.find(this.searchInput.value, { + skipCurrent: skipCurrent, + backwards: backwards, + wrap: true, + regExp: this.regExpOption.checked, + caseSensitive: this.caseSensitiveOption.checked, + wholeWord: this.wholeWordOption.checked, + preventScroll: preventScroll, + range: this.searchRange + }); + var noMatch = !range && this.searchInput.value; + dom.setCssClass(this.searchBox, "ace_nomatch", noMatch); + this.editor._emit("findSearchBox", { match: !noMatch }); + this.highlight(); + this.updateCounter(); + }; + this.updateCounter = function() { + var editor = this.editor; + var regex = editor.$search.$options.re; + var all = 0; + var before = 0 + if (regex) { + var value = this.searchRange + ? editor.session.getTextRange(this.searchRange) + : editor.getValue(); + + var offset = editor.session.doc.positionToIndex(editor.selection.anchor); + if (this.searchRange) + offset -= editor.session.doc.positionToIndex(this.searchRange.start); + + var last = regex.lastIndex = 0; + var m; + while ((m = regex.exec(value))) { + all++; + last = m.index; + if (last <= offset) + before++; + if (all > MAX_COUNT) + break + if (!m[0]) { + regex.lastIndex = last += 1; + if (last >= value.length) + break; + } + } + } + this.searchCounter.textContent = before + " of " + (all > MAX_COUNT ? MAX_COUNT + "+" : all); + }; + this.findNext = function() { + this.find(true, false); + }; + this.findPrev = function() { + this.find(true, true); + }; + this.findAll = function(){ + var range = this.editor.findAll(this.searchInput.value, { + regExp: this.regExpOption.checked, + caseSensitive: this.caseSensitiveOption.checked, + wholeWord: this.wholeWordOption.checked + }); + var noMatch = !range && this.searchInput.value; + dom.setCssClass(this.searchBox, "ace_nomatch", noMatch); + this.editor._emit("findSearchBox", { match: !noMatch }); + this.highlight(); + this.hide(); + }; + this.replace = function() { + if (!this.editor.getReadOnly()) + this.editor.replace(this.replaceInput.value); + }; + this.replaceAndFindNext = function() { + if (!this.editor.getReadOnly()) { + this.editor.replace(this.replaceInput.value); + this.findNext() + } + }; + this.replaceAll = function() { + if (!this.editor.getReadOnly()) + this.editor.replaceAll(this.replaceInput.value); + }; + + this.hide = function() { + this.active = false; + this.setSearchRange(null) + this.editor.off("changeSession", this.setSession); + + this.element.style.display = "none"; + this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb); + this.editor.focus(); + }; + this.show = function(value, isReplace) { + this.active = true; + this.editor.on("changeSession", this.setSession); + this.element.style.display = ""; + this.replaceOption.checked = isReplace; + + if (value) + this.searchInput.value = value; + + this.searchInput.focus(); + this.searchInput.select(); + + this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb); + + this.$syncOptions(true); + }; + + this.isFocused = function() { + var el = document.activeElement; + return el == this.searchInput || el == this.replaceInput; + } +}).call(SearchBox.prototype); + +exports.SearchBox = SearchBox; + +exports.Search = function(editor, isReplace) { + var sb = editor.searchBox || new SearchBox(editor); + sb.show(editor.session.getTextRange(), isReplace); +}; + +}); + (function() { + ace.require(["ace/ext/searchbox"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-settings_menu.js b/src/libs/ace/ext-settings_menu.js new file mode 100755 index 0000000..a00b28f --- /dev/null +++ b/src/libs/ace/ext-settings_menu.js @@ -0,0 +1,663 @@ +ace.define("ace/ext/menu_tools/element_generator",["require","exports","module"], function(require, exports, module) { +'use strict'; +module.exports.createOption = function createOption (obj) { + var attribute; + var el = document.createElement('option'); + for(attribute in obj) { + if(obj.hasOwnProperty(attribute)) { + if(attribute === 'selected') { + el.setAttribute(attribute, obj[attribute]); + } else { + el[attribute] = obj[attribute]; + } + } + } + return el; +}; +module.exports.createCheckbox = function createCheckbox (id, checked, clss) { + var el = document.createElement('input'); + el.setAttribute('type', 'checkbox'); + el.setAttribute('id', id); + el.setAttribute('name', id); + el.setAttribute('value', checked); + el.setAttribute('class', clss); + if(checked) { + el.setAttribute('checked', 'checked'); + } + return el; +}; +module.exports.createInput = function createInput (id, value, clss) { + var el = document.createElement('input'); + el.setAttribute('type', 'text'); + el.setAttribute('id', id); + el.setAttribute('name', id); + el.setAttribute('value', value); + el.setAttribute('class', clss); + return el; +}; +module.exports.createLabel = function createLabel (text, labelFor) { + var el = document.createElement('label'); + el.setAttribute('for', labelFor); + el.textContent = text; + return el; +}; +module.exports.createSelection = function createSelection (id, values, clss) { + var el = document.createElement('select'); + el.setAttribute('id', id); + el.setAttribute('name', id); + el.setAttribute('class', clss); + values.forEach(function(item) { + el.appendChild(module.exports.createOption(item)); + }); + return el; +}; + +}); + +ace.define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var modes = []; +function getModeForPath(path) { + var mode = modesByName.text; + var fileName = path.split(/[\/\\]/).pop(); + for (var i = 0; i < modes.length; i++) { + if (modes[i].supportsFile(fileName)) { + mode = modes[i]; + break; + } + } + return mode; +} + +var Mode = function(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function(a, b){ + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } else { + re = "^.*\\.(" + extensions + ")$"; + } + + this.extRe = new RegExp(re, "gi"); +}; + +Mode.prototype.supportsFile = function(filename) { + return filename.match(this.extRe); +}; +var supportedModes = { + ABAP: ["abap"], + ABC: ["abc"], + ActionScript:["as"], + ADA: ["ada|adb"], + Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], + AsciiDoc: ["asciidoc|adoc"], + Assembly_x86:["asm|a"], + AutoHotKey: ["ahk"], + BatchFile: ["bat|cmd"], + Bro: ["bro"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm"], + CSharp: ["cs"], + CSS: ["css"], + Curly: ["curly"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Dummy: ["dummy"], + DummySyntax: ["dummy"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], + GraphQLSchema: ["gql"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], + Haskell_Cabal: ["cabal"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml"], + HTML_Elixir: ["eex|html.eex"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|jsx"], + JSON: ["json"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MEL: ["mel"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], + Pig: ["pig"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + Python: ["py"], + R: ["r"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + RHTML: ["Rhtml"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala"], + Scheme: ["scm|sm|rkt|oak|scheme"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Smarty: ["smarty|tpl"], + snippets: ["snippets"], + Soy_Template:["soy"], + Space: ["space"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSX: ["tsx"], + Twig: ["twig|swig"], + Typescript: ["ts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Django: ["html"] +}; + +var nameOverrides = { + ObjectiveC: "Objective-C", + CSharp: "C#", + golang: "Go", + C_Cpp: "C and C++", + coffee: "CoffeeScript", + HTML_Ruby: "HTML (Ruby)", + HTML_Elixir: "HTML (Elixir)", + FTL: "FreeMarker" +}; +var modesByName = {}; +for (var name in supportedModes) { + var data = supportedModes[name]; + var displayName = (nameOverrides[name] || name).replace(/_/g, " "); + var filename = name.toLowerCase(); + var mode = new Mode(filename, displayName, data[0]); + modesByName[filename] = mode; + modes.push(mode); +} + +module.exports = { + getModeForPath: getModeForPath, + modes: modes, + modesByName: modesByName +}; + +}); + +ace.define("ace/ext/themelist",["require","exports","module","ace/lib/fixoldbrowsers"], function(require, exports, module) { +"use strict"; +require("ace/lib/fixoldbrowsers"); + +var themeData = [ + ["Chrome" ], + ["Clouds" ], + ["Crimson Editor" ], + ["Dawn" ], + ["Dreamweaver" ], + ["Eclipse" ], + ["GitHub" ], + ["IPlastic" ], + ["Solarized Light"], + ["TextMate" ], + ["Tomorrow" ], + ["XCode" ], + ["Kuroir"], + ["KatzenMilch"], + ["SQL Server" ,"sqlserver" , "light"], + ["Ambiance" ,"ambiance" , "dark"], + ["Chaos" ,"chaos" , "dark"], + ["Clouds Midnight" ,"clouds_midnight" , "dark"], + ["Cobalt" ,"cobalt" , "dark"], + ["Gruvbox" ,"gruvbox" , "dark"], + ["Green on Black" ,"gob" , "dark"], + ["idle Fingers" ,"idle_fingers" , "dark"], + ["krTheme" ,"kr_theme" , "dark"], + ["Merbivore" ,"merbivore" , "dark"], + ["Merbivore Soft" ,"merbivore_soft" , "dark"], + ["Mono Industrial" ,"mono_industrial" , "dark"], + ["Monokai" ,"monokai" , "dark"], + ["Pastel on dark" ,"pastel_on_dark" , "dark"], + ["Solarized Dark" ,"solarized_dark" , "dark"], + ["Terminal" ,"terminal" , "dark"], + ["Tomorrow Night" ,"tomorrow_night" , "dark"], + ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], + ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], + ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], + ["Twilight" ,"twilight" , "dark"], + ["Vibrant Ink" ,"vibrant_ink" , "dark"] +]; + + +exports.themesByName = {}; +exports.themes = themeData.map(function(data) { + var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); + var theme = { + caption: data[0], + theme: "ace/theme/" + name, + isDark: data[2] == "dark", + name: name + }; + exports.themesByName[name] = theme; + return theme; +}); + +}); + +ace.define("ace/ext/menu_tools/add_editor_menu_options",["require","exports","module","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module) { +'use strict'; +module.exports.addEditorMenuOptions = function addEditorMenuOptions (editor) { + var modelist = require('../modelist'); + var themelist = require('../themelist'); + editor.menuOptions = { + setNewLineMode: [{ + textContent: "unix", + value: "unix" + }, { + textContent: "windows", + value: "windows" + }, { + textContent: "auto", + value: "auto" + }], + setTheme: [], + setMode: [], + setKeyboardHandler: [{ + textContent: "ace", + value: "" + }, { + textContent: "vim", + value: "ace/keyboard/vim" + }, { + textContent: "emacs", + value: "ace/keyboard/emacs" + }, { + textContent: "textarea", + value: "ace/keyboard/textarea" + }, { + textContent: "sublime", + value: "ace/keyboard/sublime" + }] + }; + + editor.menuOptions.setTheme = themelist.themes.map(function(theme) { + return { + textContent: theme.caption, + value: theme.theme + }; + }); + + editor.menuOptions.setMode = modelist.modes.map(function(mode) { + return { + textContent: mode.name, + value: mode.mode + }; + }); +}; + + +}); + +ace.define("ace/ext/menu_tools/get_set_functions",["require","exports","module"], function(require, exports, module) { +'use strict'; +module.exports.getSetFunctions = function getSetFunctions (editor) { + var out = []; + var my = { + 'editor' : editor, + 'session' : editor.session, + 'renderer' : editor.renderer + }; + var opts = []; + var skip = [ + 'setOption', + 'setUndoManager', + 'setDocument', + 'setValue', + 'setBreakpoints', + 'setScrollTop', + 'setScrollLeft', + 'setSelectionStyle', + 'setWrapLimitRange' + ]; + ['renderer', 'session', 'editor'].forEach(function(esra) { + var esr = my[esra]; + var clss = esra; + for(var fn in esr) { + if(skip.indexOf(fn) === -1) { + if(/^set/.test(fn) && opts.indexOf(fn) === -1) { + opts.push(fn); + out.push({ + 'functionName' : fn, + 'parentObj' : esr, + 'parentName' : clss + }); + } + } + } + }); + return out; +}; + +}); + +ace.define("ace/ext/menu_tools/generate_settings_menu",["require","exports","module","ace/ext/menu_tools/element_generator","ace/ext/menu_tools/add_editor_menu_options","ace/ext/menu_tools/get_set_functions","ace/ace"], function(require, exports, module) { +'use strict'; +var egen = require('./element_generator'); +var addEditorMenuOptions = require('./add_editor_menu_options').addEditorMenuOptions; +var getSetFunctions = require('./get_set_functions').getSetFunctions; +module.exports.generateSettingsMenu = function generateSettingsMenu (editor) { + var elements = []; + function cleanupElementsList() { + elements.sort(function(a, b) { + var x = a.getAttribute('contains'); + var y = b.getAttribute('contains'); + return x.localeCompare(y); + }); + } + function wrapElements() { + var topmenu = document.createElement('div'); + topmenu.setAttribute('id', 'ace_settingsmenu'); + elements.forEach(function(element) { + topmenu.appendChild(element); + }); + + var el = topmenu.appendChild(document.createElement('div')); + var version = require("../../ace").version; + el.style.padding = "1em"; + el.textContent = "Ace version " + version; + + return topmenu; + } + function createNewEntry(obj, clss, item, val) { + var el; + var div = document.createElement('div'); + div.setAttribute('contains', item); + div.setAttribute('class', 'ace_optionsMenuEntry'); + div.setAttribute('style', 'clear: both;'); + + div.appendChild(egen.createLabel( + item.replace(/^set/, '').replace(/([A-Z])/g, ' $1').trim(), + item + )); + + if (Array.isArray(val)) { + el = egen.createSelection(item, val, clss); + el.addEventListener('change', function(e) { + try{ + editor.menuOptions[e.target.id].forEach(function(x) { + if(x.textContent !== e.target.textContent) { + delete x.selected; + } + }); + obj[e.target.id](e.target.value); + } catch (err) { + throw new Error(err); + } + }); + } else if(typeof val === 'boolean') { + el = egen.createCheckbox(item, val, clss); + el.addEventListener('change', function(e) { + try{ + obj[e.target.id](!!e.target.checked); + } catch (err) { + throw new Error(err); + } + }); + } else { + el = egen.createInput(item, val, clss); + el.addEventListener('change', function(e) { + try{ + if(e.target.value === 'true') { + obj[e.target.id](true); + } else if(e.target.value === 'false') { + obj[e.target.id](false); + } else { + obj[e.target.id](e.target.value); + } + } catch (err) { + throw new Error(err); + } + }); + } + el.style.cssText = 'float:right;'; + div.appendChild(el); + return div; + } + function makeDropdown(item, esr, clss, fn) { + var val = editor.menuOptions[item]; + var currentVal = esr[fn](); + if (typeof currentVal == 'object') + currentVal = currentVal.$id; + val.forEach(function(valuex) { + if (valuex.value === currentVal) + valuex.selected = 'selected'; + }); + return createNewEntry(esr, clss, item, val); + } + function handleSet(setObj) { + var item = setObj.functionName; + var esr = setObj.parentObj; + var clss = setObj.parentName; + var val; + var fn = item.replace(/^set/, 'get'); + if(editor.menuOptions[item] !== undefined) { + elements.push(makeDropdown(item, esr, clss, fn)); + } else if(typeof esr[fn] === 'function') { + try { + val = esr[fn](); + if(typeof val === 'object') { + val = val.$id; + } + elements.push( + createNewEntry(esr, clss, item, val) + ); + } catch (e) { + } + } + } + addEditorMenuOptions(editor); + getSetFunctions(editor).forEach(function(setObj) { + handleSet(setObj); + }); + cleanupElementsList(); + return wrapElements(); +}; + +}); + +ace.define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], 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);\ +-webkit-transition: all 0.5s;\ +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: 1000;\ +}\ +.ace_closeButton{\ +background: rgba(245, 146, 146, 0.9);\ +}\ +.ace_optionsMenuKey {\ +color: darkslateblue;\ +font-weight: bold;\ +}\ +.ace_optionsMenuCommand {\ +color: darkcyan;\ +font-weight: normal;\ +}"; +dom.importCssString(cssText); +module.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) { + top = top ? 'top: ' + top + ';' : ''; + bottom = bottom ? 'bottom: ' + bottom + ';' : ''; + right = right ? 'right: ' + right + ';' : ''; + left = left ? 'left: ' + left + ';' : ''; + + var closer = document.createElement('div'); + var contentContainer = document.createElement('div'); + + function documentEscListener(e) { + if (e.keyCode === 27) { + closer.click(); + } + } + + 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() { + document.removeEventListener('keydown', documentEscListener); + closer.parentNode.removeChild(closer); + editor.focus(); + closer = null; + }); + document.addEventListener('keydown', documentEscListener); + + contentContainer.style.cssText = top + right + bottom + left; + contentContainer.addEventListener('click', function(e) { + e.stopPropagation(); + }); + + var wrapper = dom.createElement("div"); + wrapper.style.position = "relative"; + + var closeButton = dom.createElement("div"); + closeButton.className = "ace_closeButton"; + closeButton.addEventListener('click', function() { + closer.click(); + }); + + wrapper.appendChild(closeButton); + contentContainer.appendChild(wrapper); + + contentContainer.appendChild(contentElement); + closer.appendChild(contentContainer); + document.body.appendChild(closer); + editor.blur(); +}; + +}); + +ace.define("ace/ext/settings_menu",["require","exports","module","ace/ext/menu_tools/generate_settings_menu","ace/ext/menu_tools/overlay_page","ace/editor"], function(require, exports, module) { +"use strict"; +var generateSettingsMenu = require('./menu_tools/generate_settings_menu').generateSettingsMenu; +var overlayPage = require('./menu_tools/overlay_page').overlayPage; +function showSettingsMenu(editor) { + var sm = document.getElementById('ace_settingsmenu'); + if (!sm) + overlayPage(editor, generateSettingsMenu(editor), '0', '0', '0'); +} +module.exports.init = function(editor) { + var Editor = require("ace/editor").Editor; + Editor.prototype.showSettingsMenu = function() { + showSettingsMenu(this); + }; +}; +}); + (function() { + ace.require(["ace/ext/settings_menu"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-spellcheck.js b/src/libs/ace/ext-spellcheck.js new file mode 100755 index 0000000..8d3b5f6 --- /dev/null +++ b/src/libs/ace/ext-spellcheck.js @@ -0,0 +1,71 @@ +ace.define("ace/ext/spellcheck",["require","exports","module","ace/lib/event","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; +var event = require("../lib/event"); + +exports.contextMenuHandler = function(e){ + var host = e.target; + var text = host.textInput.getElement(); + if (!host.selection.isEmpty()) + return; + var c = host.getCursorPosition(); + var r = host.session.getWordRange(c.row, c.column); + var w = host.session.getTextRange(r); + + host.session.tokenRe.lastIndex = 0; + if (!host.session.tokenRe.test(w)) + return; + var PLACEHOLDER = "\x01\x01"; + var value = w + " " + PLACEHOLDER; + text.value = value; + text.setSelectionRange(w.length, w.length + 1); + text.setSelectionRange(0, 0); + text.setSelectionRange(0, w.length); + + var afterKeydown = false; + event.addListener(text, "keydown", function onKeydown() { + event.removeListener(text, "keydown", onKeydown); + afterKeydown = true; + }); + + host.textInput.setInputHandler(function(newVal) { + console.log(newVal , value, text.selectionStart, text.selectionEnd) + if (newVal == value) + return ''; + if (newVal.lastIndexOf(value, 0) === 0) + return newVal.slice(value.length); + if (newVal.substr(text.selectionEnd) == value) + return newVal.slice(0, -value.length); + if (newVal.slice(-2) == PLACEHOLDER) { + var val = newVal.slice(0, -2); + if (val.slice(-1) == " ") { + if (afterKeydown) + return val.substring(0, text.selectionEnd); + val = val.slice(0, -1); + host.session.replace(r, val); + return ""; + } + } + + return newVal; + }); +}; +var Editor = require("../editor").Editor; +require("../config").defineOptions(Editor.prototype, "editor", { + spellcheck: { + set: function(val) { + var text = this.textInput.getElement(); + text.spellcheck = !!val; + if (!val) + this.removeListener("nativecontextmenu", exports.contextMenuHandler); + else + this.on("nativecontextmenu", exports.contextMenuHandler); + }, + value: true + } +}); + +}); + (function() { + ace.require(["ace/ext/spellcheck"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-split.js b/src/libs/ace/ext-split.js new file mode 100755 index 0000000..29dd20e --- /dev/null +++ b/src/libs/ace/ext-split.js @@ -0,0 +1,246 @@ +ace.define("ace/split",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/editor","ace/virtual_renderer","ace/edit_session"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var Editor = require("./editor").Editor; +var Renderer = require("./virtual_renderer").VirtualRenderer; +var EditSession = require("./edit_session").EditSession; + + +var Split = function(container, theme, splits) { + this.BELOW = 1; + this.BESIDE = 0; + + this.$container = container; + this.$theme = theme; + this.$splits = 0; + this.$editorCSS = ""; + this.$editors = []; + this.$orientation = this.BESIDE; + + this.setSplits(splits || 1); + this.$cEditor = this.$editors[0]; + + + this.on("focus", function(editor) { + this.$cEditor = editor; + }.bind(this)); +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.$createEditor = function() { + var el = document.createElement("div"); + el.className = this.$editorCSS; + el.style.cssText = "position: absolute; top:0px; bottom:0px"; + this.$container.appendChild(el); + var editor = new Editor(new Renderer(el, this.$theme)); + + editor.on("focus", function() { + this._emit("focus", editor); + }.bind(this)); + + this.$editors.push(editor); + editor.setFontSize(this.$fontSize); + return editor; + }; + + this.setSplits = function(splits) { + var editor; + if (splits < 1) { + throw "The number of splits have to be > 0!"; + } + + if (splits == this.$splits) { + return; + } else if (splits > this.$splits) { + while (this.$splits < this.$editors.length && this.$splits < splits) { + editor = this.$editors[this.$splits]; + this.$container.appendChild(editor.container); + editor.setFontSize(this.$fontSize); + this.$splits ++; + } + while (this.$splits < splits) { + this.$createEditor(); + this.$splits ++; + } + } else { + while (this.$splits > splits) { + editor = this.$editors[this.$splits - 1]; + this.$container.removeChild(editor.container); + this.$splits --; + } + } + this.resize(); + }; + this.getSplits = function() { + return this.$splits; + }; + this.getEditor = function(idx) { + return this.$editors[idx]; + }; + this.getCurrentEditor = function() { + return this.$cEditor; + }; + this.focus = function() { + this.$cEditor.focus(); + }; + this.blur = function() { + this.$cEditor.blur(); + }; + this.setTheme = function(theme) { + this.$editors.forEach(function(editor) { + editor.setTheme(theme); + }); + }; + this.setKeyboardHandler = function(keybinding) { + this.$editors.forEach(function(editor) { + editor.setKeyboardHandler(keybinding); + }); + }; + this.forEach = function(callback, scope) { + this.$editors.forEach(callback, scope); + }; + + + this.$fontSize = ""; + this.setFontSize = function(size) { + this.$fontSize = size; + this.forEach(function(editor) { + editor.setFontSize(size); + }); + }; + + this.$cloneSession = function(session) { + var s = new EditSession(session.getDocument(), session.getMode()); + + var undoManager = session.getUndoManager(); + if (undoManager) { + var undoManagerProxy = new UndoManagerProxy(undoManager, s); + s.setUndoManager(undoManagerProxy); + } + s.$informUndoManager = lang.delayedCall(function() { s.$deltas = []; }); + s.setTabSize(session.getTabSize()); + s.setUseSoftTabs(session.getUseSoftTabs()); + s.setOverwrite(session.getOverwrite()); + s.setBreakpoints(session.getBreakpoints()); + s.setUseWrapMode(session.getUseWrapMode()); + s.setUseWorker(session.getUseWorker()); + s.setWrapLimitRange(session.$wrapLimitRange.min, + session.$wrapLimitRange.max); + s.$foldData = session.$cloneFoldData(); + + return s; + }; + this.setSession = function(session, idx) { + var editor; + if (idx == null) { + editor = this.$cEditor; + } else { + editor = this.$editors[idx]; + } + var isUsed = this.$editors.some(function(editor) { + return editor.session === session; + }); + + if (isUsed) { + session = this.$cloneSession(session); + } + editor.setSession(session); + return session; + }; + this.getOrientation = function() { + return this.$orientation; + }; + this.setOrientation = function(orientation) { + if (this.$orientation == orientation) { + return; + } + this.$orientation = orientation; + this.resize(); + }; + this.resize = function() { + var width = this.$container.clientWidth; + var height = this.$container.clientHeight; + var editor; + + if (this.$orientation == this.BESIDE) { + var editorWidth = width / this.$splits; + for (var i = 0; i < this.$splits; i++) { + editor = this.$editors[i]; + editor.container.style.width = editorWidth + "px"; + editor.container.style.top = "0px"; + editor.container.style.left = i * editorWidth + "px"; + editor.container.style.height = height + "px"; + editor.resize(); + } + } else { + var editorHeight = height / this.$splits; + for (var i = 0; i < this.$splits; i++) { + editor = this.$editors[i]; + editor.container.style.width = width + "px"; + editor.container.style.top = i * editorHeight + "px"; + editor.container.style.left = "0px"; + editor.container.style.height = editorHeight + "px"; + editor.resize(); + } + } + }; + +}).call(Split.prototype); + + +function UndoManagerProxy(undoManager, session) { + this.$u = undoManager; + this.$doc = session; +} + +(function() { + this.execute = function(options) { + this.$u.execute(options); + }; + + this.undo = function() { + var selectionRange = this.$u.undo(true); + if (selectionRange) { + this.$doc.selection.setSelectionRange(selectionRange); + } + }; + + this.redo = function() { + var selectionRange = this.$u.redo(true); + if (selectionRange) { + this.$doc.selection.setSelectionRange(selectionRange); + } + }; + + this.reset = function() { + this.$u.reset(); + }; + + this.hasUndo = function() { + return this.$u.hasUndo(); + }; + + this.hasRedo = function() { + return this.$u.hasRedo(); + }; +}).call(UndoManagerProxy.prototype); + +exports.Split = Split; +}); + +ace.define("ace/ext/split",["require","exports","module","ace/split"], function(require, exports, module) { +"use strict"; +module.exports = require("../split"); + +}); + (function() { + ace.require(["ace/ext/split"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-static_highlight.js b/src/libs/ace/ext-static_highlight.js new file mode 100755 index 0000000..a875f9d --- /dev/null +++ b/src/libs/ace/ext-static_highlight.js @@ -0,0 +1,161 @@ +ace.define("ace/ext/static_highlight",["require","exports","module","ace/edit_session","ace/layer/text","ace/config","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var EditSession = require("../edit_session").EditSession; +var TextLayer = require("../layer/text").Text; +var baseStyles = ".ace_static_highlight {\ +font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;\ +font-size: 12px;\ +white-space: pre-wrap\ +}\ +.ace_static_highlight .ace_gutter {\ +width: 2em;\ +text-align: right;\ +padding: 0 3px 0 0;\ +margin-right: 3px;\ +}\ +.ace_static_highlight.ace_show_gutter .ace_line {\ +padding-left: 2.6em;\ +}\ +.ace_static_highlight .ace_line { position: relative; }\ +.ace_static_highlight .ace_gutter-cell {\ +-moz-user-select: -moz-none;\ +-khtml-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +top: 0;\ +bottom: 0;\ +left: 0;\ +position: absolute;\ +}\ +.ace_static_highlight .ace_gutter-cell:before {\ +content: counter(ace_line, decimal);\ +counter-increment: ace_line;\ +}\ +.ace_static_highlight {\ +counter-reset: ace_line;\ +}\ +"; +var config = require("../config"); +var dom = require("../lib/dom"); + +var SimpleTextLayer = function() { + this.config = {}; +}; +SimpleTextLayer.prototype = TextLayer.prototype; + +var highlight = function(el, opts, callback) { + var m = el.className.match(/lang-(\w+)/); + var mode = opts.mode || m && ("ace/mode/" + m[1]); + if (!mode) + return false; + var theme = opts.theme || "ace/theme/textmate"; + + var data = ""; + var nodes = []; + + if (el.firstElementChild) { + var textLen = 0; + for (var i = 0; i < el.childNodes.length; i++) { + var ch = el.childNodes[i]; + if (ch.nodeType == 3) { + textLen += ch.data.length; + data += ch.data; + } else { + nodes.push(textLen, ch); + } + } + } else { + data = dom.getInnerText(el); + if (opts.trim) + data = data.trim(); + } + + highlight.render(data, mode, theme, opts.firstLineNumber, !opts.showGutter, function (highlighted) { + dom.importCssString(highlighted.css, "ace_highlight"); + el.innerHTML = highlighted.html; + var container = el.firstChild.firstChild; + for (var i = 0; i < nodes.length; i += 2) { + var pos = highlighted.session.doc.indexToPosition(nodes[i]); + var node = nodes[i + 1]; + var lineEl = container.children[pos.row]; + lineEl && lineEl.appendChild(node); + } + callback && callback(); + }); +}; +highlight.render = function(input, mode, theme, lineStart, disableGutter, callback) { + var waiting = 1; + var modeCache = EditSession.prototype.$modes; + if (typeof theme == "string") { + waiting++; + config.loadModule(['theme', theme], function(m) { + theme = m; + --waiting || done(); + }); + } + var modeOptions; + if (mode && typeof mode === "object" && !mode.getTokenizer) { + modeOptions = mode; + mode = modeOptions.path; + } + if (typeof mode == "string") { + waiting++; + config.loadModule(['mode', mode], function(m) { + if (!modeCache[mode] || modeOptions) + modeCache[mode] = new m.Mode(modeOptions); + mode = modeCache[mode]; + --waiting || done(); + }); + } + function done() { + var result = highlight.renderSync(input, mode, theme, lineStart, disableGutter); + return callback ? callback(result) : result; + } + return --waiting || done(); +}; +highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) { + lineStart = parseInt(lineStart || 1, 10); + + var session = new EditSession(""); + session.setUseWorker(false); + session.setMode(mode); + + var textLayer = new SimpleTextLayer(); + textLayer.setSession(session); + + session.setValue(input); + + var stringBuilder = []; + var length = session.getLength(); + + for(var ix = 0; ix < length; ix++) { + stringBuilder.push("
      "); + if (!disableGutter) + stringBuilder.push("" + /*(ix + lineStart) + */ ""); + textLayer.$renderLine(stringBuilder, ix, true, false); + stringBuilder.push("\n
      "); + } + var html = "
      " + + "
      " + + stringBuilder.join("") + + "
      " + + "
      "; + + textLayer.destroy(); + + return { + css: baseStyles + theme.cssText, + html: html, + session: session + }; +}; + +module.exports = highlight; +module.exports.highlight = highlight; +}); + (function() { + ace.require(["ace/ext/static_highlight"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-statusbar.js b/src/libs/ace/ext-statusbar.js new file mode 100755 index 0000000..0c46b38 --- /dev/null +++ b/src/libs/ace/ext-statusbar.js @@ -0,0 +1,53 @@ +ace.define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"], function(require, exports, module) { +"use strict"; +var dom = require("ace/lib/dom"); +var lang = require("ace/lib/lang"); + +var StatusBar = function(editor, parentNode) { + this.element = dom.createElement("div"); + this.element.className = "ace_status-indicator"; + this.element.style.cssText = "display: inline-block;"; + parentNode.appendChild(this.element); + + var statusUpdate = lang.delayedCall(function(){ + this.updateStatus(editor) + }.bind(this)).schedule.bind(null, 100); + + editor.on("changeStatus", statusUpdate); + editor.on("changeSelection", statusUpdate); + editor.on("keyboardActivity", statusUpdate); +}; + +(function(){ + this.updateStatus = function(editor) { + var status = []; + function add(str, separator) { + str && status.push(str, separator || "|"); + } + + add(editor.keyBinding.getStatusText(editor)); + if (editor.commands.recording) + add("REC"); + + var sel = editor.selection; + var c = sel.lead; + + if (!sel.isEmpty()) { + var r = editor.getSelectionRange(); + add("(" + (r.end.row - r.start.row) + ":" +(r.end.column - r.start.column) + ")", " "); + } + add(c.row + ":" + c.column, " "); + if (sel.rangeCount) + add("[" + sel.rangeCount + "]", " "); + status.pop(); + this.element.textContent = status.join(""); + }; +}).call(StatusBar.prototype); + +exports.StatusBar = StatusBar; + +}); + (function() { + ace.require(["ace/ext/statusbar"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-textarea.js b/src/libs/ace/ext-textarea.js new file mode 100755 index 0000000..f3bc70a --- /dev/null +++ b/src/libs/ace/ext-textarea.js @@ -0,0 +1,560 @@ +ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = ".ace-tm .ace_gutter {\ +background: #f0f0f0;\ +color: #333;\ +}\ +.ace-tm .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-tm .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-tm {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-tm .ace_cursor {\ +color: black;\ +}\ +.ace-tm .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-tm .ace_storage,\ +.ace-tm .ace_keyword {\ +color: blue;\ +}\ +.ace-tm .ace_constant {\ +color: rgb(197, 6, 11);\ +}\ +.ace-tm .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-tm .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-tm .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_invalid {\ +background-color: rgba(255, 0, 0, 0.1);\ +color: red;\ +}\ +.ace-tm .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-tm .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_support.ace_type,\ +.ace-tm .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-tm .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-tm .ace_string {\ +color: rgb(3, 106, 7);\ +}\ +.ace-tm .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-tm .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-tm .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-tm .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-tm .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-tm .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-tm .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-tm .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-tm .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-tm .ace_meta.ace_tag {\ +color:rgb(0, 22, 142);\ +}\ +.ace-tm .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-tm .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-tm.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-tm .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-tm .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-tm .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-tm .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-tm .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-tm .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-tm .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); + +ace.define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace","ace/theme/textmate"], function(require, exports, module) { +"use strict"; + +var event = require("../lib/event"); +var UA = require("../lib/useragent"); +var net = require("../lib/net"); +var ace = require("../ace"); + +require("../theme/textmate"); + +module.exports = exports = ace; +var getCSSProperty = function(element, container, property) { + var ret = element.style[property]; + + if (!ret) { + if (window.getComputedStyle) { + ret = window.getComputedStyle(element, '').getPropertyValue(property); + } else { + ret = element.currentStyle[property]; + } + } + + if (!ret || ret == 'auto' || ret == 'intrinsic') { + ret = container.style[property]; + } + return ret; +}; + +function applyStyles(elm, styles) { + for (var style in styles) { + elm.style[style] = styles[style]; + } +} + +function setupContainer(element, getValue) { + if (element.type != 'textarea') { + throw new Error("Textarea required!"); + } + + var parentNode = element.parentNode; + var container = document.createElement('div'); + var resizeEvent = function() { + var style = 'position:relative;'; + [ + 'margin-top', 'margin-left', 'margin-right', 'margin-bottom' + ].forEach(function(item) { + style += item + ':' + + getCSSProperty(element, container, item) + ';'; + }); + var width = getCSSProperty(element, container, 'width') || (element.clientWidth + "px"); + var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px"); + style += 'height:' + height + ';width:' + width + ';'; + style += 'display:inline-block;'; + container.setAttribute('style', style); + }; + event.addListener(window, 'resize', resizeEvent); + resizeEvent(); + parentNode.insertBefore(container, element.nextSibling); + while (parentNode !== document) { + if (parentNode.tagName.toUpperCase() === 'FORM') { + var oldSumit = parentNode.onsubmit; + parentNode.onsubmit = function(evt) { + element.value = getValue(); + if (oldSumit) { + oldSumit.call(this, evt); + } + }; + break; + } + parentNode = parentNode.parentNode; + } + return container; +} + +exports.transformTextarea = function(element, options) { + var session; + var container = setupContainer(element, function() { + return session.getValue(); + }); + element.style.display = 'none'; + container.style.background = 'white'; + var editorDiv = document.createElement("div"); + applyStyles(editorDiv, { + top: "0px", + left: "0px", + right: "0px", + bottom: "0px", + border: "1px solid gray", + position: "absolute" + }); + container.appendChild(editorDiv); + + var settingOpener = document.createElement("div"); + applyStyles(settingOpener, { + position: "absolute", + right: "0px", + bottom: "0px", + background: "red", + cursor: "nw-resize", + borderStyle: "solid", + borderWidth: "9px 8px 10px 9px", + width: "2px", + borderColor: "lightblue gray gray lightblue", + zIndex: 101 + }); + + var settingDiv = document.createElement("div"); + var settingDivStyles = { + top: "0px", + left: "20%", + right: "0px", + bottom: "0px", + position: "absolute", + padding: "5px", + zIndex: 100, + color: "white", + display: "none", + overflow: "auto", + fontSize: "14px", + boxShadow: "-5px 2px 3px gray" + }; + if (!UA.isOldIE) { + settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)"; + } else { + settingDivStyles.backgroundColor = "#333"; + } + + applyStyles(settingDiv, settingDivStyles); + container.appendChild(settingDiv); + + options = options || exports.defaultOptions; + var editor = ace.edit(editorDiv); + session = editor.getSession(); + + session.setValue(element.value || element.innerHTML); + editor.focus(); + container.appendChild(settingOpener); + setupApi(editor, editorDiv, settingDiv, ace, options, load); + setupSettingPanel(settingDiv, settingOpener, editor); + + var state = ""; + event.addListener(settingOpener, "mousemove", function(e) { + var rect = this.getBoundingClientRect(); + var x = e.clientX - rect.left, y = e.clientY - rect.top; + if (x + y < (rect.width + rect.height)/2) { + this.style.cursor = "pointer"; + state = "toggle"; + } else { + state = "resize"; + this.style.cursor = "nw-resize"; + } + }); + + event.addListener(settingOpener, "mousedown", function(e) { + if (state == "toggle") { + editor.setDisplaySettings(); + return; + } + container.style.zIndex = 100000; + var rect = container.getBoundingClientRect(); + var startX = rect.width + rect.left - e.clientX; + var startY = rect.height + rect.top - e.clientY; + event.capture(settingOpener, function(e) { + container.style.width = e.clientX - rect.left + startX + "px"; + container.style.height = e.clientY - rect.top + startY + "px"; + editor.resize(); + }, function() {}); + }); + + return editor; +}; + +function load(url, module, callback) { + net.loadScript(url, function() { + require([module], callback); + }); +} + +function setupApi(editor, editorDiv, settingDiv, ace, options, loader) { + var session = editor.getSession(); + var renderer = editor.renderer; + loader = loader || load; + + function toBool(value) { + return value === "true" || value == true; + } + + editor.setDisplaySettings = function(display) { + if (display == null) + display = settingDiv.style.display == "none"; + if (display) { + settingDiv.style.display = "block"; + settingDiv.hideButton.focus(); + editor.on("focus", function onFocus() { + editor.removeListener("focus", onFocus); + settingDiv.style.display = "none"; + }); + } else { + editor.focus(); + } + }; + + editor.$setOption = editor.setOption; + editor.$getOption = editor.getOption; + editor.setOption = function(key, value) { + switch (key) { + case "mode": + editor.$setOption("mode", "ace/mode/" + value) + break; + case "theme": + editor.$setOption("theme", "ace/theme/" + value) + break; + case "keybindings": + switch (value) { + case "vim": + editor.setKeyboardHandler("ace/keyboard/vim"); + break; + case "emacs": + editor.setKeyboardHandler("ace/keyboard/emacs"); + break; + default: + editor.setKeyboardHandler(null); + } + break; + + case "softWrap": + case "fontSize": + editor.$setOption(key, value); + break; + + default: + editor.$setOption(key, toBool(value)); + } + }; + + editor.getOption = function(key) { + switch (key) { + case "mode": + return editor.$getOption("mode").substr("ace/mode/".length) + break; + + case "theme": + return editor.$getOption("theme").substr("ace/theme/".length) + break; + + case "keybindings": + var value = editor.getKeyboardHandler() + switch (value && value.$id) { + case "ace/keyboard/vim": + return "vim"; + case "ace/keyboard/emacs": + return "emacs"; + default: + return "ace"; + } + break; + + default: + return editor.$getOption(key); + } + }; + + editor.setOptions(options); + return editor; +} + +function setupSettingPanel(settingDiv, settingOpener, editor) { + var BOOL = null; + + var desc = { + mode: "Mode:", + wrap: "Soft Wrap:", + theme: "Theme:", + fontSize: "Font Size:", + showGutter: "Display Gutter:", + keybindings: "Keyboard", + showPrintMargin: "Show Print Margin:", + useSoftTabs: "Use Soft Tabs:", + showInvisibles: "Show Invisibles" + }; + + var optionValues = { + mode: { + text: "Plain", + javascript: "JavaScript", + xml: "XML", + html: "HTML", + css: "CSS", + scss: "SCSS", + python: "Python", + php: "PHP", + java: "Java", + ruby: "Ruby", + c_cpp: "C/C++", + coffee: "CoffeeScript", + json: "json", + perl: "Perl", + clojure: "Clojure", + ocaml: "OCaml", + csharp: "C#", + haxe: "haXe", + svg: "SVG", + textile: "Textile", + groovy: "Groovy", + liquid: "Liquid", + Scala: "Scala" + }, + theme: { + clouds: "Clouds", + clouds_midnight: "Clouds Midnight", + cobalt: "Cobalt", + crimson_editor: "Crimson Editor", + dawn: "Dawn", + gob: "Green on Black", + eclipse: "Eclipse", + idle_fingers: "Idle Fingers", + kr_theme: "Kr Theme", + merbivore: "Merbivore", + merbivore_soft: "Merbivore Soft", + mono_industrial: "Mono Industrial", + monokai: "Monokai", + pastel_on_dark: "Pastel On Dark", + solarized_dark: "Solarized Dark", + solarized_light: "Solarized Light", + textmate: "Textmate", + twilight: "Twilight", + vibrant_ink: "Vibrant Ink" + }, + showGutter: BOOL, + fontSize: { + "10px": "10px", + "11px": "11px", + "12px": "12px", + "14px": "14px", + "16px": "16px" + }, + wrap: { + off: "Off", + 40: "40", + 80: "80", + free: "Free" + }, + keybindings: { + ace: "ace", + vim: "vim", + emacs: "emacs" + }, + showPrintMargin: BOOL, + useSoftTabs: BOOL, + showInvisibles: BOOL + }; + + var table = []; + table.push(""); + + function renderOption(builder, option, obj, cValue) { + if (!obj) { + builder.push( + "" + ); + return; + } + builder.push(""); + } + + for (var option in exports.defaultOptions) { + table.push(""); + table.push(""); + } + table.push("
      SettingValue
      ", desc[option], ""); + renderOption(table, option, optionValues[option], editor.getOption(option)); + table.push("
      "); + settingDiv.innerHTML = table.join(""); + + var onChange = function(e) { + var select = e.currentTarget; + editor.setOption(select.title, select.value); + }; + var onClick = function(e) { + var cb = e.currentTarget; + editor.setOption(cb.title, cb.checked); + }; + var selects = settingDiv.getElementsByTagName("select"); + for (var i = 0; i < selects.length; i++) + selects[i].onchange = onChange; + var cbs = settingDiv.getElementsByTagName("input"); + for (var i = 0; i < cbs.length; i++) + cbs[i].onclick = onClick; + + + var button = document.createElement("input"); + button.type = "button"; + button.value = "Hide"; + event.addListener(button, "click", function() { + editor.setDisplaySettings(false); + }); + settingDiv.appendChild(button); + settingDiv.hideButton = button; +} +exports.defaultOptions = { + mode: "javascript", + theme: "textmate", + wrap: "off", + fontSize: "12px", + showGutter: "false", + keybindings: "ace", + showPrintMargin: "false", + useSoftTabs: "true", + showInvisibles: "false" +}; + +}); + (function() { + ace.require(["ace/ext/textarea"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-themelist.js b/src/libs/ace/ext-themelist.js new file mode 100755 index 0000000..53225ad --- /dev/null +++ b/src/libs/ace/ext-themelist.js @@ -0,0 +1,62 @@ +ace.define("ace/ext/themelist",["require","exports","module","ace/lib/fixoldbrowsers"], function(require, exports, module) { +"use strict"; +require("ace/lib/fixoldbrowsers"); + +var themeData = [ + ["Chrome" ], + ["Clouds" ], + ["Crimson Editor" ], + ["Dawn" ], + ["Dreamweaver" ], + ["Eclipse" ], + ["GitHub" ], + ["IPlastic" ], + ["Solarized Light"], + ["TextMate" ], + ["Tomorrow" ], + ["XCode" ], + ["Kuroir"], + ["KatzenMilch"], + ["SQL Server" ,"sqlserver" , "light"], + ["Ambiance" ,"ambiance" , "dark"], + ["Chaos" ,"chaos" , "dark"], + ["Clouds Midnight" ,"clouds_midnight" , "dark"], + ["Cobalt" ,"cobalt" , "dark"], + ["Gruvbox" ,"gruvbox" , "dark"], + ["Green on Black" ,"gob" , "dark"], + ["idle Fingers" ,"idle_fingers" , "dark"], + ["krTheme" ,"kr_theme" , "dark"], + ["Merbivore" ,"merbivore" , "dark"], + ["Merbivore Soft" ,"merbivore_soft" , "dark"], + ["Mono Industrial" ,"mono_industrial" , "dark"], + ["Monokai" ,"monokai" , "dark"], + ["Pastel on dark" ,"pastel_on_dark" , "dark"], + ["Solarized Dark" ,"solarized_dark" , "dark"], + ["Terminal" ,"terminal" , "dark"], + ["Tomorrow Night" ,"tomorrow_night" , "dark"], + ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], + ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], + ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], + ["Twilight" ,"twilight" , "dark"], + ["Vibrant Ink" ,"vibrant_ink" , "dark"] +]; + + +exports.themesByName = {}; +exports.themes = themeData.map(function(data) { + var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); + var theme = { + caption: data[0], + theme: "ace/theme/" + name, + isDark: data[2] == "dark", + name: name + }; + exports.themesByName[name] = theme; + return theme; +}); + +}); + (function() { + ace.require(["ace/ext/themelist"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/ext-whitespace.js b/src/libs/ace/ext-whitespace.js new file mode 100755 index 0000000..8f4af96 --- /dev/null +++ b/src/libs/ace/ext-whitespace.js @@ -0,0 +1,206 @@ +ace.define("ace/ext/whitespace",["require","exports","module","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); +exports.$detectIndentation = function(lines, fallback) { + var stats = []; + var changes = []; + var tabIndents = 0; + var prevSpaces = 0; + var max = Math.min(lines.length, 1000); + for (var i = 0; i < max; i++) { + var line = lines[i]; + if (!/^\s*[^*+\-\s]/.test(line)) + continue; + + if (line[0] == "\t") { + tabIndents++; + prevSpaces = -Number.MAX_VALUE; + } else { + var spaces = line.match(/^ */)[0].length; + if (spaces && line[spaces] != "\t") { + var diff = spaces - prevSpaces; + if (diff > 0 && !(prevSpaces%diff) && !(spaces%diff)) + changes[diff] = (changes[diff] || 0) + 1; + + stats[spaces] = (stats[spaces] || 0) + 1; + } + prevSpaces = spaces; + } + while (i < max && line[line.length - 1] == "\\") + line = lines[i++]; + } + + function getScore(indent) { + var score = 0; + for (var i = indent; i < stats.length; i += indent) + score += stats[i] || 0; + return score; + } + + var changesTotal = changes.reduce(function(a,b){return a+b}, 0); + + var first = {score: 0, length: 0}; + var spaceIndents = 0; + for (var i = 1; i < 12; i++) { + var score = getScore(i); + if (i == 1) { + spaceIndents = score; + score = stats[1] ? 0.9 : 0.8; + if (!stats.length) + score = 0; + } else + score /= spaceIndents; + + if (changes[i]) + score += changes[i] / changesTotal; + + if (score > first.score) + first = {score: score, length: i}; + } + + if (first.score && first.score > 1.4) + var tabLength = first.length; + + if (tabIndents > spaceIndents + 1) { + if (tabLength == 1 || spaceIndents < tabIndents / 4 || first.score < 1.8) + tabLength = undefined; + return {ch: "\t", length: tabLength}; + } + if (spaceIndents > tabIndents + 1) + return {ch: " ", length: tabLength}; +}; + +exports.detectIndentation = function(session) { + var lines = session.getLines(0, 1000); + var indent = exports.$detectIndentation(lines) || {}; + + if (indent.ch) + session.setUseSoftTabs(indent.ch == " "); + + if (indent.length) + session.setTabSize(indent.length); + return indent; +}; +exports.trimTrailingSpace = function(session, options) { + var doc = session.getDocument(); + var lines = doc.getAllLines(); + + var min = options && options.trimEmpty ? -1 : 0; + var cursors = [], ci = -1; + if (options && options.keepCursorPosition) { + if (session.selection.rangeCount) { + session.selection.rangeList.ranges.forEach(function(x, i, ranges) { + var next = ranges[i + 1]; + if (next && next.cursor.row == x.cursor.row) + return; + cursors.push(x.cursor); + }); + } else { + cursors.push(session.selection.getCursor()); + } + ci = 0; + } + var cursorRow = cursors[ci] && cursors[ci].row; + + for (var i = 0, l=lines.length; i < l; i++) { + var line = lines[i]; + var index = line.search(/\s+$/); + + if (i == cursorRow) { + if (index < cursors[ci].column && index > min) + index = cursors[ci].column; + ci++; + cursorRow = cursors[ci] ? cursors[ci].row : -1; + } + + if (index > min) + doc.removeInLine(i, index, line.length); + } +}; + +exports.convertIndentation = function(session, ch, len) { + var oldCh = session.getTabString()[0]; + var oldLen = session.getTabSize(); + if (!len) len = oldLen; + if (!ch) ch = oldCh; + + var tab = ch == "\t" ? ch: lang.stringRepeat(ch, len); + + var doc = session.doc; + var lines = doc.getAllLines(); + + var cache = {}; + var spaceCache = {}; + for (var i = 0, l=lines.length; i < l; i++) { + var line = lines[i]; + var match = line.match(/^\s*/)[0]; + if (match) { + var w = session.$getStringScreenWidth(match)[0]; + var tabCount = Math.floor(w/oldLen); + var reminder = w%oldLen; + var toInsert = cache[tabCount] || (cache[tabCount] = lang.stringRepeat(tab, tabCount)); + toInsert += spaceCache[reminder] || (spaceCache[reminder] = lang.stringRepeat(" ", reminder)); + + if (toInsert != match) { + doc.removeInLine(i, 0, match.length); + doc.insertInLine({row: i, column: 0}, toInsert); + } + } + } + session.setTabSize(len); + session.setUseSoftTabs(ch == " "); +}; + +exports.$parseStringArg = function(text) { + var indent = {}; + if (/t/.test(text)) + indent.ch = "\t"; + else if (/s/.test(text)) + indent.ch = " "; + var m = text.match(/\d+/); + if (m) + indent.length = parseInt(m[0], 10); + return indent; +}; + +exports.$parseArg = function(arg) { + if (!arg) + return {}; + if (typeof arg == "string") + return exports.$parseStringArg(arg); + if (typeof arg.text == "string") + return exports.$parseStringArg(arg.text); + return arg; +}; + +exports.commands = [{ + name: "detectIndentation", + exec: function(editor) { + exports.detectIndentation(editor.session); + } +}, { + name: "trimTrailingSpace", + exec: function(editor) { + exports.trimTrailingSpace(editor.session); + } +}, { + name: "convertIndentation", + exec: function(editor, arg) { + var indent = exports.$parseArg(arg); + exports.convertIndentation(editor.session, indent.ch, indent.length); + } +}, { + name: "setIndentation", + exec: function(editor, arg) { + var indent = exports.$parseArg(arg); + indent.length && editor.session.setTabSize(indent.length); + indent.ch && editor.session.setUseSoftTabs(indent.ch == " "); + } +}]; + +}); + (function() { + ace.require(["ace/ext/whitespace"], function() {}); + })(); + \ No newline at end of file diff --git a/src/libs/ace/keybinding-emacs.js b/src/libs/ace/keybinding-emacs.js new file mode 100755 index 0000000..a6cb038 --- /dev/null +++ b/src/libs/ace/keybinding-emacs.js @@ -0,0 +1,1181 @@ +ace.define("ace/occur",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = require("./search").Search; +var EditSession = require("./edit_session").EditSession; +var SearchHighlight = require("./search_highlight").SearchHighlight; +function Occur() {} + +oop.inherits(Occur, Search); + +(function() { + this.enter = function(editor, options) { + if (!options.needle) return false; + var pos = editor.getCursorPosition(); + this.displayOccurContent(editor, options); + var translatedPos = this.originalToOccurPosition(editor.session, pos); + editor.moveCursorToPosition(translatedPos); + return true; + } + this.exit = function(editor, options) { + var pos = options.translatePosition && editor.getCursorPosition(); + var translatedPos = pos && this.occurToOriginalPosition(editor.session, pos); + this.displayOriginalContent(editor); + if (translatedPos) + editor.moveCursorToPosition(translatedPos); + return true; + } + + this.highlight = function(sess, regexp) { + var hl = sess.$occurHighlight = sess.$occurHighlight || sess.addDynamicMarker( + new SearchHighlight(null, "ace_occur-highlight", "text")); + hl.setRegexp(regexp); + sess._emit("changeBackMarker"); // force highlight layer redraw + } + + this.displayOccurContent = function(editor, options) { + this.$originalSession = editor.session; + var found = this.matchingLines(editor.session, options); + var lines = found.map(function(foundLine) { return foundLine.content; }); + var occurSession = new EditSession(lines.join('\n')); + occurSession.$occur = this; + occurSession.$occurMatchingLines = found; + editor.setSession(occurSession); + this.$useEmacsStyleLineStart = this.$originalSession.$useEmacsStyleLineStart; + occurSession.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart; + this.highlight(occurSession, options.re); + occurSession._emit('changeBackMarker'); + } + + this.displayOriginalContent = function(editor) { + editor.setSession(this.$originalSession); + this.$originalSession.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart; + } + this.originalToOccurPosition = function(session, pos) { + var lines = session.$occurMatchingLines; + var nullPos = {row: 0, column: 0}; + if (!lines) return nullPos; + for (var i = 0; i < lines.length; i++) { + if (lines[i].row === pos.row) + return {row: i, column: pos.column}; + } + return nullPos; + } + this.occurToOriginalPosition = function(session, pos) { + var lines = session.$occurMatchingLines; + if (!lines || !lines[pos.row]) + return pos; + return {row: lines[pos.row].row, column: pos.column}; + } + + this.matchingLines = function(session, options) { + options = oop.mixin({}, options); + if (!session || !options.needle) return []; + var search = new Search(); + search.set(options); + return search.findAll(session).reduce(function(lines, range) { + var row = range.start.row; + var last = lines[lines.length-1]; + return last && last.row === row ? + lines : + lines.concat({row: row, content: session.getLine(row)}); + }, []); + } + +}).call(Occur.prototype); + +var dom = require('./lib/dom'); +dom.importCssString(".ace_occur-highlight {\n\ + border-radius: 4px;\n\ + background-color: rgba(87, 255, 8, 0.25);\n\ + position: absolute;\n\ + z-index: 4;\n\ + -moz-box-sizing: border-box;\n\ + -webkit-box-sizing: border-box;\n\ + box-sizing: border-box;\n\ + box-shadow: 0 0 4px rgb(91, 255, 50);\n\ +}\n\ +.ace_dark .ace_occur-highlight {\n\ + background-color: rgb(80, 140, 85);\n\ + box-shadow: 0 0 4px rgb(60, 120, 70);\n\ +}\n", "incremental-occur-highlighting"); + +exports.Occur = Occur; + +}); + +ace.define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"], function(require, exports, module) { + +var config = require("../config"), + Occur = require("../occur").Occur; +var occurStartCommand = { + name: "occur", + exec: function(editor, options) { + var alreadyInOccur = !!editor.session.$occur; + var occurSessionActive = new Occur().enter(editor, options); + if (occurSessionActive && !alreadyInOccur) + OccurKeyboardHandler.installIn(editor); + }, + readOnly: true +}; + +var occurCommands = [{ + name: "occurexit", + bindKey: 'esc|Ctrl-G', + exec: function(editor) { + var occur = editor.session.$occur; + if (!occur) return; + occur.exit(editor, {}); + if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true +}, { + name: "occuraccept", + bindKey: 'enter', + exec: function(editor) { + var occur = editor.session.$occur; + if (!occur) return; + occur.exit(editor, {translatePosition: true}); + if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true +}]; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var oop = require("../lib/oop"); + + +function OccurKeyboardHandler() {} + +oop.inherits(OccurKeyboardHandler, HashHandler); + +(function() { + + this.isOccurHandler = true; + + this.attach = function(editor) { + HashHandler.call(this, occurCommands, editor.commands.platform); + this.$editor = editor; + } + + var handleKeyboard$super = this.handleKeyboard; + this.handleKeyboard = function(data, hashId, key, keyCode) { + var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); + return (cmd && cmd.command) ? cmd : undefined; + } + +}).call(OccurKeyboardHandler.prototype); + +OccurKeyboardHandler.installIn = function(editor) { + var handler = new this(); + editor.keyBinding.addKeyboardHandler(handler); + editor.commands.addCommands(occurCommands); +} + +OccurKeyboardHandler.uninstallFrom = function(editor) { + editor.commands.removeCommands(occurCommands); + var handler = editor.getKeyboardHandler(); + if (handler.isOccurHandler) + editor.keyBinding.removeKeyboardHandler(handler); +} + +exports.occurStartCommand = occurStartCommand; + +}); + +ace.define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"], function(require, exports, module) { + +var config = require("../config"); +var oop = require("../lib/oop"); +var HashHandler = require("../keyboard/hash_handler").HashHandler; +var occurStartCommand = require("./occur_commands").occurStartCommand; +exports.iSearchStartCommands = [{ + name: "iSearch", + bindKey: {win: "Ctrl-F", mac: "Command-F"}, + exec: function(editor, options) { + config.loadModule(["core", "ace/incremental_search"], function(e) { + var iSearch = e.iSearch = e.iSearch || new e.IncrementalSearch(); + iSearch.activate(editor, options.backwards); + if (options.jumpToFirstMatch) iSearch.next(options); + }); + }, + readOnly: true +}, { + name: "iSearchBackwards", + exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {backwards: true}); }, + readOnly: true +}, { + name: "iSearchAndGo", + bindKey: {win: "Ctrl-K", mac: "Command-G"}, + exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {jumpToFirstMatch: true, useCurrentOrPrevSearch: true}); }, + readOnly: true +}, { + name: "iSearchBackwardsAndGo", + bindKey: {win: "Ctrl-Shift-K", mac: "Command-Shift-G"}, + exec: function(editor) { editor.execCommand('iSearch', {jumpToFirstMatch: true, backwards: true, useCurrentOrPrevSearch: true}); }, + readOnly: true +}]; +exports.iSearchCommands = [{ + name: "restartSearch", + bindKey: {win: "Ctrl-F", mac: "Command-F"}, + exec: function(iSearch) { + iSearch.cancelSearch(true); + } +}, { + name: "searchForward", + bindKey: {win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G"}, + exec: function(iSearch, options) { + options.useCurrentOrPrevSearch = true; + iSearch.next(options); + } +}, { + name: "searchBackward", + bindKey: {win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G"}, + exec: function(iSearch, options) { + options.useCurrentOrPrevSearch = true; + options.backwards = true; + iSearch.next(options); + } +}, { + name: "extendSearchTerm", + exec: function(iSearch, string) { + iSearch.addString(string); + } +}, { + name: "extendSearchTermSpace", + bindKey: "space", + exec: function(iSearch) { iSearch.addString(' '); } +}, { + name: "shrinkSearchTerm", + bindKey: "backspace", + exec: function(iSearch) { + iSearch.removeChar(); + } +}, { + name: 'confirmSearch', + bindKey: 'return', + exec: function(iSearch) { iSearch.deactivate(); } +}, { + name: 'cancelSearch', + bindKey: 'esc|Ctrl-G', + exec: function(iSearch) { iSearch.deactivate(true); } +}, { + name: 'occurisearch', + bindKey: 'Ctrl-O', + exec: function(iSearch) { + var options = oop.mixin({}, iSearch.$options); + iSearch.deactivate(); + occurStartCommand.exec(iSearch.$editor, options); + } +}, { + name: "yankNextWord", + bindKey: "Ctrl-w", + exec: function(iSearch) { + var ed = iSearch.$editor, + range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorWordRight(); }), + string = ed.session.getTextRange(range); + iSearch.addString(string); + } +}, { + name: "yankNextChar", + bindKey: "Ctrl-Alt-y", + exec: function(iSearch) { + var ed = iSearch.$editor, + range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorRight(); }), + string = ed.session.getTextRange(range); + iSearch.addString(string); + } +}, { + name: 'recenterTopBottom', + bindKey: 'Ctrl-l', + exec: function(iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); } +}, { + name: 'selectAllMatches', + bindKey: 'Ctrl-space', + exec: function(iSearch) { + var ed = iSearch.$editor, + hl = ed.session.$isearchHighlight, + ranges = hl && hl.cache ? hl.cache + .reduce(function(ranges, ea) { + return ranges.concat(ea ? ea : []); }, []) : []; + iSearch.deactivate(false); + ranges.forEach(ed.selection.addRange.bind(ed.selection)); + } +}, { + name: 'searchAsRegExp', + bindKey: 'Alt-r', + exec: function(iSearch) { + iSearch.convertNeedleToRegExp(); + } +}].map(function(cmd) { + cmd.readOnly = true; + cmd.isIncrementalSearchCommand = true; + cmd.scrollIntoView = "animate-cursor"; + return cmd; +}); + +function IncrementalSearchKeyboardHandler(iSearch) { + this.$iSearch = iSearch; +} + +oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); + +(function() { + + this.attach = function(editor) { + var iSearch = this.$iSearch; + HashHandler.call(this, exports.iSearchCommands, editor.commands.platform); + this.$commandExecHandler = editor.commands.addEventListener('exec', function(e) { + if (!e.command.isIncrementalSearchCommand) + return iSearch.deactivate(); + e.stopPropagation(); + e.preventDefault(); + var scrollTop = editor.session.getScrollTop(); + var result = e.command.exec(iSearch, e.args || {}); + editor.renderer.scrollCursorIntoView(null, 0.5); + editor.renderer.animateScrolling(scrollTop); + return result; + }); + }; + + this.detach = function(editor) { + if (!this.$commandExecHandler) return; + editor.commands.removeEventListener('exec', this.$commandExecHandler); + delete this.$commandExecHandler; + }; + + var handleKeyboard$super = this.handleKeyboard; + this.handleKeyboard = function(data, hashId, key, keyCode) { + if (((hashId === 1/*ctrl*/ || hashId === 8/*command*/) && key === 'v') + || (hashId === 1/*ctrl*/ && key === 'y')) return null; + var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); + if (cmd.command) { return cmd; } + if (hashId == -1) { + var extendCmd = this.commands.extendSearchTerm; + if (extendCmd) { return {command: extendCmd, args: key}; } + } + return false; + }; + +}).call(IncrementalSearchKeyboardHandler.prototype); + + +exports.IncrementalSearchKeyboardHandler = IncrementalSearchKeyboardHandler; + +}); + +ace.define("ace/incremental_search",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = require("./search").Search; +var SearchHighlight = require("./search_highlight").SearchHighlight; +var iSearchCommandModule = require("./commands/incremental_search_commands"); +var ISearchKbd = iSearchCommandModule.IncrementalSearchKeyboardHandler; +function IncrementalSearch() { + this.$options = {wrap: false, skipCurrent: false}; + this.$keyboardHandler = new ISearchKbd(this); +} + +oop.inherits(IncrementalSearch, Search); + +function isRegExp(obj) { + return obj instanceof RegExp; +} + +function regExpToObject(re) { + var string = String(re), + start = string.indexOf('/'), + flagStart = string.lastIndexOf('/'); + return { + expression: string.slice(start+1, flagStart), + flags: string.slice(flagStart+1) + } +} + +function stringToRegExp(string, flags) { + try { + return new RegExp(string, flags); + } catch (e) { return string; } +} + +function objectToRegExp(obj) { + return stringToRegExp(obj.expression, obj.flags); +} + +(function() { + + this.activate = function(ed, backwards) { + this.$editor = ed; + this.$startPos = this.$currentPos = ed.getCursorPosition(); + this.$options.needle = ''; + this.$options.backwards = backwards; + ed.keyBinding.addKeyboardHandler(this.$keyboardHandler); + this.$originalEditorOnPaste = ed.onPaste; ed.onPaste = this.onPaste.bind(this); + this.$mousedownHandler = ed.addEventListener('mousedown', this.onMouseDown.bind(this)); + this.selectionFix(ed); + this.statusMessage(true); + }; + + this.deactivate = function(reset) { + this.cancelSearch(reset); + var ed = this.$editor; + ed.keyBinding.removeKeyboardHandler(this.$keyboardHandler); + if (this.$mousedownHandler) { + ed.removeEventListener('mousedown', this.$mousedownHandler); + delete this.$mousedownHandler; + } + ed.onPaste = this.$originalEditorOnPaste; + this.message(''); + }; + + this.selectionFix = function(editor) { + if (editor.selection.isEmpty() && !editor.session.$emacsMark) { + editor.clearSelection(); + } + }; + + this.highlight = function(regexp) { + var sess = this.$editor.session, + hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker( + new SearchHighlight(null, "ace_isearch-result", "text")); + hl.setRegexp(regexp); + sess._emit("changeBackMarker"); // force highlight layer redraw + }; + + this.cancelSearch = function(reset) { + var e = this.$editor; + this.$prevNeedle = this.$options.needle; + this.$options.needle = ''; + if (reset) { + e.moveCursorToPosition(this.$startPos); + this.$currentPos = this.$startPos; + } else { + e.pushEmacsMark && e.pushEmacsMark(this.$startPos, false); + } + this.highlight(null); + return Range.fromPoints(this.$currentPos, this.$currentPos); + }; + + this.highlightAndFindWithNeedle = function(moveToNext, needleUpdateFunc) { + if (!this.$editor) return null; + var options = this.$options; + if (needleUpdateFunc) { + options.needle = needleUpdateFunc.call(this, options.needle || '') || ''; + } + if (options.needle.length === 0) { + this.statusMessage(true); + return this.cancelSearch(true); + } + options.start = this.$currentPos; + var session = this.$editor.session, + found = this.find(session), + shouldSelect = this.$editor.emacsMark ? + !!this.$editor.emacsMark() : !this.$editor.selection.isEmpty(); + if (found) { + if (options.backwards) found = Range.fromPoints(found.end, found.start); + this.$editor.selection.setRange(Range.fromPoints(shouldSelect ? this.$startPos : found.end, found.end)); + if (moveToNext) this.$currentPos = found.end; + this.highlight(options.re); + } + + this.statusMessage(found); + + return found; + }; + + this.addString = function(s) { + return this.highlightAndFindWithNeedle(false, function(needle) { + if (!isRegExp(needle)) + return needle + s; + var reObj = regExpToObject(needle); + reObj.expression += s; + return objectToRegExp(reObj); + }); + }; + + this.removeChar = function(c) { + return this.highlightAndFindWithNeedle(false, function(needle) { + if (!isRegExp(needle)) + return needle.substring(0, needle.length-1); + var reObj = regExpToObject(needle); + reObj.expression = reObj.expression.substring(0, reObj.expression.length-1); + return objectToRegExp(reObj); + }); + }; + + this.next = function(options) { + options = options || {}; + this.$options.backwards = !!options.backwards; + this.$currentPos = this.$editor.getCursorPosition(); + return this.highlightAndFindWithNeedle(true, function(needle) { + return options.useCurrentOrPrevSearch && needle.length === 0 ? + this.$prevNeedle || '' : needle; + }); + }; + + this.onMouseDown = function(evt) { + this.deactivate(); + return true; + }; + + this.onPaste = function(text) { + this.addString(text); + }; + + this.convertNeedleToRegExp = function() { + return this.highlightAndFindWithNeedle(false, function(needle) { + return isRegExp(needle) ? needle : stringToRegExp(needle, 'ig'); + }); + }; + + this.convertNeedleToString = function() { + return this.highlightAndFindWithNeedle(false, function(needle) { + return isRegExp(needle) ? regExpToObject(needle).expression : needle; + }); + }; + + this.statusMessage = function(found) { + var options = this.$options, msg = ''; + msg += options.backwards ? 'reverse-' : ''; + msg += 'isearch: ' + options.needle; + msg += found ? '' : ' (not found)'; + this.message(msg); + }; + + this.message = function(msg) { + if (this.$editor.showCommandLine) { + this.$editor.showCommandLine(msg); + this.$editor.focus(); + } else { + console.log(msg); + } + }; + +}).call(IncrementalSearch.prototype); + + +exports.IncrementalSearch = IncrementalSearch; + +var dom = require('./lib/dom'); +dom.importCssString && dom.importCssString("\ +.ace_marker-layer .ace_isearch-result {\ + position: absolute;\ + z-index: 6;\ + -moz-box-sizing: border-box;\ + -webkit-box-sizing: border-box;\ + box-sizing: border-box;\ +}\ +div.ace_isearch-result {\ + border-radius: 4px;\ + background-color: rgba(255, 200, 0, 0.5);\ + box-shadow: 0 0 4px rgb(255, 200, 0);\ +}\ +.ace_dark div.ace_isearch-result {\ + background-color: rgb(100, 110, 160);\ + box-shadow: 0 0 4px rgb(80, 90, 140);\ +}", "incremental-search-highlighting"); +var commands = require("./commands/command_manager"); +(function() { + this.setupIncrementalSearch = function(editor, val) { + if (this.usesIncrementalSearch == val) return; + this.usesIncrementalSearch = val; + var iSearchCommands = iSearchCommandModule.iSearchStartCommands; + var method = val ? 'addCommands' : 'removeCommands'; + this[method](iSearchCommands); + }; +}).call(commands.CommandManager.prototype); +var Editor = require("./editor").Editor; +require("./config").defineOptions(Editor.prototype, "editor", { + useIncrementalSearch: { + set: function(val) { + this.keyBinding.$handlers.forEach(function(handler) { + if (handler.setupIncrementalSearch) { + handler.setupIncrementalSearch(this, val); + } + }); + this._emit('incrementalSearchSettingChanged', {isEnabled: val}); + } + } +}); + +}); + +ace.define("ace/keyboard/emacs",["require","exports","module","ace/lib/dom","ace/incremental_search","ace/commands/incremental_search_commands","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +require("../incremental_search"); +var iSearchCommandModule = require("../commands/incremental_search_commands"); + + +var screenToTextBlockCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var col = Math.floor( + (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth + ); + var row = Math.floor( + (y + this.scrollTop - canvasPos.top) / this.lineHeight + ); + + return this.session.screenToDocumentPosition(row, col); +}; + +var HashHandler = require("./hash_handler").HashHandler; +exports.handler = new HashHandler(); + +exports.handler.isEmacs = true; +exports.handler.$id = "ace/keyboard/emacs"; + +var initialized = false; +var $formerLongWords; +var $formerLineStart; + +exports.handler.attach = function(editor) { + if (!initialized) { + initialized = true; + dom.importCssString('\ + .emacs-mode .ace_cursor{\ + border: 1px rgba(50,250,50,0.8) solid!important;\ + -moz-box-sizing: border-box!important;\ + -webkit-box-sizing: border-box!important;\ + box-sizing: border-box!important;\ + background-color: rgba(0,250,0,0.9);\ + opacity: 0.5;\ + }\ + .emacs-mode .ace_hidden-cursors .ace_cursor{\ + opacity: 1;\ + background-color: transparent;\ + }\ + .emacs-mode .ace_overwrite-cursors .ace_cursor {\ + opacity: 1;\ + background-color: transparent;\ + border-width: 0 0 2px 2px !important;\ + }\ + .emacs-mode .ace_text-layer {\ + z-index: 4\ + }\ + .emacs-mode .ace_cursor-layer {\ + z-index: 2\ + }', 'emacsMode' + ); + } + $formerLongWords = editor.session.$selectLongWords; + editor.session.$selectLongWords = true; + $formerLineStart = editor.session.$useEmacsStyleLineStart; + editor.session.$useEmacsStyleLineStart = true; + + editor.session.$emacsMark = null; // the active mark + editor.session.$emacsMarkRing = editor.session.$emacsMarkRing || []; + + editor.emacsMark = function() { + return this.session.$emacsMark; + }; + + editor.setEmacsMark = function(p) { + this.session.$emacsMark = p; + }; + + editor.pushEmacsMark = function(p, activate) { + var prevMark = this.session.$emacsMark; + if (prevMark) + this.session.$emacsMarkRing.push(prevMark); + if (!p || activate) this.setEmacsMark(p); + else this.session.$emacsMarkRing.push(p); + }; + + editor.popEmacsMark = function() { + var mark = this.emacsMark(); + if (mark) { this.setEmacsMark(null); return mark; } + return this.session.$emacsMarkRing.pop(); + }; + + editor.getLastEmacsMark = function(p) { + return this.session.$emacsMark || this.session.$emacsMarkRing.slice(-1)[0]; + }; + + editor.emacsMarkForSelection = function(replacement) { + var sel = this.selection, + multiRangeLength = this.multiSelect ? + this.multiSelect.getAllRanges().length : 1, + selIndex = sel.index || 0, + markRing = this.session.$emacsMarkRing, + markIndex = markRing.length - (multiRangeLength - selIndex), + lastMark = markRing[markIndex] || sel.anchor; + if (replacement) { + markRing.splice(markIndex, 1, + "row" in replacement && "column" in replacement ? + replacement : undefined); + } + return lastMark; + } + + editor.on("click", $resetMarkMode); + editor.on("changeSession", $kbSessionChange); + editor.renderer.screenToTextCoordinates = screenToTextBlockCoordinates; + editor.setStyle("emacs-mode"); + editor.commands.addCommands(commands); + exports.handler.platform = editor.commands.platform; + editor.$emacsModeHandler = this; + editor.addEventListener('copy', this.onCopy); + editor.addEventListener('paste', this.onPaste); +}; + +exports.handler.detach = function(editor) { + delete editor.renderer.screenToTextCoordinates; + editor.session.$selectLongWords = $formerLongWords; + editor.session.$useEmacsStyleLineStart = $formerLineStart; + editor.removeEventListener("click", $resetMarkMode); + editor.removeEventListener("changeSession", $kbSessionChange); + editor.unsetStyle("emacs-mode"); + editor.commands.removeCommands(commands); + editor.removeEventListener('copy', this.onCopy); + editor.removeEventListener('paste', this.onPaste); + editor.$emacsModeHandler = null; +}; + +var $kbSessionChange = function(e) { + if (e.oldSession) { + e.oldSession.$selectLongWords = $formerLongWords; + e.oldSession.$useEmacsStyleLineStart = $formerLineStart; + } + + $formerLongWords = e.session.$selectLongWords; + e.session.$selectLongWords = true; + $formerLineStart = e.session.$useEmacsStyleLineStart; + e.session.$useEmacsStyleLineStart = true; + + if (!e.session.hasOwnProperty('$emacsMark')) + e.session.$emacsMark = null; + if (!e.session.hasOwnProperty('$emacsMarkRing')) + e.session.$emacsMarkRing = []; +}; + +var $resetMarkMode = function(e) { + e.editor.session.$emacsMark = null; +}; + +var keys = require("../lib/keys").KEY_MODS; +var eMods = {C: "ctrl", S: "shift", M: "alt", CMD: "command"}; +var combinations = ["C-S-M-CMD", + "S-M-CMD", "C-M-CMD", "C-S-CMD", "C-S-M", + "M-CMD", "S-CMD", "S-M", "C-CMD", "C-M", "C-S", + "CMD", "M", "S", "C"]; +combinations.forEach(function(c) { + var hashId = 0; + c.split("-").forEach(function(c) { + hashId = hashId | keys[eMods[c]]; + }); + eMods[hashId] = c.toLowerCase() + "-"; +}); + +exports.handler.onCopy = function(e, editor) { + if (editor.$handlesEmacsOnCopy) return; + editor.$handlesEmacsOnCopy = true; + exports.handler.commands.killRingSave.exec(editor); + editor.$handlesEmacsOnCopy = false; +}; + +exports.handler.onPaste = function(e, editor) { + editor.pushEmacsMark(editor.getCursorPosition()); +}; + +exports.handler.bindKey = function(key, command) { + if (typeof key == "object") + key = key[this.platform]; + if (!key) + return; + + var ckb = this.commandKeyBinding; + key.split("|").forEach(function(keyPart) { + keyPart = keyPart.toLowerCase(); + ckb[keyPart] = command; + var keyParts = keyPart.split(" ").slice(0,-1); + keyParts.reduce(function(keyMapKeys, keyPart, i) { + var prefix = keyMapKeys[i-1] ? keyMapKeys[i-1] + ' ' : ''; + return keyMapKeys.concat([prefix + keyPart]); + }, []).forEach(function(keyPart) { + if (!ckb[keyPart]) ckb[keyPart] = "null"; + }); + }, this); +}; + +exports.handler.getStatusText = function(editor, data) { + var str = ""; + if (data.count) + str += data.count; + if (data.keyChain) + str += " " + data.keyChain + return str; +}; + +exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { + if (keyCode === -1) return undefined; + + var editor = data.editor; + editor._signal("changeStatus"); + if (hashId == -1) { + editor.pushEmacsMark(); + if (data.count) { + var str = new Array(data.count + 1).join(key); + data.count = null; + return {command: "insertstring", args: str}; + } + } + + var modifier = eMods[hashId]; + if (modifier == "c-" || data.count) { + var count = parseInt(key[key.length - 1]); + if (typeof count === 'number' && !isNaN(count)) { + data.count = Math.max(data.count, 0) || 0; + data.count = 10 * data.count + count; + return {command: "null"}; + } + } + if (modifier) key = modifier + key; + if (data.keyChain) key = data.keyChain += " " + key; + var command = this.commandKeyBinding[key]; + data.keyChain = command == "null" ? key : ""; + if (!command) return undefined; + if (command === "null") return {command: "null"}; + + if (command === "universalArgument") { + data.count = -4; + return {command: "null"}; + } + var args; + if (typeof command !== "string") { + args = command.args; + if (command.command) command = command.command; + if (command === "goorselect") { + command = editor.emacsMark() ? args[1] : args[0]; + args = null; + } + } + + if (typeof command === "string") { + if (command === "insertstring" || + command === "splitline" || + command === "togglecomment") { + editor.pushEmacsMark(); + } + command = this.commands[command] || editor.commands.commands[command]; + if (!command) return undefined; + } + + if (!command.readOnly && !command.isYank) + data.lastCommand = null; + + if (!command.readOnly && editor.emacsMark()) + editor.setEmacsMark(null) + + if (data.count) { + var count = data.count; + data.count = 0; + if (!command || !command.handlesCount) { + return { + args: args, + command: { + exec: function(editor, args) { + for (var i = 0; i < count; i++) + command.exec(editor, args); + }, + multiSelectAction: command.multiSelectAction + } + }; + } else { + if (!args) args = {}; + if (typeof args === 'object') args.count = count; + } + } + + return {command: command, args: args}; +}; + +exports.emacsKeys = { + "Up|C-p" : {command: "goorselect", args: ["golineup","selectup"]}, + "Down|C-n" : {command: "goorselect", args: ["golinedown","selectdown"]}, + "Left|C-b" : {command: "goorselect", args: ["gotoleft","selectleft"]}, + "Right|C-f" : {command: "goorselect", args: ["gotoright","selectright"]}, + "C-Left|M-b" : {command: "goorselect", args: ["gotowordleft","selectwordleft"]}, + "C-Right|M-f" : {command: "goorselect", args: ["gotowordright","selectwordright"]}, + "Home|C-a" : {command: "goorselect", args: ["gotolinestart","selecttolinestart"]}, + "End|C-e" : {command: "goorselect", args: ["gotolineend","selecttolineend"]}, + "C-Home|S-M-,": {command: "goorselect", args: ["gotostart","selecttostart"]}, + "C-End|S-M-." : {command: "goorselect", args: ["gotoend","selecttoend"]}, + "S-Up|S-C-p" : "selectup", + "S-Down|S-C-n" : "selectdown", + "S-Left|S-C-b" : "selectleft", + "S-Right|S-C-f" : "selectright", + "S-C-Left|S-M-b" : "selectwordleft", + "S-C-Right|S-M-f" : "selectwordright", + "S-Home|S-C-a" : "selecttolinestart", + "S-End|S-C-e" : "selecttolineend", + "S-C-Home" : "selecttostart", + "S-C-End" : "selecttoend", + + "C-l" : "recenterTopBottom", + "M-s" : "centerselection", + "M-g": "gotoline", + "C-x C-p": "selectall", + "C-Down": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, + "C-Up": {command: "goorselect", args: ["gotopageup","selectpageup"]}, + "PageDown|C-v": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, + "PageUp|M-v": {command: "goorselect", args: ["gotopageup","selectpageup"]}, + "S-C-Down": "selectpagedown", + "S-C-Up": "selectpageup", + + "C-s": "iSearch", + "C-r": "iSearchBackwards", + + "M-C-s": "findnext", + "M-C-r": "findprevious", + "S-M-5": "replace", + "Backspace": "backspace", + "Delete|C-d": "del", + "Return|C-m": {command: "insertstring", args: "\n"}, // "newline" + "C-o": "splitline", + + "M-d|C-Delete": {command: "killWord", args: "right"}, + "C-Backspace|M-Backspace|M-Delete": {command: "killWord", args: "left"}, + "C-k": "killLine", + + "C-y|S-Delete": "yank", + "M-y": "yankRotate", + "C-g": "keyboardQuit", + + "C-w|C-S-W": "killRegion", + "M-w": "killRingSave", + "C-Space": "setMark", + "C-x C-x": "exchangePointAndMark", + + "C-t": "transposeletters", + "M-u": "touppercase", // Doesn't work + "M-l": "tolowercase", + "M-/": "autocomplete", // Doesn't work + "C-u": "universalArgument", + + "M-;": "togglecomment", + + "C-/|C-x u|S-C--|C-z": "undo", + "S-C-/|S-C-x u|C--|S-C-z": "redo", // infinite undo? + "C-x r": "selectRectangularRegion", + "M-x": {command: "focusCommandLine", args: "M-x "} +}; + + +exports.handler.bindKeys(exports.emacsKeys); + +exports.handler.addCommands({ + recenterTopBottom: function(editor) { + var renderer = editor.renderer; + var pos = renderer.$cursorLayer.getPixelPosition(); + var h = renderer.$size.scrollerHeight - renderer.lineHeight; + var scrollTop = renderer.scrollTop; + if (Math.abs(pos.top - scrollTop) < 2) { + scrollTop = pos.top - h; + } else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) { + scrollTop = pos.top; + } else { + scrollTop = pos.top - h * 0.5; + } + editor.session.setScrollTop(scrollTop); + }, + selectRectangularRegion: function(editor) { + editor.multiSelect.toggleBlockSelection(); + }, + setMark: { + exec: function(editor, args) { + + if (args && args.count) { + if (editor.inMultiSelectMode) editor.forEachSelection(moveToMark); + else moveToMark(); + moveToMark(); + return; + } + + var mark = editor.emacsMark(), + ranges = editor.selection.getAllRanges(), + rangePositions = ranges.map(function(r) { return {row: r.start.row, column: r.start.column}; }), + transientMarkModeActive = true, + hasNoSelection = ranges.every(function(range) { return range.isEmpty(); }); + if (transientMarkModeActive && (mark || !hasNoSelection)) { + if (editor.inMultiSelectMode) editor.forEachSelection({exec: editor.clearSelection.bind(editor)}); + else editor.clearSelection(); + if (mark) editor.pushEmacsMark(null); + return; + } + + if (!mark) { + rangePositions.forEach(function(pos) { editor.pushEmacsMark(pos); }); + editor.setEmacsMark(rangePositions[rangePositions.length-1]); + return; + } + + function moveToMark() { + var mark = editor.popEmacsMark(); + mark && editor.moveCursorToPosition(mark); + } + + }, + readOnly: true, + handlesCount: true + }, + exchangePointAndMark: { + exec: function exchangePointAndMark$exec(editor, args) { + var sel = editor.selection; + if (!args.count && !sel.isEmpty()) { // just invert selection + sel.setSelectionRange(sel.getRange(), !sel.isBackwards()); + return; + } + + if (args.count) { // replace mark and point + var pos = {row: sel.lead.row, column: sel.lead.column}; + sel.clearSelection(); + sel.moveCursorToPosition(editor.emacsMarkForSelection(pos)); + } else { // create selection to last mark + sel.selectToPosition(editor.emacsMarkForSelection()); + } + }, + readOnly: true, + handlesCount: true, + multiSelectAction: "forEach" + }, + killWord: { + exec: function(editor, dir) { + editor.clearSelection(); + if (dir == "left") + editor.selection.selectWordLeft(); + else + editor.selection.selectWordRight(); + + var range = editor.getSelectionRange(); + var text = editor.session.getTextRange(range); + exports.killRing.add(text); + + editor.session.remove(range); + editor.clearSelection(); + }, + multiSelectAction: "forEach" + }, + killLine: function(editor) { + editor.pushEmacsMark(null); + editor.clearSelection(); + var range = editor.getSelectionRange(); + var line = editor.session.getLine(range.start.row); + range.end.column = line.length; + line = line.substr(range.start.column) + + var foldLine = editor.session.getFoldLine(range.start.row); + if (foldLine && range.end.row != foldLine.end.row) { + range.end.row = foldLine.end.row; + line = "x"; + } + if (/^\s*$/.test(line)) { + range.end.row++; + line = editor.session.getLine(range.end.row); + range.end.column = /^\s*$/.test(line) ? line.length : 0; + } + var text = editor.session.getTextRange(range); + if (editor.prevOp.command == this) + exports.killRing.append(text); + else + exports.killRing.add(text); + + editor.session.remove(range); + editor.clearSelection(); + }, + yank: function(editor) { + editor.onPaste(exports.killRing.get() || ''); + editor.keyBinding.$data.lastCommand = "yank"; + }, + yankRotate: function(editor) { + if (editor.keyBinding.$data.lastCommand != "yank") + return; + editor.undo(); + editor.session.$emacsMarkRing.pop(); // also undo recording mark + editor.onPaste(exports.killRing.rotate()); + editor.keyBinding.$data.lastCommand = "yank"; + }, + killRegion: { + exec: function(editor) { + exports.killRing.add(editor.getCopyText()); + editor.commands.byName.cut.exec(editor); + editor.setEmacsMark(null); + }, + readOnly: true, + multiSelectAction: "forEach" + }, + killRingSave: { + exec: function(editor) { + + editor.$handlesEmacsOnCopy = true; + var marks = editor.session.$emacsMarkRing.slice(), + deselectedMarks = []; + exports.killRing.add(editor.getCopyText()); + + setTimeout(function() { + function deselect() { + var sel = editor.selection, range = sel.getRange(), + pos = sel.isBackwards() ? range.end : range.start; + deselectedMarks.push({row: pos.row, column: pos.column}); + sel.clearSelection(); + } + editor.$handlesEmacsOnCopy = false; + if (editor.inMultiSelectMode) editor.forEachSelection({exec: deselect}); + else deselect(); + editor.session.$emacsMarkRing = marks.concat(deselectedMarks.reverse()); + }, 0); + }, + readOnly: true + }, + keyboardQuit: function(editor) { + editor.selection.clearSelection(); + editor.setEmacsMark(null); + editor.keyBinding.$data.count = null; + }, + focusCommandLine: function(editor, arg) { + if (editor.showCommandLine) + editor.showCommandLine(arg); + } +}); + +exports.handler.addCommands(iSearchCommandModule.iSearchStartCommands); + +var commands = exports.handler.commands; +commands.yank.isYank = true; +commands.yankRotate.isYank = true; + +exports.killRing = { + $data: [], + add: function(str) { + str && this.$data.push(str); + if (this.$data.length > 30) + this.$data.shift(); + }, + append: function(str) { + var idx = this.$data.length - 1; + var text = this.$data[idx] || ""; + if (str) text += str; + if (text) this.$data[idx] = text; + }, + get: function(n) { + n = n || 1; + return this.$data.slice(this.$data.length-n, this.$data.length).reverse().join('\n'); + }, + pop: function() { + if (this.$data.length > 1) + this.$data.pop(); + return this.get(); + }, + rotate: function() { + this.$data.unshift(this.$data.pop()); + return this.get(); + } +}; + +}); diff --git a/src/libs/ace/keybinding-vim.js b/src/libs/ace/keybinding-vim.js new file mode 100755 index 0000000..5b0f378 --- /dev/null +++ b/src/libs/ace/keybinding-vim.js @@ -0,0 +1,5598 @@ +ace.define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/dom","ace/lib/oop","ace/lib/keys","ace/lib/event","ace/search","ace/lib/useragent","ace/search_highlight","ace/commands/multi_select_commands","ace/mode/text","ace/multi_select"], function(require, exports, module) { + 'use strict'; + + function log() { + var d = ""; + function format(p) { + if (typeof p != "object") + return p + ""; + if ("line" in p) { + return p.line + ":" + p.ch; + } + if ("anchor" in p) { + return format(p.anchor) + "->" + format(p.head); + } + if (Array.isArray(p)) + return "[" + p.map(function(x) { + return format(x); + }) + "]"; + return JSON.stringify(p); + } + for (var i = 0; i < arguments.length; i++) { + var p = arguments[i]; + var f = format(p); + d += f + " "; + } + console.log(d); + } + var Range = require("../range").Range; + var EventEmitter = require("../lib/event_emitter").EventEmitter; + var dom = require("../lib/dom"); + var oop = require("../lib/oop"); + var KEYS = require("../lib/keys"); + var event = require("../lib/event"); + var Search = require("../search").Search; + var useragent = require("../lib/useragent"); + var SearchHighlight = require("../search_highlight").SearchHighlight; + var multiSelectCommands = require("../commands/multi_select_commands"); + var TextModeTokenRe = require("../mode/text").Mode.prototype.tokenRe; + require("../multi_select"); + + var CodeMirror = function(ace) { + this.ace = ace; + this.state = {}; + this.marks = {}; + this.$uid = 0; + this.onChange = this.onChange.bind(this); + this.onSelectionChange = this.onSelectionChange.bind(this); + this.onBeforeEndOperation = this.onBeforeEndOperation.bind(this); + this.ace.on('change', this.onChange); + this.ace.on('changeSelection', this.onSelectionChange); + this.ace.on('beforeEndOperation', this.onBeforeEndOperation); + }; + CodeMirror.Pos = function(line, ch) { + if (!(this instanceof Pos)) return new Pos(line, ch); + this.line = line; this.ch = ch; + }; + CodeMirror.defineOption = function(name, val, setter) {}; + CodeMirror.commands = { + redo: function(cm) { cm.ace.redo(); }, + undo: function(cm) { cm.ace.undo(); }, + newlineAndIndent: function(cm) { cm.ace.insert("\n"); } + }; + CodeMirror.keyMap = {}; + CodeMirror.addClass = CodeMirror.rmClass = + CodeMirror.e_stop = function() {}; + CodeMirror.keyName = function(e) { + if (e.key) return e.key; + var key = (KEYS[e.keyCode] || ""); + if (key.length == 1) key = key.toUpperCase(); + key = event.getModifierString(e).replace(/(^|-)\w/g, function(m) { + return m.toUpperCase(); + }) + key; + return key; + }; + CodeMirror.keyMap['default'] = function(key) { + return function(cm) { + var cmd = cm.ace.commands.commandKeyBinding[key.toLowerCase()]; + return cmd && cm.ace.execCommand(cmd) !== false; + }; + }; + CodeMirror.lookupKey = function lookupKey(key, map, handle) { + if (typeof map == "string") + map = CodeMirror.keyMap[map]; + var found = typeof map == "function" ? map(key) : map[key]; + if (found === false) return "nothing"; + if (found === "...") return "multi"; + if (found != null && handle(found)) return "handled"; + + if (map.fallthrough) { + if (!Array.isArray(map.fallthrough)) + return lookupKey(key, map.fallthrough, handle); + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle); + if (result) return result; + } + } + }; + + CodeMirror.signal = function(o, name, e) { return o._signal(name, e) }; + CodeMirror.on = event.addListener; + CodeMirror.off = event.removeListener; + CodeMirror.isWordChar = function(ch) { + if (ch < "\x7f") return /^\w$/.test(ch); + TextModeTokenRe.lastIndex = 0; + return TextModeTokenRe.test(ch); + }; + +(function() { + oop.implement(CodeMirror.prototype, EventEmitter); + + this.destroy = function() { + this.ace.off('change', this.onChange); + this.ace.off('changeSelection', this.onSelectionChange); + this.ace.off('beforeEndOperation', this.onBeforeEndOperation); + this.removeOverlay(); + }; + this.virtualSelectionMode = function() { + return this.ace.inVirtualSelectionMode && this.ace.selection.index; + }; + this.onChange = function(delta) { + var change = { text: delta.action[0] == 'i' ? delta.lines : [] }; + var curOp = this.curOp = this.curOp || {}; + if (!curOp.changeHandlers) + curOp.changeHandlers = this._eventRegistry["change"] && this._eventRegistry["change"].slice(); + if (this.virtualSelectionMode()) return; + if (!curOp.lastChange) { + curOp.lastChange = curOp.change = change; + } else { + curOp.lastChange.next = curOp.lastChange = change; + } + this.$updateMarkers(delta); + }; + this.onSelectionChange = function() { + var curOp = this.curOp = this.curOp || {}; + if (!curOp.cursorActivityHandlers) + curOp.cursorActivityHandlers = this._eventRegistry["cursorActivity"] && this._eventRegistry["cursorActivity"].slice(); + this.curOp.cursorActivity = true; + if (this.ace.inMultiSelectMode) { + this.ace.keyBinding.removeKeyboardHandler(multiSelectCommands.keyboardHandler); + } + }; + this.operation = function(fn, force) { + if (!force && this.curOp || force && this.curOp && this.curOp.force) { + return fn(); + } + if (force || !this.ace.curOp) { + if (this.curOp) + this.onBeforeEndOperation(); + } + if (!this.ace.curOp) { + var prevOp = this.ace.prevOp; + this.ace.startOperation({ + command: { name: "vim", scrollIntoView: "cursor" } + }); + } + var curOp = this.curOp = this.curOp || {}; + this.curOp.force = force; + var result = fn(); + if (this.ace.curOp && this.ace.curOp.command.name == "vim") { + this.ace.endOperation(); + if (!curOp.cursorActivity && !curOp.lastChange && prevOp) + this.ace.prevOp = prevOp; + } + if (force || !this.ace.curOp) { + if (this.curOp) + this.onBeforeEndOperation(); + } + return result; + }; + this.onBeforeEndOperation = function() { + var op = this.curOp; + if (op) { + if (op.change) { this.signal("change", op.change, op); } + if (op && op.cursorActivity) { this.signal("cursorActivity", null, op); } + this.curOp = null; + } + }; + + this.signal = function(eventName, e, handlers) { + var listeners = handlers ? handlers[eventName + "Handlers"] + : (this._eventRegistry || {})[eventName]; + if (!listeners) + return; + listeners = listeners.slice(); + for (var i=0; i 0) { + point.row += rowShift; + point.column += point.row == end.row ? colShift : 0; + continue; + } + if (!isInsert && cmp2 <= 0) { + point.row = start.row; + point.column = start.column; + if (cmp2 === 0) + point.bias = 1; + } + } + }; + var Marker = function(cm, id, row, column) { + this.cm = cm; + this.id = id; + this.row = row; + this.column = column; + cm.marks[this.id] = this; + }; + Marker.prototype.clear = function() { delete this.cm.marks[this.id] }; + Marker.prototype.find = function() { return toCmPos(this) }; + this.setBookmark = function(cursor, options) { + var bm = new Marker(this, this.$uid++, cursor.line, cursor.ch); + if (!options || !options.insertLeft) + bm.$insertRight = true; + this.marks[bm.id] = bm; + return bm; + }; + this.moveH = function(increment, unit) { + if (unit == 'char') { + var sel = this.ace.selection; + sel.clearSelection(); + sel.moveCursorBy(0, increment); + } + }; + this.findPosV = function(start, amount, unit, goalColumn) { + if (unit == 'page') { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + amount = amount * Math.floor(config.height / config.lineHeight); + unit = 'line'; + } + if (unit == 'line') { + var screenPos = this.ace.session.documentToScreenPosition(start.line, start.ch); + if (goalColumn != null) + screenPos.column = goalColumn; + screenPos.row += amount; + screenPos.row = Math.min(Math.max(0, screenPos.row), this.ace.session.getScreenLength() - 1); + var pos = this.ace.session.screenToDocumentPosition(screenPos.row, screenPos.column); + return toCmPos(pos); + } else { + debugger; + } + }; + this.charCoords = function(pos, mode) { + if (mode == 'div' || !mode) { + var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); + return {left: sc.column, top: sc.row}; + }if (mode == 'local') { + var renderer = this.ace.renderer; + var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); + var lh = renderer.layerConfig.lineHeight; + var cw = renderer.layerConfig.characterWidth; + var top = lh * sc.row; + return {left: sc.column * cw, top: top, bottom: top + lh}; + } + }; + this.coordsChar = function(pos, mode) { + var renderer = this.ace.renderer; + if (mode == 'local') { + var row = Math.max(0, Math.floor(pos.top / renderer.lineHeight)); + var col = Math.max(0, Math.floor(pos.left / renderer.characterWidth)); + var ch = renderer.session.screenToDocumentPosition(row, col); + return toCmPos(ch); + } else if (mode == 'div') { + throw "not implemented"; + } + }; + this.getSearchCursor = function(query, pos, caseFold) { + var caseSensitive = false; + var isRegexp = false; + if (query instanceof RegExp && !query.global) { + caseSensitive = !query.ignoreCase; + query = query.source; + isRegexp = true; + } + var search = new Search(); + if (pos.ch == undefined) pos.ch = Number.MAX_VALUE; + var acePos = {row: pos.line, column: pos.ch}; + var cm = this; + var last = null; + return { + findNext: function() { return this.find(false) }, + findPrevious: function() {return this.find(true) }, + find: function(back) { + search.setOptions({ + needle: query, + caseSensitive: caseSensitive, + wrap: false, + backwards: back, + regExp: isRegexp, + start: last || acePos + }); + var range = search.find(cm.ace.session); + if (range && range.isEmpty()) { + if (cm.getLine(range.start.row).length == range.start.column) { + search.$options.start = range; + range = search.find(cm.ace.session); + } + } + last = range; + return last; + }, + from: function() { return last && toCmPos(last.start) }, + to: function() { return last && toCmPos(last.end) }, + replace: function(text) { + if (last) { + last.end = cm.ace.session.doc.replace(last, text); + } + } + }; + }; + this.scrollTo = function(x, y) { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + var maxHeight = config.maxHeight; + maxHeight -= (renderer.$size.scrollerHeight - renderer.lineHeight) * renderer.$scrollPastEnd; + if (y != null) this.ace.session.setScrollTop(Math.max(0, Math.min(y, maxHeight))); + if (x != null) this.ace.session.setScrollLeft(Math.max(0, Math.min(x, config.width))); + }; + this.scrollInfo = function() { return 0; }; + this.scrollIntoView = function(pos, margin) { + if (pos) { + var renderer = this.ace.renderer; + var viewMargin = { "top": 0, "bottom": margin }; + renderer.scrollCursorIntoView(toAcePos(pos), + (renderer.lineHeight * 2) / renderer.$size.scrollerHeight, viewMargin); + } + }; + this.getLine = function(row) { return this.ace.session.getLine(row) }; + this.getRange = function(s, e) { + return this.ace.session.getTextRange(new Range(s.line, s.ch, e.line, e.ch)); + }; + this.replaceRange = function(text, s, e) { + if (!e) e = s; + return this.ace.session.replace(new Range(s.line, s.ch, e.line, e.ch), text); + }; + this.replaceSelections = function(p) { + var sel = this.ace.selection; + if (this.ace.inVirtualSelectionMode) { + this.ace.session.replace(sel.getRange(), p[0] || ""); + return; + } + sel.inVirtualSelectionMode = true; + var ranges = sel.rangeList.ranges; + if (!ranges.length) ranges = [this.ace.multiSelect.getRange()]; + for (var i = ranges.length; i--;) + this.ace.session.replace(ranges[i], p[i] || ""); + sel.inVirtualSelectionMode = false; + }; + this.getSelection = function() { + return this.ace.getSelectedText(); + }; + this.getSelections = function() { + return this.listSelections().map(function(x) { + return this.getRange(x.anchor, x.head); + }, this); + }; + this.getInputField = function() { + return this.ace.textInput.getElement(); + }; + this.getWrapperElement = function() { + return this.ace.containter; + }; + var optMap = { + indentWithTabs: "useSoftTabs", + indentUnit: "tabSize", + tabSize: "tabSize", + firstLineNumber: "firstLineNumber", + readOnly: "readOnly" + }; + this.setOption = function(name, val) { + this.state[name] = val; + switch (name) { + case 'indentWithTabs': + name = optMap[name]; + val = !val; + break; + default: + name = optMap[name]; + } + if (name) + this.ace.setOption(name, val); + }; + this.getOption = function(name, val) { + var aceOpt = optMap[name]; + if (aceOpt) + val = this.ace.getOption(aceOpt); + switch (name) { + case 'indentWithTabs': + name = optMap[name]; + return !val; + } + return aceOpt ? val : this.state[name]; + }; + this.toggleOverwrite = function(on) { + this.state.overwrite = on; + return this.ace.setOverwrite(on); + }; + this.addOverlay = function(o) { + if (!this.$searchHighlight || !this.$searchHighlight.session) { + var highlight = new SearchHighlight(null, "ace_highlight-marker", "text"); + var marker = this.ace.session.addDynamicMarker(highlight); + highlight.id = marker.id; + highlight.session = this.ace.session; + highlight.destroy = function(o) { + highlight.session.off("change", highlight.updateOnChange); + highlight.session.off("changeEditor", highlight.destroy); + highlight.session.removeMarker(highlight.id); + highlight.session = null; + }; + highlight.updateOnChange = function(delta) { + var row = delta.start.row; + if (row == delta.end.row) highlight.cache[row] = undefined; + else highlight.cache.splice(row, highlight.cache.length); + }; + highlight.session.on("changeEditor", highlight.destroy); + highlight.session.on("change", highlight.updateOnChange); + } + var re = new RegExp(o.query.source, "gmi"); + this.$searchHighlight = o.highlight = highlight; + this.$searchHighlight.setRegexp(re); + this.ace.renderer.updateBackMarkers(); + }; + this.removeOverlay = function(o) { + if (this.$searchHighlight && this.$searchHighlight.session) { + this.$searchHighlight.destroy(); + } + }; + this.getScrollInfo = function() { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + return { + left: renderer.scrollLeft, + top: renderer.scrollTop, + height: config.maxHeight, + width: config.width, + clientHeight: config.height, + clientWidth: config.width + }; + }; + this.getValue = function() { + return this.ace.getValue(); + }; + this.setValue = function(v) { + return this.ace.setValue(v); + }; + this.getTokenTypeAt = function(pos) { + var token = this.ace.session.getTokenAt(pos.line, pos.ch); + return token && /comment|string/.test(token.type) ? "string" : ""; + }; + this.findMatchingBracket = function(pos) { + var m = this.ace.session.findMatchingBracket(toAcePos(pos)); + return {to: m && toCmPos(m)}; + }; + this.indentLine = function(line, method) { + if (method === true) + this.ace.session.indentRows(line, line, "\t"); + else if (method === false) + this.ace.session.outdentRows(new Range(line, 0, line, 0)); + }; + this.indexFromPos = function(pos) { + return this.ace.session.doc.positionToIndex(toAcePos(pos)); + }; + this.posFromIndex = function(index) { + return toCmPos(this.ace.session.doc.indexToPosition(index)); + }; + this.focus = function(index) { + return this.ace.focus(); + }; + this.blur = function(index) { + return this.ace.blur(); + }; + this.defaultTextHeight = function(index) { + return this.ace.renderer.layerConfig.lineHeight; + }; + this.scanForBracket = function(pos, dir, _, options) { + var re = options.bracketRegex.source; + if (dir == 1) { + var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), /paren|text/); + } else { + var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, /paren|text/); + } + return m && {pos: toCmPos(m)}; + }; + this.refresh = function() { + return this.ace.resize(true); + }; + this.getMode = function() { + return { name : this.getOption("mode") }; + } +}).call(CodeMirror.prototype); + function toAcePos(cmPos) { + return {row: cmPos.line, column: cmPos.ch}; + } + function toCmPos(acePos) { + return new Pos(acePos.row, acePos.column); + } + + var StringStream = CodeMirror.StringStream = function(string, tabSize) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + }; + + StringStream.prototype = { + eol: function() {return this.pos >= this.string.length;}, + sol: function() {return this.pos == this.lineStart;}, + peek: function() {return this.string.charAt(this.pos) || undefined;}, + next: function() { + if (this.pos < this.string.length) + return this.string.charAt(this.pos++); + }, + eat: function(match) { + var ch = this.string.charAt(this.pos); + if (typeof match == "string") var ok = ch == match; + else var ok = ch && (match.test ? match.test(ch) : match(ch)); + if (ok) {++this.pos; return ch;} + }, + eatWhile: function(match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start; + }, + eatSpace: function() { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; + return this.pos > start; + }, + skipToEnd: function() {this.pos = this.string.length;}, + skipTo: function(ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true;} + }, + backUp: function(n) {this.pos -= n;}, + column: function() { + throw "not implemented"; + }, + indentation: function() { + throw "not implemented"; + }, + match: function(pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) this.pos += pattern.length; + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) return null; + if (match && consume !== false) this.pos += match[0].length; + return match; + } + }, + current: function(){return this.string.slice(this.start, this.pos);}, + hideFirstChars: function(n, inner) { + this.lineStart += n; + try { return inner(); } + finally { this.lineStart -= n; } + } + }; +CodeMirror.defineExtension = function(name, fn) { + CodeMirror.prototype[name] = fn; +}; +dom.importCssString(".normal-mode .ace_cursor{\ + border: 1px solid red;\ + background-color: red;\ + opacity: 0.5;\ +}\ +.normal-mode .ace_hidden-cursors .ace_cursor{\ + background-color: transparent;\ +}\ +.ace_dialog {\ + position: absolute;\ + left: 0; right: 0;\ + background: white;\ + z-index: 15;\ + padding: .1em .8em;\ + overflow: hidden;\ + color: #333;\ +}\ +.ace_dialog-top {\ + border-bottom: 1px solid #eee;\ + top: 0;\ +}\ +.ace_dialog-bottom {\ + border-top: 1px solid #eee;\ + bottom: 0;\ +}\ +.ace_dialog input {\ + border: none;\ + outline: none;\ + background: transparent;\ + width: 20em;\ + color: inherit;\ + font-family: monospace;\ +}", "vimMode"); +(function() { + function dialogDiv(cm, template, bottom) { + var wrap = cm.ace.container; + var dialog; + dialog = wrap.appendChild(document.createElement("div")); + if (bottom) + dialog.className = "ace_dialog ace_dialog-bottom"; + else + dialog.className = "ace_dialog ace_dialog-top"; + + if (typeof template == "string") { + dialog.innerHTML = template; + } else { // Assuming it's a detached DOM element. + dialog.appendChild(template); + } + return dialog; + } + + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) + cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + + CodeMirror.defineExtension("openDialog", function(template, callback, options) { + if (this.virtualSelectionMode()) return; + if (!options) options = {}; + + closeNotification(this, null); + + var dialog = dialogDiv(this, template, options.bottom); + var closed = false, me = this; + function close(newVal) { + if (typeof newVal == 'string') { + inp.value = newVal; + } else { + if (closed) return; + closed = true; + dialog.parentNode.removeChild(dialog); + me.focus(); + + if (options.onClose) options.onClose(dialog); + } + } + + var inp = dialog.getElementsByTagName("input")[0], button; + if (inp) { + if (options.value) { + inp.value = options.value; + if (options.select !== false) inp.select(); + } + + if (options.onInput) + CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); + if (options.onKeyUp) + CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); + + CodeMirror.on(inp, "keydown", function(e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } + if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { + inp.blur(); + CodeMirror.e_stop(e); + close(); + } + if (e.keyCode == 13) callback(inp.value); + }); + + if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); + + inp.focus(); + } else if (button = dialog.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function() { + close(); + me.focus(); + }); + + if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); + + button.focus(); + } + return close; + }); + + CodeMirror.defineExtension("openNotification", function(template, options) { + if (this.virtualSelectionMode()) return; + closeNotification(this, close); + var dialog = dialogDiv(this, template, options && options.bottom); + var closed = false, doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; + + function close() { + if (closed) return; + closed = true; + clearTimeout(doneTimer); + dialog.parentNode.removeChild(dialog); + } + + CodeMirror.on(dialog, 'click', function(e) { + CodeMirror.e_preventDefault(e); + close(); + }); + + if (duration) + doneTimer = setTimeout(close, duration); + + return close; + }); +})(); + + + var defaultKeymap = [ + { keys: '', type: 'keyToKey', toKeys: 'h' }, + { keys: '', type: 'keyToKey', toKeys: 'l' }, + { keys: '', type: 'keyToKey', toKeys: 'k' }, + { keys: '', type: 'keyToKey', toKeys: 'j' }, + { keys: '', type: 'keyToKey', toKeys: 'l' }, + { keys: '', type: 'keyToKey', toKeys: 'h', context: 'normal'}, + { keys: '', type: 'keyToKey', toKeys: 'W' }, + { keys: '', type: 'keyToKey', toKeys: 'B', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'w' }, + { keys: '', type: 'keyToKey', toKeys: 'b', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'j' }, + { keys: '', type: 'keyToKey', toKeys: 'k' }, + { keys: '', type: 'keyToKey', toKeys: '' }, + { keys: '', type: 'keyToKey', toKeys: '' }, + { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, + { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, + { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' }, + { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'}, + { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' }, + { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' }, + { keys: '', type: 'keyToKey', toKeys: '0' }, + { keys: '', type: 'keyToKey', toKeys: '$' }, + { keys: '', type: 'keyToKey', toKeys: '' }, + { keys: '', type: 'keyToKey', toKeys: '' }, + { keys: '', type: 'keyToKey', toKeys: 'j^', context: 'normal' }, + { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }}, + { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }}, + { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }}, + { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }}, + { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }}, + { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }}, + { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }}, + { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }}, + { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }}, + { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }}, + { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }}, + { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }}, + { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }}, + { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }}, + { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }}, + { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }}, + { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }}, + { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }}, + { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }}, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }}, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }}, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }}, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }}, + { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }}, + { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }}, + { keys: '0', type: 'motion', motion: 'moveToStartOfLine' }, + { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }}, + { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }}, + { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }}, + { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }}, + { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }}, + { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }}, + { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }}, + { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }}, + { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }}, + { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }}, + { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }}, + { keys: '\'', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}}, + { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}}, + { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } }, + { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } }, + { keys: ']\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } }, + { keys: '[\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } }, + { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}}, + { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}}, + { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}}, + { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}}, + { keys: '|', type: 'motion', motion: 'moveToColumn'}, + { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'}, + { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'}, + { keys: 'd', type: 'operator', operator: 'delete' }, + { keys: 'y', type: 'operator', operator: 'yank' }, + { keys: 'c', type: 'operator', operator: 'change' }, + { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }}, + { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }}, + { keys: 'g~', type: 'operator', operator: 'changeCase' }, + { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true }, + { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true }, + { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }}, + { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }}, + { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }}, + { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }}, + { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, + { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'}, + { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, + { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'}, + { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, + { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'}, + { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'}, + { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'}, + { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' }, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }}, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }}, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }}, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }}, + { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' }, + { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' }, + { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' }, + { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' }, + { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' }, + { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' }, + { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' }, + { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' }, + { keys: 'v', type: 'action', action: 'toggleVisualMode' }, + { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }}, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, + { keys: 'gv', type: 'action', action: 'reselectLastSelection' }, + { keys: 'J', type: 'action', action: 'joinLines', isEdit: true }, + { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }}, + { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }}, + { keys: 'r', type: 'action', action: 'replace', isEdit: true }, + { keys: '@', type: 'action', action: 'replayMacro' }, + { keys: 'q', type: 'action', action: 'enterMacroRecordMode' }, + { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }}, + { keys: 'u', type: 'action', action: 'undo', context: 'normal' }, + { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true }, + { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true }, + { keys: '', type: 'action', action: 'redo' }, + { keys: 'm', type: 'action', action: 'setMark' }, + { keys: '"', type: 'action', action: 'setRegister' }, + { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }}, + { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }}, + { keys: 'z', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }}, + { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: '.', type: 'action', action: 'repeatLastEdit' }, + { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}}, + { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}}, + { keys: 'a', type: 'motion', motion: 'textObjectManipulation' }, + { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }}, + { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }}, + { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }}, + { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, + { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, + { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }}, + { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }}, + { keys: ':', type: 'ex' } + ]; + var defaultExCommandMap = [ + { name: 'colorscheme', shortName: 'colo' }, + { name: 'map' }, + { name: 'imap', shortName: 'im' }, + { name: 'nmap', shortName: 'nm' }, + { name: 'vmap', shortName: 'vm' }, + { name: 'unmap' }, + { name: 'write', shortName: 'w' }, + { name: 'undo', shortName: 'u' }, + { name: 'redo', shortName: 'red' }, + { name: 'set', shortName: 'se' }, + { name: 'set', shortName: 'se' }, + { name: 'setlocal', shortName: 'setl' }, + { name: 'setglobal', shortName: 'setg' }, + { name: 'sort', shortName: 'sor' }, + { name: 'substitute', shortName: 's', possiblyAsync: true }, + { name: 'nohlsearch', shortName: 'noh' }, + { name: 'delmarks', shortName: 'delm' }, + { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }, + { name: 'global', shortName: 'g' } + ]; + + var Pos = CodeMirror.Pos; + + var Vim = function() { return vimApi; } //{ + function enterVimMode(cm) { + cm.setOption('disableInput', true); + cm.setOption('showCursorWhenSelecting', false); + CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + cm.on('cursorActivity', onCursorActivity); + maybeInitVimState(cm); + CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); + } + + function leaveVimMode(cm) { + cm.setOption('disableInput', false); + cm.off('cursorActivity', onCursorActivity); + CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); + cm.state.vim = null; + } + + function detachVimMap(cm, next) { + if (this == CodeMirror.keyMap.vim) + CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor"); + + if (!next || next.attach != attachVimMap) + leaveVimMode(cm, false); + } + function attachVimMap(cm, prev) { + if (this == CodeMirror.keyMap.vim) + CodeMirror.addClass(cm.getWrapperElement(), "cm-fat-cursor"); + + if (!prev || prev.attach != attachVimMap) + enterVimMode(cm); + } + CodeMirror.defineOption('vimMode', false, function(cm, val, prev) { + if (val && cm.getOption("keyMap") != "vim") + cm.setOption("keyMap", "vim"); + else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption("keyMap"))) + cm.setOption("keyMap", "default"); + }); + + function cmKey(key, cm) { + if (!cm) { return undefined; } + var vimKey = cmKeyToVimKey(key); + if (!vimKey) { + return false; + } + var cmd = CodeMirror.Vim.findKey(cm, vimKey); + if (typeof cmd == 'function') { + CodeMirror.signal(cm, 'vim-keypress', vimKey); + } + return cmd; + } + + var modifiers = {'Shift': 'S', 'Ctrl': 'C', 'Alt': 'A', 'Cmd': 'D', 'Mod': 'A'}; + var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del'}; + function cmKeyToVimKey(key) { + if (key.charAt(0) == '\'') { + return key.charAt(1); + } + var pieces = key.split(/-(?!$)/); + var lastPiece = pieces[pieces.length - 1]; + if (pieces.length == 1 && pieces[0].length == 1) { + return false; + } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) { + return false; + } + var hasCharacter = false; + for (var i = 0; i < pieces.length; i++) { + var piece = pieces[i]; + if (piece in modifiers) { pieces[i] = modifiers[piece]; } + else { hasCharacter = true; } + if (piece in specialKeys) { pieces[i] = specialKeys[piece]; } + } + if (!hasCharacter) { + return false; + } + if (isUpperCase(lastPiece)) { + pieces[pieces.length - 1] = lastPiece.toLowerCase(); + } + return '<' + pieces.join('-') + '>'; + } + + function getOnPasteFn(cm) { + var vim = cm.state.vim; + if (!vim.onPasteFn) { + vim.onPasteFn = function() { + if (!vim.insertMode) { + cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); + actions.enterInsertMode(cm, {}, vim); + } + }; + } + return vim.onPasteFn; + } + + var numberRegex = /[\d]/; + var wordCharTest = [CodeMirror.isWordChar, function(ch) { + return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch); + }], bigWordCharTest = [function(ch) { + return /\S/.test(ch); + }]; + function makeKeyRange(start, size) { + var keys = []; + for (var i = start; i < start + size; i++) { + keys.push(String.fromCharCode(i)); + } + return keys; + } + var upperCaseAlphabet = makeKeyRange(65, 26); + var lowerCaseAlphabet = makeKeyRange(97, 26); + var numbers = makeKeyRange(48, 10); + var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']); + var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '/']); + + function isLine(cm, line) { + return line >= cm.firstLine() && line <= cm.lastLine(); + } + function isLowerCase(k) { + return (/^[a-z]$/).test(k); + } + function isMatchableSymbol(k) { + return '()[]{}'.indexOf(k) != -1; + } + function isNumber(k) { + return numberRegex.test(k); + } + function isUpperCase(k) { + return (/^[A-Z]$/).test(k); + } + function isWhiteSpaceString(k) { + return (/^\s*$/).test(k); + } + function inArray(val, arr) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] == val) { + return true; + } + } + return false; + } + + var options = {}; + function defineOption(name, defaultValue, type, aliases, callback) { + if (defaultValue === undefined && !callback) { + throw Error('defaultValue is required unless callback is provided'); + } + if (!type) { type = 'string'; } + options[name] = { + type: type, + defaultValue: defaultValue, + callback: callback + }; + if (aliases) { + for (var i = 0; i < aliases.length; i++) { + options[aliases[i]] = options[name]; + } + } + if (defaultValue) { + setOption(name, defaultValue); + } + } + + function setOption(name, value, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { + throw Error('Unknown option: ' + name); + } + if (option.type == 'boolean') { + if (value && value !== true) { + throw Error('Invalid argument: ' + name + '=' + value); + } else if (value !== false) { + value = true; + } + } + if (option.callback) { + if (scope !== 'local') { + option.callback(value, undefined); + } + if (scope !== 'global' && cm) { + option.callback(value, cm); + } + } else { + if (scope !== 'local') { + option.value = option.type == 'boolean' ? !!value : value; + } + if (scope !== 'global' && cm) { + cm.state.vim.options[name] = {value: value}; + } + } + } + + function getOption(name, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { + throw Error('Unknown option: ' + name); + } + if (option.callback) { + var local = cm && option.callback(undefined, cm); + if (scope !== 'global' && local !== undefined) { + return local; + } + if (scope !== 'local') { + return option.callback(); + } + return; + } else { + var local = (scope !== 'global') && (cm && cm.state.vim.options[name]); + return (local || (scope !== 'local') && option || {}).value; + } + } + + defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) { + if (cm === undefined) { + return; + } + if (name === undefined) { + var mode = cm.getOption('mode'); + return mode == 'null' ? '' : mode; + } else { + var mode = name == '' ? 'null' : name; + cm.setOption('mode', mode); + } + }); + + var createCircularJumpList = function() { + var size = 100; + var pointer = -1; + var head = 0; + var tail = 0; + var buffer = new Array(size); + function add(cm, oldCur, newCur) { + var current = pointer % size; + var curMark = buffer[current]; + function useNextSlot(cursor) { + var next = ++pointer % size; + var trashMark = buffer[next]; + if (trashMark) { + trashMark.clear(); + } + buffer[next] = cm.setBookmark(cursor); + } + if (curMark) { + var markPos = curMark.find(); + if (markPos && !cursorEqual(markPos, oldCur)) { + useNextSlot(oldCur); + } + } else { + useNextSlot(oldCur); + } + useNextSlot(newCur); + head = pointer; + tail = pointer - size + 1; + if (tail < 0) { + tail = 0; + } + } + function move(cm, offset) { + pointer += offset; + if (pointer > head) { + pointer = head; + } else if (pointer < tail) { + pointer = tail; + } + var mark = buffer[(size + pointer) % size]; + if (mark && !mark.find()) { + var inc = offset > 0 ? 1 : -1; + var newCur; + var oldCur = cm.getCursor(); + do { + pointer += inc; + mark = buffer[(size + pointer) % size]; + if (mark && + (newCur = mark.find()) && + !cursorEqual(oldCur, newCur)) { + break; + } + } while (pointer < head && pointer > tail); + } + return mark; + } + return { + cachedCursor: undefined, //used for # and * jumps + add: add, + move: move + }; + }; + var createInsertModeChanges = function(c) { + if (c) { + return { + changes: c.changes, + expectCursorActivityForChange: c.expectCursorActivityForChange + }; + } + return { + changes: [], + expectCursorActivityForChange: false + }; + }; + + function MacroModeState() { + this.latestRegister = undefined; + this.isPlaying = false; + this.isRecording = false; + this.replaySearchQueries = []; + this.onRecordingDone = undefined; + this.lastInsertModeChanges = createInsertModeChanges(); + } + MacroModeState.prototype = { + exitMacroRecordMode: function() { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.onRecordingDone) { + macroModeState.onRecordingDone(); // close dialog + } + macroModeState.onRecordingDone = undefined; + macroModeState.isRecording = false; + }, + enterMacroRecordMode: function(cm, registerName) { + var register = + vimGlobalState.registerController.getRegister(registerName); + if (register) { + register.clear(); + this.latestRegister = registerName; + if (cm.openDialog) { + this.onRecordingDone = cm.openDialog( + '(recording)['+registerName+']', null, {bottom:true}); + } + this.isRecording = true; + } + } + }; + + function maybeInitVimState(cm) { + if (!cm.state.vim) { + cm.state.vim = { + inputState: new InputState(), + lastEditInputState: undefined, + lastEditActionCommand: undefined, + lastHPos: -1, + lastHSPos: -1, + lastMotion: null, + marks: {}, + fakeCursor: null, + insertMode: false, + insertModeRepeat: undefined, + visualMode: false, + visualLine: false, + visualBlock: false, + lastSelection: null, + lastPastedText: null, + sel: {}, + options: {} + }; + } + return cm.state.vim; + } + var vimGlobalState; + function resetVimGlobalState() { + vimGlobalState = { + searchQuery: null, + searchIsReversed: false, + lastSubstituteReplacePart: undefined, + jumpList: createCircularJumpList(), + macroModeState: new MacroModeState, + lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''}, + registerController: new RegisterController({}), + searchHistoryController: new HistoryController({}), + exCommandHistoryController : new HistoryController({}) + }; + for (var optionName in options) { + var option = options[optionName]; + option.value = option.defaultValue; + } + } + + var lastInsertModeKeyTimer; + var vimApi= { + buildKeyMap: function() { + }, + getRegisterController: function() { + return vimGlobalState.registerController; + }, + resetVimGlobalState_: resetVimGlobalState, + getVimGlobalState_: function() { + return vimGlobalState; + }, + maybeInitVimState_: maybeInitVimState, + + suppressErrorLogging: false, + + InsertModeKey: InsertModeKey, + map: function(lhs, rhs, ctx) { + exCommandDispatcher.map(lhs, rhs, ctx); + }, + unmap: function(lhs, ctx) { + exCommandDispatcher.unmap(lhs, ctx); + }, + setOption: setOption, + getOption: getOption, + defineOption: defineOption, + defineEx: function(name, prefix, func){ + if (!prefix) { + prefix = name; + } else if (name.indexOf(prefix) !== 0) { + throw new Error('(Vim.defineEx) "'+prefix+'" is not a prefix of "'+name+'", command not registered'); + } + exCommands[name]=func; + exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'}; + }, + handleKey: function (cm, key, origin) { + var command = this.findKey(cm, key, origin); + if (typeof command === 'function') { + return command(); + } + }, + findKey: function(cm, key, origin) { + var vim = maybeInitVimState(cm); + function handleMacroRecording() { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + if (key == 'q') { + macroModeState.exitMacroRecordMode(); + clearInputState(cm); + return true; + } + if (origin != 'mapping') { + logKey(macroModeState, key); + } + } + } + function handleEsc() { + if (key == '') { + clearInputState(cm); + if (vim.visualMode) { + exitVisualMode(cm); + } else if (vim.insertMode) { + exitInsertMode(cm); + } + return true; + } + } + function doKeyToKey(keys) { + var match; + while (keys) { + match = (/<\w+-.+?>|<\w+>|./).exec(keys); + key = match[0]; + keys = keys.substring(match.index + key.length); + CodeMirror.Vim.handleKey(cm, key, 'mapping'); + } + } + + function handleKeyInsertMode() { + if (handleEsc()) { return true; } + var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; + var keysAreChars = key.length == 1; + var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + while (keys.length > 1 && match.type != 'full') { + var keys = vim.inputState.keyBuffer = keys.slice(1); + var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + if (thisMatch.type != 'none') { match = thisMatch; } + } + if (match.type == 'none') { clearInputState(cm); return false; } + else if (match.type == 'partial') { + if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } + lastInsertModeKeyTimer = window.setTimeout( + function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } }, + getOption('insertModeEscKeysTimeout')); + return !keysAreChars; + } + + if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } + if (keysAreChars) { + var selections = cm.listSelections(); + for (var i = 0; i < selections.length; i++) { + var here = selections[i].head; + cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input'); + } + vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop(); + } + clearInputState(cm); + return match.command; + } + + function handleKeyNonInsertMode() { + if (handleMacroRecording() || handleEsc()) { return true; } + + var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; + if (/^[1-9]\d*$/.test(keys)) { return true; } + + var keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (!keysMatcher) { clearInputState(cm); return false; } + var context = vim.visualMode ? 'visual' : + 'normal'; + var match = commandDispatcher.matchCommand(keysMatcher[2] || keysMatcher[1], defaultKeymap, vim.inputState, context); + if (match.type == 'none') { clearInputState(cm); return false; } + else if (match.type == 'partial') { return true; } + + vim.inputState.keyBuffer = ''; + var keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (keysMatcher[1] && keysMatcher[1] != '0') { + vim.inputState.pushRepeatDigit(keysMatcher[1]); + } + return match.command; + } + + var command; + if (vim.insertMode) { command = handleKeyInsertMode(); } + else { command = handleKeyNonInsertMode(); } + if (command === false) { + return undefined; + } else if (command === true) { + return function() { return true; }; + } else { + return function() { + if ((command.operator || command.isEdit) && cm.getOption('readOnly')) + return; // ace_patch + return cm.operation(function() { + cm.curOp.isVimOp = true; + try { + if (command.type == 'keyToKey') { + doKeyToKey(command.toKeys); + } else { + commandDispatcher.processCommand(cm, vim, command); + } + } catch (e) { + cm.state.vim = undefined; + maybeInitVimState(cm); + if (!CodeMirror.Vim.suppressErrorLogging) { + console['log'](e); + } + throw e; + } + return true; + }); + }; + } + }, + handleEx: function(cm, input) { + exCommandDispatcher.processCommand(cm, input); + }, + + defineMotion: defineMotion, + defineAction: defineAction, + defineOperator: defineOperator, + mapCommand: mapCommand, + _mapCommand: _mapCommand, + + defineRegister: defineRegister, + + exitVisualMode: exitVisualMode, + exitInsertMode: exitInsertMode + }; + function InputState() { + this.prefixRepeat = []; + this.motionRepeat = []; + + this.operator = null; + this.operatorArgs = null; + this.motion = null; + this.motionArgs = null; + this.keyBuffer = []; // For matching multi-key commands. + this.registerName = null; // Defaults to the unnamed register. + } + InputState.prototype.pushRepeatDigit = function(n) { + if (!this.operator) { + this.prefixRepeat = this.prefixRepeat.concat(n); + } else { + this.motionRepeat = this.motionRepeat.concat(n); + } + }; + InputState.prototype.getRepeat = function() { + var repeat = 0; + if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { + repeat = 1; + if (this.prefixRepeat.length > 0) { + repeat *= parseInt(this.prefixRepeat.join(''), 10); + } + if (this.motionRepeat.length > 0) { + repeat *= parseInt(this.motionRepeat.join(''), 10); + } + } + return repeat; + }; + + function clearInputState(cm, reason) { + cm.state.vim.inputState = new InputState(); + CodeMirror.signal(cm, 'vim-command-done', reason); + } + function Register(text, linewise, blockwise) { + this.clear(); + this.keyBuffer = [text || '']; + this.insertModeChanges = []; + this.searchQueries = []; + this.linewise = !!linewise; + this.blockwise = !!blockwise; + } + Register.prototype = { + setText: function(text, linewise, blockwise) { + this.keyBuffer = [text || '']; + this.linewise = !!linewise; + this.blockwise = !!blockwise; + }, + pushText: function(text, linewise) { + if (linewise) { + if (!this.linewise) { + this.keyBuffer.push('\n'); + } + this.linewise = true; + } + this.keyBuffer.push(text); + }, + pushInsertModeChanges: function(changes) { + this.insertModeChanges.push(createInsertModeChanges(changes)); + }, + pushSearchQuery: function(query) { + this.searchQueries.push(query); + }, + clear: function() { + this.keyBuffer = []; + this.insertModeChanges = []; + this.searchQueries = []; + this.linewise = false; + }, + toString: function() { + return this.keyBuffer.join(''); + } + }; + function defineRegister(name, register) { + var registers = vimGlobalState.registerController.registers[name]; + if (!name || name.length != 1) { + throw Error('Register name must be 1 character'); + } + registers[name] = register; + validRegisters.push(name); + } + function RegisterController(registers) { + this.registers = registers; + this.unnamedRegister = registers['"'] = new Register(); + registers['.'] = new Register(); + registers[':'] = new Register(); + registers['/'] = new Register(); + } + RegisterController.prototype = { + pushText: function(registerName, operator, text, linewise, blockwise) { + if (linewise && text.charAt(0) == '\n') { + text = text.slice(1) + '\n'; + } + if (linewise && text.charAt(text.length - 1) !== '\n'){ + text += '\n'; + } + var register = this.isValidRegister(registerName) ? + this.getRegister(registerName) : null; + if (!register) { + switch (operator) { + case 'yank': + this.registers['0'] = new Register(text, linewise, blockwise); + break; + case 'delete': + case 'change': + if (text.indexOf('\n') == -1) { + this.registers['-'] = new Register(text, linewise); + } else { + this.shiftNumericRegisters_(); + this.registers['1'] = new Register(text, linewise); + } + break; + } + this.unnamedRegister.setText(text, linewise, blockwise); + return; + } + var append = isUpperCase(registerName); + if (append) { + register.pushText(text, linewise); + } else { + register.setText(text, linewise, blockwise); + } + this.unnamedRegister.setText(register.toString(), linewise); + }, + getRegister: function(name) { + if (!this.isValidRegister(name)) { + return this.unnamedRegister; + } + name = name.toLowerCase(); + if (!this.registers[name]) { + this.registers[name] = new Register(); + } + return this.registers[name]; + }, + isValidRegister: function(name) { + return name && inArray(name, validRegisters); + }, + shiftNumericRegisters_: function() { + for (var i = 9; i >= 2; i--) { + this.registers[i] = this.getRegister('' + (i - 1)); + } + } + }; + function HistoryController() { + this.historyBuffer = []; + this.iterator; + this.initialPrefix = null; + } + HistoryController.prototype = { + nextMatch: function (input, up) { + var historyBuffer = this.historyBuffer; + var dir = up ? -1 : 1; + if (this.initialPrefix === null) this.initialPrefix = input; + for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) { + var element = historyBuffer[i]; + for (var j = 0; j <= element.length; j++) { + if (this.initialPrefix == element.substring(0, j)) { + this.iterator = i; + return element; + } + } + } + if (i >= historyBuffer.length) { + this.iterator = historyBuffer.length; + return this.initialPrefix; + } + if (i < 0 ) return input; + }, + pushInput: function(input) { + var index = this.historyBuffer.indexOf(input); + if (index > -1) this.historyBuffer.splice(index, 1); + if (input.length) this.historyBuffer.push(input); + }, + reset: function() { + this.initialPrefix = null; + this.iterator = this.historyBuffer.length; + } + }; + var commandDispatcher = { + matchCommand: function(keys, keyMap, inputState, context) { + var matches = commandMatches(keys, keyMap, context, inputState); + if (!matches.full && !matches.partial) { + return {type: 'none'}; + } else if (!matches.full && matches.partial) { + return {type: 'partial'}; + } + + var bestMatch; + for (var i = 0; i < matches.full.length; i++) { + var match = matches.full[i]; + if (!bestMatch) { + bestMatch = match; + } + } + if (bestMatch.keys.slice(-11) == '') { + var character = lastChar(keys); + if (//.test(character)) return {type: 'none'}; + inputState.selectedCharacter = character; + } + return {type: 'full', command: bestMatch}; + }, + processCommand: function(cm, vim, command) { + vim.inputState.repeatOverride = command.repeatOverride; + switch (command.type) { + case 'motion': + this.processMotion(cm, vim, command); + break; + case 'operator': + this.processOperator(cm, vim, command); + break; + case 'operatorMotion': + this.processOperatorMotion(cm, vim, command); + break; + case 'action': + this.processAction(cm, vim, command); + break; + case 'search': + this.processSearch(cm, vim, command); + break; + case 'ex': + case 'keyToEx': + this.processEx(cm, vim, command); + break; + default: + break; + } + }, + processMotion: function(cm, vim, command) { + vim.inputState.motion = command.motion; + vim.inputState.motionArgs = copyArgs(command.motionArgs); + this.evalInput(cm, vim); + }, + processOperator: function(cm, vim, command) { + var inputState = vim.inputState; + if (inputState.operator) { + if (inputState.operator == command.operator) { + inputState.motion = 'expandToLine'; + inputState.motionArgs = { linewise: true }; + this.evalInput(cm, vim); + return; + } else { + clearInputState(cm); + } + } + inputState.operator = command.operator; + inputState.operatorArgs = copyArgs(command.operatorArgs); + if (vim.visualMode) { + this.evalInput(cm, vim); + } + }, + processOperatorMotion: function(cm, vim, command) { + var visualMode = vim.visualMode; + var operatorMotionArgs = copyArgs(command.operatorMotionArgs); + if (operatorMotionArgs) { + if (visualMode && operatorMotionArgs.visualLine) { + vim.visualLine = true; + } + } + this.processOperator(cm, vim, command); + if (!visualMode) { + this.processMotion(cm, vim, command); + } + }, + processAction: function(cm, vim, command) { + var inputState = vim.inputState; + var repeat = inputState.getRepeat(); + var repeatIsExplicit = !!repeat; + var actionArgs = copyArgs(command.actionArgs) || {}; + if (inputState.selectedCharacter) { + actionArgs.selectedCharacter = inputState.selectedCharacter; + } + if (command.operator) { + this.processOperator(cm, vim, command); + } + if (command.motion) { + this.processMotion(cm, vim, command); + } + if (command.motion || command.operator) { + this.evalInput(cm, vim); + } + actionArgs.repeat = repeat || 1; + actionArgs.repeatIsExplicit = repeatIsExplicit; + actionArgs.registerName = inputState.registerName; + clearInputState(cm); + vim.lastMotion = null; + if (command.isEdit) { + this.recordLastEdit(vim, inputState, command); + } + actions[command.action](cm, actionArgs, vim); + }, + processSearch: function(cm, vim, command) { + if (!cm.getSearchCursor) { + return; + } + var forward = command.searchArgs.forward; + var wholeWordOnly = command.searchArgs.wholeWordOnly; + getSearchState(cm).setReversed(!forward); + var promptPrefix = (forward) ? '/' : '?'; + var originalQuery = getSearchState(cm).getQuery(); + var originalScrollPos = cm.getScrollInfo(); + function handleQuery(query, ignoreCase, smartCase) { + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + try { + updateSearchQuery(cm, query, ignoreCase, smartCase); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + query); + clearInputState(cm); + return; + } + commandDispatcher.processMotion(cm, vim, { + type: 'motion', + motion: 'findNext', + motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist } + }); + } + function onPromptClose(query) { + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + handleQuery(query, true /** ignoreCase */, true /** smartCase */); + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + logSearchQuery(macroModeState, query); + } + } + function onPromptKeyUp(e, query, close) { + var keyName = CodeMirror.keyName(e), up; + if (keyName == 'Up' || keyName == 'Down') { + up = keyName == 'Up' ? true : false; + query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; + close(query); + } else { + if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') + vimGlobalState.searchHistoryController.reset(); + } + var parsedQuery; + try { + parsedQuery = updateSearchQuery(cm, query, + true /** ignoreCase */, true /** smartCase */); + } catch (e) { + } + if (parsedQuery) { + cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); + } else { + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + } + } + function onPromptKeyDown(e, query, close) { + var keyName = CodeMirror.keyName(e); + if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || + (keyName == 'Backspace' && query == '')) { + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + updateSearchQuery(cm, originalQuery); + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } else if (keyName == 'Ctrl-U') { + CodeMirror.e_stop(e); + close(''); + } + } + switch (command.searchArgs.querySrc) { + case 'prompt': + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { + var query = macroModeState.replaySearchQueries.shift(); + handleQuery(query, true /** ignoreCase */, false /** smartCase */); + } else { + showPrompt(cm, { + onClose: onPromptClose, + prefix: promptPrefix, + desc: searchPromptDesc, + onKeyUp: onPromptKeyUp, + onKeyDown: onPromptKeyDown + }); + } + break; + case 'wordUnderCursor': + var word = expandWordUnderCursor(cm, false /** inclusive */, + true /** forward */, false /** bigWord */, + true /** noSymbol */); + var isKeyword = true; + if (!word) { + word = expandWordUnderCursor(cm, false /** inclusive */, + true /** forward */, false /** bigWord */, + false /** noSymbol */); + isKeyword = false; + } + if (!word) { + return; + } + var query = cm.getLine(word.start.line).substring(word.start.ch, + word.end.ch); + if (isKeyword && wholeWordOnly) { + query = '\\b' + query + '\\b'; + } else { + query = escapeRegex(query); + } + vimGlobalState.jumpList.cachedCursor = cm.getCursor(); + cm.setCursor(word.start); + + handleQuery(query, true /** ignoreCase */, false /** smartCase */); + break; + } + }, + processEx: function(cm, vim, command) { + function onPromptClose(input) { + vimGlobalState.exCommandHistoryController.pushInput(input); + vimGlobalState.exCommandHistoryController.reset(); + exCommandDispatcher.processCommand(cm, input); + } + function onPromptKeyDown(e, input, close) { + var keyName = CodeMirror.keyName(e), up; + if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || + (keyName == 'Backspace' && input == '')) { + vimGlobalState.exCommandHistoryController.pushInput(input); + vimGlobalState.exCommandHistoryController.reset(); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } + if (keyName == 'Up' || keyName == 'Down') { + up = keyName == 'Up' ? true : false; + input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; + close(input); + } else if (keyName == 'Ctrl-U') { + CodeMirror.e_stop(e); + close(''); + } else { + if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') + vimGlobalState.exCommandHistoryController.reset(); + } + } + if (command.type == 'keyToEx') { + exCommandDispatcher.processCommand(cm, command.exArgs.input); + } else { + if (vim.visualMode) { + showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>', + onKeyDown: onPromptKeyDown}); + } else { + showPrompt(cm, { onClose: onPromptClose, prefix: ':', + onKeyDown: onPromptKeyDown}); + } + } + }, + evalInput: function(cm, vim) { + var inputState = vim.inputState; + var motion = inputState.motion; + var motionArgs = inputState.motionArgs || {}; + var operator = inputState.operator; + var operatorArgs = inputState.operatorArgs || {}; + var registerName = inputState.registerName; + var sel = vim.sel; + var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head')); + var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor')); + var oldHead = copyCursor(origHead); + var oldAnchor = copyCursor(origAnchor); + var newHead, newAnchor; + var repeat; + if (operator) { + this.recordLastEdit(vim, inputState); + } + if (inputState.repeatOverride !== undefined) { + repeat = inputState.repeatOverride; + } else { + repeat = inputState.getRepeat(); + } + if (repeat > 0 && motionArgs.explicitRepeat) { + motionArgs.repeatIsExplicit = true; + } else if (motionArgs.noRepeat || + (!motionArgs.explicitRepeat && repeat === 0)) { + repeat = 1; + motionArgs.repeatIsExplicit = false; + } + if (inputState.selectedCharacter) { + motionArgs.selectedCharacter = operatorArgs.selectedCharacter = + inputState.selectedCharacter; + } + motionArgs.repeat = repeat; + clearInputState(cm); + if (motion) { + var motionResult = motions[motion](cm, origHead, motionArgs, vim); + vim.lastMotion = motions[motion]; + if (!motionResult) { + return; + } + if (motionArgs.toJumplist) { + if (!operator && cm.ace.curOp != null) + cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch + var jumpList = vimGlobalState.jumpList; + var cachedCursor = jumpList.cachedCursor; + if (cachedCursor) { + recordJumpPosition(cm, cachedCursor, motionResult); + delete jumpList.cachedCursor; + } else { + recordJumpPosition(cm, origHead, motionResult); + } + } + if (motionResult instanceof Array) { + newAnchor = motionResult[0]; + newHead = motionResult[1]; + } else { + newHead = motionResult; + } + if (!newHead) { + newHead = copyCursor(origHead); + } + if (vim.visualMode) { + if (!(vim.visualBlock && newHead.ch === Infinity)) { + newHead = clipCursorToContent(cm, newHead, vim.visualBlock); + } + if (newAnchor) { + newAnchor = clipCursorToContent(cm, newAnchor, true); + } + newAnchor = newAnchor || oldAnchor; + sel.anchor = newAnchor; + sel.head = newHead; + updateCmSelection(cm); + updateMark(cm, vim, '<', + cursorIsBefore(newAnchor, newHead) ? newAnchor + : newHead); + updateMark(cm, vim, '>', + cursorIsBefore(newAnchor, newHead) ? newHead + : newAnchor); + } else if (!operator) { + newHead = clipCursorToContent(cm, newHead); + cm.setCursor(newHead.line, newHead.ch); + } + } + if (operator) { + if (operatorArgs.lastSel) { + newAnchor = oldAnchor; + var lastSel = operatorArgs.lastSel; + var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); + var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); + if (lastSel.visualLine) { + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } else if (lastSel.visualBlock) { + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); + } else if (lastSel.head.line == lastSel.anchor.line) { + newHead = Pos(oldAnchor.line, oldAnchor.ch + chOffset); + } else { + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } + vim.visualMode = true; + vim.visualLine = lastSel.visualLine; + vim.visualBlock = lastSel.visualBlock; + sel = vim.sel = { + anchor: newAnchor, + head: newHead + }; + updateCmSelection(cm); + } else if (vim.visualMode) { + operatorArgs.lastSel = { + anchor: copyCursor(sel.anchor), + head: copyCursor(sel.head), + visualBlock: vim.visualBlock, + visualLine: vim.visualLine + }; + } + var curStart, curEnd, linewise, mode; + var cmSel; + if (vim.visualMode) { + curStart = cursorMin(sel.head, sel.anchor); + curEnd = cursorMax(sel.head, sel.anchor); + linewise = vim.visualLine || operatorArgs.linewise; + mode = vim.visualBlock ? 'block' : + linewise ? 'line' : + 'char'; + cmSel = makeCmSelection(cm, { + anchor: curStart, + head: curEnd + }, mode); + if (linewise) { + var ranges = cmSel.ranges; + if (mode == 'block') { + for (var i = 0; i < ranges.length; i++) { + ranges[i].head.ch = lineLength(cm, ranges[i].head.line); + } + } else if (mode == 'line') { + ranges[0].head = Pos(ranges[0].head.line + 1, 0); + } + } + } else { + curStart = copyCursor(newAnchor || oldAnchor); + curEnd = copyCursor(newHead || oldHead); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curStart; + curStart = curEnd; + curEnd = tmp; + } + linewise = motionArgs.linewise || operatorArgs.linewise; + if (linewise) { + expandSelectionToLine(cm, curStart, curEnd); + } else if (motionArgs.forward) { + clipToLine(cm, curStart, curEnd); + } + mode = 'char'; + var exclusive = !motionArgs.inclusive || linewise; + cmSel = makeCmSelection(cm, { + anchor: curStart, + head: curEnd + }, mode, exclusive); + } + cm.setSelections(cmSel.ranges, cmSel.primary); + vim.lastMotion = null; + operatorArgs.repeat = repeat; // For indent in visual mode. + operatorArgs.registerName = registerName; + operatorArgs.linewise = linewise; + var operatorMoveTo = operators[operator]( + cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); + if (vim.visualMode) { + exitVisualMode(cm, operatorMoveTo != null); + } + if (operatorMoveTo) { + cm.setCursor(operatorMoveTo); + } + } + }, + recordLastEdit: function(vim, inputState, actionCommand) { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { return; } + vim.lastEditInputState = inputState; + vim.lastEditActionCommand = actionCommand; + macroModeState.lastInsertModeChanges.changes = []; + macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false; + } + }; + var motions = { + moveToTopLine: function(cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).top + motionArgs.repeat -1; + return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + moveToMiddleLine: function(cm) { + var range = getUserVisibleLines(cm); + var line = Math.floor((range.top + range.bottom) * 0.5); + return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + moveToBottomLine: function(cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1; + return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + expandToLine: function(_cm, head, motionArgs) { + var cur = head; + return Pos(cur.line + motionArgs.repeat - 1, Infinity); + }, + findNext: function(cm, _head, motionArgs) { + var state = getSearchState(cm); + var query = state.getQuery(); + if (!query) { + return; + } + var prev = !motionArgs.forward; + prev = (state.isReversed()) ? !prev : prev; + highlightSearchMatches(cm, query); + return findNext(cm, prev/** prev */, query, motionArgs.repeat); + }, + goToMark: function(cm, _head, motionArgs, vim) { + var mark = vim.marks[motionArgs.selectedCharacter]; + if (mark) { + var pos = mark.find(); + return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos; + } + return null; + }, + moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) { + if (vim.visualBlock && motionArgs.sameLine) { + var sel = vim.sel; + return [ + clipCursorToContent(cm, Pos(sel.anchor.line, sel.head.ch)), + clipCursorToContent(cm, Pos(sel.head.line, sel.anchor.ch)) + ]; + } else { + return ([vim.sel.head, vim.sel.anchor]); + } + }, + jumpToMark: function(cm, head, motionArgs, vim) { + var best = head; + for (var i = 0; i < motionArgs.repeat; i++) { + var cursor = best; + for (var key in vim.marks) { + if (!isLowerCase(key)) { + continue; + } + var mark = vim.marks[key].find(); + var isWrongDirection = (motionArgs.forward) ? + cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); + + if (isWrongDirection) { + continue; + } + if (motionArgs.linewise && (mark.line == cursor.line)) { + continue; + } + + var equal = cursorEqual(cursor, best); + var between = (motionArgs.forward) ? + cursorIsBetween(cursor, mark, best) : + cursorIsBetween(best, mark, cursor); + + if (equal || between) { + best = mark; + } + } + } + + if (motionArgs.linewise) { + best = Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line))); + } + return best; + }, + moveByCharacters: function(_cm, head, motionArgs) { + var cur = head; + var repeat = motionArgs.repeat; + var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat; + return Pos(cur.line, ch); + }, + moveByLines: function(cm, head, motionArgs, vim) { + var cur = head; + var endCh = cur.ch; + switch (vim.lastMotion) { + case this.moveByLines: + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveToColumn: + case this.moveToEol: + endCh = vim.lastHPos; + break; + default: + vim.lastHPos = endCh; + } + var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0); + var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat; + var first = cm.firstLine(); + var last = cm.lastLine(); + if ((line < first && cur.line == first) || + (line > last && cur.line == last)) { + return; + } + var fold = cm.ace.session.getFoldLine(line); + if (fold) { + if (motionArgs.forward) { + if (line > fold.start.row) + line = fold.end.row + 1; + } else { + line = fold.start.row; + } + } + if (motionArgs.toFirstChar){ + endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line)); + vim.lastHPos = endCh; + } + vim.lastHSPos = cm.charCoords(Pos(line, endCh),'div').left; + return Pos(line, endCh); + }, + moveByDisplayLines: function(cm, head, motionArgs, vim) { + var cur = head; + switch (vim.lastMotion) { + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveByLines: + case this.moveToColumn: + case this.moveToEol: + break; + default: + vim.lastHSPos = cm.charCoords(cur,'div').left; + } + var repeat = motionArgs.repeat; + var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos); + if (res.hitSide) { + if (motionArgs.forward) { + var lastCharCoords = cm.charCoords(res, 'div'); + var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos }; + var res = cm.coordsChar(goalCoords, 'div'); + } else { + var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div'); + resCoords.left = vim.lastHSPos; + res = cm.coordsChar(resCoords, 'div'); + } + } + vim.lastHPos = res.ch; + return res; + }, + moveByPage: function(cm, head, motionArgs) { + var curStart = head; + var repeat = motionArgs.repeat; + return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page'); + }, + moveByParagraph: function(cm, head, motionArgs) { + var dir = motionArgs.forward ? 1 : -1; + return findParagraph(cm, head, motionArgs.repeat, dir); + }, + moveByScroll: function(cm, head, motionArgs, vim) { + var scrollbox = cm.getScrollInfo(); + var curEnd = null; + var repeat = motionArgs.repeat; + if (!repeat) { + repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight()); + } + var orig = cm.charCoords(head, 'local'); + motionArgs.repeat = repeat; + var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); + if (!curEnd) { + return null; + } + var dest = cm.charCoords(curEnd, 'local'); + cm.scrollTo(null, scrollbox.top + dest.top - orig.top); + return curEnd; + }, + moveByWords: function(cm, head, motionArgs) { + return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, + !!motionArgs.wordEnd, !!motionArgs.bigWord); + }, + moveTillCharacter: function(cm, _head, motionArgs) { + var repeat = motionArgs.repeat; + var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter); + var increment = motionArgs.forward ? -1 : 1; + recordLastCharacterSearch(increment, motionArgs); + if (!curEnd) return null; + curEnd.ch += increment; + return curEnd; + }, + moveToCharacter: function(cm, head, motionArgs) { + var repeat = motionArgs.repeat; + recordLastCharacterSearch(0, motionArgs); + return moveToCharacter(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter) || head; + }, + moveToSymbol: function(cm, head, motionArgs) { + var repeat = motionArgs.repeat; + return findSymbol(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter) || head; + }, + moveToColumn: function(cm, head, motionArgs, vim) { + var repeat = motionArgs.repeat; + vim.lastHPos = repeat - 1; + vim.lastHSPos = cm.charCoords(head,'div').left; + return moveToColumn(cm, repeat); + }, + moveToEol: function(cm, head, motionArgs, vim) { + var cur = head; + vim.lastHPos = Infinity; + var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity); + var end=cm.clipPos(retval); + end.ch--; + vim.lastHSPos = cm.charCoords(end,'div').left; + return retval; + }, + moveToFirstNonWhiteSpaceCharacter: function(cm, head) { + var cursor = head; + return Pos(cursor.line, + findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line))); + }, + moveToMatchedSymbol: function(cm, head) { + var cursor = head; + var line = cursor.line; + var ch = cursor.ch; + var lineText = cm.getLine(line); + var symbol; + do { + symbol = lineText.charAt(ch++); + if (symbol && isMatchableSymbol(symbol)) { + var style = cm.getTokenTypeAt(Pos(line, ch)); + if (style !== "string" && style !== "comment") { + break; + } + } + } while (symbol); + if (symbol) { + var matched = cm.findMatchingBracket(Pos(line, ch)); + return matched.to; + } else { + return cursor; + } + }, + moveToStartOfLine: function(_cm, head) { + return Pos(head.line, 0); + }, + moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) { + var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine(); + if (motionArgs.repeatIsExplicit) { + lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); + } + return Pos(lineNum, + findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum))); + }, + textObjectManipulation: function(cm, head, motionArgs, vim) { + var mirroredPairs = {'(': ')', ')': '(', + '{': '}', '}': '{', + '[': ']', ']': '['}; + var selfPaired = {'\'': true, '"': true}; + + var character = motionArgs.selectedCharacter; + if (character == 'b') { + character = '('; + } else if (character == 'B') { + character = '{'; + } + var inclusive = !motionArgs.textObjectInner; + + var tmp; + if (mirroredPairs[character]) { + tmp = selectCompanionObject(cm, head, character, inclusive); + } else if (selfPaired[character]) { + tmp = findBeginningAndEnd(cm, head, character, inclusive); + } else if (character === 'W') { + tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, + true /** bigWord */); + } else if (character === 'w') { + tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, + false /** bigWord */); + } else if (character === 'p') { + tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); + motionArgs.linewise = true; + if (vim.visualMode) { + if (!vim.visualLine) { vim.visualLine = true; } + } else { + var operatorArgs = vim.inputState.operatorArgs; + if (operatorArgs) { operatorArgs.linewise = true; } + tmp.end.line--; + } + } else { + return null; + } + + if (!cm.state.vim.visualMode) { + return [tmp.start, tmp.end]; + } else { + return expandSelection(cm, tmp.start, tmp.end); + } + }, + + repeatLastCharacterSearch: function(cm, head, motionArgs) { + var lastSearch = vimGlobalState.lastChararacterSearch; + var repeat = motionArgs.repeat; + var forward = motionArgs.forward === lastSearch.forward; + var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1); + cm.moveH(-increment, 'char'); + motionArgs.inclusive = forward ? true : false; + var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter); + if (!curEnd) { + cm.moveH(increment, 'char'); + return head; + } + curEnd.ch += increment; + return curEnd; + } + }; + + function defineMotion(name, fn) { + motions[name] = fn; + } + + function fillArray(val, times) { + var arr = []; + for (var i = 0; i < times; i++) { + arr.push(val); + } + return arr; + } + var operators = { + change: function(cm, args, ranges) { + var finalHead, text; + var vim = cm.state.vim; + vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock = vim.visualBlock; + if (!vim.visualMode) { + var anchor = ranges[0].anchor, + head = ranges[0].head; + text = cm.getRange(anchor, head); + var lastState = vim.lastEditInputState || {}; + if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { + var match = (/\s+$/).exec(text); + if (match && lastState.motionArgs && lastState.motionArgs.forward) { + head = offsetCursor(head, 0, - match[0].length); + text = text.slice(0, - match[0].length); + } + } + var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE); + var wasLastLine = cm.firstLine() == cm.lastLine(); + if (head.line > cm.lastLine() && args.linewise && !wasLastLine) { + cm.replaceRange('', prevLineEnd, head); + } else { + cm.replaceRange('', anchor, head); + } + if (args.linewise) { + if (!wasLastLine) { + cm.setCursor(prevLineEnd); + CodeMirror.commands.newlineAndIndent(cm); + } + anchor.ch = Number.MAX_VALUE; + } + finalHead = anchor; + } else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = cursorMin(ranges[0].head, ranges[0].anchor); + } + vimGlobalState.registerController.pushText( + args.registerName, 'change', text, + args.linewise, ranges.length > 1); + actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim); + }, + 'delete': function(cm, args, ranges) { + var finalHead, text; + var vim = cm.state.vim; + if (!vim.visualBlock) { + var anchor = ranges[0].anchor, + head = ranges[0].head; + if (args.linewise && + head.line != cm.firstLine() && + anchor.line == cm.lastLine() && + anchor.line == head.line - 1) { + if (anchor.line == cm.firstLine()) { + anchor.ch = 0; + } else { + anchor = Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); + } + } + text = cm.getRange(anchor, head); + cm.replaceRange('', anchor, head); + finalHead = anchor; + if (args.linewise) { + finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); + } + } else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = ranges[0].anchor; + } + vimGlobalState.registerController.pushText( + args.registerName, 'delete', text, + args.linewise, vim.visualBlock); + return clipCursorToContent(cm, finalHead); + }, + indent: function(cm, args, ranges) { + var vim = cm.state.vim; + var startLine = ranges[0].anchor.line; + var endLine = vim.visualBlock ? + ranges[ranges.length - 1].anchor.line : + ranges[0].head.line; + var repeat = (vim.visualMode) ? args.repeat : 1; + if (args.linewise) { + endLine--; + } + for (var i = startLine; i <= endLine; i++) { + for (var j = 0; j < repeat; j++) { + cm.indentLine(i, args.indentRight); + } + } + return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); + }, + changeCase: function(cm, args, ranges, oldAnchor, newHead) { + var selections = cm.getSelections(); + var swapped = []; + var toLower = args.toLower; + for (var j = 0; j < selections.length; j++) { + var toSwap = selections[j]; + var text = ''; + if (toLower === true) { + text = toSwap.toLowerCase(); + } else if (toLower === false) { + text = toSwap.toUpperCase(); + } else { + for (var i = 0; i < toSwap.length; i++) { + var character = toSwap.charAt(i); + text += isUpperCase(character) ? character.toLowerCase() : + character.toUpperCase(); + } + } + swapped.push(text); + } + cm.replaceSelections(swapped); + if (args.shouldMoveCursor){ + return newHead; + } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { + return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); + } else if (args.linewise){ + return oldAnchor; + } else { + return cursorMin(ranges[0].anchor, ranges[0].head); + } + }, + yank: function(cm, args, ranges, oldAnchor) { + var vim = cm.state.vim; + var text = cm.getSelection(); + var endPos = vim.visualMode + ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) + : oldAnchor; + vimGlobalState.registerController.pushText( + args.registerName, 'yank', + text, args.linewise, vim.visualBlock); + return endPos; + } + }; + + function defineOperator(name, fn) { + operators[name] = fn; + } + + var actions = { + jumpListWalk: function(cm, actionArgs, vim) { + if (vim.visualMode) { + return; + } + var repeat = actionArgs.repeat; + var forward = actionArgs.forward; + var jumpList = vimGlobalState.jumpList; + + var mark = jumpList.move(cm, forward ? repeat : -repeat); + var markPos = mark ? mark.find() : undefined; + markPos = markPos ? markPos : cm.getCursor(); + cm.setCursor(markPos); + cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch + }, + scroll: function(cm, actionArgs, vim) { + if (vim.visualMode) { + return; + } + var repeat = actionArgs.repeat || 1; + var lineHeight = cm.defaultTextHeight(); + var top = cm.getScrollInfo().top; + var delta = lineHeight * repeat; + var newPos = actionArgs.forward ? top + delta : top - delta; + var cursor = copyCursor(cm.getCursor()); + var cursorCoords = cm.charCoords(cursor, 'local'); + if (actionArgs.forward) { + if (newPos > cursorCoords.top) { + cursor.line += (newPos - cursorCoords.top) / lineHeight; + cursor.line = Math.ceil(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo(null, cursorCoords.top); + } else { + cm.scrollTo(null, newPos); + } + } else { + var newBottom = newPos + cm.getScrollInfo().clientHeight; + if (newBottom < cursorCoords.bottom) { + cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; + cursor.line = Math.floor(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo( + null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); + } else { + cm.scrollTo(null, newPos); + } + } + }, + scrollToCursor: function(cm, actionArgs) { + var lineNum = cm.getCursor().line; + var charCoords = cm.charCoords(Pos(lineNum, 0), 'local'); + var height = cm.getScrollInfo().clientHeight; + var y = charCoords.top; + var lineHeight = charCoords.bottom - y; + switch (actionArgs.position) { + case 'center': y = y - (height / 2) + lineHeight; + break; + case 'bottom': y = y - height + lineHeight*1.4; + break; + case 'top': y = y + lineHeight*0.4; + break; + } + cm.scrollTo(null, y); + }, + replayMacro: function(cm, actionArgs, vim) { + var registerName = actionArgs.selectedCharacter; + var repeat = actionArgs.repeat; + var macroModeState = vimGlobalState.macroModeState; + if (registerName == '@') { + registerName = macroModeState.latestRegister; + } + while(repeat--){ + executeMacroRegister(cm, vim, macroModeState, registerName); + } + }, + enterMacroRecordMode: function(cm, actionArgs) { + var macroModeState = vimGlobalState.macroModeState; + var registerName = actionArgs.selectedCharacter; + macroModeState.enterMacroRecordMode(cm, registerName); + }, + enterInsertMode: function(cm, actionArgs, vim) { + if (cm.getOption('readOnly')) { return; } + vim.insertMode = true; + vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1; + var insertAt = (actionArgs) ? actionArgs.insertAt : null; + var sel = vim.sel; + var head = actionArgs.head || cm.getCursor('head'); + var height = cm.listSelections().length; + if (insertAt == 'eol') { + head = Pos(head.line, lineLength(cm, head.line)); + } else if (insertAt == 'charAfter') { + head = offsetCursor(head, 0, 1); + } else if (insertAt == 'firstNonBlank') { + head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head); + } else if (insertAt == 'startOfSelectedArea') { + if (!vim.visualBlock) { + if (sel.head.line < sel.anchor.line) { + head = sel.head; + } else { + head = Pos(sel.anchor.line, 0); + } + } else { + head = Pos( + Math.min(sel.head.line, sel.anchor.line), + Math.min(sel.head.ch, sel.anchor.ch)); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } else if (insertAt == 'endOfSelectedArea') { + if (!vim.visualBlock) { + if (sel.head.line >= sel.anchor.line) { + head = offsetCursor(sel.head, 0, 1); + } else { + head = Pos(sel.anchor.line, 0); + } + } else { + head = Pos( + Math.min(sel.head.line, sel.anchor.line), + Math.max(sel.head.ch + 1, sel.anchor.ch)); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } else if (insertAt == 'inplace') { + if (vim.visualMode){ + return; + } + } + cm.setOption('keyMap', 'vim-insert'); + cm.setOption('disableInput', false); + if (actionArgs && actionArgs.replace) { + cm.toggleOverwrite(true); + cm.setOption('keyMap', 'vim-replace'); + CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); + } else { + cm.setOption('keyMap', 'vim-insert'); + CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); + } + if (!vimGlobalState.macroModeState.isPlaying) { + cm.on('change', onChange); + CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + } + if (vim.visualMode) { + exitVisualMode(cm); + } + selectForInsert(cm, head, height); + }, + toggleVisualMode: function(cm, actionArgs, vim) { + var repeat = actionArgs.repeat; + var anchor = cm.getCursor(); + var head; + if (!vim.visualMode) { + vim.visualMode = true; + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + head = clipCursorToContent( + cm, Pos(anchor.line, anchor.ch + repeat - 1), + true /** includeLineBreak */); + vim.sel = { + anchor: anchor, + head: head + }; + CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + } else if (vim.visualLine ^ actionArgs.linewise || + vim.visualBlock ^ actionArgs.blockwise) { + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); + updateCmSelection(cm); + } else { + exitVisualMode(cm); + } + }, + reselectLastSelection: function(cm, _actionArgs, vim) { + var lastSelection = vim.lastSelection; + if (vim.visualMode) { + updateLastSelection(cm, vim); + } + if (lastSelection) { + var anchor = lastSelection.anchorMark.find(); + var head = lastSelection.headMark.find(); + if (!anchor || !head) { + return; + } + vim.sel = { + anchor: anchor, + head: head + }; + vim.visualMode = true; + vim.visualLine = lastSelection.visualLine; + vim.visualBlock = lastSelection.visualBlock; + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + CodeMirror.signal(cm, 'vim-mode-change', { + mode: 'visual', + subMode: vim.visualLine ? 'linewise' : + vim.visualBlock ? 'blockwise' : ''}); + } + }, + joinLines: function(cm, actionArgs, vim) { + var curStart, curEnd; + if (vim.visualMode) { + curStart = cm.getCursor('anchor'); + curEnd = cm.getCursor('head'); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curEnd; + curEnd = curStart; + curStart = tmp; + } + curEnd.ch = lineLength(cm, curEnd.line) - 1; + } else { + var repeat = Math.max(actionArgs.repeat, 2); + curStart = cm.getCursor(); + curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1, + Infinity)); + } + var finalCh = 0; + for (var i = curStart.line; i < curEnd.line; i++) { + finalCh = lineLength(cm, curStart.line); + var tmp = Pos(curStart.line + 1, + lineLength(cm, curStart.line + 1)); + var text = cm.getRange(curStart, tmp); + text = text.replace(/\n\s*/g, ' '); + cm.replaceRange(text, curStart, tmp); + } + var curFinalPos = Pos(curStart.line, finalCh); + if (vim.visualMode) { + exitVisualMode(cm, false); + } + cm.setCursor(curFinalPos); + }, + newLineAndEnterInsertMode: function(cm, actionArgs, vim) { + vim.insertMode = true; + var insertAt = copyCursor(cm.getCursor()); + if (insertAt.line === cm.firstLine() && !actionArgs.after) { + cm.replaceRange('\n', Pos(cm.firstLine(), 0)); + cm.setCursor(cm.firstLine(), 0); + } else { + insertAt.line = (actionArgs.after) ? insertAt.line : + insertAt.line - 1; + insertAt.ch = lineLength(cm, insertAt.line); + cm.setCursor(insertAt); + var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || + CodeMirror.commands.newlineAndIndent; + newlineFn(cm); + } + this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim); + }, + paste: function(cm, actionArgs, vim) { + var cur = copyCursor(cm.getCursor()); + var register = vimGlobalState.registerController.getRegister( + actionArgs.registerName); + var text = register.toString(); + if (!text) { + return; + } + if (actionArgs.matchIndent) { + var tabSize = cm.getOption("tabSize"); + var whitespaceLength = function(str) { + var tabs = (str.split("\t").length - 1); + var spaces = (str.split(" ").length - 1); + return tabs * tabSize + spaces * 1; + }; + var currentLine = cm.getLine(cm.getCursor().line); + var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); + var chompedText = text.replace(/\n$/, ''); + var wasChomped = text !== chompedText; + var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); + var text = chompedText.replace(/^\s*/gm, function(wspace) { + var newIndent = indent + (whitespaceLength(wspace) - firstIndent); + if (newIndent < 0) { + return ""; + } + else if (cm.getOption("indentWithTabs")) { + var quotient = Math.floor(newIndent / tabSize); + return Array(quotient + 1).join('\t'); + } + else { + return Array(newIndent + 1).join(' '); + } + }); + text += wasChomped ? "\n" : ""; + } + if (actionArgs.repeat > 1) { + var text = Array(actionArgs.repeat + 1).join(text); + } + var linewise = register.linewise; + var blockwise = register.blockwise; + if (linewise && !blockwise) { + if(vim.visualMode) { + text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; + } else if (actionArgs.after) { + text = '\n' + text.slice(0, text.length - 1); + cur.ch = lineLength(cm, cur.line); + } else { + cur.ch = 0; + } + } else { + if (blockwise) { + text = text.split('\n'); + for (var i = 0; i < text.length; i++) { + text[i] = (text[i] == '') ? ' ' : text[i]; + } + } + cur.ch += actionArgs.after ? 1 : 0; + } + var curPosFinal; + var idx; + if (vim.visualMode) { + vim.lastPastedText = text; + var lastSelectionCurEnd; + var selectedArea = getSelectedAreaRange(cm, vim); + var selectionStart = selectedArea[0]; + var selectionEnd = selectedArea[1]; + var selectedText = cm.getSelection(); + var selections = cm.listSelections(); + var emptyStrings = new Array(selections.length).join('1').split('1'); + if (vim.lastSelection) { + lastSelectionCurEnd = vim.lastSelection.headMark.find(); + } + vimGlobalState.registerController.unnamedRegister.setText(selectedText); + if (blockwise) { + cm.replaceSelections(emptyStrings); + selectionEnd = Pos(selectionStart.line + text.length-1, selectionStart.ch); + cm.setCursor(selectionStart); + selectBlock(cm, selectionEnd); + cm.replaceSelections(text); + curPosFinal = selectionStart; + } else if (vim.visualBlock) { + cm.replaceSelections(emptyStrings); + cm.setCursor(selectionStart); + cm.replaceRange(text, selectionStart, selectionStart); + curPosFinal = selectionStart; + } else { + cm.replaceRange(text, selectionStart, selectionEnd); + curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); + } + if(lastSelectionCurEnd) { + vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); + } + if (linewise) { + curPosFinal.ch=0; + } + } else { + if (blockwise) { + cm.setCursor(cur); + for (var i = 0; i < text.length; i++) { + var line = cur.line+i; + if (line > cm.lastLine()) { + cm.replaceRange('\n', Pos(line, 0)); + } + var lastCh = lineLength(cm, line); + if (lastCh < cur.ch) { + extendLineToColumn(cm, line, cur.ch); + } + } + cm.setCursor(cur); + selectBlock(cm, Pos(cur.line + text.length-1, cur.ch)); + cm.replaceSelections(text); + curPosFinal = cur; + } else { + cm.replaceRange(text, cur); + if (linewise && actionArgs.after) { + curPosFinal = Pos( + cur.line + 1, + findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1))); + } else if (linewise && !actionArgs.after) { + curPosFinal = Pos( + cur.line, + findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line))); + } else if (!linewise && actionArgs.after) { + idx = cm.indexFromPos(cur); + curPosFinal = cm.posFromIndex(idx + text.length - 1); + } else { + idx = cm.indexFromPos(cur); + curPosFinal = cm.posFromIndex(idx + text.length); + } + } + } + if (vim.visualMode) { + exitVisualMode(cm, false); + } + cm.setCursor(curPosFinal); + }, + undo: function(cm, actionArgs) { + cm.operation(function() { + repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); + cm.setCursor(cm.getCursor('anchor')); + }); + }, + redo: function(cm, actionArgs) { + repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)(); + }, + setRegister: function(_cm, actionArgs, vim) { + vim.inputState.registerName = actionArgs.selectedCharacter; + }, + setMark: function(cm, actionArgs, vim) { + var markName = actionArgs.selectedCharacter; + updateMark(cm, vim, markName, cm.getCursor()); + }, + replace: function(cm, actionArgs, vim) { + var replaceWith = actionArgs.selectedCharacter; + var curStart = cm.getCursor(); + var replaceTo; + var curEnd; + var selections = cm.listSelections(); + if (vim.visualMode) { + curStart = cm.getCursor('start'); + curEnd = cm.getCursor('end'); + } else { + var line = cm.getLine(curStart.line); + replaceTo = curStart.ch + actionArgs.repeat; + if (replaceTo > line.length) { + replaceTo=line.length; + } + curEnd = Pos(curStart.line, replaceTo); + } + if (replaceWith=='\n') { + if (!vim.visualMode) cm.replaceRange('', curStart, curEnd); + (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); + } else { + var replaceWithStr = cm.getRange(curStart, curEnd); + replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); + if (vim.visualBlock) { + var spaces = new Array(cm.getOption("tabSize")+1).join(' '); + replaceWithStr = cm.getSelection(); + replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); + cm.replaceSelections(replaceWithStr); + } else { + cm.replaceRange(replaceWithStr, curStart, curEnd); + } + if (vim.visualMode) { + curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? + selections[0].anchor : selections[0].head; + cm.setCursor(curStart); + exitVisualMode(cm, false); + } else { + cm.setCursor(offsetCursor(curEnd, 0, -1)); + } + } + }, + incrementNumberToken: function(cm, actionArgs) { + var cur = cm.getCursor(); + var lineStr = cm.getLine(cur.line); + var re = /-?\d+/g; + var match; + var start; + var end; + var numberStr; + var token; + while ((match = re.exec(lineStr)) !== null) { + token = match[0]; + start = match.index; + end = start + token.length; + if (cur.ch < end)break; + } + if (!actionArgs.backtrack && (end <= cur.ch))return; + if (token) { + var increment = actionArgs.increase ? 1 : -1; + var number = parseInt(token) + (increment * actionArgs.repeat); + var from = Pos(cur.line, start); + var to = Pos(cur.line, end); + numberStr = number.toString(); + cm.replaceRange(numberStr, from, to); + } else { + return; + } + cm.setCursor(Pos(cur.line, start + numberStr.length - 1)); + }, + repeatLastEdit: function(cm, actionArgs, vim) { + var lastEditInputState = vim.lastEditInputState; + if (!lastEditInputState) { return; } + var repeat = actionArgs.repeat; + if (repeat && actionArgs.repeatIsExplicit) { + vim.lastEditInputState.repeatOverride = repeat; + } else { + repeat = vim.lastEditInputState.repeatOverride || repeat; + } + repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */); + }, + exitInsertMode: exitInsertMode + }; + + function defineAction(name, fn) { + actions[name] = fn; + } + function clipCursorToContent(cm, cur, includeLineBreak) { + var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() ); + var maxCh = lineLength(cm, line) - 1; + maxCh = (includeLineBreak) ? maxCh + 1 : maxCh; + var ch = Math.min(Math.max(0, cur.ch), maxCh); + return Pos(line, ch); + } + function copyArgs(args) { + var ret = {}; + for (var prop in args) { + if (args.hasOwnProperty(prop)) { + ret[prop] = args[prop]; + } + } + return ret; + } + function offsetCursor(cur, offsetLine, offsetCh) { + if (typeof offsetLine === 'object') { + offsetCh = offsetLine.ch; + offsetLine = offsetLine.line; + } + return Pos(cur.line + offsetLine, cur.ch + offsetCh); + } + function getOffset(anchor, head) { + return { + line: head.line - anchor.line, + ch: head.line - anchor.line + }; + } + function commandMatches(keys, keyMap, context, inputState) { + var match, partial = [], full = []; + for (var i = 0; i < keyMap.length; i++) { + var command = keyMap[i]; + if (context == 'insert' && command.context != 'insert' || + command.context && command.context != context || + inputState.operator && command.type == 'action' || + !(match = commandMatch(keys, command.keys))) { continue; } + if (match == 'partial') { partial.push(command); } + if (match == 'full') { full.push(command); } + } + return { + partial: partial.length && partial, + full: full.length && full + }; + } + function commandMatch(pressed, mapped) { + if (mapped.slice(-11) == '') { + var prefixLen = mapped.length - 11; + var pressedPrefix = pressed.slice(0, prefixLen); + var mappedPrefix = mapped.slice(0, prefixLen); + return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' : + mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; + } else { + return pressed == mapped ? 'full' : + mapped.indexOf(pressed) == 0 ? 'partial' : false; + } + } + function lastChar(keys) { + var match = /^.*(<[\w\-]+>)$/.exec(keys); + var selectedCharacter = match ? match[1] : keys.slice(-1); + if (selectedCharacter.length > 1){ + switch(selectedCharacter){ + case '': + selectedCharacter='\n'; + break; + case '': + selectedCharacter=' '; + break; + default: + break; + } + } + return selectedCharacter; + } + function repeatFn(cm, fn, repeat) { + return function() { + for (var i = 0; i < repeat; i++) { + fn(cm); + } + }; + } + function copyCursor(cur) { + return Pos(cur.line, cur.ch); + } + function cursorEqual(cur1, cur2) { + return cur1.ch == cur2.ch && cur1.line == cur2.line; + } + function cursorIsBefore(cur1, cur2) { + if (cur1.line < cur2.line) { + return true; + } + if (cur1.line == cur2.line && cur1.ch < cur2.ch) { + return true; + } + return false; + } + function cursorMin(cur1, cur2) { + if (arguments.length > 2) { + cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1)); + } + return cursorIsBefore(cur1, cur2) ? cur1 : cur2; + } + function cursorMax(cur1, cur2) { + if (arguments.length > 2) { + cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1)); + } + return cursorIsBefore(cur1, cur2) ? cur2 : cur1; + } + function cursorIsBetween(cur1, cur2, cur3) { + var cur1before2 = cursorIsBefore(cur1, cur2); + var cur2before3 = cursorIsBefore(cur2, cur3); + return cur1before2 && cur2before3; + } + function lineLength(cm, lineNum) { + return cm.getLine(lineNum).length; + } + function trim(s) { + if (s.trim) { + return s.trim(); + } + return s.replace(/^\s+|\s+$/g, ''); + } + function escapeRegex(s) { + return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); + } + function extendLineToColumn(cm, lineNum, column) { + var endCh = lineLength(cm, lineNum); + var spaces = new Array(column-endCh+1).join(' '); + cm.setCursor(Pos(lineNum, endCh)); + cm.replaceRange(spaces, cm.getCursor()); + } + function selectBlock(cm, selectionEnd) { + var selections = [], ranges = cm.listSelections(); + var head = copyCursor(cm.clipPos(selectionEnd)); + var isClipped = !cursorEqual(selectionEnd, head); + var curHead = cm.getCursor('head'); + var primIndex = getIndex(ranges, curHead); + var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); + var max = ranges.length - 1; + var index = max - primIndex > primIndex ? max : 0; + var base = ranges[index].anchor; + + var firstLine = Math.min(base.line, head.line); + var lastLine = Math.max(base.line, head.line); + var baseCh = base.ch, headCh = head.ch; + + var dir = ranges[index].head.ch - baseCh; + var newDir = headCh - baseCh; + if (dir > 0 && newDir <= 0) { + baseCh++; + if (!isClipped) { headCh--; } + } else if (dir < 0 && newDir >= 0) { + baseCh--; + if (!wasClipped) { headCh++; } + } else if (dir < 0 && newDir == -1) { + baseCh--; + headCh++; + } + for (var line = firstLine; line <= lastLine; line++) { + var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)}; + selections.push(range); + } + primIndex = head.line == lastLine ? selections.length - 1 : 0; + cm.setSelections(selections); + selectionEnd.ch = headCh; + base.ch = baseCh; + return base; + } + function selectForInsert(cm, head, height) { + var sel = []; + for (var i = 0; i < height; i++) { + var lineHead = offsetCursor(head, i, 0); + sel.push({anchor: lineHead, head: lineHead}); + } + cm.setSelections(sel, 0); + } + function getIndex(ranges, cursor, end) { + for (var i = 0; i < ranges.length; i++) { + var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor); + var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor); + if (atAnchor || atHead) { + return i; + } + } + return -1; + } + function getSelectedAreaRange(cm, vim) { + var lastSelection = vim.lastSelection; + var getCurrentSelectedAreaRange = function() { + var selections = cm.listSelections(); + var start = selections[0]; + var end = selections[selections.length-1]; + var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head; + var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor; + return [selectionStart, selectionEnd]; + }; + var getLastSelectedAreaRange = function() { + var selectionStart = cm.getCursor(); + var selectionEnd = cm.getCursor(); + var block = lastSelection.visualBlock; + if (block) { + var width = block.width; + var height = block.height; + selectionEnd = Pos(selectionStart.line + height, selectionStart.ch + width); + var selections = []; + for (var i = selectionStart.line; i < selectionEnd.line; i++) { + var anchor = Pos(i, selectionStart.ch); + var head = Pos(i, selectionEnd.ch); + var range = {anchor: anchor, head: head}; + selections.push(range); + } + cm.setSelections(selections); + } else { + var start = lastSelection.anchorMark.find(); + var end = lastSelection.headMark.find(); + var line = end.line - start.line; + var ch = end.ch - start.ch; + selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch}; + if (lastSelection.visualLine) { + selectionStart = Pos(selectionStart.line, 0); + selectionEnd = Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); + } + cm.setSelection(selectionStart, selectionEnd); + } + return [selectionStart, selectionEnd]; + }; + if (!vim.visualMode) { + return getLastSelectedAreaRange(); + } else { + return getCurrentSelectedAreaRange(); + } + } + function updateLastSelection(cm, vim) { + var anchor = vim.sel.anchor; + var head = vim.sel.head; + if (vim.lastPastedText) { + head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length); + vim.lastPastedText = null; + } + vim.lastSelection = {'anchorMark': cm.setBookmark(anchor), + 'headMark': cm.setBookmark(head), + 'anchor': copyCursor(anchor), + 'head': copyCursor(head), + 'visualMode': vim.visualMode, + 'visualLine': vim.visualLine, + 'visualBlock': vim.visualBlock}; + } + function expandSelection(cm, start, end) { + var sel = cm.state.vim.sel; + var head = sel.head; + var anchor = sel.anchor; + var tmp; + if (cursorIsBefore(end, start)) { + tmp = end; + end = start; + start = tmp; + } + if (cursorIsBefore(head, anchor)) { + head = cursorMin(start, head); + anchor = cursorMax(anchor, end); + } else { + anchor = cursorMin(start, anchor); + head = cursorMax(head, end); + head = offsetCursor(head, 0, -1); + if (head.ch == -1 && head.line != cm.firstLine()) { + head = Pos(head.line - 1, lineLength(cm, head.line - 1)); + } + } + return [anchor, head]; + } + function updateCmSelection(cm, sel, mode) { + var vim = cm.state.vim; + sel = sel || vim.sel; + var mode = mode || + vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char'; + var cmSel = makeCmSelection(cm, sel, mode); + cm.setSelections(cmSel.ranges, cmSel.primary); + updateFakeCursor(cm); + } + function makeCmSelection(cm, sel, mode, exclusive) { + var head = copyCursor(sel.head); + var anchor = copyCursor(sel.anchor); + if (mode == 'char') { + var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; + var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; + head = offsetCursor(sel.head, 0, headOffset); + anchor = offsetCursor(sel.anchor, 0, anchorOffset); + return { + ranges: [{anchor: anchor, head: head}], + primary: 0 + }; + } else if (mode == 'line') { + if (!cursorIsBefore(sel.head, sel.anchor)) { + anchor.ch = 0; + + var lastLine = cm.lastLine(); + if (head.line > lastLine) { + head.line = lastLine; + } + head.ch = lineLength(cm, head.line); + } else { + head.ch = 0; + anchor.ch = lineLength(cm, anchor.line); + } + return { + ranges: [{anchor: anchor, head: head}], + primary: 0 + }; + } else if (mode == 'block') { + var top = Math.min(anchor.line, head.line), + left = Math.min(anchor.ch, head.ch), + bottom = Math.max(anchor.line, head.line), + right = Math.max(anchor.ch, head.ch) + 1; + var height = bottom - top + 1; + var primary = head.line == top ? 0 : height - 1; + var ranges = []; + for (var i = 0; i < height; i++) { + ranges.push({ + anchor: Pos(top + i, left), + head: Pos(top + i, right) + }); + } + return { + ranges: ranges, + primary: primary + }; + } + } + function getHead(cm) { + var cur = cm.getCursor('head'); + if (cm.getSelection().length == 1) { + cur = cursorMin(cur, cm.getCursor('anchor')); + } + return cur; + } + function exitVisualMode(cm, moveHead) { + var vim = cm.state.vim; + if (moveHead !== false) { + cm.setCursor(clipCursorToContent(cm, vim.sel.head)); + } + updateLastSelection(cm, vim); + vim.visualMode = false; + vim.visualLine = false; + vim.visualBlock = false; + CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + if (vim.fakeCursor) { + vim.fakeCursor.clear(); + } + } + function clipToLine(cm, curStart, curEnd) { + var selection = cm.getRange(curStart, curEnd); + if (/\n\s*$/.test(selection)) { + var lines = selection.split('\n'); + lines.pop(); + var line; + for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { + curEnd.line--; + curEnd.ch = 0; + } + if (line) { + curEnd.line--; + curEnd.ch = lineLength(cm, curEnd.line); + } else { + curEnd.ch = 0; + } + } + } + function expandSelectionToLine(_cm, curStart, curEnd) { + curStart.ch = 0; + curEnd.ch = 0; + curEnd.line++; + } + + function findFirstNonWhiteSpaceCharacter(text) { + if (!text) { + return 0; + } + var firstNonWS = text.search(/\S/); + return firstNonWS == -1 ? text.length : firstNonWS; + } + + function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) { + var cur = getHead(cm); + var line = cm.getLine(cur.line); + var idx = cur.ch; + var test = noSymbol ? wordCharTest[0] : bigWordCharTest [0]; + while (!test(line.charAt(idx))) { + idx++; + if (idx >= line.length) { return null; } + } + + if (bigWord) { + test = bigWordCharTest[0]; + } else { + test = wordCharTest[0]; + if (!test(line.charAt(idx))) { + test = wordCharTest[1]; + } + } + + var end = idx, start = idx; + while (test(line.charAt(end)) && end < line.length) { end++; } + while (test(line.charAt(start)) && start >= 0) { start--; } + start++; + + if (inclusive) { + var wordEnd = end; + while (/\s/.test(line.charAt(end)) && end < line.length) { end++; } + if (wordEnd == end) { + var wordStart = start; + while (/\s/.test(line.charAt(start - 1)) && start > 0) { start--; } + if (!start) { start = wordStart; } + } + } + return { start: Pos(cur.line, start), end: Pos(cur.line, end) }; + } + + function recordJumpPosition(cm, oldCur, newCur) { + if (!cursorEqual(oldCur, newCur)) { + vimGlobalState.jumpList.add(cm, oldCur, newCur); + } + } + + function recordLastCharacterSearch(increment, args) { + vimGlobalState.lastChararacterSearch.increment = increment; + vimGlobalState.lastChararacterSearch.forward = args.forward; + vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter; + } + + var symbolToMode = { + '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket', + '[': 'section', ']': 'section', + '*': 'comment', '/': 'comment', + 'm': 'method', 'M': 'method', + '#': 'preprocess' + }; + var findSymbolModes = { + bracket: { + isComplete: function(state) { + if (state.nextCh === state.symb) { + state.depth++; + if (state.depth >= 1)return true; + } else if (state.nextCh === state.reverseSymb) { + state.depth--; + } + return false; + } + }, + section: { + init: function(state) { + state.curMoveThrough = true; + state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; + }, + isComplete: function(state) { + return state.index === 0 && state.nextCh === state.symb; + } + }, + comment: { + isComplete: function(state) { + var found = state.lastCh === '*' && state.nextCh === '/'; + state.lastCh = state.nextCh; + return found; + } + }, + method: { + init: function(state) { + state.symb = (state.symb === 'm' ? '{' : '}'); + state.reverseSymb = state.symb === '{' ? '}' : '{'; + }, + isComplete: function(state) { + if (state.nextCh === state.symb)return true; + return false; + } + }, + preprocess: { + init: function(state) { + state.index = 0; + }, + isComplete: function(state) { + if (state.nextCh === '#') { + var token = state.lineText.match(/#(\w+)/)[1]; + if (token === 'endif') { + if (state.forward && state.depth === 0) { + return true; + } + state.depth++; + } else if (token === 'if') { + if (!state.forward && state.depth === 0) { + return true; + } + state.depth--; + } + if (token === 'else' && state.depth === 0)return true; + } + return false; + } + } + }; + function findSymbol(cm, repeat, forward, symb) { + var cur = copyCursor(cm.getCursor()); + var increment = forward ? 1 : -1; + var endLine = forward ? cm.lineCount() : -1; + var curCh = cur.ch; + var line = cur.line; + var lineText = cm.getLine(line); + var state = { + lineText: lineText, + nextCh: lineText.charAt(curCh), + lastCh: null, + index: curCh, + symb: symb, + reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], + forward: forward, + depth: 0, + curMoveThrough: false + }; + var mode = symbolToMode[symb]; + if (!mode)return cur; + var init = findSymbolModes[mode].init; + var isComplete = findSymbolModes[mode].isComplete; + if (init) { init(state); } + while (line !== endLine && repeat) { + state.index += increment; + state.nextCh = state.lineText.charAt(state.index); + if (!state.nextCh) { + line += increment; + state.lineText = cm.getLine(line) || ''; + if (increment > 0) { + state.index = 0; + } else { + var lineLen = state.lineText.length; + state.index = (lineLen > 0) ? (lineLen-1) : 0; + } + state.nextCh = state.lineText.charAt(state.index); + } + if (isComplete(state)) { + cur.line = line; + cur.ch = state.index; + repeat--; + } + } + if (state.nextCh || state.curMoveThrough) { + return Pos(line, state.index); + } + return cur; + } + function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { + var lineNum = cur.line; + var pos = cur.ch; + var line = cm.getLine(lineNum); + var dir = forward ? 1 : -1; + var charTests = bigWord ? bigWordCharTest: wordCharTest; + + if (emptyLineIsWord && line == '') { + lineNum += dir; + line = cm.getLine(lineNum); + if (!isLine(cm, lineNum)) { + return null; + } + pos = (forward) ? 0 : line.length; + } + + while (true) { + if (emptyLineIsWord && line == '') { + return { from: 0, to: 0, line: lineNum }; + } + var stop = (dir > 0) ? line.length : -1; + var wordStart = stop, wordEnd = stop; + while (pos != stop) { + var foundWord = false; + for (var i = 0; i < charTests.length && !foundWord; ++i) { + if (charTests[i](line.charAt(pos))) { + wordStart = pos; + while (pos != stop && charTests[i](line.charAt(pos))) { + pos += dir; + } + wordEnd = pos; + foundWord = wordStart != wordEnd; + if (wordStart == cur.ch && lineNum == cur.line && + wordEnd == wordStart + dir) { + continue; + } else { + return { + from: Math.min(wordStart, wordEnd + 1), + to: Math.max(wordStart, wordEnd), + line: lineNum }; + } + } + } + if (!foundWord) { + pos += dir; + } + } + lineNum += dir; + if (!isLine(cm, lineNum)) { + return null; + } + line = cm.getLine(lineNum); + pos = (dir > 0) ? 0 : line.length; + } + throw new Error('The impossible happened.'); + } + function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { + var curStart = copyCursor(cur); + var words = []; + if (forward && !wordEnd || !forward && wordEnd) { + repeat++; + } + var emptyLineIsWord = !(forward && wordEnd); + for (var i = 0; i < repeat; i++) { + var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord); + if (!word) { + var eodCh = lineLength(cm, cm.lastLine()); + words.push(forward + ? {line: cm.lastLine(), from: eodCh, to: eodCh} + : {line: 0, from: 0, to: 0}); + break; + } + words.push(word); + cur = Pos(word.line, forward ? (word.to - 1) : word.from); + } + var shortCircuit = words.length != repeat; + var firstWord = words[0]; + var lastWord = words.pop(); + if (forward && !wordEnd) { + if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) { + lastWord = words.pop(); + } + return Pos(lastWord.line, lastWord.from); + } else if (forward && wordEnd) { + return Pos(lastWord.line, lastWord.to - 1); + } else if (!forward && wordEnd) { + if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) { + lastWord = words.pop(); + } + return Pos(lastWord.line, lastWord.to); + } else { + return Pos(lastWord.line, lastWord.from); + } + } + + function moveToCharacter(cm, repeat, forward, character) { + var cur = cm.getCursor(); + var start = cur.ch; + var idx; + for (var i = 0; i < repeat; i ++) { + var line = cm.getLine(cur.line); + idx = charIdxInLine(start, line, character, forward, true); + if (idx == -1) { + return null; + } + start = idx; + } + return Pos(cm.getCursor().line, idx); + } + + function moveToColumn(cm, repeat) { + var line = cm.getCursor().line; + return clipCursorToContent(cm, Pos(line, repeat - 1)); + } + + function updateMark(cm, vim, markName, pos) { + if (!inArray(markName, validMarks)) { + return; + } + if (vim.marks[markName]) { + vim.marks[markName].clear(); + } + vim.marks[markName] = cm.setBookmark(pos); + } + + function charIdxInLine(start, line, character, forward, includeChar) { + var idx; + if (forward) { + idx = line.indexOf(character, start + 1); + if (idx != -1 && !includeChar) { + idx -= 1; + } + } else { + idx = line.lastIndexOf(character, start - 1); + if (idx != -1 && !includeChar) { + idx += 1; + } + } + return idx; + } + + function findParagraph(cm, head, repeat, dir, inclusive) { + var line = head.line; + var min = cm.firstLine(); + var max = cm.lastLine(); + var start, end, i = line; + function isEmpty(i) { return !/\S/.test(cm.getLine(i)); } // ace_patch + function isBoundary(i, dir, any) { + if (any) { return isEmpty(i) != isEmpty(i + dir); } + return !isEmpty(i) && isEmpty(i + dir); + } + function skipFold(i) { + dir = dir > 0 ? 1 : -1; + var foldLine = cm.ace.session.getFoldLine(i); + if (foldLine) { + if (i + dir > foldLine.start.row && i + dir < foldLine.end.row) + dir = (dir > 0 ? foldLine.end.row : foldLine.start.row) - i; + } + } + if (dir) { + while (min <= i && i <= max && repeat > 0) { + skipFold(i); + if (isBoundary(i, dir)) { repeat--; } + i += dir; + } + return new Pos(i, 0); + } + + var vim = cm.state.vim; + if (vim.visualLine && isBoundary(line, 1, true)) { + var anchor = vim.sel.anchor; + if (isBoundary(anchor.line, -1, true)) { + if (!inclusive || anchor.line != line) { + line += 1; + } + } + } + var startState = isEmpty(line); + for (i = line; i <= max && repeat; i++) { + if (isBoundary(i, 1, true)) { + if (!inclusive || isEmpty(i) != startState) { + repeat--; + } + } + } + end = new Pos(i, 0); + if (i > max && !startState) { startState = true; } + else { inclusive = false; } + for (i = line; i > min; i--) { + if (!inclusive || isEmpty(i) == startState || i == line) { + if (isBoundary(i, -1, true)) { break; } + } + } + start = new Pos(i, 0); + return { start: start, end: end }; + } + function selectCompanionObject(cm, head, symb, inclusive) { + var cur = head, start, end; + + var bracketRegexp = ({ + '(': /[()]/, ')': /[()]/, + '[': /[[\]]/, ']': /[[\]]/, + '{': /[{}]/, '}': /[{}]/})[symb]; + var openSym = ({ + '(': '(', ')': '(', + '[': '[', ']': '[', + '{': '{', '}': '{'})[symb]; + var curChar = cm.getLine(cur.line).charAt(cur.ch); + var offset = curChar === openSym ? 1 : 0; + + start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, {'bracketRegex': bracketRegexp}); + end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, {'bracketRegex': bracketRegexp}); + + if (!start || !end) { + return { start: cur, end: cur }; + } + + start = start.pos; + end = end.pos; + + if ((start.line == end.line && start.ch > end.ch) + || (start.line > end.line)) { + var tmp = start; + start = end; + end = tmp; + } + + if (inclusive) { + end.ch += 1; + } else { + start.ch += 1; + } + + return { start: start, end: end }; + } + function findBeginningAndEnd(cm, head, symb, inclusive) { + var cur = copyCursor(head); + var line = cm.getLine(cur.line); + var chars = line.split(''); + var start, end, i, len; + var firstIndex = chars.indexOf(symb); + if (cur.ch < firstIndex) { + cur.ch = firstIndex; + } + else if (firstIndex < cur.ch && chars[cur.ch] == symb) { + end = cur.ch; // assign end to the current cursor + --cur.ch; // make sure to look backwards + } + if (chars[cur.ch] == symb && !end) { + start = cur.ch + 1; // assign start to ahead of the cursor + } else { + for (i = cur.ch; i > -1 && !start; i--) { + if (chars[i] == symb) { + start = i + 1; + } + } + } + if (start && !end) { + for (i = start, len = chars.length; i < len && !end; i++) { + if (chars[i] == symb) { + end = i; + } + } + } + if (!start || !end) { + return { start: cur, end: cur }; + } + if (inclusive) { + --start; ++end; + } + + return { + start: Pos(cur.line, start), + end: Pos(cur.line, end) + }; + } + defineOption('pcre', true, 'boolean'); + function SearchState() {} + SearchState.prototype = { + getQuery: function() { + return vimGlobalState.query; + }, + setQuery: function(query) { + vimGlobalState.query = query; + }, + getOverlay: function() { + return this.searchOverlay; + }, + setOverlay: function(overlay) { + this.searchOverlay = overlay; + }, + isReversed: function() { + return vimGlobalState.isReversed; + }, + setReversed: function(reversed) { + vimGlobalState.isReversed = reversed; + }, + getScrollbarAnnotate: function() { + return this.annotate; + }, + setScrollbarAnnotate: function(annotate) { + this.annotate = annotate; + } + }; + function getSearchState(cm) { + var vim = cm.state.vim; + return vim.searchState_ || (vim.searchState_ = new SearchState()); + } + function dialog(cm, template, shortText, onClose, options) { + if (cm.openDialog) { + cm.openDialog(template, onClose, { bottom: true, value: options.value, + onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, + selectValueOnOpen: false}); + } + else { + onClose(prompt(shortText, '')); + } + } + function splitBySlash(argString) { + var slashes = findUnescapedSlashes(argString) || []; + if (!slashes.length) return []; + var tokens = []; + if (slashes[0] !== 0) return; + for (var i = 0; i < slashes.length; i++) { + if (typeof slashes[i] == 'number') + tokens.push(argString.substring(slashes[i] + 1, slashes[i+1])); + } + return tokens; + } + + function findUnescapedSlashes(str) { + var escapeNextChar = false; + var slashes = []; + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i); + if (!escapeNextChar && c == '/') { + slashes.push(i); + } + escapeNextChar = !escapeNextChar && (c == '\\'); + } + return slashes; + } + function translateRegex(str) { + var specials = '|(){'; + var unescape = '}'; + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { + var c = str.charAt(i) || ''; + var n = str.charAt(i+1) || ''; + var specialComesNext = (n && specials.indexOf(n) != -1); + if (escapeNextChar) { + if (c !== '\\' || !specialComesNext) { + out.push(c); + } + escapeNextChar = false; + } else { + if (c === '\\') { + escapeNextChar = true; + if (n && unescape.indexOf(n) != -1) { + specialComesNext = true; + } + if (!specialComesNext || n === '\\') { + out.push(c); + } + } else { + out.push(c); + if (specialComesNext && n !== '\\') { + out.push('\\'); + } + } + } + } + return out.join(''); + } + var charUnescapes = {'\\n': '\n', '\\r': '\r', '\\t': '\t'}; + function translateRegexReplace(str) { + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { + var c = str.charAt(i) || ''; + var n = str.charAt(i+1) || ''; + if (charUnescapes[c + n]) { + out.push(charUnescapes[c+n]); + i++; + } else if (escapeNextChar) { + out.push(c); + escapeNextChar = false; + } else { + if (c === '\\') { + escapeNextChar = true; + if ((isNumber(n) || n === '$')) { + out.push('$'); + } else if (n !== '/' && n !== '\\') { + out.push('\\'); + } + } else { + if (c === '$') { + out.push('$'); + } + out.push(c); + if (n === '/') { + out.push('\\'); + } + } + } + } + return out.join(''); + } + var unescapes = {'\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t'}; + function unescapeRegexReplace(str) { + var stream = new CodeMirror.StringStream(str); + var output = []; + while (!stream.eol()) { + while (stream.peek() && stream.peek() != '\\') { + output.push(stream.next()); + } + var matched = false; + for (var matcher in unescapes) { + if (stream.match(matcher, true)) { + matched = true; + output.push(unescapes[matcher]); + break; + } + } + if (!matched) { + output.push(stream.next()); + } + } + return output.join(''); + } + function parseQuery(query, ignoreCase, smartCase) { + var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); + lastSearchRegister.setText(query); + if (query instanceof RegExp) { return query; } + var slashes = findUnescapedSlashes(query); + var regexPart; + var forceIgnoreCase; + if (!slashes.length) { + regexPart = query; + } else { + regexPart = query.substring(0, slashes[0]); + var flagsPart = query.substring(slashes[0]); + forceIgnoreCase = (flagsPart.indexOf('i') != -1); + } + if (!regexPart) { + return null; + } + if (!getOption('pcre')) { + regexPart = translateRegex(regexPart); + } + if (smartCase) { + ignoreCase = (/^[^A-Z]*$/).test(regexPart); + } + var regexp = new RegExp(regexPart, + (ignoreCase || forceIgnoreCase) ? 'i' : undefined); + return regexp; + } + function showConfirm(cm, text) { + if (cm.openNotification) { + cm.openNotification('' + text + '', + {bottom: true, duration: 5000}); + } else { + alert(text); + } + } + function makePrompt(prefix, desc) { + var raw = ''; + if (prefix) { + raw += '' + prefix + ''; + } + raw += ' ' + + ''; + if (desc) { + raw += ''; + raw += desc; + raw += ''; + } + return raw; + } + var searchPromptDesc = '(Javascript regexp)'; + function showPrompt(cm, options) { + var shortText = (options.prefix || '') + ' ' + (options.desc || ''); + var prompt = makePrompt(options.prefix, options.desc); + dialog(cm, prompt, shortText, options.onClose, options); + } + function regexEqual(r1, r2) { + if (r1 instanceof RegExp && r2 instanceof RegExp) { + var props = ['global', 'multiline', 'ignoreCase', 'source']; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + if (r1[prop] !== r2[prop]) { + return false; + } + } + return true; + } + return false; + } + function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { + if (!rawQuery) { + return; + } + var state = getSearchState(cm); + var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); + if (!query) { + return; + } + highlightSearchMatches(cm, query); + if (regexEqual(query, state.getQuery())) { + return query; + } + state.setQuery(query); + return query; + } + function searchOverlay(query) { + if (query.source.charAt(0) == '^') { + var matchSol = true; + } + return { + token: function(stream) { + if (matchSol && !stream.sol()) { + stream.skipToEnd(); + return; + } + var match = stream.match(query, false); + if (match) { + if (match[0].length == 0) { + stream.next(); + return 'searching'; + } + if (!stream.sol()) { + stream.backUp(1); + if (!query.exec(stream.next() + match[0])) { + stream.next(); + return null; + } + } + stream.match(query); + return 'searching'; + } + while (!stream.eol()) { + stream.next(); + if (stream.match(query, false)) break; + } + }, + query: query + }; + } + function highlightSearchMatches(cm, query) { + var searchState = getSearchState(cm); + var overlay = searchState.getOverlay(); + if (!overlay || query != overlay.query) { + if (overlay) { + cm.removeOverlay(overlay); + } + overlay = searchOverlay(query); + cm.addOverlay(overlay); + if (cm.showMatchesOnScrollbar) { + if (searchState.getScrollbarAnnotate()) { + searchState.getScrollbarAnnotate().clear(); + } + searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); + } + searchState.setOverlay(overlay); + } + } + function findNext(cm, prev, query, repeat) { + if (repeat === undefined) { repeat = 1; } + return cm.operation(function() { + var pos = cm.getCursor(); + var cursor = cm.getSearchCursor(query, pos); + for (var i = 0; i < repeat; i++) { + var found = cursor.find(prev); + if (i == 0 && found && cursorEqual(cursor.from(), pos)) { found = cursor.find(prev); } + if (!found) { + cursor = cm.getSearchCursor(query, + (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) ); + if (!cursor.find(prev)) { + return; + } + } + } + return cursor.from(); + }); + } + function clearSearchHighlight(cm) { + var state = getSearchState(cm); + cm.removeOverlay(getSearchState(cm).getOverlay()); + state.setOverlay(null); + if (state.getScrollbarAnnotate()) { + state.getScrollbarAnnotate().clear(); + state.setScrollbarAnnotate(null); + } + } + function isInRange(pos, start, end) { + if (typeof pos != 'number') { + pos = pos.line; + } + if (start instanceof Array) { + return inArray(pos, start); + } else { + if (end) { + return (pos >= start && pos <= end); + } else { + return pos == start; + } + } + } + function getUserVisibleLines(cm) { + var renderer = cm.ace.renderer; + return { + top: renderer.getFirstFullyVisibleRow(), + bottom: renderer.getLastFullyVisibleRow() + } + } + + var ExCommandDispatcher = function() { + this.buildCommandMap_(); + }; + ExCommandDispatcher.prototype = { + processCommand: function(cm, input, opt_params) { + var that = this; + cm.operation(function () { + cm.curOp.isVimOp = true; + that._processCommand(cm, input, opt_params); + }); + }, + _processCommand: function(cm, input, opt_params) { + var vim = cm.state.vim; + var commandHistoryRegister = vimGlobalState.registerController.getRegister(':'); + var previousCommand = commandHistoryRegister.toString(); + if (vim.visualMode) { + exitVisualMode(cm); + } + var inputStream = new CodeMirror.StringStream(input); + commandHistoryRegister.setText(input); + var params = opt_params || {}; + params.input = input; + try { + this.parseInput_(cm, inputStream, params); + } catch(e) { + showConfirm(cm, e); + throw e; + } + var command; + var commandName; + if (!params.commandName) { + if (params.line !== undefined) { + commandName = 'move'; + } + } else { + command = this.matchCommand_(params.commandName); + if (command) { + commandName = command.name; + if (command.excludeFromCommandHistory) { + commandHistoryRegister.setText(previousCommand); + } + this.parseCommandArgs_(inputStream, params, command); + if (command.type == 'exToKey') { + for (var i = 0; i < command.toKeys.length; i++) { + CodeMirror.Vim.handleKey(cm, command.toKeys[i], 'mapping'); + } + return; + } else if (command.type == 'exToEx') { + this.processCommand(cm, command.toInput); + return; + } + } + } + if (!commandName) { + showConfirm(cm, 'Not an editor command ":' + input + '"'); + return; + } + try { + exCommands[commandName](cm, params); + if ((!command || !command.possiblyAsync) && params.callback) { + params.callback(); + } + } catch(e) { + showConfirm(cm, e); + throw e; + } + }, + parseInput_: function(cm, inputStream, result) { + inputStream.eatWhile(':'); + if (inputStream.eat('%')) { + result.line = cm.firstLine(); + result.lineEnd = cm.lastLine(); + } else { + result.line = this.parseLineSpec_(cm, inputStream); + if (result.line !== undefined && inputStream.eat(',')) { + result.lineEnd = this.parseLineSpec_(cm, inputStream); + } + } + var commandMatch = inputStream.match(/^(\w+)/); + if (commandMatch) { + result.commandName = commandMatch[1]; + } else { + result.commandName = inputStream.match(/.*/)[0]; + } + + return result; + }, + parseLineSpec_: function(cm, inputStream) { + var numberMatch = inputStream.match(/^(\d+)/); + if (numberMatch) { + return parseInt(numberMatch[1], 10) - 1; + } + switch (inputStream.next()) { + case '.': + return cm.getCursor().line; + case '$': + return cm.lastLine(); + case '\'': + var mark = cm.state.vim.marks[inputStream.next()]; + if (mark && mark.find()) { + return mark.find().line; + } + throw new Error('Mark not set'); + default: + inputStream.backUp(1); + return undefined; + } + }, + parseCommandArgs_: function(inputStream, params, command) { + if (inputStream.eol()) { + return; + } + params.argString = inputStream.match(/.*/)[0]; + var delim = command.argDelimiter || /\s+/; + var args = trim(params.argString).split(delim); + if (args.length && args[0]) { + params.args = args; + } + }, + matchCommand_: function(commandName) { + for (var i = commandName.length; i > 0; i--) { + var prefix = commandName.substring(0, i); + if (this.commandMap_[prefix]) { + var command = this.commandMap_[prefix]; + if (command.name.indexOf(commandName) === 0) { + return command; + } + } + } + return null; + }, + buildCommandMap_: function() { + this.commandMap_ = {}; + for (var i = 0; i < defaultExCommandMap.length; i++) { + var command = defaultExCommandMap[i]; + var key = command.shortName || command.name; + this.commandMap_[key] = command; + } + }, + map: function(lhs, rhs, ctx) { + if (lhs != ':' && lhs.charAt(0) == ':') { + if (ctx) { throw Error('Mode not supported for ex mappings'); } + var commandName = lhs.substring(1); + if (rhs != ':' && rhs.charAt(0) == ':') { + this.commandMap_[commandName] = { + name: commandName, + type: 'exToEx', + toInput: rhs.substring(1), + user: true + }; + } else { + this.commandMap_[commandName] = { + name: commandName, + type: 'exToKey', + toKeys: rhs, + user: true + }; + } + } else { + if (rhs != ':' && rhs.charAt(0) == ':') { + var mapping = { + keys: lhs, + type: 'keyToEx', + exArgs: { input: rhs.substring(1) }, + user: true}; + if (ctx) { mapping.context = ctx; } + defaultKeymap.unshift(mapping); + } else { + var mapping = { + keys: lhs, + type: 'keyToKey', + toKeys: rhs, + user: true + }; + if (ctx) { mapping.context = ctx; } + defaultKeymap.unshift(mapping); + } + } + }, + unmap: function(lhs, ctx) { + if (lhs != ':' && lhs.charAt(0) == ':') { + if (ctx) { throw Error('Mode not supported for ex mappings'); } + var commandName = lhs.substring(1); + if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { + delete this.commandMap_[commandName]; + return; + } + } else { + var keys = lhs; + for (var i = 0; i < defaultKeymap.length; i++) { + if (keys == defaultKeymap[i].keys + && defaultKeymap[i].context === ctx + && defaultKeymap[i].user) { + defaultKeymap.splice(i, 1); + return; + } + } + } + } + }; + + var exCommands = { + colorscheme: function(cm, params) { + if (!params.args || params.args.length < 1) { + showConfirm(cm, cm.getOption('theme')); + return; + } + cm.setOption('theme', params.args[0]); + }, + map: function(cm, params, ctx) { + var mapArgs = params.args; + if (!mapArgs || mapArgs.length < 2) { + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; + } + exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx); + }, + imap: function(cm, params) { this.map(cm, params, 'insert'); }, + nmap: function(cm, params) { this.map(cm, params, 'normal'); }, + vmap: function(cm, params) { this.map(cm, params, 'visual'); }, + unmap: function(cm, params, ctx) { + var mapArgs = params.args; + if (!mapArgs || mapArgs.length < 1) { + if (cm) { + showConfirm(cm, 'No such mapping: ' + params.input); + } + return; + } + exCommandDispatcher.unmap(mapArgs[0], ctx); + }, + move: function(cm, params) { + commandDispatcher.processCommand(cm, cm.state.vim, { + type: 'motion', + motion: 'moveToLineOrEdgeOfDocument', + motionArgs: { forward: false, explicitRepeat: true, + linewise: true }, + repeatOverride: params.line+1}); + }, + set: function(cm, params) { + var setArgs = params.args; + var setCfg = params.setCfg || {}; + if (!setArgs || setArgs.length < 1) { + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; + } + var expr = setArgs[0].split('='); + var optionName = expr[0]; + var value = expr[1]; + var forceGet = false; + + if (optionName.charAt(optionName.length - 1) == '?') { + if (value) { throw Error('Trailing characters: ' + params.argString); } + optionName = optionName.substring(0, optionName.length - 1); + forceGet = true; + } + if (value === undefined && optionName.substring(0, 2) == 'no') { + optionName = optionName.substring(2); + value = false; + } + + var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean'; + if (optionIsBoolean && value == undefined) { + value = true; + } + if (!optionIsBoolean && value === undefined || forceGet) { + var oldValue = getOption(optionName, cm, setCfg); + if (oldValue === true || oldValue === false) { + showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); + } else { + showConfirm(cm, ' ' + optionName + '=' + oldValue); + } + } else { + setOption(optionName, value, cm, setCfg); + } + }, + setlocal: function (cm, params) { + params.setCfg = {scope: 'local'}; + this.set(cm, params); + }, + setglobal: function (cm, params) { + params.setCfg = {scope: 'global'}; + this.set(cm, params); + }, + registers: function(cm, params) { + var regArgs = params.args; + var registers = vimGlobalState.registerController.registers; + var regInfo = '----------Registers----------

      '; + if (!regArgs) { + for (var registerName in registers) { + var text = registers[registerName].toString(); + if (text.length) { + regInfo += '"' + registerName + ' ' + text + '
      '; + } + } + } else { + var registerName; + regArgs = regArgs.join(''); + for (var i = 0; i < regArgs.length; i++) { + registerName = regArgs.charAt(i); + if (!vimGlobalState.registerController.isValidRegister(registerName)) { + continue; + } + var register = registers[registerName] || new Register(); + regInfo += '"' + registerName + ' ' + register.toString() + '
      '; + } + } + showConfirm(cm, regInfo); + }, + sort: function(cm, params) { + var reverse, ignoreCase, unique, number; + function parseArgs() { + if (params.argString) { + var args = new CodeMirror.StringStream(params.argString); + if (args.eat('!')) { reverse = true; } + if (args.eol()) { return; } + if (!args.eatSpace()) { return 'Invalid arguments'; } + var opts = args.match(/[a-z]+/); + if (opts) { + opts = opts[0]; + ignoreCase = opts.indexOf('i') != -1; + unique = opts.indexOf('u') != -1; + var decimal = opts.indexOf('d') != -1 && 1; + var hex = opts.indexOf('x') != -1 && 1; + var octal = opts.indexOf('o') != -1 && 1; + if (decimal + hex + octal > 1) { return 'Invalid arguments'; } + number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; + } + if (args.match(/\/.*\//)) { return 'patterns not supported'; } + } + } + var err = parseArgs(); + if (err) { + showConfirm(cm, err + ': ' + params.argString); + return; + } + var lineStart = params.line || cm.firstLine(); + var lineEnd = params.lineEnd || params.line || cm.lastLine(); + if (lineStart == lineEnd) { return; } + var curStart = Pos(lineStart, 0); + var curEnd = Pos(lineEnd, lineLength(cm, lineEnd)); + var text = cm.getRange(curStart, curEnd).split('\n'); + var numberRegex = (number == 'decimal') ? /(-?)([\d]+)/ : + (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : + (number == 'octal') ? /([0-7]+)/ : null; + var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null; + var numPart = [], textPart = []; + if (number) { + for (var i = 0; i < text.length; i++) { + if (numberRegex.exec(text[i])) { + numPart.push(text[i]); + } else { + textPart.push(text[i]); + } + } + } else { + textPart = text; + } + function compareFn(a, b) { + if (reverse) { var tmp; tmp = a; a = b; b = tmp; } + if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); } + var anum = number && numberRegex.exec(a); + var bnum = number && numberRegex.exec(b); + if (!anum) { return a < b ? -1 : 1; } + anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); + bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); + return anum - bnum; + } + numPart.sort(compareFn); + textPart.sort(compareFn); + text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart); + if (unique) { // Remove duplicate lines + var textOld = text; + var lastLine; + text = []; + for (var i = 0; i < textOld.length; i++) { + if (textOld[i] != lastLine) { + text.push(textOld[i]); + } + lastLine = textOld[i]; + } + } + cm.replaceRange(text.join('\n'), curStart, curEnd); + }, + global: function(cm, params) { + var argString = params.argString; + if (!argString) { + showConfirm(cm, 'Regular Expression missing from global'); + return; + } + var lineStart = (params.line !== undefined) ? params.line : cm.firstLine(); + var lineEnd = params.lineEnd || params.line || cm.lastLine(); + var tokens = splitBySlash(argString); + var regexPart = argString, cmd; + if (tokens.length) { + regexPart = tokens[0]; + cmd = tokens.slice(1, tokens.length).join('/'); + } + if (regexPart) { + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */, + true /** smartCase */); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } + } + var query = getSearchState(cm).getQuery(); + var matchedLines = [], content = ''; + for (var i = lineStart; i <= lineEnd; i++) { + var matched = query.test(cm.getLine(i)); + if (matched) { + matchedLines.push(i+1); + content+= cm.getLine(i) + '
      '; + } + } + if (!cmd) { + showConfirm(cm, content); + return; + } + var index = 0; + var nextCommand = function() { + if (index < matchedLines.length) { + var command = matchedLines[index] + cmd; + exCommandDispatcher.processCommand(cm, command, { + callback: nextCommand + }); + } + index++; + }; + nextCommand(); + }, + substitute: function(cm, params) { + if (!cm.getSearchCursor) { + throw new Error('Search feature not available. Requires searchcursor.js or ' + + 'any other getSearchCursor implementation.'); + } + var argString = params.argString; + var tokens = argString ? splitBySlash(argString) : []; + var regexPart, replacePart = '', trailing, flagsPart, count; + var confirm = false; // Whether to confirm each replace. + var global = false; // True to replace all instances on a line, false to replace only 1. + if (tokens.length) { + regexPart = tokens[0]; + replacePart = tokens[1]; + if (replacePart !== undefined) { + if (getOption('pcre')) { + replacePart = unescapeRegexReplace(replacePart); + } else { + replacePart = translateRegexReplace(replacePart); + } + vimGlobalState.lastSubstituteReplacePart = replacePart; + } + trailing = tokens[2] ? tokens[2].split(' ') : []; + } else { + if (argString && argString.length) { + showConfirm(cm, 'Substitutions should be of the form ' + + ':s/pattern/replace/'); + return; + } + } + if (trailing) { + flagsPart = trailing[0]; + count = parseInt(trailing[1]); + if (flagsPart) { + if (flagsPart.indexOf('c') != -1) { + confirm = true; + flagsPart.replace('c', ''); + } + if (flagsPart.indexOf('g') != -1) { + global = true; + flagsPart.replace('g', ''); + } + regexPart = regexPart + '/' + flagsPart; + } + } + if (regexPart) { + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */, + true /** smartCase */); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } + } + replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart; + if (replacePart === undefined) { + showConfirm(cm, 'No previous substitute regular expression'); + return; + } + var state = getSearchState(cm); + var query = state.getQuery(); + var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line; + var lineEnd = params.lineEnd || lineStart; + if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) { + lineEnd = Infinity; + } + if (count) { + lineStart = lineEnd; + lineEnd = lineStart + count - 1; + } + var startPos = clipCursorToContent(cm, Pos(lineStart, 0)); + var cursor = cm.getSearchCursor(query, startPos); + doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback); + }, + redo: CodeMirror.commands.redo, + undo: CodeMirror.commands.undo, + write: function(cm) { + if (CodeMirror.commands.save) { + CodeMirror.commands.save(cm); + } else { + cm.save(); + } + }, + nohlsearch: function(cm) { + clearSearchHighlight(cm); + }, + delmarks: function(cm, params) { + if (!params.argString || !trim(params.argString)) { + showConfirm(cm, 'Argument required'); + return; + } + + var state = cm.state.vim; + var stream = new CodeMirror.StringStream(trim(params.argString)); + while (!stream.eol()) { + stream.eatSpace(); + var count = stream.pos; + + if (!stream.match(/[a-zA-Z]/, false)) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + + var sym = stream.next(); + if (stream.match('-', true)) { + if (!stream.match(/[a-zA-Z]/, false)) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + + var startMark = sym; + var finishMark = stream.next(); + if (isLowerCase(startMark) && isLowerCase(finishMark) || + isUpperCase(startMark) && isUpperCase(finishMark)) { + var start = startMark.charCodeAt(0); + var finish = finishMark.charCodeAt(0); + if (start >= finish) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + for (var j = 0; j <= finish - start; j++) { + var mark = String.fromCharCode(start + j); + delete state.marks[mark]; + } + } else { + showConfirm(cm, 'Invalid argument: ' + startMark + '-'); + return; + } + } else { + delete state.marks[sym]; + } + } + } + }; + + var exCommandDispatcher = new ExCommandDispatcher(); + function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, + replaceWith, callback) { + cm.state.vim.exMode = true; + var done = false; + var lastPos = searchCursor.from(); + function replaceAll() { + cm.operation(function() { + while (!done) { + replace(); + next(); + } + stop(); + }); + } + function replace() { + var text = cm.getRange(searchCursor.from(), searchCursor.to()); + var newText = text.replace(query, replaceWith); + searchCursor.replace(newText); + } + function next() { + while(searchCursor.findNext() && + isInRange(searchCursor.from(), lineStart, lineEnd)) { + if (!global && lastPos && searchCursor.from().line == lastPos.line) { + continue; + } + cm.scrollIntoView(searchCursor.from(), 30); + cm.setSelection(searchCursor.from(), searchCursor.to()); + lastPos = searchCursor.from(); + done = false; + return; + } + done = true; + } + function stop(close) { + if (close) { close(); } + cm.focus(); + if (lastPos) { + cm.setCursor(lastPos); + var vim = cm.state.vim; + vim.exMode = false; + vim.lastHPos = vim.lastHSPos = lastPos.ch; + } + if (callback) { callback(); } + } + function onPromptKeyDown(e, _value, close) { + CodeMirror.e_stop(e); + var keyName = CodeMirror.keyName(e); + switch (keyName) { + case 'Y': + replace(); next(); break; + case 'N': + next(); break; + case 'A': + var savedCallback = callback; + callback = undefined; + cm.operation(replaceAll); + callback = savedCallback; + break; + case 'L': + replace(); + case 'Q': + case 'Esc': + case 'Ctrl-C': + case 'Ctrl-[': + stop(close); + break; + } + if (done) { stop(close); } + return true; + } + next(); + if (done) { + showConfirm(cm, 'No matches for ' + query.source); + return; + } + if (!confirm) { + replaceAll(); + if (callback) { callback(); } + return; + } + showPrompt(cm, { + prefix: 'replace with ' + replaceWith + ' (y/n/a/q/l)', + onKeyDown: onPromptKeyDown + }); + } + + CodeMirror.keyMap.vim = { + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + function exitInsertMode(cm) { + var vim = cm.state.vim; + var macroModeState = vimGlobalState.macroModeState; + var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); + var isPlaying = macroModeState.isPlaying; + var lastChange = macroModeState.lastInsertModeChanges; + var text = []; + if (!isPlaying) { + var selLength = lastChange.inVisualBlock ? vim.lastSelection.visualBlock.height : 1; + var changes = lastChange.changes; + var text = []; + var i = 0; + while (i < changes.length) { + text.push(changes[i]); + if (changes[i] instanceof InsertModeKey) { + i++; + } else { + i+= selLength; + } + } + lastChange.changes = text; + cm.off('change', onChange); + CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + } + if (!isPlaying && vim.insertModeRepeat > 1) { + repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, + true /** repeatForInsert */); + vim.lastEditInputState.repeatOverride = vim.insertModeRepeat; + } + delete vim.insertModeRepeat; + vim.insertMode = false; + cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1); + cm.setOption('keyMap', 'vim'); + cm.setOption('disableInput', true); + + lastChange.overwrite = cm.state.overwrite; + cm.toggleOverwrite(false); // exit replace mode if we were in it. + insertModeChangeRegister.setText(lastChange.changes.join('')); + CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); + if (macroModeState.isRecording) { + logInsertModeChange(macroModeState); + } + } + + function _mapCommand(command) { + defaultKeymap.unshift(command); + } + + function mapCommand(keys, type, name, args, extra) { + var command = {keys: keys, type: type}; + command[type] = name; + command[type + "Args"] = args; + for (var key in extra) + command[key] = extra[key]; + _mapCommand(command); + } + defineOption('insertModeEscKeysTimeout', 200, 'number'); + + CodeMirror.keyMap['vim-insert'] = { + 'Ctrl-N': 'autocomplete', + 'Ctrl-P': 'autocomplete', + 'Enter': function(cm) { + var fn = CodeMirror.commands.newlineAndIndentContinueComment || + CodeMirror.commands.newlineAndIndent; + fn(cm); + }, + fallthrough: ['default'], + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + CodeMirror.keyMap['vim-replace'] = { + 'Backspace': 'goCharLeft', + fallthrough: ['vim-insert'], + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + function executeMacroRegister(cm, vim, macroModeState, registerName) { + var register = vimGlobalState.registerController.getRegister(registerName); + if (registerName == ':') { + if (register.keyBuffer[0]) { + exCommandDispatcher.processCommand(cm, register.keyBuffer[0]); + } + macroModeState.isPlaying = false; + return; + } + var keyBuffer = register.keyBuffer; + var imc = 0; + macroModeState.isPlaying = true; + macroModeState.replaySearchQueries = register.searchQueries.slice(0); + for (var i = 0; i < keyBuffer.length; i++) { + var text = keyBuffer[i]; + var match, key; + while (text) { + match = (/<\w+-.+?>|<\w+>|./).exec(text); + key = match[0]; + text = text.substring(match.index + key.length); + CodeMirror.Vim.handleKey(cm, key, 'macro'); + if (vim.insertMode) { + var changes = register.insertModeChanges[imc++].changes; + vimGlobalState.macroModeState.lastInsertModeChanges.changes = + changes; + repeatInsertModeChanges(cm, changes, 1); + exitInsertMode(cm); + } + } + } + macroModeState.isPlaying = false; + } + + function logKey(macroModeState, key) { + if (macroModeState.isPlaying) { return; } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register) { + register.pushText(key); + } + } + + function logInsertModeChange(macroModeState) { + if (macroModeState.isPlaying) { return; } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushInsertModeChanges) { + register.pushInsertModeChanges(macroModeState.lastInsertModeChanges); + } + } + + function logSearchQuery(macroModeState, query) { + if (macroModeState.isPlaying) { return; } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushSearchQuery) { + register.pushSearchQuery(query); + } + } + function onChange(_cm, changeObj) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + if (!macroModeState.isPlaying) { + while(changeObj) { + lastChange.expectCursorActivityForChange = true; + if (changeObj.origin == '+input' || changeObj.origin == 'paste' + || changeObj.origin === undefined /* only in testing */) { + var text = changeObj.text.join('\n'); + if (lastChange.maybeReset) { + lastChange.changes = []; + lastChange.maybeReset = false; + } + lastChange.changes.push(text); + } + changeObj = changeObj.next; + } + } + } + function onCursorActivity(cm) { + var vim = cm.state.vim; + if (vim.insertMode) { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { return; } + var lastChange = macroModeState.lastInsertModeChanges; + if (lastChange.expectCursorActivityForChange) { + lastChange.expectCursorActivityForChange = false; + } else { + lastChange.maybeReset = true; + } + } else if (!cm.curOp.isVimOp) { + handleExternalSelection(cm, vim); + } + if (vim.visualMode) { + updateFakeCursor(cm); + } + } + function updateFakeCursor(cm) { + var vim = cm.state.vim; + var from = clipCursorToContent(cm, copyCursor(vim.sel.head)); + var to = offsetCursor(from, 0, 1); + if (vim.fakeCursor) { + vim.fakeCursor.clear(); + } + vim.fakeCursor = cm.markText(from, to, {className: 'cm-animate-fat-cursor'}); + } + function handleExternalSelection(cm, vim) { + var anchor = cm.getCursor('anchor'); + var head = cm.getCursor('head'); + if (vim.visualMode && !cm.somethingSelected()) { + exitVisualMode(cm, false); + } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { + vim.visualMode = true; + vim.visualLine = false; + CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"}); + } + if (vim.visualMode) { + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; + head = offsetCursor(head, 0, headOffset); + anchor = offsetCursor(anchor, 0, anchorOffset); + vim.sel = { + anchor: anchor, + head: head + }; + updateMark(cm, vim, '<', cursorMin(head, anchor)); + updateMark(cm, vim, '>', cursorMax(head, anchor)); + } else if (!vim.insertMode) { + vim.lastHPos = cm.getCursor().ch; + } + } + function InsertModeKey(keyName) { + this.keyName = keyName; + } + function onKeyEventTargetKeyDown(e) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + var keyName = CodeMirror.keyName(e); + if (!keyName) { return; } + function onKeyFound() { + if (lastChange.maybeReset) { + lastChange.changes = []; + lastChange.maybeReset = false; + } + lastChange.changes.push(new InsertModeKey(keyName)); + return true; + } + if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { + CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound); + } + } + function repeatLastEdit(cm, vim, repeat, repeatForInsert) { + var macroModeState = vimGlobalState.macroModeState; + macroModeState.isPlaying = true; + var isAction = !!vim.lastEditActionCommand; + var cachedInputState = vim.inputState; + function repeatCommand() { + if (isAction) { + commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); + } else { + commandDispatcher.evalInput(cm, vim); + } + } + function repeatInsert(repeat) { + if (macroModeState.lastInsertModeChanges.changes.length > 0) { + repeat = !vim.lastEditActionCommand ? 1 : repeat; + var changeObject = macroModeState.lastInsertModeChanges; + repeatInsertModeChanges(cm, changeObject.changes, repeat, changeObject.overwrite); + } + } + vim.inputState = vim.lastEditInputState; + if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { + for (var i = 0; i < repeat; i++) { + repeatCommand(); + repeatInsert(1); + } + } else { + if (!repeatForInsert) { + repeatCommand(); + } + repeatInsert(repeat); + } + vim.inputState = cachedInputState; + if (vim.insertMode && !repeatForInsert) { + exitInsertMode(cm); + } + macroModeState.isPlaying = false; + } + + function repeatInsertModeChanges(cm, changes, repeat, overwrite) { + function keyHandler(binding) { + if (typeof binding == 'string') { + CodeMirror.commands[binding](cm); + } else { + binding(cm); + } + return true; + } + var head = cm.getCursor('head'); + var inVisualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock; + if (inVisualBlock) { + var vim = cm.state.vim; + var lastSel = vim.lastSelection; + var offset = getOffset(lastSel.anchor, lastSel.head); + selectForInsert(cm, head, offset.line + 1); + repeat = cm.listSelections().length; + cm.setCursor(head); + } + for (var i = 0; i < repeat; i++) { + if (inVisualBlock) { + cm.setCursor(offsetCursor(head, i, 0)); + } + for (var j = 0; j < changes.length; j++) { + var change = changes[j]; + if (change instanceof InsertModeKey) { + CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); + } else { + var cur = cm.getCursor(); + var end = cur; + if (overwrite && !/\n/.test(change)) { + end = offsetCursor(cur, 0, change.length); + } + cm.replaceRange(change, cur, end); + } + } + } + if (inVisualBlock) { + cm.setCursor(offsetCursor(head, 0, 1)); + } + } + + resetVimGlobalState(); + CodeMirror.Vim = Vim(); + + Vim = CodeMirror.Vim; + + var specialKey = {'return':'CR',backspace:'BS','delete':'Del',esc:'Esc', + left:'Left',right:'Right',up:'Up',down:'Down',space: 'Space', + home:'Home',end:'End',pageup:'PageUp',pagedown:'PageDown', enter: 'CR' + }; + function lookupKey(hashId, key, e) { + if (key.length > 1 && key[0] == "n") { + key = key.replace("numpad", ""); + } + key = specialKey[key] || key; + var name = ''; + if (e.ctrlKey) { name += 'C-'; } + if (e.altKey) { name += 'A-'; } + if (e.shiftKey) { name += 'S-'; } + + name += key; + if (name.length > 1) { name = '<' + name + '>'; } + return name; + } + var handleKey = Vim.handleKey.bind(Vim); + Vim.handleKey = function(cm, key, origin) { + return cm.operation(function() { + return handleKey(cm, key, origin); + }, true); + } + function cloneVimState(state) { + var n = new state.constructor(); + Object.keys(state).forEach(function(key) { + var o = state[key]; + if (Array.isArray(o)) + o = o.slice(); + else if (o && typeof o == "object" && o.constructor != Object) + o = cloneVimState(o); + n[key] = o; + }); + if (state.sel) { + n.sel = { + head: state.sel.head && copyCursor(state.sel.head), + anchor: state.sel.anchor && copyCursor(state.sel.anchor) + }; + } + return n; + } + function multiSelectHandleKey(cm, key, origin) { + var isHandled = false; + var vim = Vim.maybeInitVimState_(cm); + var visualBlock = vim.visualBlock || vim.wasInVisualBlock; + if (vim.wasInVisualBlock && !cm.ace.inMultiSelectMode) { + vim.wasInVisualBlock = false; + } else if (cm.ace.inMultiSelectMode && vim.visualBlock) { + vim.wasInVisualBlock = true; + } + + if (key == '' && !vim.insertMode && !vim.visualMode && cm.ace.inMultiSelectMode) { + cm.ace.exitMultiSelectMode(); + } else if (visualBlock || !cm.ace.inMultiSelectMode || cm.ace.inVirtualSelectionMode) { + isHandled = Vim.handleKey(cm, key, origin); + } else { + var old = cloneVimState(vim); + cm.operation(function() { + cm.ace.forEachSelection(function() { + var sel = cm.ace.selection; + cm.state.vim.lastHPos = sel.$desiredColumn == null ? sel.lead.column : sel.$desiredColumn; + var head = cm.getCursor("head"); + var anchor = cm.getCursor("anchor"); + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; + head = offsetCursor(head, 0, headOffset); + anchor = offsetCursor(anchor, 0, anchorOffset); + cm.state.vim.sel.head = head; + cm.state.vim.sel.anchor = anchor; + + isHandled = handleKey(cm, key, origin); + sel.$desiredColumn = cm.state.vim.lastHPos == -1 ? null : cm.state.vim.lastHPos; + if (cm.virtualSelectionMode()) { + cm.state.vim = cloneVimState(old); + } + }); + if (cm.curOp.cursorActivity && !isHandled) + cm.curOp.cursorActivity = false; + }, true); + } + return isHandled; + } + exports.CodeMirror = CodeMirror; + var getVim = Vim.maybeInitVimState_; + exports.handler = { + $id: "ace/keyboard/vim", + drawCursor: function(style, pixelPos, config, sel, session) { + var vim = this.state.vim || {}; + var w = config.characterWidth; + var h = config.lineHeight; + var top = pixelPos.top; + var left = pixelPos.left; + if (!vim.insertMode) { + var isbackwards = !sel.cursor + ? session.selection.isBackwards() || session.selection.isEmpty() + : Range.comparePoints(sel.cursor, sel.start) <= 0; + if (!isbackwards && left > w) + left -= w; + } + if (!vim.insertMode && vim.status) { + h = h / 2; + top += h; + } + style.left = left + "px"; + style.top = top + "px"; + style.width = w + "px"; + style.height = h + "px"; + }, + handleKeyboard: function(data, hashId, key, keyCode, e) { + var editor = data.editor; + var cm = editor.state.cm; + var vim = getVim(cm); + if (keyCode == -1) return; + + if (key == "c" && hashId == 1) { // key == "ctrl-c" + if (!useragent.isMac && editor.getCopyText()) { + editor.once("copy", function() { + editor.selection.clearSelection(); + }); + return {command: "null", passEvent: true}; + } + } else if (!vim.insertMode) { + if (useragent.isMac && this.handleMacRepeat(data, hashId, key)) { + hashId = -1; + key = data.inputChar; + } + } + + if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) { + var insertMode = vim.insertMode; + var name = lookupKey(hashId, key, e || {}); + if (vim.status == null) + vim.status = ""; + var isHandled = multiSelectHandleKey(cm, name, 'user'); + vim = getVim(cm); // may be changed by multiSelectHandleKey + if (isHandled && vim.status != null) + vim.status += name; + else if (vim.status == null) + vim.status = ""; + cm._signal("changeStatus"); + if (!isHandled && (hashId != -1 || insertMode)) + return; + return {command: "null", passEvent: !isHandled}; + } + }, + attach: function(editor) { + if (!editor.state) editor.state = {}; + var cm = new CodeMirror(editor); + editor.state.cm = cm; + editor.$vimModeHandler = this; + CodeMirror.keyMap.vim.attach(cm); + getVim(cm).status = null; + cm.on('vim-command-done', function() { + if (cm.virtualSelectionMode()) return; + getVim(cm).status = null; + cm.ace._signal("changeStatus"); + cm.ace.session.markUndoGroup(); + }); + cm.on("changeStatus", function() { + cm.ace.renderer.updateCursor(); + cm.ace._signal("changeStatus"); + }); + cm.on("vim-mode-change", function() { + if (cm.virtualSelectionMode()) return; + cm.ace.renderer.setStyle("normal-mode", !getVim(cm).insertMode); + cm._signal("changeStatus"); + }); + cm.ace.renderer.setStyle("normal-mode", !getVim(cm).insertMode); + editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm); + this.updateMacCompositionHandlers(editor, true); + }, + detach: function(editor) { + var cm = editor.state.cm; + CodeMirror.keyMap.vim.detach(cm); + cm.destroy(); + editor.state.cm = null; + editor.$vimModeHandler = null; + editor.renderer.$cursorLayer.drawCursor = null; + editor.renderer.setStyle("normal-mode", false); + this.updateMacCompositionHandlers(editor, false); + }, + getStatusText: function(editor) { + var cm = editor.state.cm; + var vim = getVim(cm); + if (vim.insertMode) + return "INSERT"; + var status = ""; + if (vim.visualMode) { + status += "VISUAL"; + if (vim.visualLine) + status += " LINE"; + if (vim.visualBlock) + status += " BLOCK"; + } + if (vim.status) + status += (status ? " " : "") + vim.status; + return status; + }, + handleMacRepeat: function(data, hashId, key) { + if (hashId == -1) { + data.inputChar = key; + data.lastEvent = "input"; + } else if (data.inputChar && data.$lastHash == hashId && data.$lastKey == key) { + if (data.lastEvent == "input") { + data.lastEvent = "input1"; + } else if (data.lastEvent == "input1") { + return true; + } + } else { + data.$lastHash = hashId; + data.$lastKey = key; + data.lastEvent = "keypress"; + } + }, + updateMacCompositionHandlers: function(editor, enable) { + var onCompositionUpdateOverride = function(text) { + var cm = editor.state.cm; + var vim = getVim(cm); + if (!vim.insertMode) { + var el = this.textInput.getElement(); + el.blur(); + el.focus(); + el.value = text; + } else { + this.onCompositionUpdateOrig(text); + } + }; + var onCompositionStartOverride = function(text) { + var cm = editor.state.cm; + var vim = getVim(cm); + if (!vim.insertMode) { + this.onCompositionStartOrig(text); + } + }; + if (enable) { + if (!editor.onCompositionUpdateOrig) { + editor.onCompositionUpdateOrig = editor.onCompositionUpdate; + editor.onCompositionUpdate = onCompositionUpdateOverride; + editor.onCompositionStartOrig = editor.onCompositionStart; + editor.onCompositionStart = onCompositionStartOverride; + } + } else { + if (editor.onCompositionUpdateOrig) { + editor.onCompositionUpdate = editor.onCompositionUpdateOrig; + editor.onCompositionUpdateOrig = null; + editor.onCompositionStart = editor.onCompositionStartOrig; + editor.onCompositionStartOrig = null; + } + } + } + }; + var renderVirtualNumbers = { + getText: function(session, row) { + return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9? "\xb7" : "" ))) + ""; + }, + getWidth: function(session, lastLineNumber, config) { + return session.getLength().toString().length * config.characterWidth; + }, + update: function(e, editor) { + editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER); + }, + attach: function(editor) { + editor.renderer.$gutterLayer.$renderer = this; + editor.on("changeSelection", this.update); + }, + detach: function(editor) { + editor.renderer.$gutterLayer.$renderer = null; + editor.off("changeSelection", this.update); + } + }; + Vim.defineOption({ + name: "wrap", + set: function(value, cm) { + if (cm) {cm.ace.setOption("wrap", value)} + }, + type: "boolean" + }, false); + Vim.defineEx('write', 'w', function() { + console.log(':write is not implemented') + }); + defaultKeymap.push( + { keys: 'zc', type: 'action', action: 'fold', actionArgs: { open: false } }, + { keys: 'zC', type: 'action', action: 'fold', actionArgs: { open: false, all: true } }, + { keys: 'zo', type: 'action', action: 'fold', actionArgs: { open: true } }, + { keys: 'zO', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, + { keys: 'za', type: 'action', action: 'fold', actionArgs: { toggle: true } }, + { keys: 'zA', type: 'action', action: 'fold', actionArgs: { toggle: true, all: true } }, + { keys: 'zf', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, + { keys: 'zd', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, + + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAbove" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelow" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAboveSkipCurrent" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelowSkipCurrent" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreBefore" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreAfter" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextBefore" } }, + { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextAfter" } } + ); + actions.aceCommand = function(cm, actionArgs, vim) { + cm.vimCmd = actionArgs; + if (cm.ace.inVirtualSelectionMode) + cm.ace.on("beforeEndOperation", delayedExecAceCommand); + else + delayedExecAceCommand(null, cm.ace); + }; + function delayedExecAceCommand(op, ace) { + ace.off("beforeEndOperation", delayedExecAceCommand); + var cmd = ace.state.cm.vimCmd; + if (cmd) { + ace.execCommand(cmd.exec ? cmd : cmd.name, cmd.args); + } + ace.curOp = ace.prevOp; + } + actions.fold = function(cm, actionArgs, vim) { + cm.ace.execCommand(['toggleFoldWidget', 'toggleFoldWidget', 'foldOther', 'unfoldall' + ][(actionArgs.all ? 2 : 0) + (actionArgs.open ? 1 : 0)]); + }; + + exports.handler.defaultKeymap = defaultKeymap; + exports.handler.actions = actions; + exports.Vim = Vim; + + Vim.map("Y", "yy", "normal"); +}); diff --git a/src/libs/ace/mode-abap.js b/src/libs/ace/mode-abap.js new file mode 100755 index 0000000..343481f --- /dev/null +++ b/src/libs/ace/mode-abap.js @@ -0,0 +1,214 @@ +ace.define("ace/mode/abap_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AbapHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": + "ADD ALIAS ALIASES ASCENDING ASSERT ASSIGN ASSIGNING AT BACK" + + " CALL CASE CATCH CHECK CLASS CLEAR CLOSE CNT COLLECT COMMIT COMMUNICATION COMPUTE CONCATENATE CONDENSE CONSTANTS CONTINUE CONTROLS CONVERT CREATE CURRENCY" + + " DATA DEFINE DEFINITION DEFERRED DELETE DESCENDING DESCRIBE DETAIL DIVIDE DO" + + " ELSE ELSEIF ENDAT ENDCASE ENDCLASS ENDDO ENDEXEC ENDFORM ENDFUNCTION ENDIF ENDIFEND ENDINTERFACE ENDLOOP ENDMETHOD ENDMODULE ENDON ENDPROVIDE ENDSELECT ENDTRY ENDWHILE EVENT EVENTS EXEC EXIT EXPORT EXPORTING EXTRACT" + + " FETCH FIELDS FORM FORMAT FREE FROM FUNCTION" + + " GENERATE GET" + + " HIDE" + + " IF IMPORT IMPORTING INDEX INFOTYPES INITIALIZATION INTERFACE INTERFACES INPUT INSERT IMPLEMENTATION" + + " LEAVE LIKE LINE LOAD LOCAL LOOP" + + " MESSAGE METHOD METHODS MODIFY MODULE MOVE MULTIPLY" + + " ON OVERLAY OPTIONAL OTHERS" + + " PACK PARAMETERS PERFORM POSITION PROGRAM PROVIDE PUT" + + " RAISE RANGES READ RECEIVE RECEIVING REDEFINITION REFERENCE REFRESH REJECT REPLACE REPORT RESERVE RESTORE RETURN RETURNING ROLLBACK" + + " SCAN SCROLL SEARCH SELECT SET SHIFT SKIP SORT SORTED SPLIT STANDARD STATICS STEP STOP SUBMIT SUBTRACT SUM SUMMARY SUPPRESS" + + " TABLES TIMES TRANSFER TRANSLATE TRY TYPE TYPES" + + " UNASSIGN ULINE UNPACK UPDATE" + + " WHEN WHILE WINDOW WRITE" + + " OCCURS STRUCTURE OBJECT PROPERTY" + + " CASTING APPEND RAISING VALUE COLOR" + + " CHANGING EXCEPTION EXCEPTIONS DEFAULT CHECKBOX COMMENT" + + " ID NUMBER FOR TITLE OUTPUT" + + " WITH EXIT USING" + + " INTO WHERE GROUP BY HAVING ORDER BY SINGLE" + + " APPENDING CORRESPONDING FIELDS OF TABLE" + + " LEFT RIGHT OUTER INNER JOIN AS CLIENT SPECIFIED BYPASSING BUFFER UP TO ROWS CONNECTING" + + " EQ NE LT LE GT GE NOT AND OR XOR IN LIKE BETWEEN", + "constant.language": + "TRUE FALSE NULL SPACE", + "support.type": + "c n i p f d t x string xstring decfloat16 decfloat34", + "keyword.operator": + "abs sign ceil floor trunc frac acos asin atan cos sin tan" + + " abapOperator cosh sinh tanh exp log log10 sqrt" + + " strlen xstrlen charlen numofchar dbmaxlen lines" + }, "text", true, " "); + + var compoundKeywords = "WITH\\W+(?:HEADER\\W+LINE|FRAME|KEY)|NO\\W+STANDARD\\W+PAGE\\W+HEADING|"+ + "EXIT\\W+FROM\\W+STEP\\W+LOOP|BEGIN\\W+OF\\W+(?:BLOCK|LINE)|BEGIN\\W+OF|"+ + "END\\W+OF\\W+(?:BLOCK|LINE)|END\\W+OF|NO\\W+INTERVALS|"+ + "RESPECTING\\W+BLANKS|SEPARATED\\W+BY|USING\\W+(?:EDIT\\W+MASK)|"+ + "WHERE\\W+(?:LINE)|RADIOBUTTON\\W+GROUP|REF\\W+TO|"+ + "(?:PUBLIC|PRIVATE|PROTECTED)(?:\\W+SECTION)?|DELETING\\W+(?:TRAILING|LEADING)"+ + "(?:ALL\\W+OCCURRENCES)|(?:FIRST|LAST)\\W+OCCURRENCE|INHERITING\\W+FROM|"+ + "LINE-COUNT|ADD-CORRESPONDING|AUTHORITY-CHECK|BREAK-POINT|CLASS-DATA|CLASS-METHODS|"+ + "CLASS-METHOD|DIVIDE-CORRESPONDING|EDITOR-CALL|END-OF-DEFINITION|END-OF-PAGE|END-OF-SELECTION|"+ + "FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|NEW-LINE|"+ + "NEW-PAGE|NEW-SECTION|PRINT-CONTROL|RP-PROVIDE-FROM-LAST|SELECT-OPTIONS|SELECTION-SCREEN|"+ + "START-OF-SELECTION|SUBTRACT-CORRESPONDING|SYNTAX-CHECK|SYNTAX-TRACE|TOP-OF-PAGE|TYPE-POOL|"+ + "TYPE-POOLS|LINE-SIZE|LINE-COUNT|MESSAGE-ID|DISPLAY-MODE|READ(?:-ONLY)?|"+ + "IS\\W+(?:NOT\\W+)?(?:ASSIGNED|BOUND|INITIAL|SUPPLIED)"; + + this.$rules = { + "start" : [ + {token : "string", regex : "`", next : "string"}, + {token : "string", regex : "'", next : "qstring"}, + {token : "doc.comment", regex : /^\*.+/}, + {token : "comment", regex : /".+$/}, + {token : "invalid", regex: "\\.{2,}"}, + {token : "keyword.operator", regex: /\W[\-+%=<>*]\W|\*\*|[~:,\.&$]|->*?|=>/}, + {token : "paren.lparen", regex : "[\\[({]"}, + {token : "paren.rparen", regex : "[\\])}]"}, + {token : "constant.numeric", regex: "[+-]?\\d+\\b"}, + {token : "variable.parameter", regex : /sy|pa?\d\d\d\d\|t\d\d\d\.|innnn/}, + {token : "keyword", regex : compoundKeywords}, + {token : "variable.parameter", regex : /\w+-\w+(?:-\w+)*/}, + {token : keywordMapper, regex : "\\b\\w+\\b"}, + {caseInsensitive: true} + ], + "qstring" : [ + {token : "constant.language.escape", regex : "''"}, + {token : "string", regex : "'", next : "start"}, + {defaultToken : "string"} + ], + "string" : [ + {token : "constant.language.escape", regex : "``"}, + {token : "string", regex : "`", next : "start"}, + {defaultToken : "string"} + ] + }; +}; +oop.inherits(AbapHighlightRules, TextHighlightRules); + +exports.AbapHighlightRules = AbapHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/abap",["require","exports","module","ace/mode/abap_highlight_rules","ace/mode/folding/coffee","ace/range","ace/mode/text","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Rules = require("./abap_highlight_rules").AbapHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; +var Range = require("../range").Range; +var TextMode = require("./text").Mode; +var oop = require("../lib/oop"); + +function Mode() { + this.HighlightRules = Rules; + this.foldingRules = new FoldMode(); +} + +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = '"' + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + return indent; + }; + + this.$id = "ace/mode/abap"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-abc.js b/src/libs/ace/mode-abc.js new file mode 100755 index 0000000..c03859d --- /dev/null +++ b/src/libs/ace/mode-abc.js @@ -0,0 +1,261 @@ +ace.define("ace/mode/abc_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function (require, exports, module) { + "use strict"; + + var oop = require("../lib/oop"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + var ABCHighlightRules = function () { + + this.$rules = { + start: [ + { + token: ['zupfnoter.information.comment.line.percentage', 'information.keyword', 'in formation.keyword.embedded'], + regex: '(%%%%)(hn\\.[a-z]*)(.*)', + comment: 'Instruction Comment' + }, + { + token: ['information.comment.line.percentage', 'information.keyword.embedded'], + regex: '(%%)(.*)', + comment: 'Instruction Comment' + }, + + { + token: 'comment.line.percentage', + regex: '%.*', + comment: 'Comments' + }, + + { + token: 'barline.keyword.operator', + regex: '[\\[:]*[|:][|\\]:]*(?:\\[?[0-9]+)?|\\[[0-9]+', + comment: 'Bar lines' + }, + { + token: ['information.keyword.embedded', 'information.argument.string.unquoted'], + regex: '(\\[[A-Za-z]:)([^\\]]*\\])', + comment: 'embedded Header lines' + }, + { + token: ['information.keyword', 'information.argument.string.unquoted'], + regex: '^([A-Za-z]:)([^%\\\\]*)', + comment: 'Header lines' + }, + { + token: ['text', 'entity.name.function', 'string.unquoted', 'text'], + regex: '(\\[)([A-Z]:)(.*?)(\\])', + comment: 'Inline fields' + }, + { + token: ['accent.constant.language', 'pitch.constant.numeric', 'duration.constant.numeric'], + regex: '([\\^=_]*)([A-Ga-gz][,\']*)([0-9]*/*[><0-9]*)', + comment: 'Notes' + }, + { + token: 'zupfnoter.jumptarget.string.quoted', + regex: '[\\"!]\\^\\:.*?[\\"!]', + comment: 'Zupfnoter jumptarget' + }, { + token: 'zupfnoter.goto.string.quoted', + regex: '[\\"!]\\^\\@.*?[\\"!]', + comment: 'Zupfnoter goto' + }, + { + token: 'zupfnoter.annotation.string.quoted', + regex: '[\\"!]\\^\\!.*?[\\"!]', + comment: 'Zupfnoter annoation' + }, + { + token: 'zupfnoter.annotationref.string.quoted', + regex: '[\\"!]\\^\\#.*?[\\"!]', + comment: 'Zupfnoter annotation reference' + }, + { + token: 'chordname.string.quoted', + regex: '[\\"!]\\^.*?[\\"!]', + comment: 'abc chord' + }, + { + token: 'string.quoted', + regex: '[\\"!].*?[\\"!]', + comment: 'abc annotation' + } + + ] + }; + + this.normalizeRules(); + }; + + ABCHighlightRules.metaData = { + fileTypes: ['abc'], + name: 'ABC', + scopeName: 'text.abcnotation' + }; + + + oop.inherits(ABCHighlightRules, TextHighlightRules); + + exports.ABCHighlightRules = ABCHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/abc",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/abc_highlight_rules","ace/mode/folding/cstyle"], function (require, exports, module) { + "use strict"; + + var oop = require("../lib/oop"); + var TextMode = require("./text").Mode; + var ABCHighlightRules = require("./abc_highlight_rules").ABCHighlightRules; + var FoldMode = require("./folding/cstyle").FoldMode; + + var Mode = function () { + this.HighlightRules = ABCHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; + }; + oop.inherits(Mode, TextMode); + + (function () { + this.$id = "ace/mode/abc" + }).call(Mode.prototype); + + exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-actionscript.js b/src/libs/ace/mode-actionscript.js new file mode 100755 index 0000000..c1af163 --- /dev/null +++ b/src/libs/ace/mode-actionscript.js @@ -0,0 +1,267 @@ +ace.define("ace/mode/actionscript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ActionScriptHighlightRules = function() { + + this.$rules = { start: + [ { token: 'support.class.actionscript.2', + regex: '\\b(?:R(?:ecordset|DBMSResolver|adioButton(?:Group)?)|X(?:ML(?:Socket|Node|Connector)?|UpdateResolverDataHolder)|M(?:M(?:Save|Execute)|icrophoneMicrophone|o(?:use|vieClip(?:Loader)?)|e(?:nu(?:Bar)?|dia(?:Controller|Display|Playback))|ath)|B(?:yName|inding|utton)|S(?:haredObject|ystem|crollPane|t(?:yleSheet|age|ream)|ound|e(?:ndEvent|rviceObject)|OAPCall|lide)|N(?:umericStepper|et(?:stream|S(?:tream|ervices)|Connection|Debug(?:Config)?))|C(?:heckBox|o(?:ntextMenu(?:Item)?|okie|lor|m(?:ponentMixins|boBox))|ustomActions|lient|amera)|T(?:ypedValue|ext(?:Snapshot|Input|F(?:ield|ormat)|Area)|ree|AB)|Object|D(?:ownload|elta(?:Item|Packet)?|at(?:e(?:Chooser|Field)?|a(?:G(?:lue|rid)|Set|Type)))|U(?:RL|TC|IScrollBar)|P(?:opUpManager|endingCall|r(?:intJob|o(?:duct|gressBar)))|E(?:ndPoint|rror)|Video|Key|F(?:RadioButton|GridColumn|MessageBox|BarChart|S(?:croll(?:Bar|Pane)|tyleFormat|plitView)|orm|C(?:heckbox|omboBox|alendar)|unction|T(?:icker|ooltip(?:Lite)?|ree(?:Node)?)|IconButton|D(?:ataGrid|raggablePane)|P(?:ieChart|ushButton|ro(?:gressBar|mptBox))|L(?:i(?:stBox|neChart)|oadingBox)|AdvancedMessageBox)|W(?:indow|SDLURL|ebService(?:Connector)?)|L(?:ist|o(?:calConnection|ad(?:er|Vars)|g)|a(?:unch|bel))|A(?:sBroadcaster|cc(?:ordion|essibility)|S(?:Set(?:Native|PropFlags)|N(?:ew|ative)|C(?:onstructor|lamp(?:2)?)|InstanceOf)|pplication|lert|rray))\\b' }, + { token: 'support.function.actionscript.2', + regex: '\\b(?:s(?:h(?:ift|ow(?:GridLines|Menu|Border|Settings|Headers|ColumnHeaders|Today|Preferences)?|ad(?:ow|ePane))|c(?:hema|ale(?:X|Mode|Y|Content)|r(?:oll(?:Track|Drag)?|een(?:Resolution|Color|DPI)))|t(?:yleSheet|op(?:Drag|A(?:nimation|llSounds|gent))?|epSize|a(?:tus|rt(?:Drag|A(?:nimation|gent))?))|i(?:n|ze|lence(?:TimeOut|Level))|o(?:ngname|urce|rt(?:Items(?:By)?|On(?:HeaderRelease)?|able(?:Columns)?)?)|u(?:ppressInvalidCalls|bstr(?:ing)?)|p(?:li(?:ce|t)|aceCol(?:umnsEqually|lumnsEqually))|e(?:nd(?:DefaultPushButtonEvent|AndLoad)?|curity|t(?:R(?:GB|o(?:otNode|w(?:Height|Count))|esizable(?:Columns)?|a(?:nge|te))|G(?:ain|roupName)|X(?:AxisTitle)?|M(?:i(?:n(?:imum|utes)|lliseconds)|o(?:nth(?:Names)?|tionLevel|de)|ultilineMode|e(?:ssage|nu(?:ItemEnabled(?:At)?|EnabledAt)|dia)|a(?:sk|ximum))|B(?:u(?:tton(?:s|Width)|fferTime)|a(?:seTabIndex|ndwidthLimit|ckground))|S(?:howAsDisabled|croll(?:ing|Speed|Content|Target|P(?:osition|roperties)|barState|Location)|t(?:yle(?:Property)?|opOnFocus|at(?:us|e))|i(?:ze|lenceLevel)|ort(?:able(?:Columns)?|Function)|p(?:litterBarPosition|acing)|e(?:conds|lect(?:Multiple|ion(?:Required|Type)?|Style|Color|ed(?:Node(?:s)?|Cell|I(?:nd(?:ices|ex)|tem(?:s)?))?|able))|kin|m(?:oothness|allScroll))|H(?:ighlight(?:s|Color)|Scroll|o(?:urs|rizontal)|eader(?:Symbol|Height|Text|Property|Format|Width|Location)?|as(?:Shader|CloseBox))|Y(?:ear|AxisTitle)?|N(?:ode(?:Properties|ExpansionHandler)|ewTextFormat)|C(?:h(?:ildNodes|a(?:ngeHandler|rt(?:Title|EventHandler)))|o(?:ntent(?:Size)?|okie|lumns)|ell(?:Symbol|Data)|l(?:i(?:ckHandler|pboard)|oseHandler)|redentials)|T(?:ype(?:dVaule)?|i(?:tle(?:barHeight)?|p(?:Target|Offset)?|me(?:out(?:Handler)?)?)|oggle|extFormat|ransform)|I(?:s(?:Branch|Open)|n(?:terval|putProperty)|con(?:SymbolName)?|te(?:rator|m(?:ByKey|Symbol)))|Orientation|D(?:i(?:splay(?:Range|Graphics|Mode|Clip|Text|edMonth)|rection)|uration|e(?:pth(?:Below|To|Above)|fault(?:GatewayURL|Mappings|NodeIconSymbolName)|l(?:iveryMode|ay)|bug(?:ID)?)|a(?:yOfWeekNames|t(?:e(?:Filter)?|a(?:Mapping(?:s)?|Item(?:Text|Property|Format)|Provider|All(?:Height|Property|Format|Width))?))|ra(?:wConnectors|gContent))|U(?:se(?:Shadow|HandCursor|EchoSuppression|rInput|Fade)|TC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear))|P(?:osition|ercentComplete|an(?:e(?:M(?:inimumSize|aximumSize)|Size|Title))?|ro(?:pert(?:y(?:Data)?|iesAt)|gress))|E(?:nabled|dit(?:Handler|able)|xpand(?:NodeTrigger|erSymbolName))|V(?:Scroll|olume|alue(?:Source)?)|KeyFrameInterval|Quality|F(?:i(?:eld|rst(?:DayOfWeek|VisibleNode))|ocus|ullYear|ps|ade(?:InLength|OutLength)|rame(?:Color|Width))|Width|L(?:ine(?:Color|Weight)|o(?:opback|adTarget)|a(?:rgeScroll|bel(?:Source|Placement)?))|A(?:s(?:Boolean|String|Number)|n(?:yTypedValue|imation)|ctiv(?:e(?:State(?:Handler)?|Handler)|ateHandler)|utoH(?:ideScrollBar|eight)))?|paratorBefore|ek|lect(?:ion(?:Disabled|Unfocused)?|ed(?:Node(?:s)?|Child|I(?:nd(?:ices|ex)|tem(?:s)?)|Dat(?:e|a))?|able(?:Ranges)?)|rver(?:String)?)|kip|qrt|wapDepths|lice|aveToSharedObj|moothing)|h(?:scroll(?:Policy)?|tml(?:Text)?|i(?:t(?:Test(?:TextNearPos)?|Area)|de(?:BuiltInItems|Child)?|ghlight(?:2D|3D)?)|orizontal|e(?:ight|ader(?:Re(?:nderer|lease)|Height|Text))|P(?:osition|ageScrollSize)|a(?:s(?:childNodes|MP3|S(?:creen(?:Broadcast|Playback)|treaming(?:Video|Audio)|ort)|Next|OwnProperty|Pr(?:inting|evious)|EmbeddedVideo|VideoEncoder|A(?:ccesibility|udio(?:Encoder)?))|ndlerName)|LineScrollSize)|ye(?:sLabel|ar)|n(?:o(?:t|de(?:Name|Close|Type|Open|Value)|Label)|u(?:llValue|mChild(?:S(?:creens|lides)|ren|Forms))|e(?:w(?:Item|line|Value|LocationDialog)|xt(?:S(?:cene|ibling|lide)|TabIndex|Value|Frame)?)?|ame(?:s)?)|c(?:h(?:ildNodes|eck|a(?:nge(?:sPending)?|r(?:CodeAt|At))|r)|o(?:s|n(?:st(?:ant|ructor)|nect|c(?:urrency|at)|t(?:ent(?:Type|Path)?|ains|rol(?:Placement|lerPolicy))|denseWhite|version)|py|l(?:or|umn(?:Stretch|Name(?:s)?|Count))|m(?:p(?:onent|lete)|ment))|u(?:stomItems|ePoint(?:s)?|r(?:veTo|Value|rent(?:Slide|ChildSlide|Item|F(?:ocused(?:S(?:creen|lide)|Form)|ps))))|e(?:il|ll(?:Renderer|Press|Edit|Focus(?:In|Out)))|l(?:i(?:ck|ents)|o(?:se(?:Button|Pane)?|ne(?:Node)?)|ear(?:S(?:haredObjects|treams)|Timeout|Interval)?)|a(?:ncelLabel|tch|p(?:tion|abilities)|l(?:cFields|l(?:e(?:e|r))?))|reate(?:GatewayConnection|Menu|Se(?:rver|gment)|C(?:hild(?:AtDepth)?|l(?:ient|ass(?:ChildAtDepth|Object(?:AtDepth)?))|all)|Text(?:Node|Field)|Item|Object(?:AtDepth)?|PopUp|E(?:lement|mptyMovieClip)))|t(?:h(?:is|row)|ype(?:of|Name)?|i(?:tle(?:StyleDeclaration)?|me(?:out)?)|o(?:talTime|String|olTipText|p|UpperCase|ggle(?:HighQuality)?|Lo(?:caleString|werCase))|e(?:st|llTarget|xt(?:RightMargin|Bold|S(?:ize|elected)|Height|Color|I(?:ndent|talic)|Disabled|Underline|F(?:ield|ont)|Width|LeftMargin|Align)?)|a(?:n|rget(?:Path)?|b(?:Stops|Children|Index|Enabled|leName))|r(?:y|igger|ac(?:e|k(?:AsMenu)?)))|i(?:s(?:Running|Branch|NaN|Con(?:soleOpen|nected)|Toggled|Installed|Open|D(?:own|ebugger)|P(?:urchased|ro(?:totypeOf|pertyEnumerable))|Empty|F(?:inite|ullyPopulated)|Local|Active)|n(?:s(?:tall|ertBefore)|cludeDeltaPacketInfo|t|it(?:ialize|Component|Pod|A(?:pplication|gent))?|de(?:nt|terminate|x(?:InParent(?:Slide|Form)?|Of)?)|put|validate|finity|LocalInternetCache)?|con(?:F(?:ield|unction))?|t(?:e(?:ratorScrolled|m(?:s|RollO(?:ut|ver)|ClassName))|alic)|d3|p|fFrameLoaded|gnore(?:Case|White))|o(?:s|n(?:R(?:ollO(?:ut|ver)|e(?:s(?:ize|ult)|l(?:ease(?:Outside)?|aseOutside)))|XML|Mouse(?:Move|Down|Up|Wheel)|S(?:ync|croller|tatus|oundComplete|e(?:tFocus|lect(?:edItem)?))|N(?:oticeEvent|etworkChange)|C(?:hanged|onnect|l(?:ipEvent|ose))|ID3|D(?:isconnect|eactivate|ata|ragO(?:ut|ver))|Un(?:install|load)|P(?:aymentResult|ress)|EnterFrame|K(?:illFocus|ey(?:Down|Up))|Fault|Lo(?:ad|g)|A(?:ctiv(?:ity|ate)|ppSt(?:op|art)))?|pe(?:n|ration)|verLayChildren|kLabel|ldValue|r(?:d)?)|d(?:i(?:s(?:connect|play(?:Normal|ed(?:Month|Year)|Full)|able(?:Shader|d(?:Ranges|Days)|CloseBox|Events))|rection)|o(?:cTypeDecl|tall|Decoding|main|LazyDecoding)|u(?:plicateMovieClip|ration)|e(?:stroy(?:ChildAt|Object)|code|fault(?:PushButton(?:Enabled)?|KeydownHandler)?|l(?:ta(?:Packet(?:Changed)?)?|ete(?:PopUp|All)?)|blocking)|a(?:shBoardSave|yNames|ta(?:Provider)?|rkshadow)|r(?:opdown(?:Width)?|a(?:w|gO(?:ut|ver))))|u(?:se(?:Sort|HandCursor|Codepage|EchoSuppression)|n(?:shift|install|derline|escape|format|watch|lo(?:ck|ad(?:Movie(?:Num)?)?))|pdate(?:Results|Mode|I(?:nputProperties|tem(?:ByIndex)?)|P(?:acket|roperties)|View|AfterEvent)|rl)|join|p(?:ixelAspectRatio|o(?:sition|p|w)|u(?:sh|rge|blish)|ercen(?:tComplete|Loaded)|lay(?:head(?:Change|Time)|ing|Hidden|erType)?|a(?:ssword|use|r(?:se(?:XML|CSS|Int|Float)|ent(?:Node|Is(?:S(?:creen|lide)|Form))|ams))|r(?:int(?:Num|AsBitmap(?:Num)?)?|o(?:to(?:type)?|pert(?:y|ies)|gress)|e(?:ss|v(?:ious(?:S(?:ibling|lide)|Value)?|Scene|Frame)|ferred(?:Height|Width))))|e(?:scape|n(?:code(?:r)?|ter(?:Frame)?|dFill|able(?:Shader|d|CloseBox|Events))|dit(?:able|Field|LocationDialog)|v(?:ent|al(?:uate)?)|q|x(?:tended|p|ec(?:ute)?|actSettings)|m(?:phasized(?:StyleDeclaration)?|bedFonts))|v(?:i(?:sible|ewPod)|ScrollPolicy|o(?:id|lume)|ersion|P(?:osition|ageScrollSize)|a(?:l(?:idat(?:ionError|e(?:Property|ActivationKey)?)|ue(?:Of)?)|riable)|LineScrollSize)|k(?:ind|ey(?:Down|Up|Press|FrameInterval))|q(?:sort|uality)|f(?:scommand|i(?:n(?:d(?:Text|First|Last)?|ally)|eldInfo|lter(?:ed|Func)?|rst(?:Slide|Child|DayOfWeek|VisibleNode)?)|o(?:nt|cus(?:In|edCell|Out|Enabled)|r(?:egroundDisabled|mat(?:ter)?))|unctionName|ps|l(?:oor|ush)|ace|romCharCode)|w(?:i(?:th|dth)|ordWrap|atch|riteAccess)|l(?:t|i(?:st(?:Owner)?|ne(?:Style|To))|o(?:c(?:k|a(?:t(?:ion|eByld)|l(?:ToGlobal|FileReadDisable)))|opback|ad(?:Movie(?:Num)?|S(?:crollContent|ound)|ed|Variables(?:Num)?|Application)?|g(?:Changes)?)|e(?:ngth|ft(?:Margin)?|ading)?|a(?:st(?:Slide|Child|Index(?:Of)?)?|nguage|b(?:el(?:Placement|F(?:ield|unction))?|leField)))|a(?:s(?:scociate(?:Controller|Display)|in|pectRatio|function)|nd|c(?:ceptConnection|tiv(?:ityLevel|ePlayControl)|os)|t(?:t(?:ach(?:Movie|Sound|Video|Audio)|ributes)|an(?:2)?)|dd(?:header|RequestHeader|Menu(?:Item(?:At)?|At)?|Sort|Header|No(?:tice|de(?:At)?)|C(?:olumn(?:At)?|uePoint)|T(?:oLocalInternetCache|reeNode(?:At)?)|I(?:con|tem(?:s(?:At)?|At)?)|DeltaItem|P(?:od|age|roperty)|EventListener|View|FieldInfo|Listener|Animation)?|uto(?:Size|Play|KeyNav|Load)|pp(?:endChild|ly(?:Changes|Updates)?)|vHardwareDisable|fterLoaded|l(?:ternateRowColors|ign|l(?:ow(?:InsecureDomain|Domain)|Transitions(?:InDone|OutDone))|bum)|r(?:tist|row|g(?:uments|List))|gent|bs)|r(?:ight(?:Margin)?|o(?:ot(?:S(?:creen|lide)|Form)|und|w(?:Height|Count)|llO(?:ut|ver))|e(?:s(?:yncDepth|t(?:orePane|artAnimation|rict)|iz(?:e|able(?:Columns)?)|olveDelta|ult(?:s)?|ponse)|c(?:o(?:ncile(?:Results|Updates)|rd)|eive(?:Video|Audio))|draw|jectConnection|place(?:Sel|ItemAt|AllItems)?|ve(?:al(?:Child)?|rse)|quest(?:SizeChange|Payment)?|f(?:errer|resh(?:ScrollContent|Destinations|Pane|FromSources)?)|lease(?:Outside)?|ad(?:Only|Access)|gister(?:SkinElement|C(?:olor(?:Style|Name)|lass)|InheritingStyle|Proxy)|move(?:Range|M(?:ovieClip|enu(?:Item(?:At)?|At))|Background|Sort|No(?:tice|de(?:sAt|At)?)|C(?:olum(?:nAt|At)|uePoints)|T(?:extField|reeNode(?:At)?)|Item(?:At)?|Pod|EventListener|FromLocalInternetCache|Listener|All(?:C(?:olumns|uePoints)|Items)?))|a(?:ndom|te|dioDot))|g(?:t|oto(?:Slide|NextSlide|PreviousSlide|FirstSlide|LastSlide|And(?:Stop|Play))|e(?:nre|t(?:R(?:GB|o(?:otNode|wCount)|e(?:sizable|mote))|X(?:AxisTitle)?|M(?:i(?:n(?:imum(?:Size)?|utes)|lliseconds)|onth(?:Names)?|ultilineMode|e(?:ssage|nu(?:ItemAt|EnabledAt|At))|aximum(?:Size)?)|B(?:ytes(?:Total|Loaded)|ounds|utton(?:s|Width)|eginIndex|a(?:ndwidthLimit|ckground))|S(?:howAsDisabled|croll(?:ing|Speed|Content|Position|barState|Location)|t(?:yle(?:Names)?|opOnFocus|ate)|ize|o(?:urce|rtState)|p(?:litterBarPosition|acing)|e(?:conds|lect(?:Multiple|ion(?:Required|Type)|Style|ed(?:Node(?:s)?|Cell|Text|I(?:nd(?:ices|ex)|tem(?:s)?))?)|rvice)|moothness|WFVersion)|H(?:ighlight(?:s|Color)|ours|e(?:ight|ader(?:Height|Text|Property|Format|Width|Location)?)|as(?:Shader|CloseBox))|Y(?:ear|AxisTitle)?|N(?:o(?:tices|de(?:DisplayedAt|At))|um(?:Children|berAvailable)|e(?:wTextFormat|xtHighestDepth))|C(?:h(?:ild(?:S(?:creen|lide)|Nodes|Form|At)|artTitle)|o(?:n(?:tent|figInfo)|okie|de|unt|lumn(?:Names|Count|Index|At))|uePoint|ellIndex|loseHandler|a(?:ll|retIndex))|T(?:ypedValue|i(?:tle(?:barHeight)?|p(?:Target|Offset)?|me(?:stamp|zoneOffset|out(?:State|Handler)|r)?)|oggle|ext(?:Extent|Format)?|r(?:ee(?:NodeAt|Length)|ans(?:form|actionId)))|I(?:s(?:Branch|Open)|n(?:stanceAtDepth|d(?:icesByKey|exByKey))|con(?:SymbolName)?|te(?:rator|m(?:sByKey|By(?:Name|Key)|id|ID|At))|d)|O(?:utput(?:Parameter(?:s|ByName)?|Value(?:s)?)|peration|ri(?:entation|ginalCellData))|D(?:i(?:s(?:play(?:Range|Mode|Clip|Index|edMonth)|kUsage)|rection)|uration|e(?:pth|faultNodeIconSymbolName|l(?:taPacket|ay)|bug(?:Config|ID)?)|a(?:y(?:OfWeekNames)?|t(?:e|a(?:Mapping(?:s)?|Item(?:Text|Property|Format)|Label|All(?:Height|Property|Format|Width))?))|rawConnectors)|U(?:se(?:Shadow|HandCursor|rInput|Fade)|RL|TC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear))|P(?:o(?:sition|ds)|ercentComplete|a(?:n(?:e(?:M(?:inimums|aximums)|Height|Title|Width))?|rentNode)|r(?:operty(?:Name|Data)?|efer(?:ences|red(?:Height|Width))))|E(?:n(?:dIndex|abled)|ditingData|x(?:panderSymbolName|andNodeTrigger))|V(?:iewed(?:Pods|Applications)|olume|ersion|alue(?:Source)?)|F(?:i(?:eld|rst(?:DayOfWeek|VisibleNode))|o(?:ntList|cus)|ullYear|ade(?:InLength|OutLength)|rame(?:Color|Width))|Width|L(?:ine(?:Color|Weight)|o(?:cal|adTarget)|ength|a(?:stTabIndex|bel(?:Source)?))|A(?:s(?:cii|Boolean|String|Number)|n(?:yTypedValue|imation)|ctiv(?:eState(?:Handler)?|ateHandler)|utoH(?:ideScrollBar|eight)|llItems|gent))?)?|lobal(?:StyleFormat|ToLocal)?|ain|roupName)|x(?:updatePackety|mlDecl)?|m(?:y(?:MethodName|Call)|in(?:imum)?|o(?:nthNames|tion(?:TimeOut|Level)|de(?:lChanged)?|use(?:Move|O(?:ut|ver)|Down(?:Somewhere|Outside)?|Up(?:Somewhere)?|WheelEnabled)|ve(?:To)?)|u(?:ted|lti(?:pleS(?:imultaneousAllowed|elections)|line))|e(?:ssage|nu(?:Show|Hide)?|th(?:od)?|diaType)|a(?:nufacturer|tch|x(?:scroll|hscroll|imum|HPosition|Chars|VPosition)?)|b(?:substring|chr|ord|length))|b(?:ytes(?:Total|Loaded)|indFormat(?:Strings|Function)|o(?:ttom(?:Scroll)?|ld|rder(?:Color)?)|u(?:tton(?:Height|Width)|iltInItems|ffer(?:Time|Length)|llet)|e(?:foreApplyUpdates|gin(?:GradientFill|Fill))|lockIndent|a(?:ndwidth|ckground(?:Style|Color|Disabled)?)|roadcastMessage)|onHTTPStatus)\\b' }, + { token: 'support.constant.actionscript.2', + regex: '\\b(?:__proto__|__resolve|_accProps|_alpha|_changed|_currentframe|_droptarget|_flash|_focusrect|_framesloaded|_global|_height|_highquality|_level|_listeners|_lockroot|_name|_parent|_quality|_root|_rotation|_soundbuftime|_target|_totalframes|_url|_visible|_width|_x|_xmouse|_xscale|_y|_ymouse|_yscale)\\b' }, + { token: 'keyword.control.actionscript.2', + regex: '\\b(?:dynamic|extends|import|implements|interface|public|private|new|static|super|var|for|in|break|continue|while|do|return|if|else|case|switch)\\b' }, + { token: 'storage.type.actionscript.2', + regex: '\\b(?:Boolean|Number|String|Void)\\b' }, + { token: 'constant.language.actionscript.2', + regex: '\\b(?:null|undefined|true|false)\\b' }, + { token: 'constant.numeric.actionscript.2', + regex: '\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\.?[0-9]*|\\.[0-9]+)(?:(?:e|E)(?:\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\b' }, + { token: 'punctuation.definition.string.begin.actionscript.2', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.actionscript.2', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.actionscript.2', + regex: '\\\\.' }, + { defaultToken: 'string.quoted.double.actionscript.2' } ] }, + { token: 'punctuation.definition.string.begin.actionscript.2', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.actionscript.2', + regex: '\'', + next: 'pop' }, + { token: 'constant.character.escape.actionscript.2', + regex: '\\\\.' }, + { defaultToken: 'string.quoted.single.actionscript.2' } ] }, + { token: 'support.constant.actionscript.2', + regex: '\\b(?:BACKSPACE|CAPSLOCK|CONTROL|DELETEKEY|DOWN|END|ENTER|HOME|INSERT|LEFT|LN10|LN2|LOG10E|LOG2E|MAX_VALUE|MIN_VALUE|NEGATIVE_INFINITY|NaN|PGDN|PGUP|PI|POSITIVE_INFINITY|RIGHT|SPACE|SQRT1_2|SQRT2|UP)\\b' }, + { token: 'punctuation.definition.comment.actionscript.2', + regex: '/\\*', + push: + [ { token: 'punctuation.definition.comment.actionscript.2', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.actionscript.2' } ] }, + { token: 'punctuation.definition.comment.actionscript.2', + regex: '//.*$', + push_: + [ { token: 'comment.line.double-slash.actionscript.2', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-slash.actionscript.2' } ] }, + { token: 'keyword.operator.actionscript.2', + regex: '\\binstanceof\\b' }, + { token: 'keyword.operator.symbolic.actionscript.2', + regex: '[-!%&*+=/?:]' }, + { token: + [ 'meta.preprocessor.actionscript.2', + 'punctuation.definition.preprocessor.actionscript.2', + 'meta.preprocessor.actionscript.2' ], + regex: '^([ \\t]*)(#)([a-zA-Z]+)' }, + { token: + [ 'storage.type.function.actionscript.2', + 'meta.function.actionscript.2', + 'entity.name.function.actionscript.2', + 'meta.function.actionscript.2', + 'punctuation.definition.parameters.begin.actionscript.2' ], + regex: '\\b(function)(\\s+)([a-zA-Z_]\\w*)(\\s*)(\\()', + push: + [ { token: 'punctuation.definition.parameters.end.actionscript.2', + regex: '\\)', + next: 'pop' }, + { token: 'variable.parameter.function.actionscript.2', + regex: '[^,)$]+' }, + { defaultToken: 'meta.function.actionscript.2' } ] }, + { token: + [ 'storage.type.class.actionscript.2', + 'meta.class.actionscript.2', + 'entity.name.type.class.actionscript.2', + 'meta.class.actionscript.2', + 'storage.modifier.extends.actionscript.2', + 'meta.class.actionscript.2', + 'entity.other.inherited-class.actionscript.2' ], + regex: '\\b(class)(\\s+)([a-zA-Z_](?:\\w|\\.)*)(?:(\\s+)(extends)(\\s+)([a-zA-Z_](?:\\w|\\.)*))?' } ] } + + this.normalizeRules(); +}; + +ActionScriptHighlightRules.metaData = { fileTypes: [ 'as' ], + keyEquivalent: '^~A', + name: 'ActionScript', + scopeName: 'source.actionscript.2' } + + +oop.inherits(ActionScriptHighlightRules, TextHighlightRules); + +exports.ActionScriptHighlightRules = ActionScriptHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/actionscript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/actionscript_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ActionScriptHighlightRules = require("./actionscript_highlight_rules").ActionScriptHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = ActionScriptHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/actionscript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-ada.js b/src/libs/ace/mode-ada.js new file mode 100755 index 0000000..da05988 --- /dev/null +++ b/src/libs/ace/mode-ada.js @@ -0,0 +1,87 @@ +ace.define("ace/mode/ada_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AdaHighlightRules = function() { +var keywords = "abort|else|new|return|abs|elsif|not|reverse|abstract|end|null|accept|entry|select|" + +"access|exception|of|separate|aliased|exit|or|some|all|others|subtype|and|for|out|synchronized|" + +"array|function|overriding|at|tagged|generic|package|task|begin|goto|pragma|terminate|" + +"body|private|then|if|procedure|type|case|in|protected|constant|interface|until|" + +"|is|raise|use|declare|range|delay|limited|record|when|delta|loop|rem|while|digits|renames|with|do|mod|requeue|xor"; + + var builtinConstants = ( + "true|false|null" + ); + + var builtinFunctions = ( + "count|min|max|avg|sum|rank|now|coalesce|main" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "--.*$" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; +}; + +oop.inherits(AdaHighlightRules, TextHighlightRules); + +exports.AdaHighlightRules = AdaHighlightRules; +}); + +ace.define("ace/mode/ada",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ada_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var AdaHighlightRules = require("./ada_highlight_rules").AdaHighlightRules; + +var Mode = function() { + this.HighlightRules = AdaHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + + this.$id = "ace/mode/ada"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-apache_conf.js b/src/libs/ace/mode-apache_conf.js new file mode 100755 index 0000000..bb6566a --- /dev/null +++ b/src/libs/ace/mode-apache_conf.js @@ -0,0 +1,356 @@ +ace.define("ace/mode/apache_conf_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ApacheConfHighlightRules = function() { + + this.$rules = { start: + [ { token: + [ 'punctuation.definition.comment.apacheconf', + 'comment.line.hash.ini', + 'comment.line.hash.ini' ], + regex: '^((?:\\s)*)(#)(.*$)' }, + { token: + [ 'punctuation.definition.tag.apacheconf', + 'entity.tag.apacheconf', + 'text', + 'string.value.apacheconf', + 'punctuation.definition.tag.apacheconf' ], + regex: '(<)(Proxy|ProxyMatch|IfVersion|Directory|DirectoryMatch|Files|FilesMatch|IfDefine|IfModule|Limit|LimitExcept|Location|LocationMatch|VirtualHost)(?:(\\s)(.+?))?(>)' }, + { token: + [ 'punctuation.definition.tag.apacheconf', + 'entity.tag.apacheconf', + 'punctuation.definition.tag.apacheconf' ], + regex: '()' }, + { token: + [ 'keyword.alias.apacheconf', 'text', + 'string.regexp.apacheconf', 'text', + 'string.replacement.apacheconf', 'text' ], + regex: '(Rewrite(?:Rule|Cond))(\\s+)(.+?)(\\s+)(.+?)($|\\s)' }, + { token: + [ 'keyword.alias.apacheconf', 'text', + 'entity.status.apacheconf', 'text', + 'string.regexp.apacheconf', 'text', + 'string.path.apacheconf', 'text' ], + regex: '(RedirectMatch)(?:(\\s+)(\\d\\d\\d|permanent|temp|seeother|gone))?(\\s+)(.+?)(\\s+)(?:(.+?)($|\\s))?' }, + { token: + [ 'keyword.alias.apacheconf', 'text', + 'entity.status.apacheconf', 'text', + 'string.path.apacheconf', 'text', + 'string.path.apacheconf', 'text' ], + regex: '(Redirect)(?:(\\s+)(\\d\\d\\d|permanent|temp|seeother|gone))?(\\s+)(.+?)(\\s+)(?:(.+?)($|\\s))?' }, + { token: + [ 'keyword.alias.apacheconf', 'text', + 'string.regexp.apacheconf', 'text', + 'string.path.apacheconf', 'text' ], + regex: '(ScriptAliasMatch|AliasMatch)(\\s+)(.+?)(\\s+)(?:(.+?)(\\s))?' }, + { token: + [ 'keyword.alias.apacheconf', 'text', + 'string.path.apacheconf', 'text', + 'string.path.apacheconf', 'text' ], + regex: '(RedirectPermanent|RedirectTemp|ScriptAlias|Alias)(\\s+)(.+?)(\\s+)(?:(.+?)($|\\s))?' }, + { token: 'keyword.core.apacheconf', + regex: '\\b(?:AcceptPathInfo|AccessFileName|AddDefaultCharset|AddOutputFilterByType|AllowEncodedSlashes|AllowOverride|AuthName|AuthType|CGIMapExtension|ContentDigest|DefaultType|DocumentRoot|EnableMMAP|EnableSendfile|ErrorDocument|ErrorLog|FileETag|ForceType|HostnameLookups|IdentityCheck|Include|KeepAlive|KeepAliveTimeout|LimitInternalRecursion|LimitRequestBody|LimitRequestFields|LimitRequestFieldSize|LimitRequestLine|LimitXMLRequestBody|LogLevel|MaxKeepAliveRequests|NameVirtualHost|Options|Require|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScriptInterpreterSource|ServerAdmin|ServerAlias|ServerName|ServerPath|ServerRoot|ServerSignature|ServerTokens|SetHandler|SetInputFilter|SetOutputFilter|TimeOut|TraceEnable|UseCanonicalName)\\b' }, + { token: 'keyword.mpm.apacheconf', + regex: '\\b(?:AcceptMutex|AssignUserID|BS2000Account|ChildPerUserID|CoreDumpDirectory|EnableExceptionHook|Group|Listen|ListenBacklog|LockFile|MaxClients|MaxMemFree|MaxRequestsPerChild|MaxRequestsPerThread|MaxSpareServers|MaxSpareThreads|MaxThreads|MaxThreadsPerChild|MinSpareServers|MinSpareThreads|NumServers|PidFile|ReceiveBufferSize|ScoreBoardFile|SendBufferSize|ServerLimit|StartServers|StartThreads|ThreadLimit|ThreadsPerChild|ThreadStackSize|User|Win32DisableAcceptEx)\\b' }, + { token: 'keyword.access.apacheconf', + regex: '\\b(?:Allow|Deny|Order)\\b' }, + { token: 'keyword.actions.apacheconf', + regex: '\\b(?:Action|Script)\\b' }, + { token: 'keyword.alias.apacheconf', + regex: '\\b(?:Alias|AliasMatch|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ScriptAlias|ScriptAliasMatch)\\b' }, + { token: 'keyword.auth.apacheconf', + regex: '\\b(?:AuthAuthoritative|AuthGroupFile|AuthUserFile)\\b' }, + { token: 'keyword.auth_anon.apacheconf', + regex: '\\b(?:Anonymous|Anonymous_Authoritative|Anonymous_LogEmail|Anonymous_MustGiveEmail|Anonymous_NoUserID|Anonymous_VerifyEmail)\\b' }, + { token: 'keyword.auth_dbm.apacheconf', + regex: '\\b(?:AuthDBMAuthoritative|AuthDBMGroupFile|AuthDBMType|AuthDBMUserFile)\\b' }, + { token: 'keyword.auth_digest.apacheconf', + regex: '\\b(?:AuthDigestAlgorithm|AuthDigestDomain|AuthDigestFile|AuthDigestGroupFile|AuthDigestNcCheck|AuthDigestNonceFormat|AuthDigestNonceLifetime|AuthDigestQop|AuthDigestShmemSize)\\b' }, + { token: 'keyword.auth_ldap.apacheconf', + regex: '\\b(?:AuthLDAPAuthoritative|AuthLDAPBindDN|AuthLDAPBindPassword|AuthLDAPCharsetConfig|AuthLDAPCompareDNOnServer|AuthLDAPDereferenceAliases|AuthLDAPEnabled|AuthLDAPFrontPageHack|AuthLDAPGroupAttribute|AuthLDAPGroupAttributeIsDN|AuthLDAPRemoteUserIsDN|AuthLDAPUrl)\\b' }, + { token: 'keyword.autoindex.apacheconf', + regex: '\\b(?:AddAlt|AddAltByEncoding|AddAltByType|AddDescription|AddIcon|AddIconByEncoding|AddIconByType|DefaultIcon|HeaderName|IndexIgnore|IndexOptions|IndexOrderDefault|ReadmeName)\\b' }, + { token: 'keyword.cache.apacheconf', + regex: '\\b(?:CacheDefaultExpire|CacheDisable|CacheEnable|CacheForceCompletion|CacheIgnoreCacheControl|CacheIgnoreHeaders|CacheIgnoreNoLastMod|CacheLastModifiedFactor|CacheMaxExpire)\\b' }, + { token: 'keyword.cern_meta.apacheconf', + regex: '\\b(?:MetaDir|MetaFiles|MetaSuffix)\\b' }, + { token: 'keyword.cgi.apacheconf', + regex: '\\b(?:ScriptLog|ScriptLogBuffer|ScriptLogLength)\\b' }, + { token: 'keyword.cgid.apacheconf', + regex: '\\b(?:ScriptLog|ScriptLogBuffer|ScriptLogLength|ScriptSock)\\b' }, + { token: 'keyword.charset_lite.apacheconf', + regex: '\\b(?:CharsetDefault|CharsetOptions|CharsetSourceEnc)\\b' }, + { token: 'keyword.dav.apacheconf', + regex: '\\b(?:Dav|DavDepthInfinity|DavMinTimeout|DavLockDB)\\b' }, + { token: 'keyword.deflate.apacheconf', + regex: '\\b(?:DeflateBufferSize|DeflateCompressionLevel|DeflateFilterNote|DeflateMemLevel|DeflateWindowSize)\\b' }, + { token: 'keyword.dir.apacheconf', + regex: '\\b(?:DirectoryIndex|DirectorySlash)\\b' }, + { token: 'keyword.disk_cache.apacheconf', + regex: '\\b(?:CacheDirLength|CacheDirLevels|CacheExpiryCheck|CacheGcClean|CacheGcDaily|CacheGcInterval|CacheGcMemUsage|CacheGcUnused|CacheMaxFileSize|CacheMinFileSize|CacheRoot|CacheSize|CacheTimeMargin)\\b' }, + { token: 'keyword.dumpio.apacheconf', + regex: '\\b(?:DumpIOInput|DumpIOOutput)\\b' }, + { token: 'keyword.env.apacheconf', + regex: '\\b(?:PassEnv|SetEnv|UnsetEnv)\\b' }, + { token: 'keyword.expires.apacheconf', + regex: '\\b(?:ExpiresActive|ExpiresByType|ExpiresDefault)\\b' }, + { token: 'keyword.ext_filter.apacheconf', + regex: '\\b(?:ExtFilterDefine|ExtFilterOptions)\\b' }, + { token: 'keyword.file_cache.apacheconf', + regex: '\\b(?:CacheFile|MMapFile)\\b' }, + { token: 'keyword.headers.apacheconf', + regex: '\\b(?:Header|RequestHeader)\\b' }, + { token: 'keyword.imap.apacheconf', + regex: '\\b(?:ImapBase|ImapDefault|ImapMenu)\\b' }, + { token: 'keyword.include.apacheconf', + regex: '\\b(?:SSIEndTag|SSIErrorMsg|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|XBitHack)\\b' }, + { token: 'keyword.isapi.apacheconf', + regex: '\\b(?:ISAPIAppendLogToErrors|ISAPIAppendLogToQuery|ISAPICacheFile|ISAPIFakeAsync|ISAPILogNotSupported|ISAPIReadAheadBuffer)\\b' }, + { token: 'keyword.ldap.apacheconf', + regex: '\\b(?:LDAPCacheEntries|LDAPCacheTTL|LDAPConnectionTimeout|LDAPOpCacheEntries|LDAPOpCacheTTL|LDAPSharedCacheFile|LDAPSharedCacheSize|LDAPTrustedCA|LDAPTrustedCAType)\\b' }, + { token: 'keyword.log.apacheconf', + regex: '\\b(?:BufferedLogs|CookieLog|CustomLog|LogFormat|TransferLog|ForensicLog)\\b' }, + { token: 'keyword.mem_cache.apacheconf', + regex: '\\b(?:MCacheMaxObjectCount|MCacheMaxObjectSize|MCacheMaxStreamingBuffer|MCacheMinObjectSize|MCacheRemovalAlgorithm|MCacheSize)\\b' }, + { token: 'keyword.mime.apacheconf', + regex: '\\b(?:AddCharset|AddEncoding|AddHandler|AddInputFilter|AddLanguage|AddOutputFilter|AddType|DefaultLanguage|ModMimeUsePathInfo|MultiviewsMatch|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|TypesConfig)\\b' }, + { token: 'keyword.misc.apacheconf', + regex: '\\b(?:ProtocolEcho|Example|AddModuleInfo|MimeMagicFile|CheckSpelling|ExtendedStatus|SuexecUserGroup|UserDir)\\b' }, + { token: 'keyword.negotiation.apacheconf', + regex: '\\b(?:CacheNegotiatedDocs|ForceLanguagePriority|LanguagePriority)\\b' }, + { token: 'keyword.nw_ssl.apacheconf', + regex: '\\b(?:NWSSLTrustedCerts|NWSSLUpgradeable|SecureListen)\\b' }, + { token: 'keyword.proxy.apacheconf', + regex: '\\b(?:AllowCONNECT|NoProxy|ProxyBadHeader|ProxyBlock|ProxyDomain|ProxyErrorOverride|ProxyFtpDirCharset|ProxyIOBufferSize|ProxyMaxForwards|ProxyPass|ProxyPassReverse|ProxyPreserveHost|ProxyReceiveBufferSize|ProxyRemote|ProxyRemoteMatch|ProxyRequests|ProxyTimeout|ProxyVia)\\b' }, + { token: 'keyword.rewrite.apacheconf', + regex: '\\b(?:RewriteBase|RewriteCond|RewriteEngine|RewriteLock|RewriteLog|RewriteLogLevel|RewriteMap|RewriteOptions|RewriteRule)\\b' }, + { token: 'keyword.setenvif.apacheconf', + regex: '\\b(?:BrowserMatch|BrowserMatchNoCase|SetEnvIf|SetEnvIfNoCase)\\b' }, + { token: 'keyword.so.apacheconf', + regex: '\\b(?:LoadFile|LoadModule)\\b' }, + { token: 'keyword.ssl.apacheconf', + regex: '\\b(?:SSLCACertificateFile|SSLCACertificatePath|SSLCARevocationFile|SSLCARevocationPath|SSLCertificateChainFile|SSLCertificateFile|SSLCertificateKeyFile|SSLCipherSuite|SSLEngine|SSLMutex|SSLOptions|SSLPassPhraseDialog|SSLProtocol|SSLProxyCACertificateFile|SSLProxyCACertificatePath|SSLProxyCARevocationFile|SSLProxyCARevocationPath|SSLProxyCipherSuite|SSLProxyEngine|SSLProxyMachineCertificateFile|SSLProxyMachineCertificatePath|SSLProxyProtocol|SSLProxyVerify|SSLProxyVerifyDepth|SSLRandomSeed|SSLRequire|SSLRequireSSL|SSLSessionCache|SSLSessionCacheTimeout|SSLUserName|SSLVerifyClient|SSLVerifyDepth)\\b' }, + { token: 'keyword.usertrack.apacheconf', + regex: '\\b(?:CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking)\\b' }, + { token: 'keyword.vhost_alias.apacheconf', + regex: '\\b(?:VirtualDocumentRoot|VirtualDocumentRootIP|VirtualScriptAlias|VirtualScriptAliasIP)\\b' }, + { token: + [ 'keyword.php.apacheconf', + 'text', + 'entity.property.apacheconf', + 'text', + 'string.value.apacheconf', + 'text' ], + regex: '\\b(php_value|php_flag)\\b(?:(\\s+)(.+?)(?:(\\s+)(.+?))?)?(\\s)' }, + { token: + [ 'punctuation.variable.apacheconf', + 'variable.env.apacheconf', + 'variable.misc.apacheconf', + 'punctuation.variable.apacheconf' ], + regex: '(%\\{)(?:(HTTP_USER_AGENT|HTTP_REFERER|HTTP_COOKIE|HTTP_FORWARDED|HTTP_HOST|HTTP_PROXY_CONNECTION|HTTP_ACCEPT|REMOTE_ADDR|REMOTE_HOST|REMOTE_PORT|REMOTE_USER|REMOTE_IDENT|REQUEST_METHOD|SCRIPT_FILENAME|PATH_INFO|QUERY_STRING|AUTH_TYPE|DOCUMENT_ROOT|SERVER_ADMIN|SERVER_NAME|SERVER_ADDR|SERVER_PORT|SERVER_PROTOCOL|SERVER_SOFTWARE|TIME_YEAR|TIME_MON|TIME_DAY|TIME_HOUR|TIME_MIN|TIME_SEC|TIME_WDAY|TIME|API_VERSION|THE_REQUEST|REQUEST_URI|REQUEST_FILENAME|IS_SUBREQ|HTTPS)|(.*?))(\\})' }, + { token: [ 'entity.mime-type.apacheconf', 'text' ], + regex: '\\b((?:text|image|application|video|audio)/.+?)(\\s)' }, + { token: 'entity.helper.apacheconf', + regex: '\\b(?:from|unset|set|on|off)\\b', + caseInsensitive: true }, + { token: 'constant.integer.apacheconf', regex: '\\b\\d+\\b' }, + { token: + [ 'text', + 'punctuation.definition.flag.apacheconf', + 'string.flag.apacheconf', + 'punctuation.definition.flag.apacheconf', + 'text' ], + regex: '(\\s)(\\[)(.*?)(\\])(\\s)' } ] } + + this.normalizeRules(); +}; + +ApacheConfHighlightRules.metaData = { fileTypes: + [ 'conf', + 'CONF', + 'htaccess', + 'HTACCESS', + 'htgroups', + 'HTGROUPS', + 'htpasswd', + 'HTPASSWD', + '.htaccess', + '.HTACCESS', + '.htgroups', + '.HTGROUPS', + '.htpasswd', + '.HTPASSWD' ], + name: 'Apache Conf', + scopeName: 'source.apacheconf' } + + +oop.inherits(ApacheConfHighlightRules, TextHighlightRules); + +exports.ApacheConfHighlightRules = ApacheConfHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/apache_conf",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/apache_conf_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ApacheConfHighlightRules = require("./apache_conf_highlight_rules").ApacheConfHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = ApacheConfHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.$id = "ace/mode/apache_conf"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-applescript.js b/src/libs/ace/mode-applescript.js new file mode 100755 index 0000000..936ce2f --- /dev/null +++ b/src/libs/ace/mode-applescript.js @@ -0,0 +1,271 @@ +ace.define("ace/mode/applescript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AppleScriptHighlightRules = function() { + var keywords = ( + "about|above|after|against|and|around|as|at|back|before|beginning|" + + "behind|below|beneath|beside|between|but|by|considering|" + + "contain|contains|continue|copy|div|does|eighth|else|end|equal|" + + "equals|error|every|exit|fifth|first|for|fourth|from|front|" + + "get|given|global|if|ignoring|in|into|is|it|its|last|local|me|" + + "middle|mod|my|ninth|not|of|on|onto|or|over|prop|property|put|ref|" + + "reference|repeat|returning|script|second|set|seventh|since|" + + "sixth|some|tell|tenth|that|the|then|third|through|thru|" + + "timeout|times|to|transaction|try|until|where|while|whose|with|without" + ); + + var builtinConstants = ( + "AppleScript|false|linefeed|return|pi|quote|result|space|tab|true" + ); + + var builtinFunctions = ( + "activate|beep|count|delay|launch|log|offset|read|round|run|say|" + + "summarize|write" + ); + + var builtinTypes = ( + "alias|application|boolean|class|constant|date|file|integer|list|" + + "number|real|record|string|text|character|characters|contents|day|" + + "frontmost|id|item|length|month|name|paragraph|paragraphs|rest|" + + "reverse|running|time|version|weekday|word|words|year" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "support.type": builtinTypes, + "keyword": keywords + }, "identifier"); + + this.$rules = { + "start": [ + { + token: "comment", + regex: "--.*$" + }, + { + token : "comment", // multi line comment + regex : "\\(\\*", + next : "comment" + }, + { + token: "string", // " string + regex: '".*?"' + }, + { + token: "support.type", + regex: '\\b(POSIX file|POSIX path|(date|time) string|quoted form)\\b' + }, + { + token: "support.function", + regex: '\\b(clipboard info|the clipboard|info for|list (disks|folder)|' + + 'mount volume|path to|(close|open for) access|(get|set) eof|' + + 'current date|do shell script|get volume settings|random number|' + + 'set volume|system attribute|system info|time to GMT|' + + '(load|run|store) script|scripting components|' + + 'ASCII (character|number)|localized string|' + + 'choose (application|color|file|file name|' + + 'folder|from list|remote application|URL)|' + + 'display (alert|dialog))\\b|^\\s*return\\b' + }, + { + token: "constant.language", + regex: '\\b(text item delimiters|current application|missing value)\\b' + }, + { + token: "keyword", + regex: '\\b(apart from|aside from|instead of|out of|greater than|' + + "isn't|(doesn't|does not) (equal|come before|come after|contain)|" + + '(greater|less) than( or equal)?|(starts?|ends|begins?) with|' + + 'contained by|comes (before|after)|a (ref|reference))\\b' + }, + { + token: keywordMapper, + regex: "[a-zA-Z][a-zA-Z0-9_]*\\b" + } + ], + "comment": [ + { + token: "comment", // closing comment + regex: "\\*\\)", + next: "start" + }, { + defaultToken: "comment" + } + ] + } + + this.normalizeRules(); +}; + +oop.inherits(AppleScriptHighlightRules, TextHighlightRules); + +exports.AppleScriptHighlightRules = AppleScriptHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/applescript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/applescript_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var AppleScriptHighlightRules = require("./applescript_highlight_rules").AppleScriptHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = AppleScriptHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "(*", end: "*)"}; + this.$id = "ace/mode/applescript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-asciidoc.js b/src/libs/ace/mode-asciidoc.js new file mode 100755 index 0000000..f112cec --- /dev/null +++ b/src/libs/ace/mode-asciidoc.js @@ -0,0 +1,342 @@ +ace.define("ace/mode/asciidoc_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AsciidocHighlightRules = function() { + var identifierRe = "[a-zA-Z\u00a1-\uffff]+\\b"; + + this.$rules = { + "start": [ + {token: "empty", regex: /$/}, + {token: "literal", regex: /^\.{4,}\s*$/, next: "listingBlock"}, + {token: "literal", regex: /^-{4,}\s*$/, next: "literalBlock"}, + {token: "string", regex: /^\+{4,}\s*$/, next: "passthroughBlock"}, + {token: "keyword", regex: /^={4,}\s*$/}, + {token: "text", regex: /^\s*$/}, + {token: "empty", regex: "", next: "dissallowDelimitedBlock"} + ], + + "dissallowDelimitedBlock": [ + {include: "paragraphEnd"}, + {token: "comment", regex: '^//.+$'}, + {token: "keyword", regex: "^(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION):"}, + + {include: "listStart"}, + {token: "literal", regex: /^\s+.+$/, next: "indentedBlock"}, + {token: "empty", regex: "", next: "text"} + ], + + "paragraphEnd": [ + {token: "doc.comment", regex: /^\/{4,}\s*$/, next: "commentBlock"}, + {token: "tableBlock", regex: /^\s*[|!]=+\s*$/, next: "tableBlock"}, + {token: "keyword", regex: /^(?:--|''')\s*$/, next: "start"}, + {token: "option", regex: /^\[.*\]\s*$/, next: "start"}, + {token: "pageBreak", regex: /^>{3,}$/, next: "start"}, + {token: "literal", regex: /^\.{4,}\s*$/, next: "listingBlock"}, + {token: "titleUnderline", regex: /^(?:={2,}|-{2,}|~{2,}|\^{2,}|\+{2,})\s*$/, next: "start"}, + {token: "singleLineTitle", regex: /^={1,5}\s+\S.*$/, next: "start"}, + + {token: "otherBlock", regex: /^(?:\*{2,}|_{2,})\s*$/, next: "start"}, + {token: "optionalTitle", regex: /^\.[^.\s].+$/, next: "start"} + ], + + "listStart": [ + {token: "keyword", regex: /^\s*(?:\d+\.|[a-zA-Z]\.|[ixvmIXVM]+\)|\*{1,5}|-|\.{1,5})\s/, next: "listText"}, + {token: "meta.tag", regex: /^.+(?::{2,4}|;;)(?: |$)/, next: "listText"}, + {token: "support.function.list.callout", regex: /^(?:<\d+>|\d+>|>) /, next: "text"}, + {token: "keyword", regex: /^\+\s*$/, next: "start"} + ], + + "text": [ + {token: ["link", "variable.language"], regex: /((?:https?:\/\/|ftp:\/\/|file:\/\/|mailto:|callto:)[^\s\[]+)(\[.*?\])/}, + {token: "link", regex: /(?:https?:\/\/|ftp:\/\/|file:\/\/|mailto:|callto:)[^\s\[]+/}, + {token: "link", regex: /\b[\w\.\/\-]+@[\w\.\/\-]+\b/}, + {include: "macros"}, + {include: "paragraphEnd"}, + {token: "literal", regex:/\+{3,}/, next:"smallPassthrough"}, + {token: "escape", regex: /\((?:C|TM|R)\)|\.{3}|->|<-|=>|<=|&#(?:\d+|x[a-fA-F\d]+);|(?: |^)--(?=\s+\S)/}, + {token: "escape", regex: /\\[_*'`+#]|\\{2}[_*'`+#]{2}/}, + {token: "keyword", regex: /\s\+$/}, + {token: "text", regex: identifierRe}, + {token: ["keyword", "string", "keyword"], + regex: /(<<[\w\d\-$]+,)(.*?)(>>|$)/}, + {token: "keyword", regex: /<<[\w\d\-$]+,?|>>/}, + {token: "constant.character", regex: /\({2,3}.*?\){2,3}/}, + {token: "keyword", regex: /\[\[.+?\]\]/}, + {token: "support", regex: /^\[{3}[\w\d =\-]+\]{3}/}, + + {include: "quotes"}, + {token: "empty", regex: /^\s*$/, next: "start"} + ], + + "listText": [ + {include: "listStart"}, + {include: "text"} + ], + + "indentedBlock": [ + {token: "literal", regex: /^[\s\w].+$/, next: "indentedBlock"}, + {token: "literal", regex: "", next: "start"} + ], + + "listingBlock": [ + {token: "literal", regex: /^\.{4,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "constant.numeric", regex: '<\\d+>'}, + {token: "literal", regex: '[^<]+'}, + {token: "literal", regex: '<'} + ], + "literalBlock": [ + {token: "literal", regex: /^-{4,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "constant.numeric", regex: '<\\d+>'}, + {token: "literal", regex: '[^<]+'}, + {token: "literal", regex: '<'} + ], + "passthroughBlock": [ + {token: "literal", regex: /^\+{4,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "literal", regex: identifierRe + "|\\d+"}, + {include: "macros"}, + {token: "literal", regex: "."} + ], + + "smallPassthrough": [ + {token: "literal", regex: /[+]{3,}/, next: "dissallowDelimitedBlock"}, + {token: "literal", regex: /^\s*$/, next: "dissallowDelimitedBlock"}, + {token: "literal", regex: identifierRe + "|\\d+"}, + {include: "macros"} + ], + + "commentBlock": [ + {token: "doc.comment", regex: /^\/{4,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "doc.comment", regex: '^.*$'} + ], + "tableBlock": [ + {token: "tableBlock", regex: /^\s*\|={3,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "tableBlock", regex: /^\s*!={3,}\s*$/, next: "innerTableBlock"}, + {token: "tableBlock", regex: /\|/}, + {include: "text", noEscape: true} + ], + "innerTableBlock": [ + {token: "tableBlock", regex: /^\s*!={3,}\s*$/, next: "tableBlock"}, + {token: "tableBlock", regex: /^\s*|={3,}\s*$/, next: "dissallowDelimitedBlock"}, + {token: "tableBlock", regex: /!/} + ], + "macros": [ + {token: "macro", regex: /{[\w\-$]+}/}, + {token: ["text", "string", "text", "constant.character", "text"], regex: /({)([\w\-$]+)(:)?(.+)?(})/}, + {token: ["text", "markup.list.macro", "keyword", "string"], regex: /(\w+)(footnote(?:ref)?::?)([^\s\[]+)?(\[.*?\])?/}, + {token: ["markup.list.macro", "keyword", "string"], regex: /([a-zA-Z\-][\w\.\/\-]*::?)([^\s\[]+)(\[.*?\])?/}, + {token: ["markup.list.macro", "keyword"], regex: /([a-zA-Z\-][\w\.\/\-]+::?)(\[.*?\])/}, + {token: "keyword", regex: /^:.+?:(?= |$)/} + ], + + "quotes": [ + {token: "string.italic", regex: /__[^_\s].*?__/}, + {token: "string.italic", regex: quoteRule("_")}, + + {token: "keyword.bold", regex: /\*\*[^*\s].*?\*\*/}, + {token: "keyword.bold", regex: quoteRule("\\*")}, + + {token: "literal", regex: quoteRule("\\+")}, + {token: "literal", regex: /\+\+[^+\s].*?\+\+/}, + {token: "literal", regex: /\$\$.+?\$\$/}, + {token: "literal", regex: quoteRule("`")}, + + {token: "keyword", regex: quoteRule("^")}, + {token: "keyword", regex: quoteRule("~")}, + {token: "keyword", regex: /##?/}, + {token: "keyword", regex: /(?:\B|^)``|\b''/} + ] + + }; + + function quoteRule(ch) { + var prefix = /\w/.test(ch) ? "\\b" : "(?:\\B|^)"; + return prefix + ch + "[^" + ch + "].*?" + ch + "(?![\\w*])"; + } + + var tokenMap = { + macro: "constant.character", + tableBlock: "doc.comment", + titleUnderline: "markup.heading", + singleLineTitle: "markup.heading", + pageBreak: "string", + option: "string.regexp", + otherBlock: "markup.list", + literal: "support.function", + optionalTitle: "constant.numeric", + escape: "constant.language.escape", + link: "markup.underline.list" + }; + + for (var state in this.$rules) { + var stateRules = this.$rules[state]; + for (var i = stateRules.length; i--; ) { + var rule = stateRules[i]; + if (rule.include || typeof rule == "string") { + var args = [i, 1].concat(this.$rules[rule.include || rule]); + if (rule.noEscape) { + args = args.filter(function(x) { + return !x.next; + }); + } + stateRules.splice.apply(stateRules, args); + } else if (rule.token in tokenMap) { + rule.token = tokenMap[rule.token]; + } + } + } +}; +oop.inherits(AsciidocHighlightRules, TextHighlightRules); + +exports.AsciidocHighlightRules = AsciidocHighlightRules; +}); + +ace.define("ace/mode/folding/asciidoc",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + this.foldingStartMarker = /^(?:\|={10,}|[\.\/=\-~^+]{4,}\s*$|={1,5} )/; + this.singleLineHeadingRe = /^={1,5}(?=\s+\S)/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + if (!this.foldingStartMarker.test(line)) + return "" + + if (line[0] == "=") { + if (this.singleLineHeadingRe.test(line)) + return "start"; + if (session.getLine(row - 1).length != session.getLine(row).length) + return ""; + return "start"; + } + if (session.bgTokenizer.getState(row) == "dissallowDelimitedBlock") + return "end"; + return "start"; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + if (!line.match(this.foldingStartMarker)) + return; + + var token; + function getTokenType(row) { + token = session.getTokens(row)[0]; + return token && token.type; + } + + var levels = ["=","-","~","^","+"]; + var heading = "markup.heading"; + var singleLineHeadingRe = this.singleLineHeadingRe; + function getLevel() { + var match = token.value.match(singleLineHeadingRe); + if (match) + return match[0].length; + var level = levels.indexOf(token.value[0]) + 1; + if (level == 1) { + if (session.getLine(row - 1).length != session.getLine(row).length) + return Infinity; + } + return level; + } + + if (getTokenType(row) == heading) { + var startHeadingLevel = getLevel(); + while (++row < maxRow) { + if (getTokenType(row) != heading) + continue; + var level = getLevel(); + if (level <= startHeadingLevel) + break; + } + + var isSingleLineHeading = token && token.value.match(this.singleLineHeadingRe); + endRow = isSingleLineHeading ? row - 1 : row - 2; + + if (endRow > startRow) { + while (endRow > startRow && (!getTokenType(endRow) || token.value[0] == "[")) + endRow--; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + } else { + var state = session.bgTokenizer.getState(row); + if (state == "dissallowDelimitedBlock") { + while (row -- > 0) { + if (session.bgTokenizer.getState(row).lastIndexOf("Block") == -1) + break; + } + endRow = row + 1; + if (endRow < startRow) { + var endColumn = session.getLine(row).length; + return new Range(endRow, 5, startRow, startColumn - 5); + } + } else { + while (++row < maxRow) { + if (session.bgTokenizer.getState(row) == "dissallowDelimitedBlock") + break; + } + endRow = row; + if (endRow > startRow) { + var endColumn = session.getLine(row).length; + return new Range(startRow, 5, endRow, endColumn - 5); + } + } + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/asciidoc",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/asciidoc_highlight_rules","ace/mode/folding/asciidoc"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var AsciidocHighlightRules = require("./asciidoc_highlight_rules").AsciidocHighlightRules; +var AsciidocFoldMode = require("./folding/asciidoc").FoldMode; + +var Mode = function() { + this.HighlightRules = AsciidocHighlightRules; + + this.foldingRules = new AsciidocFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.type = "text"; + this.getNextLineIndent = function(state, line, tab) { + if (state == "listblock") { + var match = /^((?:.+)?)([-+*][ ]+)/.exec(line); + if (match) { + return new Array(match[1].length + 1).join(" ") + match[2]; + } else { + return ""; + } + } else { + return this.$getIndent(line); + } + }; + this.$id = "ace/mode/asciidoc"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-assembly_x86.js b/src/libs/ace/mode-assembly_x86.js new file mode 100755 index 0000000..f6a56f1 --- /dev/null +++ b/src/libs/ace/mode-assembly_x86.js @@ -0,0 +1,186 @@ +ace.define("ace/mode/assembly_x86_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AssemblyX86HighlightRules = function() { + + this.$rules = { start: + [ { token: 'keyword.control.assembly', + regex: '\\b(?:aaa|aad|aam|aas|adc|add|addpd|addps|addsd|addss|addsubpd|addsubps|aesdec|aesdeclast|aesenc|aesenclast|aesimc|aeskeygenassist|and|andpd|andps|andnpd|andnps|arpl|blendpd|blendps|blendvpd|blendvps|bound|bsf|bsr|bswap|bt|btc|btr|bts|cbw|cwde|cdqe|clc|cld|cflush|clts|cmc|cmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|cmp|cmppd|cmpps|cmps|cnpsb|cmpsw|cmpsd|cmpsq|cmpss|cmpxchg|cmpxchg8b|cmpxchg16b|comisd|comiss|cpuid|crc32|cvtdq2pd|cvtdq2ps|cvtpd2dq|cvtpd2pi|cvtpd2ps|cvtpi2pd|cvtpi2ps|cvtps2dq|cvtps2pd|cvtps2pi|cvtsd2si|cvtsd2ss|cvts2sd|cvtsi2ss|cvtss2sd|cvtss2si|cvttpd2dq|cvtpd2pi|cvttps2dq|cvttps2pi|cvttps2dq|cvttps2pi|cvttsd2si|cvttss2si|cwd|cdq|cqo|daa|das|dec|div|divpd|divps|divsd|divss|dppd|dpps|emms|enter|extractps|f2xm1|fabs|fadd|faddp|fiadd|fbld|fbstp|fchs|fclex|fnclex|fcmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|fcom|fcmop|fcompp|fcomi|fcomip|fucomi|fucomip|fcos|fdecstp|fdiv|fdivp|fidiv|fdivr|fdivrp|fidivr|ffree|ficom|ficomp|fild|fincstp|finit|fnint|fist|fistp|fisttp|fld|fld1|fldl2t|fldl2e|fldpi|fldlg2|fldln2|fldz|fldcw|fldenv|fmul|fmulp|fimul|fnop|fpatan|fprem|fprem1|fptan|frndint|frstor|fsave|fnsave|fscale|fsin|fsincos|fsqrt|fst|fstp|fstcw|fnstcw|fstenv|fnstenv|fsts|fnstsw|fsub|fsubp|fisub|fsubr|fsubrp|fisubr|ftst|fucom|fucomp|fucompp|fxam|fxch|fxrstor|fxsave|fxtract|fyl2x|fyl2xp1|haddpd|haddps|husbpd|hsubps|idiv|imul|in|inc|ins|insb|insw|insd|insertps|int|into|invd|invplg|invpcid|iret|iretd|iretq|lahf|lar|lddqu|ldmxcsr|lds|les|lfs|lgs|lss|lea|leave|lfence|lgdt|lidt|llgdt|lmsw|lock|lods|lodsb|lodsw|lodsd|lodsq|lsl|ltr|maskmovdqu|maskmovq|maxpd|maxps|maxsd|maxss|mfence|minpd|minps|minsd|minss|monitor|mov|movapd|movaps|movbe|movd|movq|movddup|movdqa|movdqu|movq2q|movhlps|movhpd|movhps|movlhps|movlpd|movlps|movmskpd|movmskps|movntdqa|movntdq|movnti|movntpd|movntps|movntq|movq|movq2dq|movs|movsb|movsw|movsd|movsq|movsd|movshdup|movsldup|movss|movsx|movsxd|movupd|movups|movzx|mpsadbw|mul|mulpd|mulps|mulsd|mulss|mwait|neg|not|or|orpd|orps|out|outs|outsb|outsw|outsd|pabsb|pabsw|pabsd|packsswb|packssdw|packusdw|packuswbpaddb|paddw|paddd|paddq|paddsb|paddsw|paddusb|paddusw|palignr|pand|pandn|pause|pavgb|pavgw|pblendvb|pblendw|pclmulqdq|pcmpeqb|pcmpeqw|pcmpeqd|pcmpeqq|pcmpestri|pcmpestrm|pcmptb|pcmptgw|pcmpgtd|pcmpgtq|pcmpistri|pcmpisrm|pextrb|pextrd|pextrq|pextrw|phaddw|phaddd|phaddsw|phinposuw|phsubw|phsubd|phsubsw|pinsrb|pinsrd|pinsrq|pinsrw|pmaddubsw|pmadddwd|pmaxsb|pmaxsd|pmaxsw|pmaxsw|pmaxub|pmaxud|pmaxuw|pminsb|pminsd|pminsw|pminub|pminud|pminuw|pmovmskb|pmovsx|pmovzx|pmuldq|pmulhrsw|pmulhuw|pmulhw|pmulld|pmullw|pmuludw|pop|popa|popad|popcnt|popf|popfd|popfq|por|prefetch|psadbw|pshufb|pshufd|pshufhw|pshuflw|pshufw|psignb|psignw|psignd|pslldq|psllw|pslld|psllq|psraw|psrad|psrldq|psrlw|psrld|psrlq|psubb|psubw|psubd|psubq|psubsb|psubsw|psubusb|psubusw|test|ptest|punpckhbw|punpckhwd|punpckhdq|punpckhddq|punpcklbw|punpcklwd|punpckldq|punpckldqd|push|pusha|pushad|pushf|pushfd|pxor|prcl|rcr|rol|ror|rcpps|rcpss|rdfsbase|rdgsbase|rdmsr|rdpmc|rdrand|rdtsc|rdtscp|rep|repe|repz|repne|repnz|roundpd|roundps|roundsd|roundss|rsm|rsqrps|rsqrtss|sahf|sal|sar|shl|shr|sbb|scas|scasb|scasw|scasd|set(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|sfence|sgdt|shld|shrd|shufpd|shufps|sidt|sldt|smsw|sqrtpd|sqrtps|sqrtsd|sqrtss|stc|std|stmxcsr|stos|stosb|stosw|stosd|stosq|str|sub|subpd|subps|subsd|subss|swapgs|syscall|sysenter|sysexit|sysret|teset|ucomisd|ucomiss|ud2|unpckhpd|unpckhps|unpcklpd|unpcklps|vbroadcast|vcvtph2ps|vcvtp2sph|verr|verw|vextractf128|vinsertf128|vmaskmov|vpermilpd|vpermilps|vperm2f128|vtestpd|vtestps|vzeroall|vzeroupper|wait|fwait|wbinvd|wrfsbase|wrgsbase|wrmsr|xadd|xchg|xgetbv|xlat|xlatb|xor|xorpd|xorps|xrstor|xsave|xsaveopt|xsetbv|lzcnt|extrq|insertq|movntsd|movntss|vfmaddpd|vfmaddps|vfmaddsd|vfmaddss|vfmaddsubbpd|vfmaddsubps|vfmsubaddpd|vfmsubaddps|vfmsubpd|vfmsubps|vfmsubsd|vfnmaddpd|vfnmaddps|vfnmaddsd|vfnmaddss|vfnmsubpd|vfnmusbps|vfnmusbsd|vfnmusbss|cvt|xor|cli|sti|hlt|nop|lock|wait|enter|leave|ret|loop(?:n?e|n?z)?|call|j(?:mp|n?e|ge?|ae?|le?|be?|n?o|n?z))\\b', + caseInsensitive: true }, + { token: 'variable.parameter.register.assembly', + regex: '\\b(?:CS|DS|ES|FS|GS|SS|RAX|EAX|RBX|EBX|RCX|ECX|RDX|EDX|RCX|RIP|EIP|IP|RSP|ESP|SP|RSI|ESI|SI|RDI|EDI|DI|RFLAGS|EFLAGS|FLAGS|R8-15|(?:Y|X)MM(?:[0-9]|10|11|12|13|14|15)|(?:A|B|C|D)(?:X|H|L)|CR(?:[0-4]|DR(?:[0-7]|TR6|TR7|EFER)))\\b', + caseInsensitive: true }, + { token: 'constant.character.decimal.assembly', + regex: '\\b[0-9]+\\b' }, + { token: 'constant.character.hexadecimal.assembly', + regex: '\\b0x[A-F0-9]+\\b', + caseInsensitive: true }, + { token: 'constant.character.hexadecimal.assembly', + regex: '\\b[A-F0-9]+h\\b', + caseInsensitive: true }, + { token: 'string.assembly', regex: /'([^\\']|\\.)*'/ }, + { token: 'string.assembly', regex: /"([^\\"]|\\.)*"/ }, + { token: 'support.function.directive.assembly', + regex: '^\\[', + push: + [ { token: 'support.function.directive.assembly', + regex: '\\]$', + next: 'pop' }, + { defaultToken: 'support.function.directive.assembly' } ] }, + { token: + [ 'support.function.directive.assembly', + 'support.function.directive.assembly', + 'entity.name.function.assembly' ], + regex: '(^struc)( )([_a-zA-Z][_a-zA-Z0-9]*)' }, + { token: 'support.function.directive.assembly', + regex: '^endstruc\\b' }, + { token: + [ 'support.function.directive.assembly', + 'entity.name.function.assembly', + 'support.function.directive.assembly', + 'constant.character.assembly' ], + regex: '^(%macro )([_a-zA-Z][_a-zA-Z0-9]*)( )([0-9]+)' }, + { token: 'support.function.directive.assembly', + regex: '^%endmacro' }, + { token: + [ 'text', + 'support.function.directive.assembly', + 'text', + 'entity.name.function.assembly' ], + regex: '(\\s*)(%define|%xdefine|%idefine|%undef|%assign|%defstr|%strcat|%strlen|%substr|%00|%0|%rotate|%rep|%endrep|%include|\\$\\$|\\$|%unmacro|%if|%elif|%else|%endif|%(?:el)?ifdef|%(?:el)?ifmacro|%(?:el)?ifctx|%(?:el)?ifidn|%(?:el)?ifidni|%(?:el)?ifid|%(?:el)?ifnum|%(?:el)?ifstr|%(?:el)?iftoken|%(?:el)?ifempty|%(?:el)?ifenv|%pathsearch|%depend|%use|%push|%pop|%repl|%arg|%stacksize|%local|%error|%warning|%fatal|%line|%!|%comment|%endcomment|__NASM_VERSION_ID__|__NASM_VER__|__FILE__|__LINE__|__BITS__|__OUTPUT_FORMAT__|__DATE__|__TIME__|__DATE_NUM__|_TIME__NUM__|__UTC_DATE__|__UTC_TIME__|__UTC_DATE_NUM__|__UTC_TIME_NUM__|__POSIX_TIME__|__PASS__|ISTRUC|AT|IEND|BITS 16|BITS 32|BITS 64|USE16|USE32|__SECT__|ABSOLUTE|EXTERN|GLOBAL|COMMON|CPU|FLOAT)\\b( ?)((?:[_a-zA-Z][_a-zA-Z0-9]*)?)', + caseInsensitive: true }, + { token: 'support.function.directive.assembly', + regex: '\\b(?:d[bwdqtoy]|res[bwdqto]|equ|times|align|alignb|sectalign|section|ptr|byte|word|dword|qword|incbin)\\b', + caseInsensitive: true }, + { token: 'entity.name.function.assembly', regex: '^\\s*%%[\\w.]+?:$' }, + { token: 'entity.name.function.assembly', regex: '^\\s*%\\$[\\w.]+?:$' }, + { token: 'entity.name.function.assembly', regex: '^[\\w.]+?:' }, + { token: 'entity.name.function.assembly', regex: '^[\\w.]+?\\b' }, + { token: 'comment.assembly', regex: ';.*$' } ] + } + + this.normalizeRules(); +}; + +AssemblyX86HighlightRules.metaData = { fileTypes: [ 'asm' ], + name: 'Assembly x86', + scopeName: 'source.assembly' } + + +oop.inherits(AssemblyX86HighlightRules, TextHighlightRules); + +exports.AssemblyX86HighlightRules = AssemblyX86HighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/assembly_x86",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/assembly_x86_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var AssemblyX86HighlightRules = require("./assembly_x86_highlight_rules").AssemblyX86HighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = AssemblyX86HighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = ";"; + this.$id = "ace/mode/assembly_x86"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-autohotkey.js b/src/libs/ace/mode-autohotkey.js new file mode 100755 index 0000000..538e6fd --- /dev/null +++ b/src/libs/ace/mode-autohotkey.js @@ -0,0 +1,235 @@ +ace.define("ace/mode/autohotkey_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var AutoHotKeyHighlightRules = function() { + var autoItKeywords = 'And|ByRef|Case|Const|ContinueCase|ContinueLoop|Default|Dim|Do|Else|ElseIf|EndFunc|EndIf|EndSelect|EndSwitch|EndWith|Enum|Exit|ExitLoop|False|For|Func|Global|If|In|Local|Next|Not|Or|ReDim|Return|Select|Step|Switch|Then|To|True|Until|WEnd|While|With|' + + 'Abs|ACos|AdlibDisable|AdlibEnable|Asc|AscW|ASin|Assign|ATan|AutoItSetOption|AutoItWinGetTitle|AutoItWinSetTitle|Beep|Binary|BinaryLen|BinaryMid|BinaryToString|BitAND|BitNOT|BitOR|BitRotate|BitShift|BitXOR|BlockInput|Break|Call|CDTray|Ceiling|Chr|ChrW|ClipGet|ClipPut|ConsoleRead|ConsoleWrite|ConsoleWriteError|ControlClick|ControlCommand|ControlDisable|ControlEnable|ControlFocus|ControlGetFocus|ControlGetHandle|ControlGetPos|ControlGetText|ControlHide|ControlListView|ControlMove|ControlSend|ControlSetText|ControlShow|ControlTreeView|Cos|Dec|DirCopy|DirCreate|DirGetSize|DirMove|DirRemove|DllCall|DllCallbackFree|DllCallbackGetPtr|DllCallbackRegister|DllClose|DllOpen|DllStructCreate|DllStructGetData|DllStructGetPtr|DllStructGetSize|DllStructSetData|DriveGetDrive|DriveGetFileSystem|DriveGetLabel|DriveGetSerial|DriveGetType|DriveMapAdd|DriveMapDel|DriveMapGet|DriveSetLabel|DriveSpaceFree|DriveSpaceTotal|DriveStatus|EnvGet|EnvSet|EnvUpdate|Eval|Execute|Exp|FileChangeDir|FileClose|FileCopy|FileCreateNTFSLink|FileCreateShortcut|FileDelete|FileExists|FileFindFirstFile|FileFindNextFile|FileGetAttrib|FileGetLongName|FileGetShortcut|FileGetShortName|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileOpen|FileOpenDialog|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileSaveDialog|FileSelectFolder|FileSetAttrib|FileSetTime|FileWrite|FileWriteLine|Floor|FtpSetProxy|GUICreate|GUICtrlCreateAvi|GUICtrlCreateButton|GUICtrlCreateCheckbox|GUICtrlCreateCombo|GUICtrlCreateContextMenu|GUICtrlCreateDate|GUICtrlCreateDummy|GUICtrlCreateEdit|GUICtrlCreateGraphic|GUICtrlCreateGroup|GUICtrlCreateIcon|GUICtrlCreateInput|GUICtrlCreateLabel|GUICtrlCreateList|GUICtrlCreateListView|GUICtrlCreateListViewItem|GUICtrlCreateMenu|GUICtrlCreateMenuItem|GUICtrlCreateMonthCal|GUICtrlCreateObj|GUICtrlCreatePic|GUICtrlCreateProgress|GUICtrlCreateRadio|GUICtrlCreateSlider|GUICtrlCreateTab|GUICtrlCreateTabItem|GUICtrlCreateTreeView|GUICtrlCreateTreeViewItem|GUICtrlCreateUpdown|GUICtrlDelete|GUICtrlGetHandle|GUICtrlGetState|GUICtrlRead|GUICtrlRecvMsg|GUICtrlRegisterListViewSort|GUICtrlSendMsg|GUICtrlSendToDummy|GUICtrlSetBkColor|GUICtrlSetColor|GUICtrlSetCursor|GUICtrlSetData|GUICtrlSetFont|GUICtrlSetDefColor|GUICtrlSetDefBkColor|GUICtrlSetGraphic|GUICtrlSetImage|GUICtrlSetLimit|GUICtrlSetOnEvent|GUICtrlSetPos|GUICtrlSetResizing|GUICtrlSetState|GUICtrlSetStyle|GUICtrlSetTip|GUIDelete|GUIGetCursorInfo|GUIGetMsg|GUIGetStyle|GUIRegisterMsg|GUISetAccelerators()|GUISetBkColor|GUISetCoord|GUISetCursor|GUISetFont|GUISetHelp|GUISetIcon|GUISetOnEvent|GUISetState|GUISetStyle|GUIStartGroup|GUISwitch|Hex|HotKeySet|HttpSetProxy|HWnd|InetGet|InetGetSize|IniDelete|IniRead|IniReadSection|IniReadSectionNames|IniRenameSection|IniWrite|IniWriteSection|InputBox|Int|IsAdmin|IsArray|IsBinary|IsBool|IsDeclared|IsDllStruct|IsFloat|IsHWnd|IsInt|IsKeyword|IsNumber|IsObj|IsPtr|IsString|Log|MemGetStats|Mod|MouseClick|MouseClickDrag|MouseDown|MouseGetCursor|MouseGetPos|MouseMove|MouseUp|MouseWheel|MsgBox|Number|ObjCreate|ObjEvent|ObjGet|ObjName|Opt|Ping|PixelChecksum|PixelGetColor|PixelSearch|PluginClose|PluginOpen|ProcessClose|ProcessExists|ProcessGetStats|ProcessList|ProcessSetPriority|ProcessWait|ProcessWaitClose|ProgressOff|ProgressOn|ProgressSet|Ptr|Random|RegDelete|RegEnumKey|RegEnumVal|RegRead|RegWrite|Round|Run|RunAs|RunAsWait|RunWait|Send|SendKeepActive|SetError|SetExtended|ShellExecute|ShellExecuteWait|Shutdown|Sin|Sleep|SoundPlay|SoundSetWaveVolume|SplashImageOn|SplashOff|SplashTextOn|Sqrt|SRandom|StatusbarGetText|StderrRead|StdinWrite|StdioClose|StdoutRead|String|StringAddCR|StringCompare|StringFormat|StringInStr|StringIsAlNum|StringIsAlpha|StringIsASCII|StringIsDigit|StringIsFloat|StringIsInt|StringIsLower|StringIsSpace|StringIsUpper|StringIsXDigit|StringLeft|StringLen|StringLower|StringMid|StringRegExp|StringRegExpReplace|StringReplace|StringRight|StringSplit|StringStripCR|StringStripWS|StringToBinary|StringTrimLeft|StringTrimRight|StringUpper|Tan|TCPAccept|TCPCloseSocket|TCPConnect|TCPListen|TCPNameToIP|TCPRecv|TCPSend|TCPShutdown|TCPStartup|TimerDiff|TimerInit|ToolTip|TrayCreateItem|TrayCreateMenu|TrayGetMsg|TrayItemDelete|TrayItemGetHandle|TrayItemGetState|TrayItemGetText|TrayItemSetOnEvent|TrayItemSetState|TrayItemSetText|TraySetClick|TraySetIcon|TraySetOnEvent|TraySetPauseIcon|TraySetState|TraySetToolTip|TrayTip|UBound|UDPBind|UDPCloseSocket|UDPOpen|UDPRecv|UDPSend|UDPShutdown|UDPStartup|VarGetType|WinActivate|WinActive|WinClose|WinExists|WinFlash|WinGetCaretPos|WinGetClassList|WinGetClientSize|WinGetHandle|WinGetPos|WinGetProcess|WinGetState|WinGetText|WinGetTitle|WinKill|WinList|WinMenuSelectItem|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinSetOnTop|WinSetState|WinSetTitle|WinSetTrans|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive|' + + 'ArrayAdd|ArrayBinarySearch|ArrayConcatenate|ArrayDelete|ArrayDisplay|ArrayFindAll|ArrayInsert|ArrayMax|ArrayMaxIndex|ArrayMin|ArrayMinIndex|ArrayPop|ArrayPush|ArrayReverse|ArraySearch|ArraySort|ArraySwap|ArrayToClip|ArrayToString|ArrayTrim|ChooseColor|ChooseFont|ClipBoard_ChangeChain|ClipBoard_Close|ClipBoard_CountFormats|ClipBoard_Empty|ClipBoard_EnumFormats|ClipBoard_FormatStr|ClipBoard_GetData|ClipBoard_GetDataEx|ClipBoard_GetFormatName|ClipBoard_GetOpenWindow|ClipBoard_GetOwner|ClipBoard_GetPriorityFormat|ClipBoard_GetSequenceNumber|ClipBoard_GetViewer|ClipBoard_IsFormatAvailable|ClipBoard_Open|ClipBoard_RegisterFormat|ClipBoard_SetData|ClipBoard_SetDataEx|ClipBoard_SetViewer|ClipPutFile|ColorConvertHSLtoRGB|ColorConvertRGBtoHSL|ColorGetBlue|ColorGetGreen|ColorGetRed|Date_Time_CompareFileTime|Date_Time_DOSDateTimeToArray|Date_Time_DOSDateTimeToFileTime|Date_Time_DOSDateTimeToStr|Date_Time_DOSDateToArray|Date_Time_DOSDateToStr|Date_Time_DOSTimeToArray|Date_Time_DOSTimeToStr|Date_Time_EncodeFileTime|Date_Time_EncodeSystemTime|Date_Time_FileTimeToArray|Date_Time_FileTimeToDOSDateTime|Date_Time_FileTimeToLocalFileTime|Date_Time_FileTimeToStr|Date_Time_FileTimeToSystemTime|Date_Time_GetFileTime|Date_Time_GetLocalTime|Date_Time_GetSystemTime|Date_Time_GetSystemTimeAdjustment|Date_Time_GetSystemTimeAsFileTime|Date_Time_GetSystemTimes|Date_Time_GetTickCount|Date_Time_GetTimeZoneInformation|Date_Time_LocalFileTimeToFileTime|Date_Time_SetFileTime|Date_Time_SetLocalTime|Date_Time_SetSystemTime|Date_Time_SetSystemTimeAdjustment|Date_Time_SetTimeZoneInformation|Date_Time_SystemTimeToArray|Date_Time_SystemTimeToDateStr|Date_Time_SystemTimeToDateTimeStr|Date_Time_SystemTimeToFileTime|Date_Time_SystemTimeToTimeStr|Date_Time_SystemTimeToTzSpecificLocalTime|Date_Time_TzSpecificLocalTimeToSystemTime|DateAdd|DateDayOfWeek|DateDaysInMonth|DateDiff|DateIsLeapYear|DateIsValid|DateTimeFormat|DateTimeSplit|DateToDayOfWeek|DateToDayOfWeekISO|DateToDayValue|DateToMonth|DayValueToDate|DebugBugReportEnv|DebugOut|DebugSetup|Degree|EventLog__Backup|EventLog__Clear|EventLog__Close|EventLog__Count|EventLog__DeregisterSource|EventLog__Full|EventLog__Notify|EventLog__Oldest|EventLog__Open|EventLog__OpenBackup|EventLog__Read|EventLog__RegisterSource|EventLog__Report|FileCountLines|FileCreate|FileListToArray|FilePrint|FileReadToArray|FileWriteFromArray|FileWriteLog|FileWriteToLine|GDIPlus_ArrowCapCreate|GDIPlus_ArrowCapDispose|GDIPlus_ArrowCapGetFillState|GDIPlus_ArrowCapGetHeight|GDIPlus_ArrowCapGetMiddleInset|GDIPlus_ArrowCapGetWidth|GDIPlus_ArrowCapSetFillState|GDIPlus_ArrowCapSetHeight|GDIPlus_ArrowCapSetMiddleInset|GDIPlus_ArrowCapSetWidth|GDIPlus_BitmapCloneArea|GDIPlus_BitmapCreateFromFile|GDIPlus_BitmapCreateFromGraphics|GDIPlus_BitmapCreateFromHBITMAP|GDIPlus_BitmapCreateHBITMAPFromBitmap|GDIPlus_BitmapDispose|GDIPlus_BitmapLockBits|GDIPlus_BitmapUnlockBits|GDIPlus_BrushClone|GDIPlus_BrushCreateSolid|GDIPlus_BrushDispose|GDIPlus_BrushGetType|GDIPlus_CustomLineCapDispose|GDIPlus_Decoders|GDIPlus_DecodersGetCount|GDIPlus_DecodersGetSize|GDIPlus_Encoders|GDIPlus_EncodersGetCLSID|GDIPlus_EncodersGetCount|GDIPlus_EncodersGetParamList|GDIPlus_EncodersGetParamListSize|GDIPlus_EncodersGetSize|GDIPlus_FontCreate|GDIPlus_FontDispose|GDIPlus_FontFamilyCreate|GDIPlus_FontFamilyDispose|GDIPlus_GraphicsClear|GDIPlus_GraphicsCreateFromHDC|GDIPlus_GraphicsCreateFromHWND|GDIPlus_GraphicsDispose|GDIPlus_GraphicsDrawArc|GDIPlus_GraphicsDrawBezier|GDIPlus_GraphicsDrawClosedCurve|GDIPlus_GraphicsDrawCurve|GDIPlus_GraphicsDrawEllipse|GDIPlus_GraphicsDrawImage|GDIPlus_GraphicsDrawImageRect|GDIPlus_GraphicsDrawImageRectRect|GDIPlus_GraphicsDrawLine|GDIPlus_GraphicsDrawPie|GDIPlus_GraphicsDrawPolygon|GDIPlus_GraphicsDrawRect|GDIPlus_GraphicsDrawString|GDIPlus_GraphicsDrawStringEx|GDIPlus_GraphicsFillClosedCurve|GDIPlus_GraphicsFillEllipse|GDIPlus_GraphicsFillPie|GDIPlus_GraphicsFillRect|GDIPlus_GraphicsGetDC|GDIPlus_GraphicsGetSmoothingMode|GDIPlus_GraphicsMeasureString|GDIPlus_GraphicsReleaseDC|GDIPlus_GraphicsSetSmoothingMode|GDIPlus_GraphicsSetTransform|GDIPlus_ImageDispose|GDIPlus_ImageGetGraphicsContext|GDIPlus_ImageGetHeight|GDIPlus_ImageGetWidth|GDIPlus_ImageLoadFromFile|GDIPlus_ImageSaveToFile|GDIPlus_ImageSaveToFileEx|GDIPlus_MatrixCreate|GDIPlus_MatrixDispose|GDIPlus_MatrixRotate|GDIPlus_ParamAdd|GDIPlus_ParamInit|GDIPlus_PenCreate|GDIPlus_PenDispose|GDIPlus_PenGetAlignment|GDIPlus_PenGetColor|GDIPlus_PenGetCustomEndCap|GDIPlus_PenGetDashCap|GDIPlus_PenGetDashStyle|GDIPlus_PenGetEndCap|GDIPlus_PenGetWidth|GDIPlus_PenSetAlignment|GDIPlus_PenSetColor|GDIPlus_PenSetCustomEndCap|GDIPlus_PenSetDashCap|GDIPlus_PenSetDashStyle|GDIPlus_PenSetEndCap|GDIPlus_PenSetWidth|GDIPlus_RectFCreate|GDIPlus_Shutdown|GDIPlus_Startup|GDIPlus_StringFormatCreate|GDIPlus_StringFormatDispose|GetIP|GUICtrlAVI_Close|GUICtrlAVI_Create|GUICtrlAVI_Destroy|GUICtrlAVI_Open|GUICtrlAVI_OpenEx|GUICtrlAVI_Play|GUICtrlAVI_Seek|GUICtrlAVI_Show|GUICtrlAVI_Stop|GUICtrlButton_Click|GUICtrlButton_Create|GUICtrlButton_Destroy|GUICtrlButton_Enable|GUICtrlButton_GetCheck|GUICtrlButton_GetFocus|GUICtrlButton_GetIdealSize|GUICtrlButton_GetImage|GUICtrlButton_GetImageList|GUICtrlButton_GetState|GUICtrlButton_GetText|GUICtrlButton_GetTextMargin|GUICtrlButton_SetCheck|GUICtrlButton_SetFocus|GUICtrlButton_SetImage|GUICtrlButton_SetImageList|GUICtrlButton_SetSize|GUICtrlButton_SetState|GUICtrlButton_SetStyle|GUICtrlButton_SetText|GUICtrlButton_SetTextMargin|GUICtrlButton_Show|GUICtrlComboBox_AddDir|GUICtrlComboBox_AddString|GUICtrlComboBox_AutoComplete|GUICtrlComboBox_BeginUpdate|GUICtrlComboBox_Create|GUICtrlComboBox_DeleteString|GUICtrlComboBox_Destroy|GUICtrlComboBox_EndUpdate|GUICtrlComboBox_FindString|GUICtrlComboBox_FindStringExact|GUICtrlComboBox_GetComboBoxInfo|GUICtrlComboBox_GetCount|GUICtrlComboBox_GetCurSel|GUICtrlComboBox_GetDroppedControlRect|GUICtrlComboBox_GetDroppedControlRectEx|GUICtrlComboBox_GetDroppedState|GUICtrlComboBox_GetDroppedWidth|GUICtrlComboBox_GetEditSel|GUICtrlComboBox_GetEditText|GUICtrlComboBox_GetExtendedUI|GUICtrlComboBox_GetHorizontalExtent|GUICtrlComboBox_GetItemHeight|GUICtrlComboBox_GetLBText|GUICtrlComboBox_GetLBTextLen|GUICtrlComboBox_GetList|GUICtrlComboBox_GetListArray|GUICtrlComboBox_GetLocale|GUICtrlComboBox_GetLocaleCountry|GUICtrlComboBox_GetLocaleLang|GUICtrlComboBox_GetLocalePrimLang|GUICtrlComboBox_GetLocaleSubLang|GUICtrlComboBox_GetMinVisible|GUICtrlComboBox_GetTopIndex|GUICtrlComboBox_InitStorage|GUICtrlComboBox_InsertString|GUICtrlComboBox_LimitText|GUICtrlComboBox_ReplaceEditSel|GUICtrlComboBox_ResetContent|GUICtrlComboBox_SelectString|GUICtrlComboBox_SetCurSel|GUICtrlComboBox_SetDroppedWidth|GUICtrlComboBox_SetEditSel|GUICtrlComboBox_SetEditText|GUICtrlComboBox_SetExtendedUI|GUICtrlComboBox_SetHorizontalExtent|GUICtrlComboBox_SetItemHeight|GUICtrlComboBox_SetMinVisible|GUICtrlComboBox_SetTopIndex|GUICtrlComboBox_ShowDropDown|GUICtrlComboBoxEx_AddDir|GUICtrlComboBoxEx_AddString|GUICtrlComboBoxEx_BeginUpdate|GUICtrlComboBoxEx_Create|GUICtrlComboBoxEx_CreateSolidBitMap|GUICtrlComboBoxEx_DeleteString|GUICtrlComboBoxEx_Destroy|GUICtrlComboBoxEx_EndUpdate|GUICtrlComboBoxEx_FindStringExact|GUICtrlComboBoxEx_GetComboBoxInfo|GUICtrlComboBoxEx_GetComboControl|GUICtrlComboBoxEx_GetCount|GUICtrlComboBoxEx_GetCurSel|GUICtrlComboBoxEx_GetDroppedControlRect|GUICtrlComboBoxEx_GetDroppedControlRectEx|GUICtrlComboBoxEx_GetDroppedState|GUICtrlComboBoxEx_GetDroppedWidth|GUICtrlComboBoxEx_GetEditControl|GUICtrlComboBoxEx_GetEditSel|GUICtrlComboBoxEx_GetEditText|GUICtrlComboBoxEx_GetExtendedStyle|GUICtrlComboBoxEx_GetExtendedUI|GUICtrlComboBoxEx_GetImageList|GUICtrlComboBoxEx_GetItem|GUICtrlComboBoxEx_GetItemEx|GUICtrlComboBoxEx_GetItemHeight|GUICtrlComboBoxEx_GetItemImage|GUICtrlComboBoxEx_GetItemIndent|GUICtrlComboBoxEx_GetItemOverlayImage|GUICtrlComboBoxEx_GetItemParam|GUICtrlComboBoxEx_GetItemSelectedImage|GUICtrlComboBoxEx_GetItemText|GUICtrlComboBoxEx_GetItemTextLen|GUICtrlComboBoxEx_GetList|GUICtrlComboBoxEx_GetListArray|GUICtrlComboBoxEx_GetLocale|GUICtrlComboBoxEx_GetLocaleCountry|GUICtrlComboBoxEx_GetLocaleLang|GUICtrlComboBoxEx_GetLocalePrimLang|GUICtrlComboBoxEx_GetLocaleSubLang|GUICtrlComboBoxEx_GetMinVisible|GUICtrlComboBoxEx_GetTopIndex|GUICtrlComboBoxEx_InitStorage|GUICtrlComboBoxEx_InsertString|GUICtrlComboBoxEx_LimitText|GUICtrlComboBoxEx_ReplaceEditSel|GUICtrlComboBoxEx_ResetContent|GUICtrlComboBoxEx_SetCurSel|GUICtrlComboBoxEx_SetDroppedWidth|GUICtrlComboBoxEx_SetEditSel|GUICtrlComboBoxEx_SetEditText|GUICtrlComboBoxEx_SetExtendedStyle|GUICtrlComboBoxEx_SetExtendedUI|GUICtrlComboBoxEx_SetImageList|GUICtrlComboBoxEx_SetItem|GUICtrlComboBoxEx_SetItemEx|GUICtrlComboBoxEx_SetItemHeight|GUICtrlComboBoxEx_SetItemImage|GUICtrlComboBoxEx_SetItemIndent|GUICtrlComboBoxEx_SetItemOverlayImage|GUICtrlComboBoxEx_SetItemParam|GUICtrlComboBoxEx_SetItemSelectedImage|GUICtrlComboBoxEx_SetMinVisible|GUICtrlComboBoxEx_SetTopIndex|GUICtrlComboBoxEx_ShowDropDown|GUICtrlDTP_Create|GUICtrlDTP_Destroy|GUICtrlDTP_GetMCColor|GUICtrlDTP_GetMCFont|GUICtrlDTP_GetMonthCal|GUICtrlDTP_GetRange|GUICtrlDTP_GetRangeEx|GUICtrlDTP_GetSystemTime|GUICtrlDTP_GetSystemTimeEx|GUICtrlDTP_SetFormat|GUICtrlDTP_SetMCColor|GUICtrlDTP_SetMCFont|GUICtrlDTP_SetRange|GUICtrlDTP_SetRangeEx|GUICtrlDTP_SetSystemTime|GUICtrlDTP_SetSystemTimeEx|GUICtrlEdit_AppendText|GUICtrlEdit_BeginUpdate|GUICtrlEdit_CanUndo|GUICtrlEdit_CharFromPos|GUICtrlEdit_Create|GUICtrlEdit_Destroy|GUICtrlEdit_EmptyUndoBuffer|GUICtrlEdit_EndUpdate|GUICtrlEdit_Find|GUICtrlEdit_FmtLines|GUICtrlEdit_GetFirstVisibleLine|GUICtrlEdit_GetLimitText|GUICtrlEdit_GetLine|GUICtrlEdit_GetLineCount|GUICtrlEdit_GetMargins|GUICtrlEdit_GetModify|GUICtrlEdit_GetPasswordChar|GUICtrlEdit_GetRECT|GUICtrlEdit_GetRECTEx|GUICtrlEdit_GetSel|GUICtrlEdit_GetText|GUICtrlEdit_GetTextLen|GUICtrlEdit_HideBalloonTip|GUICtrlEdit_InsertText|GUICtrlEdit_LineFromChar|GUICtrlEdit_LineIndex|GUICtrlEdit_LineLength|GUICtrlEdit_LineScroll|GUICtrlEdit_PosFromChar|GUICtrlEdit_ReplaceSel|GUICtrlEdit_Scroll|GUICtrlEdit_SetLimitText|GUICtrlEdit_SetMargins|GUICtrlEdit_SetModify|GUICtrlEdit_SetPasswordChar|GUICtrlEdit_SetReadOnly|GUICtrlEdit_SetRECT|GUICtrlEdit_SetRECTEx|GUICtrlEdit_SetRECTNP|GUICtrlEdit_SetRectNPEx|GUICtrlEdit_SetSel|GUICtrlEdit_SetTabStops|GUICtrlEdit_SetText|GUICtrlEdit_ShowBalloonTip|GUICtrlEdit_Undo|GUICtrlHeader_AddItem|GUICtrlHeader_ClearFilter|GUICtrlHeader_ClearFilterAll|GUICtrlHeader_Create|GUICtrlHeader_CreateDragImage|GUICtrlHeader_DeleteItem|GUICtrlHeader_Destroy|GUICtrlHeader_EditFilter|GUICtrlHeader_GetBitmapMargin|GUICtrlHeader_GetImageList|GUICtrlHeader_GetItem|GUICtrlHeader_GetItemAlign|GUICtrlHeader_GetItemBitmap|GUICtrlHeader_GetItemCount|GUICtrlHeader_GetItemDisplay|GUICtrlHeader_GetItemFlags|GUICtrlHeader_GetItemFormat|GUICtrlHeader_GetItemImage|GUICtrlHeader_GetItemOrder|GUICtrlHeader_GetItemParam|GUICtrlHeader_GetItemRect|GUICtrlHeader_GetItemRectEx|GUICtrlHeader_GetItemText|GUICtrlHeader_GetItemWidth|GUICtrlHeader_GetOrderArray|GUICtrlHeader_GetUnicodeFormat|GUICtrlHeader_HitTest|GUICtrlHeader_InsertItem|GUICtrlHeader_Layout|GUICtrlHeader_OrderToIndex|GUICtrlHeader_SetBitmapMargin|GUICtrlHeader_SetFilterChangeTimeout|GUICtrlHeader_SetHotDivider|GUICtrlHeader_SetImageList|GUICtrlHeader_SetItem|GUICtrlHeader_SetItemAlign|GUICtrlHeader_SetItemBitmap|GUICtrlHeader_SetItemDisplay|GUICtrlHeader_SetItemFlags|GUICtrlHeader_SetItemFormat|GUICtrlHeader_SetItemImage|GUICtrlHeader_SetItemOrder|GUICtrlHeader_SetItemParam|GUICtrlHeader_SetItemText|GUICtrlHeader_SetItemWidth|GUICtrlHeader_SetOrderArray|GUICtrlHeader_SetUnicodeFormat|GUICtrlIpAddress_ClearAddress|GUICtrlIpAddress_Create|GUICtrlIpAddress_Destroy|GUICtrlIpAddress_Get|GUICtrlIpAddress_GetArray|GUICtrlIpAddress_GetEx|GUICtrlIpAddress_IsBlank|GUICtrlIpAddress_Set|GUICtrlIpAddress_SetArray|GUICtrlIpAddress_SetEx|GUICtrlIpAddress_SetFocus|GUICtrlIpAddress_SetFont|GUICtrlIpAddress_SetRange|GUICtrlIpAddress_ShowHide|GUICtrlListBox_AddFile|GUICtrlListBox_AddString|GUICtrlListBox_BeginUpdate|GUICtrlListBox_Create|GUICtrlListBox_DeleteString|GUICtrlListBox_Destroy|GUICtrlListBox_Dir|GUICtrlListBox_EndUpdate|GUICtrlListBox_FindInText|GUICtrlListBox_FindString|GUICtrlListBox_GetAnchorIndex|GUICtrlListBox_GetCaretIndex|GUICtrlListBox_GetCount|GUICtrlListBox_GetCurSel|GUICtrlListBox_GetHorizontalExtent|GUICtrlListBox_GetItemData|GUICtrlListBox_GetItemHeight|GUICtrlListBox_GetItemRect|GUICtrlListBox_GetItemRectEx|GUICtrlListBox_GetListBoxInfo|GUICtrlListBox_GetLocale|GUICtrlListBox_GetLocaleCountry|GUICtrlListBox_GetLocaleLang|GUICtrlListBox_GetLocalePrimLang|GUICtrlListBox_GetLocaleSubLang|GUICtrlListBox_GetSel|GUICtrlListBox_GetSelCount|GUICtrlListBox_GetSelItems|GUICtrlListBox_GetSelItemsText|GUICtrlListBox_GetText|GUICtrlListBox_GetTextLen|GUICtrlListBox_GetTopIndex|GUICtrlListBox_InitStorage|GUICtrlListBox_InsertString|GUICtrlListBox_ItemFromPoint|GUICtrlListBox_ReplaceString|GUICtrlListBox_ResetContent|GUICtrlListBox_SelectString|GUICtrlListBox_SelItemRange|GUICtrlListBox_SelItemRangeEx|GUICtrlListBox_SetAnchorIndex|GUICtrlListBox_SetCaretIndex|GUICtrlListBox_SetColumnWidth|GUICtrlListBox_SetCurSel|GUICtrlListBox_SetHorizontalExtent|GUICtrlListBox_SetItemData|GUICtrlListBox_SetItemHeight|GUICtrlListBox_SetLocale|GUICtrlListBox_SetSel|GUICtrlListBox_SetTabStops|GUICtrlListBox_SetTopIndex|GUICtrlListBox_Sort|GUICtrlListBox_SwapString|GUICtrlListBox_UpdateHScroll|GUICtrlListView_AddArray|GUICtrlListView_AddColumn|GUICtrlListView_AddItem|GUICtrlListView_AddSubItem|GUICtrlListView_ApproximateViewHeight|GUICtrlListView_ApproximateViewRect|GUICtrlListView_ApproximateViewWidth|GUICtrlListView_Arrange|GUICtrlListView_BeginUpdate|GUICtrlListView_CancelEditLabel|GUICtrlListView_ClickItem|GUICtrlListView_CopyItems|GUICtrlListView_Create|GUICtrlListView_CreateDragImage|GUICtrlListView_CreateSolidBitMap|GUICtrlListView_DeleteAllItems|GUICtrlListView_DeleteColumn|GUICtrlListView_DeleteItem|GUICtrlListView_DeleteItemsSelected|GUICtrlListView_Destroy|GUICtrlListView_DrawDragImage|GUICtrlListView_EditLabel|GUICtrlListView_EnableGroupView|GUICtrlListView_EndUpdate|GUICtrlListView_EnsureVisible|GUICtrlListView_FindInText|GUICtrlListView_FindItem|GUICtrlListView_FindNearest|GUICtrlListView_FindParam|GUICtrlListView_FindText|GUICtrlListView_GetBkColor|GUICtrlListView_GetBkImage|GUICtrlListView_GetCallbackMask|GUICtrlListView_GetColumn|GUICtrlListView_GetColumnCount|GUICtrlListView_GetColumnOrder|GUICtrlListView_GetColumnOrderArray|GUICtrlListView_GetColumnWidth|GUICtrlListView_GetCounterPage|GUICtrlListView_GetEditControl|GUICtrlListView_GetExtendedListViewStyle|GUICtrlListView_GetGroupInfo|GUICtrlListView_GetGroupViewEnabled|GUICtrlListView_GetHeader|GUICtrlListView_GetHotCursor|GUICtrlListView_GetHotItem|GUICtrlListView_GetHoverTime|GUICtrlListView_GetImageList|GUICtrlListView_GetISearchString|GUICtrlListView_GetItem|GUICtrlListView_GetItemChecked|GUICtrlListView_GetItemCount|GUICtrlListView_GetItemCut|GUICtrlListView_GetItemDropHilited|GUICtrlListView_GetItemEx|GUICtrlListView_GetItemFocused|GUICtrlListView_GetItemGroupID|GUICtrlListView_GetItemImage|GUICtrlListView_GetItemIndent|GUICtrlListView_GetItemParam|GUICtrlListView_GetItemPosition|GUICtrlListView_GetItemPositionX|GUICtrlListView_GetItemPositionY|GUICtrlListView_GetItemRect|GUICtrlListView_GetItemRectEx|GUICtrlListView_GetItemSelected|GUICtrlListView_GetItemSpacing|GUICtrlListView_GetItemSpacingX|GUICtrlListView_GetItemSpacingY|GUICtrlListView_GetItemState|GUICtrlListView_GetItemStateImage|GUICtrlListView_GetItemText|GUICtrlListView_GetItemTextArray|GUICtrlListView_GetItemTextString|GUICtrlListView_GetNextItem|GUICtrlListView_GetNumberOfWorkAreas|GUICtrlListView_GetOrigin|GUICtrlListView_GetOriginX|GUICtrlListView_GetOriginY|GUICtrlListView_GetOutlineColor|GUICtrlListView_GetSelectedColumn|GUICtrlListView_GetSelectedCount|GUICtrlListView_GetSelectedIndices|GUICtrlListView_GetSelectionMark|GUICtrlListView_GetStringWidth|GUICtrlListView_GetSubItemRect|GUICtrlListView_GetTextBkColor|GUICtrlListView_GetTextColor|GUICtrlListView_GetToolTips|GUICtrlListView_GetTopIndex|GUICtrlListView_GetUnicodeFormat|GUICtrlListView_GetView|GUICtrlListView_GetViewDetails|GUICtrlListView_GetViewLarge|GUICtrlListView_GetViewList|GUICtrlListView_GetViewRect|GUICtrlListView_GetViewSmall|GUICtrlListView_GetViewTile|GUICtrlListView_HideColumn|GUICtrlListView_HitTest|GUICtrlListView_InsertColumn|GUICtrlListView_InsertGroup|GUICtrlListView_InsertItem|GUICtrlListView_JustifyColumn|GUICtrlListView_MapIDToIndex|GUICtrlListView_MapIndexToID|GUICtrlListView_RedrawItems|GUICtrlListView_RegisterSortCallBack|GUICtrlListView_RemoveAllGroups|GUICtrlListView_RemoveGroup|GUICtrlListView_Scroll|GUICtrlListView_SetBkColor|GUICtrlListView_SetBkImage|GUICtrlListView_SetCallBackMask|GUICtrlListView_SetColumn|GUICtrlListView_SetColumnOrder|GUICtrlListView_SetColumnOrderArray|GUICtrlListView_SetColumnWidth|GUICtrlListView_SetExtendedListViewStyle|GUICtrlListView_SetGroupInfo|GUICtrlListView_SetHotItem|GUICtrlListView_SetHoverTime|GUICtrlListView_SetIconSpacing|GUICtrlListView_SetImageList|GUICtrlListView_SetItem|GUICtrlListView_SetItemChecked|GUICtrlListView_SetItemCount|GUICtrlListView_SetItemCut|GUICtrlListView_SetItemDropHilited|GUICtrlListView_SetItemEx|GUICtrlListView_SetItemFocused|GUICtrlListView_SetItemGroupID|GUICtrlListView_SetItemImage|GUICtrlListView_SetItemIndent|GUICtrlListView_SetItemParam|GUICtrlListView_SetItemPosition|GUICtrlListView_SetItemPosition32|GUICtrlListView_SetItemSelected|GUICtrlListView_SetItemState|GUICtrlListView_SetItemStateImage|GUICtrlListView_SetItemText|GUICtrlListView_SetOutlineColor|GUICtrlListView_SetSelectedColumn|GUICtrlListView_SetSelectionMark|GUICtrlListView_SetTextBkColor|GUICtrlListView_SetTextColor|GUICtrlListView_SetToolTips|GUICtrlListView_SetUnicodeFormat|GUICtrlListView_SetView|GUICtrlListView_SetWorkAreas|GUICtrlListView_SimpleSort|GUICtrlListView_SortItems|GUICtrlListView_SubItemHitTest|GUICtrlListView_UnRegisterSortCallBack|GUICtrlMenu_AddMenuItem|GUICtrlMenu_AppendMenu|GUICtrlMenu_CheckMenuItem|GUICtrlMenu_CheckRadioItem|GUICtrlMenu_CreateMenu|GUICtrlMenu_CreatePopup|GUICtrlMenu_DeleteMenu|GUICtrlMenu_DestroyMenu|GUICtrlMenu_DrawMenuBar|GUICtrlMenu_EnableMenuItem|GUICtrlMenu_FindItem|GUICtrlMenu_FindParent|GUICtrlMenu_GetItemBmp|GUICtrlMenu_GetItemBmpChecked|GUICtrlMenu_GetItemBmpUnchecked|GUICtrlMenu_GetItemChecked|GUICtrlMenu_GetItemCount|GUICtrlMenu_GetItemData|GUICtrlMenu_GetItemDefault|GUICtrlMenu_GetItemDisabled|GUICtrlMenu_GetItemEnabled|GUICtrlMenu_GetItemGrayed|GUICtrlMenu_GetItemHighlighted|GUICtrlMenu_GetItemID|GUICtrlMenu_GetItemInfo|GUICtrlMenu_GetItemRect|GUICtrlMenu_GetItemRectEx|GUICtrlMenu_GetItemState|GUICtrlMenu_GetItemStateEx|GUICtrlMenu_GetItemSubMenu|GUICtrlMenu_GetItemText|GUICtrlMenu_GetItemType|GUICtrlMenu_GetMenu|GUICtrlMenu_GetMenuBackground|GUICtrlMenu_GetMenuBarInfo|GUICtrlMenu_GetMenuContextHelpID|GUICtrlMenu_GetMenuData|GUICtrlMenu_GetMenuDefaultItem|GUICtrlMenu_GetMenuHeight|GUICtrlMenu_GetMenuInfo|GUICtrlMenu_GetMenuStyle|GUICtrlMenu_GetSystemMenu|GUICtrlMenu_InsertMenuItem|GUICtrlMenu_InsertMenuItemEx|GUICtrlMenu_IsMenu|GUICtrlMenu_LoadMenu|GUICtrlMenu_MapAccelerator|GUICtrlMenu_MenuItemFromPoint|GUICtrlMenu_RemoveMenu|GUICtrlMenu_SetItemBitmaps|GUICtrlMenu_SetItemBmp|GUICtrlMenu_SetItemBmpChecked|GUICtrlMenu_SetItemBmpUnchecked|GUICtrlMenu_SetItemChecked|GUICtrlMenu_SetItemData|GUICtrlMenu_SetItemDefault|GUICtrlMenu_SetItemDisabled|GUICtrlMenu_SetItemEnabled|GUICtrlMenu_SetItemGrayed|GUICtrlMenu_SetItemHighlighted|GUICtrlMenu_SetItemID|GUICtrlMenu_SetItemInfo|GUICtrlMenu_SetItemState|GUICtrlMenu_SetItemSubMenu|GUICtrlMenu_SetItemText|GUICtrlMenu_SetItemType|GUICtrlMenu_SetMenu|GUICtrlMenu_SetMenuBackground|GUICtrlMenu_SetMenuContextHelpID|GUICtrlMenu_SetMenuData|GUICtrlMenu_SetMenuDefaultItem|GUICtrlMenu_SetMenuHeight|GUICtrlMenu_SetMenuInfo|GUICtrlMenu_SetMenuStyle|GUICtrlMenu_TrackPopupMenu|GUICtrlMonthCal_Create|GUICtrlMonthCal_Destroy|GUICtrlMonthCal_GetColor|GUICtrlMonthCal_GetColorArray|GUICtrlMonthCal_GetCurSel|GUICtrlMonthCal_GetCurSelStr|GUICtrlMonthCal_GetFirstDOW|GUICtrlMonthCal_GetFirstDOWStr|GUICtrlMonthCal_GetMaxSelCount|GUICtrlMonthCal_GetMaxTodayWidth|GUICtrlMonthCal_GetMinReqHeight|GUICtrlMonthCal_GetMinReqRect|GUICtrlMonthCal_GetMinReqRectArray|GUICtrlMonthCal_GetMinReqWidth|GUICtrlMonthCal_GetMonthDelta|GUICtrlMonthCal_GetMonthRange|GUICtrlMonthCal_GetMonthRangeMax|GUICtrlMonthCal_GetMonthRangeMaxStr|GUICtrlMonthCal_GetMonthRangeMin|GUICtrlMonthCal_GetMonthRangeMinStr|GUICtrlMonthCal_GetMonthRangeSpan|GUICtrlMonthCal_GetRange|GUICtrlMonthCal_GetRangeMax|GUICtrlMonthCal_GetRangeMaxStr|GUICtrlMonthCal_GetRangeMin|GUICtrlMonthCal_GetRangeMinStr|GUICtrlMonthCal_GetSelRange|GUICtrlMonthCal_GetSelRangeMax|GUICtrlMonthCal_GetSelRangeMaxStr|GUICtrlMonthCal_GetSelRangeMin|GUICtrlMonthCal_GetSelRangeMinStr|GUICtrlMonthCal_GetToday|GUICtrlMonthCal_GetTodayStr|GUICtrlMonthCal_GetUnicodeFormat|GUICtrlMonthCal_HitTest|GUICtrlMonthCal_SetColor|GUICtrlMonthCal_SetCurSel|GUICtrlMonthCal_SetDayState|GUICtrlMonthCal_SetFirstDOW|GUICtrlMonthCal_SetMaxSelCount|GUICtrlMonthCal_SetMonthDelta|GUICtrlMonthCal_SetRange|GUICtrlMonthCal_SetSelRange|GUICtrlMonthCal_SetToday|GUICtrlMonthCal_SetUnicodeFormat|GUICtrlRebar_AddBand|GUICtrlRebar_AddToolBarBand|GUICtrlRebar_BeginDrag|GUICtrlRebar_Create|GUICtrlRebar_DeleteBand|GUICtrlRebar_Destroy|GUICtrlRebar_DragMove|GUICtrlRebar_EndDrag|GUICtrlRebar_GetBandBackColor|GUICtrlRebar_GetBandBorders|GUICtrlRebar_GetBandBordersEx|GUICtrlRebar_GetBandChildHandle|GUICtrlRebar_GetBandChildSize|GUICtrlRebar_GetBandCount|GUICtrlRebar_GetBandForeColor|GUICtrlRebar_GetBandHeaderSize|GUICtrlRebar_GetBandID|GUICtrlRebar_GetBandIdealSize|GUICtrlRebar_GetBandLength|GUICtrlRebar_GetBandLParam|GUICtrlRebar_GetBandMargins|GUICtrlRebar_GetBandMarginsEx|GUICtrlRebar_GetBandRect|GUICtrlRebar_GetBandRectEx|GUICtrlRebar_GetBandStyle|GUICtrlRebar_GetBandStyleBreak|GUICtrlRebar_GetBandStyleChildEdge|GUICtrlRebar_GetBandStyleFixedBMP|GUICtrlRebar_GetBandStyleFixedSize|GUICtrlRebar_GetBandStyleGripperAlways|GUICtrlRebar_GetBandStyleHidden|GUICtrlRebar_GetBandStyleHideTitle|GUICtrlRebar_GetBandStyleNoGripper|GUICtrlRebar_GetBandStyleTopAlign|GUICtrlRebar_GetBandStyleUseChevron|GUICtrlRebar_GetBandStyleVariableHeight|GUICtrlRebar_GetBandText|GUICtrlRebar_GetBarHeight|GUICtrlRebar_GetBKColor|GUICtrlRebar_GetColorScheme|GUICtrlRebar_GetRowCount|GUICtrlRebar_GetRowHeight|GUICtrlRebar_GetTextColor|GUICtrlRebar_GetToolTips|GUICtrlRebar_GetUnicodeFormat|GUICtrlRebar_HitTest|GUICtrlRebar_IDToIndex|GUICtrlRebar_MaximizeBand|GUICtrlRebar_MinimizeBand|GUICtrlRebar_MoveBand|GUICtrlRebar_SetBandBackColor|GUICtrlRebar_SetBandForeColor|GUICtrlRebar_SetBandHeaderSize|GUICtrlRebar_SetBandID|GUICtrlRebar_SetBandIdealSize|GUICtrlRebar_SetBandLength|GUICtrlRebar_SetBandLParam|GUICtrlRebar_SetBandStyle|GUICtrlRebar_SetBandStyleBreak|GUICtrlRebar_SetBandStyleChildEdge|GUICtrlRebar_SetBandStyleFixedBMP|GUICtrlRebar_SetBandStyleFixedSize|GUICtrlRebar_SetBandStyleGripperAlways|GUICtrlRebar_SetBandStyleHidden|GUICtrlRebar_SetBandStyleHideTitle|GUICtrlRebar_SetBandStyleNoGripper|GUICtrlRebar_SetBandStyleTopAlign|GUICtrlRebar_SetBandStyleUseChevron|GUICtrlRebar_SetBandStyleVariableHeight|GUICtrlRebar_SetBandText|GUICtrlRebar_SetBKColor|GUICtrlRebar_SetColorScheme|GUICtrlRebar_SetTextColor|GUICtrlRebar_SetToolTips|GUICtrlRebar_SetUnicodeFormat|GUICtrlRebar_ShowBand|GUICtrlSlider_ClearSel|GUICtrlSlider_ClearTics|GUICtrlSlider_Create|GUICtrlSlider_Destroy|GUICtrlSlider_GetBuddy|GUICtrlSlider_GetChannelRect|GUICtrlSlider_GetLineSize|GUICtrlSlider_GetNumTics|GUICtrlSlider_GetPageSize|GUICtrlSlider_GetPos|GUICtrlSlider_GetPTics|GUICtrlSlider_GetRange|GUICtrlSlider_GetRangeMax|GUICtrlSlider_GetRangeMin|GUICtrlSlider_GetSel|GUICtrlSlider_GetSelEnd|GUICtrlSlider_GetSelStart|GUICtrlSlider_GetThumbLength|GUICtrlSlider_GetThumbRect|GUICtrlSlider_GetThumbRectEx|GUICtrlSlider_GetTic|GUICtrlSlider_GetTicPos|GUICtrlSlider_GetToolTips|GUICtrlSlider_GetUnicodeFormat|GUICtrlSlider_SetBuddy|GUICtrlSlider_SetLineSize|GUICtrlSlider_SetPageSize|GUICtrlSlider_SetPos|GUICtrlSlider_SetRange|GUICtrlSlider_SetRangeMax|GUICtrlSlider_SetRangeMin|GUICtrlSlider_SetSel|GUICtrlSlider_SetSelEnd|GUICtrlSlider_SetSelStart|GUICtrlSlider_SetThumbLength|GUICtrlSlider_SetTic|GUICtrlSlider_SetTicFreq|GUICtrlSlider_SetTipSide|GUICtrlSlider_SetToolTips|GUICtrlSlider_SetUnicodeFormat|GUICtrlStatusBar_Create|GUICtrlStatusBar_Destroy|GUICtrlStatusBar_EmbedControl|GUICtrlStatusBar_GetBorders|GUICtrlStatusBar_GetBordersHorz|GUICtrlStatusBar_GetBordersRect|GUICtrlStatusBar_GetBordersVert|GUICtrlStatusBar_GetCount|GUICtrlStatusBar_GetHeight|GUICtrlStatusBar_GetIcon|GUICtrlStatusBar_GetParts|GUICtrlStatusBar_GetRect|GUICtrlStatusBar_GetRectEx|GUICtrlStatusBar_GetText|GUICtrlStatusBar_GetTextFlags|GUICtrlStatusBar_GetTextLength|GUICtrlStatusBar_GetTextLengthEx|GUICtrlStatusBar_GetTipText|GUICtrlStatusBar_GetUnicodeFormat|GUICtrlStatusBar_GetWidth|GUICtrlStatusBar_IsSimple|GUICtrlStatusBar_Resize|GUICtrlStatusBar_SetBkColor|GUICtrlStatusBar_SetIcon|GUICtrlStatusBar_SetMinHeight|GUICtrlStatusBar_SetParts|GUICtrlStatusBar_SetSimple|GUICtrlStatusBar_SetText|GUICtrlStatusBar_SetTipText|GUICtrlStatusBar_SetUnicodeFormat|GUICtrlStatusBar_ShowHide|GUICtrlTab_Create|GUICtrlTab_DeleteAllItems|GUICtrlTab_DeleteItem|GUICtrlTab_DeselectAll|GUICtrlTab_Destroy|GUICtrlTab_FindTab|GUICtrlTab_GetCurFocus|GUICtrlTab_GetCurSel|GUICtrlTab_GetDisplayRect|GUICtrlTab_GetDisplayRectEx|GUICtrlTab_GetExtendedStyle|GUICtrlTab_GetImageList|GUICtrlTab_GetItem|GUICtrlTab_GetItemCount|GUICtrlTab_GetItemImage|GUICtrlTab_GetItemParam|GUICtrlTab_GetItemRect|GUICtrlTab_GetItemRectEx|GUICtrlTab_GetItemState|GUICtrlTab_GetItemText|GUICtrlTab_GetRowCount|GUICtrlTab_GetToolTips|GUICtrlTab_GetUnicodeFormat|GUICtrlTab_HighlightItem|GUICtrlTab_HitTest|GUICtrlTab_InsertItem|GUICtrlTab_RemoveImage|GUICtrlTab_SetCurFocus|GUICtrlTab_SetCurSel|GUICtrlTab_SetExtendedStyle|GUICtrlTab_SetImageList|GUICtrlTab_SetItem|GUICtrlTab_SetItemImage|GUICtrlTab_SetItemParam|GUICtrlTab_SetItemSize|GUICtrlTab_SetItemState|GUICtrlTab_SetItemText|GUICtrlTab_SetMinTabWidth|GUICtrlTab_SetPadding|GUICtrlTab_SetToolTips|GUICtrlTab_SetUnicodeFormat|GUICtrlToolbar_AddBitmap|GUICtrlToolbar_AddButton|GUICtrlToolbar_AddButtonSep|GUICtrlToolbar_AddString|GUICtrlToolbar_ButtonCount|GUICtrlToolbar_CheckButton|GUICtrlToolbar_ClickAccel|GUICtrlToolbar_ClickButton|GUICtrlToolbar_ClickIndex|GUICtrlToolbar_CommandToIndex|GUICtrlToolbar_Create|GUICtrlToolbar_Customize|GUICtrlToolbar_DeleteButton|GUICtrlToolbar_Destroy|GUICtrlToolbar_EnableButton|GUICtrlToolbar_FindToolbar|GUICtrlToolbar_GetAnchorHighlight|GUICtrlToolbar_GetBitmapFlags|GUICtrlToolbar_GetButtonBitmap|GUICtrlToolbar_GetButtonInfo|GUICtrlToolbar_GetButtonInfoEx|GUICtrlToolbar_GetButtonParam|GUICtrlToolbar_GetButtonRect|GUICtrlToolbar_GetButtonRectEx|GUICtrlToolbar_GetButtonSize|GUICtrlToolbar_GetButtonState|GUICtrlToolbar_GetButtonStyle|GUICtrlToolbar_GetButtonText|GUICtrlToolbar_GetColorScheme|GUICtrlToolbar_GetDisabledImageList|GUICtrlToolbar_GetExtendedStyle|GUICtrlToolbar_GetHotImageList|GUICtrlToolbar_GetHotItem|GUICtrlToolbar_GetImageList|GUICtrlToolbar_GetInsertMark|GUICtrlToolbar_GetInsertMarkColor|GUICtrlToolbar_GetMaxSize|GUICtrlToolbar_GetMetrics|GUICtrlToolbar_GetPadding|GUICtrlToolbar_GetRows|GUICtrlToolbar_GetString|GUICtrlToolbar_GetStyle|GUICtrlToolbar_GetStyleAltDrag|GUICtrlToolbar_GetStyleCustomErase|GUICtrlToolbar_GetStyleFlat|GUICtrlToolbar_GetStyleList|GUICtrlToolbar_GetStyleRegisterDrop|GUICtrlToolbar_GetStyleToolTips|GUICtrlToolbar_GetStyleTransparent|GUICtrlToolbar_GetStyleWrapable|GUICtrlToolbar_GetTextRows|GUICtrlToolbar_GetToolTips|GUICtrlToolbar_GetUnicodeFormat|GUICtrlToolbar_HideButton|GUICtrlToolbar_HighlightButton|GUICtrlToolbar_HitTest|GUICtrlToolbar_IndexToCommand|GUICtrlToolbar_InsertButton|GUICtrlToolbar_InsertMarkHitTest|GUICtrlToolbar_IsButtonChecked|GUICtrlToolbar_IsButtonEnabled|GUICtrlToolbar_IsButtonHidden|GUICtrlToolbar_IsButtonHighlighted|GUICtrlToolbar_IsButtonIndeterminate|GUICtrlToolbar_IsButtonPressed|GUICtrlToolbar_LoadBitmap|GUICtrlToolbar_LoadImages|GUICtrlToolbar_MapAccelerator|GUICtrlToolbar_MoveButton|GUICtrlToolbar_PressButton|GUICtrlToolbar_SetAnchorHighlight|GUICtrlToolbar_SetBitmapSize|GUICtrlToolbar_SetButtonBitMap|GUICtrlToolbar_SetButtonInfo|GUICtrlToolbar_SetButtonInfoEx|GUICtrlToolbar_SetButtonParam|GUICtrlToolbar_SetButtonSize|GUICtrlToolbar_SetButtonState|GUICtrlToolbar_SetButtonStyle|GUICtrlToolbar_SetButtonText|GUICtrlToolbar_SetButtonWidth|GUICtrlToolbar_SetCmdID|GUICtrlToolbar_SetColorScheme|GUICtrlToolbar_SetDisabledImageList|GUICtrlToolbar_SetDrawTextFlags|GUICtrlToolbar_SetExtendedStyle|GUICtrlToolbar_SetHotImageList|GUICtrlToolbar_SetHotItem|GUICtrlToolbar_SetImageList|GUICtrlToolbar_SetIndent|GUICtrlToolbar_SetIndeterminate|GUICtrlToolbar_SetInsertMark|GUICtrlToolbar_SetInsertMarkColor|GUICtrlToolbar_SetMaxTextRows|GUICtrlToolbar_SetMetrics|GUICtrlToolbar_SetPadding|GUICtrlToolbar_SetParent|GUICtrlToolbar_SetRows|GUICtrlToolbar_SetStyle|GUICtrlToolbar_SetStyleAltDrag|GUICtrlToolbar_SetStyleCustomErase|GUICtrlToolbar_SetStyleFlat|GUICtrlToolbar_SetStyleList|GUICtrlToolbar_SetStyleRegisterDrop|GUICtrlToolbar_SetStyleToolTips|GUICtrlToolbar_SetStyleTransparent|GUICtrlToolbar_SetStyleWrapable|GUICtrlToolbar_SetToolTips|GUICtrlToolbar_SetUnicodeFormat|GUICtrlToolbar_SetWindowTheme|GUICtrlTreeView_Add|GUICtrlTreeView_AddChild|GUICtrlTreeView_AddChildFirst|GUICtrlTreeView_AddFirst|GUICtrlTreeView_BeginUpdate|GUICtrlTreeView_ClickItem|GUICtrlTreeView_Create|GUICtrlTreeView_CreateDragImage|GUICtrlTreeView_CreateSolidBitMap|GUICtrlTreeView_Delete|GUICtrlTreeView_DeleteAll|GUICtrlTreeView_DeleteChildren|GUICtrlTreeView_Destroy|GUICtrlTreeView_DisplayRect|GUICtrlTreeView_DisplayRectEx|GUICtrlTreeView_EditText|GUICtrlTreeView_EndEdit|GUICtrlTreeView_EndUpdate|GUICtrlTreeView_EnsureVisible|GUICtrlTreeView_Expand|GUICtrlTreeView_ExpandedOnce|GUICtrlTreeView_FindItem|GUICtrlTreeView_FindItemEx|GUICtrlTreeView_GetBkColor|GUICtrlTreeView_GetBold|GUICtrlTreeView_GetChecked|GUICtrlTreeView_GetChildCount|GUICtrlTreeView_GetChildren|GUICtrlTreeView_GetCount|GUICtrlTreeView_GetCut|GUICtrlTreeView_GetDropTarget|GUICtrlTreeView_GetEditControl|GUICtrlTreeView_GetExpanded|GUICtrlTreeView_GetFirstChild|GUICtrlTreeView_GetFirstItem|GUICtrlTreeView_GetFirstVisible|GUICtrlTreeView_GetFocused|GUICtrlTreeView_GetHeight|GUICtrlTreeView_GetImageIndex|GUICtrlTreeView_GetImageListIconHandle|GUICtrlTreeView_GetIndent|GUICtrlTreeView_GetInsertMarkColor|GUICtrlTreeView_GetISearchString|GUICtrlTreeView_GetItemByIndex|GUICtrlTreeView_GetItemHandle|GUICtrlTreeView_GetItemParam|GUICtrlTreeView_GetLastChild|GUICtrlTreeView_GetLineColor|GUICtrlTreeView_GetNext|GUICtrlTreeView_GetNextChild|GUICtrlTreeView_GetNextSibling|GUICtrlTreeView_GetNextVisible|GUICtrlTreeView_GetNormalImageList|GUICtrlTreeView_GetParentHandle|GUICtrlTreeView_GetParentParam|GUICtrlTreeView_GetPrev|GUICtrlTreeView_GetPrevChild|GUICtrlTreeView_GetPrevSibling|GUICtrlTreeView_GetPrevVisible|GUICtrlTreeView_GetScrollTime|GUICtrlTreeView_GetSelected|GUICtrlTreeView_GetSelectedImageIndex|GUICtrlTreeView_GetSelection|GUICtrlTreeView_GetSiblingCount|GUICtrlTreeView_GetState|GUICtrlTreeView_GetStateImageIndex|GUICtrlTreeView_GetStateImageList|GUICtrlTreeView_GetText|GUICtrlTreeView_GetTextColor|GUICtrlTreeView_GetToolTips|GUICtrlTreeView_GetTree|GUICtrlTreeView_GetUnicodeFormat|GUICtrlTreeView_GetVisible|GUICtrlTreeView_GetVisibleCount|GUICtrlTreeView_HitTest|GUICtrlTreeView_HitTestEx|GUICtrlTreeView_HitTestItem|GUICtrlTreeView_Index|GUICtrlTreeView_InsertItem|GUICtrlTreeView_IsFirstItem|GUICtrlTreeView_IsParent|GUICtrlTreeView_Level|GUICtrlTreeView_SelectItem|GUICtrlTreeView_SelectItemByIndex|GUICtrlTreeView_SetBkColor|GUICtrlTreeView_SetBold|GUICtrlTreeView_SetChecked|GUICtrlTreeView_SetCheckedByIndex|GUICtrlTreeView_SetChildren|GUICtrlTreeView_SetCut|GUICtrlTreeView_SetDropTarget|GUICtrlTreeView_SetFocused|GUICtrlTreeView_SetHeight|GUICtrlTreeView_SetIcon|GUICtrlTreeView_SetImageIndex|GUICtrlTreeView_SetIndent|GUICtrlTreeView_SetInsertMark|GUICtrlTreeView_SetInsertMarkColor|GUICtrlTreeView_SetItemHeight|GUICtrlTreeView_SetItemParam|GUICtrlTreeView_SetLineColor|GUICtrlTreeView_SetNormalImageList|GUICtrlTreeView_SetScrollTime|GUICtrlTreeView_SetSelected|GUICtrlTreeView_SetSelectedImageIndex|GUICtrlTreeView_SetState|GUICtrlTreeView_SetStateImageIndex|GUICtrlTreeView_SetStateImageList|GUICtrlTreeView_SetText|GUICtrlTreeView_SetTextColor|GUICtrlTreeView_SetToolTips|GUICtrlTreeView_SetUnicodeFormat|GUICtrlTreeView_Sort|GUIImageList_Add|GUIImageList_AddBitmap|GUIImageList_AddIcon|GUIImageList_AddMasked|GUIImageList_BeginDrag|GUIImageList_Copy|GUIImageList_Create|GUIImageList_Destroy|GUIImageList_DestroyIcon|GUIImageList_DragEnter|GUIImageList_DragLeave|GUIImageList_DragMove|GUIImageList_Draw|GUIImageList_DrawEx|GUIImageList_Duplicate|GUIImageList_EndDrag|GUIImageList_GetBkColor|GUIImageList_GetIcon|GUIImageList_GetIconHeight|GUIImageList_GetIconSize|GUIImageList_GetIconSizeEx|GUIImageList_GetIconWidth|GUIImageList_GetImageCount|GUIImageList_GetImageInfoEx|GUIImageList_Remove|GUIImageList_ReplaceIcon|GUIImageList_SetBkColor|GUIImageList_SetIconSize|GUIImageList_SetImageCount|GUIImageList_Swap|GUIScrollBars_EnableScrollBar|GUIScrollBars_GetScrollBarInfoEx|GUIScrollBars_GetScrollBarRect|GUIScrollBars_GetScrollBarRGState|GUIScrollBars_GetScrollBarXYLineButton|GUIScrollBars_GetScrollBarXYThumbBottom|GUIScrollBars_GetScrollBarXYThumbTop|GUIScrollBars_GetScrollInfo|GUIScrollBars_GetScrollInfoEx|GUIScrollBars_GetScrollInfoMax|GUIScrollBars_GetScrollInfoMin|GUIScrollBars_GetScrollInfoPage|GUIScrollBars_GetScrollInfoPos|GUIScrollBars_GetScrollInfoTrackPos|GUIScrollBars_GetScrollPos|GUIScrollBars_GetScrollRange|GUIScrollBars_Init|GUIScrollBars_ScrollWindow|GUIScrollBars_SetScrollInfo|GUIScrollBars_SetScrollInfoMax|GUIScrollBars_SetScrollInfoMin|GUIScrollBars_SetScrollInfoPage|GUIScrollBars_SetScrollInfoPos|GUIScrollBars_SetScrollRange|GUIScrollBars_ShowScrollBar|GUIToolTip_Activate|GUIToolTip_AddTool|GUIToolTip_AdjustRect|GUIToolTip_BitsToTTF|GUIToolTip_Create|GUIToolTip_DelTool|GUIToolTip_Destroy|GUIToolTip_EnumTools|GUIToolTip_GetBubbleHeight|GUIToolTip_GetBubbleSize|GUIToolTip_GetBubbleWidth|GUIToolTip_GetCurrentTool|GUIToolTip_GetDelayTime|GUIToolTip_GetMargin|GUIToolTip_GetMarginEx|GUIToolTip_GetMaxTipWidth|GUIToolTip_GetText|GUIToolTip_GetTipBkColor|GUIToolTip_GetTipTextColor|GUIToolTip_GetTitleBitMap|GUIToolTip_GetTitleText|GUIToolTip_GetToolCount|GUIToolTip_GetToolInfo|GUIToolTip_HitTest|GUIToolTip_NewToolRect|GUIToolTip_Pop|GUIToolTip_PopUp|GUIToolTip_SetDelayTime|GUIToolTip_SetMargin|GUIToolTip_SetMaxTipWidth|GUIToolTip_SetTipBkColor|GUIToolTip_SetTipTextColor|GUIToolTip_SetTitle|GUIToolTip_SetToolInfo|GUIToolTip_SetWindowTheme|GUIToolTip_ToolExists|GUIToolTip_ToolToArray|GUIToolTip_TrackActivate|GUIToolTip_TrackPosition|GUIToolTip_TTFToBits|GUIToolTip_Update|GUIToolTip_UpdateTipText|HexToString|IE_Example|IE_Introduction|IE_VersionInfo|IEAction|IEAttach|IEBodyReadHTML|IEBodyReadText|IEBodyWriteHTML|IECreate|IECreateEmbedded|IEDocGetObj|IEDocInsertHTML|IEDocInsertText|IEDocReadHTML|IEDocWriteHTML|IEErrorHandlerDeRegister|IEErrorHandlerRegister|IEErrorNotify|IEFormElementCheckBoxSelect|IEFormElementGetCollection|IEFormElementGetObjByName|IEFormElementGetValue|IEFormElementOptionSelect|IEFormElementRadioSelect|IEFormElementSetValue|IEFormGetCollection|IEFormGetObjByName|IEFormImageClick|IEFormReset|IEFormSubmit|IEFrameGetCollection|IEFrameGetObjByName|IEGetObjById|IEGetObjByName|IEHeadInsertEventScript|IEImgClick|IEImgGetCollection|IEIsFrameSet|IELinkClickByIndex|IELinkClickByText|IELinkGetCollection|IELoadWait|IELoadWaitTimeout|IENavigate|IEPropertyGet|IEPropertySet|IEQuit|IETableGetCollection|IETableWriteToArray|IETagNameAllGetCollection|IETagNameGetCollection|Iif|INetExplorerCapable|INetGetSource|INetMail|INetSmtpMail|IsPressed|MathCheckDiv|Max|MemGlobalAlloc|MemGlobalFree|MemGlobalLock|MemGlobalSize|MemGlobalUnlock|MemMoveMemory|MemMsgBox|MemShowError|MemVirtualAlloc|MemVirtualAllocEx|MemVirtualFree|MemVirtualFreeEx|Min|MouseTrap|NamedPipes_CallNamedPipe|NamedPipes_ConnectNamedPipe|NamedPipes_CreateNamedPipe|NamedPipes_CreatePipe|NamedPipes_DisconnectNamedPipe|NamedPipes_GetNamedPipeHandleState|NamedPipes_GetNamedPipeInfo|NamedPipes_PeekNamedPipe|NamedPipes_SetNamedPipeHandleState|NamedPipes_TransactNamedPipe|NamedPipes_WaitNamedPipe|Net_Share_ConnectionEnum|Net_Share_FileClose|Net_Share_FileEnum|Net_Share_FileGetInfo|Net_Share_PermStr|Net_Share_ResourceStr|Net_Share_SessionDel|Net_Share_SessionEnum|Net_Share_SessionGetInfo|Net_Share_ShareAdd|Net_Share_ShareCheck|Net_Share_ShareDel|Net_Share_ShareEnum|Net_Share_ShareGetInfo|Net_Share_ShareSetInfo|Net_Share_StatisticsGetSvr|Net_Share_StatisticsGetWrk|Now|NowCalc|NowCalcDate|NowDate|NowTime|PathFull|PathMake|PathSplit|ProcessGetName|ProcessGetPriority|Radian|ReplaceStringInFile|RunDOS|ScreenCapture_Capture|ScreenCapture_CaptureWnd|ScreenCapture_SaveImage|ScreenCapture_SetBMPFormat|ScreenCapture_SetJPGQuality|ScreenCapture_SetTIFColorDepth|ScreenCapture_SetTIFCompression|Security__AdjustTokenPrivileges|Security__GetAccountSid|Security__GetLengthSid|Security__GetTokenInformation|Security__ImpersonateSelf|Security__IsValidSid|Security__LookupAccountName|Security__LookupAccountSid|Security__LookupPrivilegeValue|Security__OpenProcessToken|Security__OpenThreadToken|Security__OpenThreadTokenEx|Security__SetPrivilege|Security__SidToStringSid|Security__SidTypeStr|Security__StringSidToSid|SendMessage|SendMessageA|SetDate|SetTime|Singleton|SoundClose|SoundLength|SoundOpen|SoundPause|SoundPlay|SoundPos|SoundResume|SoundSeek|SoundStatus|SoundStop|SQLite_Changes|SQLite_Close|SQLite_Display2DResult|SQLite_Encode|SQLite_ErrCode|SQLite_ErrMsg|SQLite_Escape|SQLite_Exec|SQLite_FetchData|SQLite_FetchNames|SQLite_GetTable|SQLite_GetTable2d|SQLite_LastInsertRowID|SQLite_LibVersion|SQLite_Open|SQLite_Query|SQLite_QueryFinalize|SQLite_QueryReset|SQLite_QuerySingleRow|SQLite_SaveMode|SQLite_SetTimeout|SQLite_Shutdown|SQLite_SQLiteExe|SQLite_Startup|SQLite_TotalChanges|StringAddComma|StringBetween|StringEncrypt|StringInsert|StringProper|StringRepeat|StringReverse|StringSplit|StringToHex|TCPIpToName|TempFile|TicksToTime|Timer_Diff|Timer_GetTimerID|Timer_Init|Timer_KillAllTimers|Timer_KillTimer|Timer_SetTimer|TimeToTicks|VersionCompare|viClose|viExecCommand|viFindGpib|viGpibBusReset|viGTL|viOpen|viSetAttribute|viSetTimeout|WeekNumberISO|WinAPI_AttachConsole|WinAPI_AttachThreadInput|WinAPI_Beep|WinAPI_BitBlt|WinAPI_CallNextHookEx|WinAPI_Check|WinAPI_ClientToScreen|WinAPI_CloseHandle|WinAPI_CommDlgExtendedError|WinAPI_CopyIcon|WinAPI_CreateBitmap|WinAPI_CreateCompatibleBitmap|WinAPI_CreateCompatibleDC|WinAPI_CreateEvent|WinAPI_CreateFile|WinAPI_CreateFont|WinAPI_CreateFontIndirect|WinAPI_CreateProcess|WinAPI_CreateSolidBitmap|WinAPI_CreateSolidBrush|WinAPI_CreateWindowEx|WinAPI_DefWindowProc|WinAPI_DeleteDC|WinAPI_DeleteObject|WinAPI_DestroyIcon|WinAPI_DestroyWindow|WinAPI_DrawEdge|WinAPI_DrawFrameControl|WinAPI_DrawIcon|WinAPI_DrawIconEx|WinAPI_DrawText|WinAPI_EnableWindow|WinAPI_EnumDisplayDevices|WinAPI_EnumWindows|WinAPI_EnumWindowsPopup|WinAPI_EnumWindowsTop|WinAPI_ExpandEnvironmentStrings|WinAPI_ExtractIconEx|WinAPI_FatalAppExit|WinAPI_FillRect|WinAPI_FindExecutable|WinAPI_FindWindow|WinAPI_FlashWindow|WinAPI_FlashWindowEx|WinAPI_FloatToInt|WinAPI_FlushFileBuffers|WinAPI_FormatMessage|WinAPI_FrameRect|WinAPI_FreeLibrary|WinAPI_GetAncestor|WinAPI_GetAsyncKeyState|WinAPI_GetClassName|WinAPI_GetClientHeight|WinAPI_GetClientRect|WinAPI_GetClientWidth|WinAPI_GetCurrentProcess|WinAPI_GetCurrentProcessID|WinAPI_GetCurrentThread|WinAPI_GetCurrentThreadId|WinAPI_GetCursorInfo|WinAPI_GetDC|WinAPI_GetDesktopWindow|WinAPI_GetDeviceCaps|WinAPI_GetDIBits|WinAPI_GetDlgCtrlID|WinAPI_GetDlgItem|WinAPI_GetFileSizeEx|WinAPI_GetFocus|WinAPI_GetForegroundWindow|WinAPI_GetIconInfo|WinAPI_GetLastError|WinAPI_GetLastErrorMessage|WinAPI_GetModuleHandle|WinAPI_GetMousePos|WinAPI_GetMousePosX|WinAPI_GetMousePosY|WinAPI_GetObject|WinAPI_GetOpenFileName|WinAPI_GetOverlappedResult|WinAPI_GetParent|WinAPI_GetProcessAffinityMask|WinAPI_GetSaveFileName|WinAPI_GetStdHandle|WinAPI_GetStockObject|WinAPI_GetSysColor|WinAPI_GetSysColorBrush|WinAPI_GetSystemMetrics|WinAPI_GetTextExtentPoint32|WinAPI_GetWindow|WinAPI_GetWindowDC|WinAPI_GetWindowHeight|WinAPI_GetWindowLong|WinAPI_GetWindowRect|WinAPI_GetWindowText|WinAPI_GetWindowThreadProcessId|WinAPI_GetWindowWidth|WinAPI_GetXYFromPoint|WinAPI_GlobalMemStatus|WinAPI_GUIDFromString|WinAPI_GUIDFromStringEx|WinAPI_HiWord|WinAPI_InProcess|WinAPI_IntToFloat|WinAPI_InvalidateRect|WinAPI_IsClassName|WinAPI_IsWindow|WinAPI_IsWindowVisible|WinAPI_LoadBitmap|WinAPI_LoadImage|WinAPI_LoadLibrary|WinAPI_LoadLibraryEx|WinAPI_LoadShell32Icon|WinAPI_LoadString|WinAPI_LocalFree|WinAPI_LoWord|WinAPI_MakeDWord|WinAPI_MAKELANGID|WinAPI_MAKELCID|WinAPI_MakeLong|WinAPI_MessageBeep|WinAPI_Mouse_Event|WinAPI_MoveWindow|WinAPI_MsgBox|WinAPI_MulDiv|WinAPI_MultiByteToWideChar|WinAPI_MultiByteToWideCharEx|WinAPI_OpenProcess|WinAPI_PointFromRect|WinAPI_PostMessage|WinAPI_PrimaryLangId|WinAPI_PtInRect|WinAPI_ReadFile|WinAPI_ReadProcessMemory|WinAPI_RectIsEmpty|WinAPI_RedrawWindow|WinAPI_RegisterWindowMessage|WinAPI_ReleaseCapture|WinAPI_ReleaseDC|WinAPI_ScreenToClient|WinAPI_SelectObject|WinAPI_SetBkColor|WinAPI_SetCapture|WinAPI_SetCursor|WinAPI_SetDefaultPrinter|WinAPI_SetDIBits|WinAPI_SetEvent|WinAPI_SetFocus|WinAPI_SetFont|WinAPI_SetHandleInformation|WinAPI_SetLastError|WinAPI_SetParent|WinAPI_SetProcessAffinityMask|WinAPI_SetSysColors|WinAPI_SetTextColor|WinAPI_SetWindowLong|WinAPI_SetWindowPos|WinAPI_SetWindowsHookEx|WinAPI_SetWindowText|WinAPI_ShowCursor|WinAPI_ShowError|WinAPI_ShowMsg|WinAPI_ShowWindow|WinAPI_StringFromGUID|WinAPI_SubLangId|WinAPI_SystemParametersInfo|WinAPI_TwipsPerPixelX|WinAPI_TwipsPerPixelY|WinAPI_UnhookWindowsHookEx|WinAPI_UpdateLayeredWindow|WinAPI_UpdateWindow|WinAPI_ValidateClassName|WinAPI_WaitForInputIdle|WinAPI_WaitForMultipleObjects|WinAPI_WaitForSingleObject|WinAPI_WideCharToMultiByte|WinAPI_WindowFromPoint|WinAPI_WriteConsole|WinAPI_WriteFile|WinAPI_WriteProcessMemory|WinNet_AddConnection|WinNet_AddConnection2|WinNet_AddConnection3|WinNet_CancelConnection|WinNet_CancelConnection2|WinNet_CloseEnum|WinNet_ConnectionDialog|WinNet_ConnectionDialog1|WinNet_DisconnectDialog|WinNet_DisconnectDialog1|WinNet_EnumResource|WinNet_GetConnection|WinNet_GetConnectionPerformance|WinNet_GetLastError|WinNet_GetNetworkInformation|WinNet_GetProviderName|WinNet_GetResourceInformation|WinNet_GetResourceParent|WinNet_GetUniversalName|WinNet_GetUser|WinNet_OpenEnum|WinNet_RestoreConnection|WinNet_UseConnection|Word_VersionInfo|WordAttach|WordCreate|WordDocAdd|WordDocAddLink|WordDocAddPicture|WordDocClose|WordDocFindReplace|WordDocGetCollection|WordDocLinkGetCollection|WordDocOpen|WordDocPrint|WordDocPropertyGet|WordDocPropertySet|WordDocSave|WordDocSaveAs|WordErrorHandlerDeRegister|WordErrorHandlerRegister|WordErrorNotify|WordMacroRun|WordPropertyGet|WordPropertySet|WordQuit|' + + 'ce|comments-end|comments-start|cs|include|include-once|NoTrayIcon|RequireAdmin|' + + 'AutoIt3Wrapper_Au3Check_Parameters|AutoIt3Wrapper_Au3Check_Stop_OnWarning|AutoIt3Wrapper_Change2CUI|AutoIt3Wrapper_Compression|AutoIt3Wrapper_cvsWrapper_Parameters|AutoIt3Wrapper_Icon|AutoIt3Wrapper_Outfile|AutoIt3Wrapper_Outfile_Type|AutoIt3Wrapper_Plugin_Funcs|AutoIt3Wrapper_Res_Comment|AutoIt3Wrapper_Res_Description|AutoIt3Wrapper_Res_Field|AutoIt3Wrapper_Res_File_Add|AutoIt3Wrapper_Res_Fileversion|AutoIt3Wrapper_Res_FileVersion_AutoIncrement|AutoIt3Wrapper_Res_Icon_Add|AutoIt3Wrapper_Res_Language|AutoIt3Wrapper_Res_LegalCopyright|AutoIt3Wrapper_res_requestedExecutionLevel|AutoIt3Wrapper_Res_SaveSource|AutoIt3Wrapper_Run_After|AutoIt3Wrapper_Run_Au3check|AutoIt3Wrapper_Run_Before|AutoIt3Wrapper_Run_cvsWrapper|AutoIt3Wrapper_Run_Debug_Mode|AutoIt3Wrapper_Run_Obfuscator|AutoIt3Wrapper_Run_Tidy|AutoIt3Wrapper_Tidy_Stop_OnError|AutoIt3Wrapper_UseAnsi|AutoIt3Wrapper_UseUpx|AutoIt3Wrapper_UseX64|AutoIt3Wrapper_Version|EndRegion|forceref|Obfuscator_Ignore_Funcs|Obfuscator_Ignore_Variables|Obfuscator_Parameters|Region|Tidy_Parameters' + var atKeywords = 'AppDataCommonDir|AppDataDir|AutoItExe|AutoItPID|AutoItUnicode|AutoItVersion|AutoItX64|COM_EventObj|CommonFilesDir|Compiled|ComputerName|ComSpec|CR|CRLF|DesktopCommonDir|DesktopDepth|DesktopDir|DesktopHeight|DesktopRefresh|DesktopWidth|DocumentsCommonDir|error|exitCode|exitMethod|extended|FavoritesCommonDir|FavoritesDir|GUI_CtrlHandle|GUI_CtrlId|GUI_DragFile|GUI_DragId|GUI_DropId|GUI_WinHandle|HomeDrive|HomePath|HomeShare|HotKeyPressed|HOUR|InetGetActive|InetGetBytesRead|IPAddress1|IPAddress2|IPAddress3|IPAddress4|KBLayout|LF|LogonDNSDomain|LogonDomain|LogonServer|MDAY|MIN|MON|MyDocumentsDir|NumParams|OSBuild|OSLang|OSServicePack|OSTYPE|OSVersion|ProcessorArch|ProgramFilesDir|ProgramsCommonDir|ProgramsDir|ScriptDir|ScriptFullPath|ScriptLineNumber|ScriptName|SEC|StartMenuCommonDir|StartMenuDir|StartupCommonDir|StartupDir|SW_DISABLE|SW_ENABLE|SW_HIDE|SW_LOCK|SW_MAXIMIZE|SW_MINIMIZE|SW_RESTORE|SW_SHOW|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWMINNOACTIVE|SW_SHOWNA|SW_SHOWNOACTIVATE|SW_SHOWNORMAL|SW_UNLOCK|SystemDir|TAB|TempDir|TRAY_ID|TrayIconFlashing|TrayIconVisible|UserName|UserProfileDir|WDAY|WindowsDir|WorkingDir|YDAY|YEAR' + + this.$rules = { start: + [ { token: 'comment.line.ahk', regex: '(?:^| );.*$' }, + { token: 'comment.block.ahk', + regex: '/\\*', push: + [ { token: 'comment.block.ahk', regex: '\\*/', next: 'pop' }, + { defaultToken: 'comment.block.ahk' } ] }, + { token: 'doc.comment.ahk', + regex: '#cs', push: + [ { token: 'doc.comment.ahk', regex: '#ce', next: 'pop' }, + { defaultToken: 'doc.comment.ahk' } ] }, + { token: 'keyword.command.ahk', + regex: '(?:\\b|^)(?:allowsamelinecomments|clipboardtimeout|commentflag|errorstdout|escapechar|hotkeyinterval|hotkeymodifiertimeout|hotstring|include|includeagain|installkeybdhook|installmousehook|keyhistory|ltrim|maxhotkeysperinterval|maxmem|maxthreads|maxthreadsbuffer|maxthreadsperhotkey|noenv|notrayicon|persistent|singleinstance|usehook|winactivateforce|autotrim|blockinput|click|clipwait|continue|control|controlclick|controlfocus|controlget|controlgetfocus|controlgetpos|controlgettext|controlmove|controlsend|controlsendraw|controlsettext|coordmode|critical|detecthiddentext|detecthiddenwindows|drive|driveget|drivespacefree|edit|endrepeat|envadd|envdiv|envget|envmult|envset|envsub|envupdate|exit|exitapp|fileappend|filecopy|filecopydir|filecreatedir|filecreateshortcut|filedelete|filegetattrib|filegetshortcut|filegetsize|filegettime|filegetversion|fileinstall|filemove|filemovedir|fileread|filereadline|filerecycle|filerecycleempty|fileremovedir|fileselectfile|fileselectfolder|filesetattrib|filesettime|formattime|getkeystate|gosub|goto|groupactivate|groupadd|groupclose|groupdeactivate|gui|guicontrol|guicontrolget|hideautoitwin|hotkey|ifequal|ifexist|ifgreater|ifgreaterorequal|ifinstring|ifless|iflessorequal|ifmsgbox|ifnotequal|ifnotexist|ifnotinstring|ifwinactive|ifwinexist|ifwinnotactive|ifwinnotexist|imagesearch|inidelete|iniread|iniwrite|input|inputbox|keyhistory|keywait|listhotkeys|listlines|listvars|menu|mouseclick|mouseclickdrag|mousegetpos|mousemove|msgbox|onexit|outputdebug|pause|pixelgetcolor|pixelsearch|postmessage|process|progress|random|regdelete|regread|regwrite|reload|repeat|run|runas|runwait|send|sendevent|sendinput|sendmode|sendplay|sendmessage|sendraw|setbatchlines|setcapslockstate|setcontroldelay|setdefaultmousespeed|setenv|setformat|setkeydelay|setmousedelay|setnumlockstate|setscrolllockstate|setstorecapslockmode|settimer|settitlematchmode|setwindelay|setworkingdir|shutdown|sleep|sort|soundbeep|soundget|soundgetwavevolume|soundplay|soundset|soundsetwavevolume|splashimage|splashtextoff|splashtexton|splitpath|statusbargettext|statusbarwait|stringcasesense|stringgetpos|stringleft|stringlen|stringlower|stringmid|stringreplace|stringright|stringsplit|stringtrimleft|stringtrimright|stringupper|suspend|sysget|thread|tooltip|transform|traytip|urldownloadtofile|while|winactivate|winactivatebottom|winclose|winget|wingetactivestats|wingetactivetitle|wingetclass|wingetpos|wingettext|wingettitle|winhide|winkill|winmaximize|winmenuselectitem|winminimize|winminimizeall|winminimizeallundo|winmove|winrestore|winset|winsettitle|winshow|winwait|winwaitactive|winwaitclose|winwaitnotactive)\\b', + caseInsensitive: true }, + { token: 'keyword.control.ahk', + regex: '(?:\\b|^)(?:if|else|return|loop|break|for|while|global|local|byref)\\b', + caseInsensitive: true }, + { token: 'support.function.ahk', + regex: '(?:\\b|^)(?:abs|acos|asc|asin|atan|ceil|chr|cos|dllcall|exp|fileexist|floor|getkeystate|il_add|il_create|il_destroy|instr|substr|isfunc|islabel|ln|log|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|onmessage|numget|numput|registercallback|regexmatch|regexreplace|round|sin|tan|sqrt|strlen|sb_seticon|sb_setparts|sb_settext|tv_add|tv_delete|tv_getchild|tv_getcount|tv_getnext|tv_get|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist)\\b', + caseInsensitive: true }, + { token: 'variable.predefined.ahk', + regex: '(?:\\b|^)(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_formatfloat|a_formatinteger|a_gui|a_guievent|a_guicontrol|a_guicontrolevent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|programfiles|a_programfiles|a_programs|a_programscommon|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel)\\b', + caseInsensitive: true }, + { token: 'support.constant.ahk', + regex: '(?:\\b|^)(?:shift|lshift|rshift|alt|lalt|ralt|control|lcontrol|rcontrol|ctrl|lctrl|rctrl|lwin|rwin|appskey|altdown|altup|shiftdown|shiftup|ctrldown|ctrlup|lwindown|lwinup|rwindown|rwinup|lbutton|rbutton|mbutton|wheelup|wheelleft|wheelright|wheeldown|xbutton1|xbutton2|joy1|joy2|joy3|joy4|joy5|joy6|joy7|joy8|joy9|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy30|joy31|joy32|joyx|joyy|joyz|joyr|joyu|joyv|joypov|joyname|joybuttons|joyaxes|joyinfo|space|tab|enter|escape|esc|backspace|bs|delete|del|insert|ins|pgup|pgdn|home|end|up|down|left|right|printscreen|ctrlbreak|pause|scrolllock|capslock|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadmult|numpadadd|numpadsub|numpaddiv|numpaddot|numpaddel|numpadins|numpadclear|numpadup|numpaddown|numpadleft|numpadright|numpadhome|numpadend|numpadpgup|numpadpgdn|numpadenter|f1|f2|f3|f4|f5|f6|f7|f8|f9|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f20|f21|f22|f23|f24|browser_back|browser_forward|browser_refresh|browser_stop|browser_search|browser_favorites|browser_home|volume_mute|volume_down|volume_up|media_next|media_prev|media_stop|media_play_pause|launch_mail|launch_media|launch_app1|launch_app2)\\b', + caseInsensitive: true }, + { token: 'variable.parameter', + regex: '(?:\\b|^)(?:pixel|mouse|screen|relative|rgb|ltrim|rtrim|join|low|belownormal|normal|abovenormal|high|realtime|ahk_id|ahk_pid|ahk_class|ahk_group|between|contains|in|is|integer|float|integerfast|floatfast|number|digit|xdigit|alpha|upper|lower|alnum|time|date|not|or|and|alwaysontop|topmost|top|bottom|transparent|transcolor|redraw|region|id|idlast|processname|minmax|controllist|count|list|capacity|statuscd|eject|lock|unlock|label|filesystem|label|setlabel|serial|type|status|static|seconds|minutes|hours|days|read|parse|logoff|close|error|single|tray|add|rename|check|uncheck|togglecheck|enable|disable|toggleenable|default|nodefault|standard|nostandard|color|delete|deleteall|icon|noicon|tip|click|show|mainwindow|nomainwindow|useerrorlevel|text|picture|pic|groupbox|button|checkbox|radio|dropdownlist|ddl|combobox|listbox|listview|datetime|monthcal|updown|slider|tab|tab2|statusbar|treeview|iconsmall|tile|report|sortdesc|nosort|nosorthdr|grid|hdr|autosize|range|xm|ym|ys|xs|xp|yp|font|resize|owner|submit|nohide|minimize|maximize|restore|noactivate|na|cancel|destroy|center|margin|maxsize|minsize|owndialogs|guiescape|guiclose|guisize|guicontextmenu|guidropfiles|tabstop|section|altsubmit|wrap|hscroll|vscroll|border|top|bottom|buttons|expand|first|imagelist|lines|wantctrla|wantf2|vis|visfirst|number|uppercase|lowercase|limit|password|multi|wantreturn|group|background|bold|italic|strike|underline|norm|backgroundtrans|theme|caption|delimiter|minimizebox|maximizebox|sysmenu|toolwindow|flash|style|exstyle|check3|checked|checkedgray|readonly|password|hidden|left|right|center|notab|section|move|focus|hide|choose|choosestring|text|pos|enabled|disabled|visible|lastfound|lastfoundexist|alttab|shiftalttab|alttabmenu|alttabandmenu|alttabmenudismiss|notimers|interrupt|priority|waitclose|blind|raw|unicode|deref|pow|bitnot|bitand|bitor|bitxor|bitshiftleft|bitshiftright|yes|no|ok|cancel|abort|retry|ignore|tryagain|on|off|all|hkey_local_machine|hkey_users|hkey_current_user|hkey_classes_root|hkey_current_config|hklm|hku|hkcu|hkcr|hkcc|reg_sz|reg_expand_sz|reg_multi_sz|reg_dword|reg_qword|reg_binary|reg_link|reg_resource_list|reg_full_resource_descriptor|reg_resource_requirements_list|reg_dword_big_endian)\\b', + caseInsensitive: true }, + { keywordMap: {"constant.language": autoItKeywords}, regex: '\\w+\\b'}, + { keywordMap: {"variable.function": atKeywords}, regex: '@\\w+\\b'}, + { token : "constant.numeric", regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"}, + { token: 'keyword.operator.ahk', + regex: '=|==|<>|:=|<|>|\\*|\\/|\\+|:|\\?|\\-' }, + { token: 'punctuation.ahk', + regex: '#|`|::|,|\\{|\\}|\\(|\\)|\\%' }, + { token: + [ 'punctuation.quote.double', + 'string.quoted.ahk', + 'punctuation.quote.double' ], + regex: '(")((?:[^"]|"")*)(")' }, + { token: [ 'label.ahk', 'punctuation.definition.label.ahk' ], + regex: '^([^: ]+)(:)(?!:)' } ] } + + this.normalizeRules(); +}; + +AutoHotKeyHighlightRules.metaData = { name: 'AutoHotKey', + scopeName: 'source.ahk', + fileTypes: [ 'ahk' ], + foldingStartMarker: '^\\s*/\\*|^(?![^{]*?;|[^{]*?/\\*(?!.*?\\*/.*?\\{)).*?\\{\\s*($|;|/\\*(?!.*?\\*/.*\\S))', + foldingStopMarker: '^\\s*\\*/|^\\s*\\}' } + + +oop.inherits(AutoHotKeyHighlightRules, TextHighlightRules); + +exports.AutoHotKeyHighlightRules = AutoHotKeyHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/autohotkey",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/autohotkey_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var AutoHotKeyHighlightRules = require("./autohotkey_highlight_rules").AutoHotKeyHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = AutoHotKeyHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = ";"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/autohotkey"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-batchfile.js b/src/libs/ace/mode-batchfile.js new file mode 100755 index 0000000..3f31ce1 --- /dev/null +++ b/src/libs/ace/mode-batchfile.js @@ -0,0 +1,223 @@ +ace.define("ace/mode/batchfile_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var BatchFileHighlightRules = function() { + + this.$rules = { start: + [ { token: 'keyword.command.dosbatch', + regex: '\\b(?:append|assoc|at|attrib|break|cacls|cd|chcp|chdir|chkdsk|chkntfs|cls|cmd|color|comp|compact|convert|copy|date|del|dir|diskcomp|diskcopy|doskey|echo|endlocal|erase|fc|find|findstr|format|ftype|graftabl|help|keyb|label|md|mkdir|mode|more|move|path|pause|popd|print|prompt|pushd|rd|recover|ren|rename|replace|restore|rmdir|set|setlocal|shift|sort|start|subst|time|title|tree|type|ver|verify|vol|xcopy)\\b', + caseInsensitive: true }, + { token: 'keyword.control.statement.dosbatch', + regex: '\\b(?:goto|call|exit)\\b', + caseInsensitive: true }, + { token: 'keyword.control.conditional.if.dosbatch', + regex: '\\bif\\s+not\\s+(?:exist|defined|errorlevel|cmdextversion)\\b', + caseInsensitive: true }, + { token: 'keyword.control.conditional.dosbatch', + regex: '\\b(?:if|else)\\b', + caseInsensitive: true }, + { token: 'keyword.control.repeat.dosbatch', + regex: '\\bfor\\b', + caseInsensitive: true }, + { token: 'keyword.operator.dosbatch', + regex: '\\b(?:EQU|NEQ|LSS|LEQ|GTR|GEQ)\\b' }, + { token: ['doc.comment', 'comment'], + regex: '(?:^|\\b)(rem)($|\\s.*$)', + caseInsensitive: true }, + { token: 'comment.line.colons.dosbatch', + regex: '::.*$' }, + { include: 'variable' }, + { token: 'punctuation.definition.string.begin.shell', + regex: '"', + push: [ + { token: 'punctuation.definition.string.end.shell', regex: '"', next: 'pop' }, + { include: 'variable' }, + { defaultToken: 'string.quoted.double.dosbatch' } ] }, + { token: 'keyword.operator.pipe.dosbatch', regex: '[|]' }, + { token: 'keyword.operator.redirect.shell', + regex: '&>|\\d*>&\\d*|\\d*(?:>>|>|<)|\\d*<&|\\d*<>' } ], + variable: [ + { token: 'constant.numeric', regex: '%%\\w+|%[*\\d]|%\\w+%'}, + { token: 'constant.numeric', regex: '%~\\d+'}, + { token: ['markup.list', 'constant.other', 'markup.list'], + regex: '(%)(\\w+)(%?)' }]} + + this.normalizeRules(); +}; + +BatchFileHighlightRules.metaData = { name: 'Batch File', + scopeName: 'source.dosbatch', + fileTypes: [ 'bat' ] } + + +oop.inherits(BatchFileHighlightRules, TextHighlightRules); + +exports.BatchFileHighlightRules = BatchFileHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/batchfile",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/batchfile_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var BatchFileHighlightRules = require("./batchfile_highlight_rules").BatchFileHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = BatchFileHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "::"; + this.blockComment = ""; + this.$id = "ace/mode/batchfile"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-bro.js b/src/libs/ace/mode-bro.js new file mode 100755 index 0000000..dd259eb --- /dev/null +++ b/src/libs/ace/mode-bro.js @@ -0,0 +1,327 @@ +ace.define("ace/mode/bro_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var BroHighlightRules = function() { + + this.$rules = { + start: [{ + token: "punctuation.definition.comment.bro", + regex: /#/, + push: [{ + token: "comment.line.number-sign.bro", + regex: /$/, + next: "pop" + }, { + defaultToken: "comment.line.number-sign.bro" + }] + }, { + token: "keyword.control.bro", + regex: /\b(?:break|case|continue|else|for|if|return|switch|next|when|timeout|schedule)\b/ + }, { + token: [ + "meta.function.bro", + "meta.function.bro", + "storage.type.bro", + "meta.function.bro", + "entity.name.function.bro", + "meta.function.bro" + ], + regex: /^(\s*)(?:function|hook|event)(\s*)(.*)(\s*\()(.*)(\).*$)/ + }, { + token: "storage.type.bro", + regex: /\b(?:bool|enum|double|int|count|port|addr|subnet|any|file|interval|time|string|table|vector|set|record|pattern|hook)\b/ + }, { + token: "storage.modifier.bro", + regex: /\b(?:global|const|redef|local|&(?:optional|rotate_interval|rotate_size|add_func|del_func|expire_func|expire_create|expire_read|expire_write|persistent|synchronized|encrypt|mergeable|priority|group|type_column|log|error_handler))\b/ + }, { + token: "keyword.operator.bro", + regex: /\s*(?:\||&&|(?:>|<|!)=?|==)\s*|\b!?in\b/ + }, { + token: "constant.language.bro", + regex: /\b(?:T|F)\b/ + }, { + token: "constant.numeric.bro", + regex: /\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\.?[0-9]*|\.[0-9]+)(?:(?:e|E)(?:\+|-)?[0-9]+)?)(?:\/(?:tcp|udp|icmp)|\s*(?:u?sec|min|hr|day)s?)?\b/ + }, { + token: "punctuation.definition.string.begin.bro", + regex: /"/, + push: [{ + token: "punctuation.definition.string.end.bro", + regex: /"/, + next: "pop" + }, { + include: "#string_escaped_char" + }, { + include: "#string_placeholder" + }, { + defaultToken: "string.quoted.double.bro" + }] + }, { + token: "punctuation.definition.string.begin.bro", + regex: /\//, + push: [{ + token: "punctuation.definition.string.end.bro", + regex: /\//, + next: "pop" + }, { + include: "#string_escaped_char" + }, { + include: "#string_placeholder" + }, { + defaultToken: "string.quoted.regex.bro" + }] + }, { + token: [ + "meta.preprocessor.bro.load", + "keyword.other.special-method.bro" + ], + regex: /^(\s*)(\@load(?:-sigs)?)\b/, + push: [{ + token: [], + regex: /(?=\#)|$/, + next: "pop" + }, { + defaultToken: "meta.preprocessor.bro.load" + }] + }, { + token: [ + "meta.preprocessor.bro.if", + "keyword.other.special-method.bro", + "meta.preprocessor.bro.if" + ], + regex: /^(\s*)(\@endif|\@if(?:n?def)?)(.*$)/, + push: [{ + token: [], + regex: /$/, + next: "pop" + }, { + defaultToken: "meta.preprocessor.bro.if" + }] + }], + "#disabled": [{ + token: "text", + regex: /^\s*\@if(?:n?def)?\b.*$/, + push: [{ + token: "text", + regex: /^\s*\@endif\b.*$/, + next: "pop" + }, { + include: "#disabled" + }, { + include: "#pragma-mark" + }], + comment: "eat nested preprocessor ifdefs" + }], + "#preprocessor-rule-other": [{ + token: [ + "text", + "meta.preprocessor.bro", + "meta.preprocessor.bro", + "text" + ], + regex: /^(\s*)(@if)((?:n?def)?)\b(.*?)(?:(?=)|$)/, + push: [{ + token: ["text", "meta.preprocessor.bro", "text"], + regex: /^(\s*)(@endif)\b(.*$)/, + next: "pop" + }, { + include: "$base" + }] + }], + "#string_escaped_char": [{ + token: "constant.character.escape.bro", + regex: /\\(?:\\|[abefnprtv'"?]|[0-3]\d{,2}|[4-7]\d?|x[a-fA-F0-9]{,2})/ + }, { + token: "invalid.illegal.unknown-escape.bro", + regex: /\\./ + }], + "#string_placeholder": [{ + token: "constant.other.placeholder.bro", + regex: /%(?:\d+\$)?[#0\- +']*[,;:_]?(?:-?\d+|\*(?:-?\d+\$)?)?(?:\.(?:-?\d+|\*(?:-?\d+\$)?)?)?(?:hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)?[diouxXDOUeEfFgGaACcSspn%]/ + }, { + token: "invalid.illegal.placeholder.bro", + regex: /%/ + }] + } + + this.normalizeRules(); +}; + +BroHighlightRules.metaData = { + fileTypes: ["bro"], + foldingStartMarker: "^(\\@if(n?def)?)", + foldingStopMarker: "^\\@endif", + keyEquivalent: "@B", + name: "Bro", + scopeName: "source.bro" +} + + +oop.inherits(BroHighlightRules, TextHighlightRules); + +exports.BroHighlightRules = BroHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/bro",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/bro_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var BroHighlightRules = require("./bro_highlight_rules").BroHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = BroHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/bro" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-c9search.js b/src/libs/ace/mode-c9search.js new file mode 100755 index 0000000..aad3dc1 --- /dev/null +++ b/src/libs/ace/mode-c9search.js @@ -0,0 +1,287 @@ +ace.define("ace/mode/c9search_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +function safeCreateRegexp(source, flag) { + try { + return new RegExp(source, flag); + } catch(e) {} +} + +var C9SearchHighlightRules = function() { + this.$rules = { + "start" : [ + { + tokenNames : ["c9searchresults.constant.numeric", "c9searchresults.text", "c9searchresults.text", "c9searchresults.keyword"], + regex : /(^\s+[0-9]+)(:)(\d*\s?)([^\r\n]+)/, + onMatch : function(val, state, stack) { + var values = this.splitRegex.exec(val); + var types = this.tokenNames; + var tokens = [{ + type: types[0], + value: values[1] + }, { + type: types[1], + value: values[2] + }]; + + if (values[3]) { + if (values[3] == " ") + tokens[1] = { type: types[1], value: values[2] + " " }; + else + tokens.push({ type: types[1], value: values[3] }); + } + var regex = stack[1]; + var str = values[4]; + + var m; + var last = 0; + if (regex && regex.exec) { + regex.lastIndex = 0; + while (m = regex.exec(str)) { + var skipped = str.substring(last, m.index); + last = regex.lastIndex; + if (skipped) + tokens.push({type: types[2], value: skipped}); + if (m[0]) + tokens.push({type: types[3], value: m[0]}); + else if (!skipped) + break; + } + } + if (last < str.length) + tokens.push({type: types[2], value: str.substr(last)}); + return tokens; + } + }, + { + regex : "^Searching for [^\\r\\n]*$", + onMatch: function(val, state, stack) { + var parts = val.split("\x01"); + if (parts.length < 3) + return "text"; + + var options, search, replace; + + var i = 0; + var tokens = [{ + value: parts[i++] + "'", + type: "text" + }, { + value: search = parts[i++], + type: "text" // "c9searchresults.keyword" + }, { + value: "'" + parts[i++], + type: "text" + }]; + if (parts[2] !== " in") { + replace = parts[i]; + tokens.push({ + value: "'" + parts[i++] + "'", + type: "text" + }, { + value: parts[i++], + type: "text" + }); + } + tokens.push({ + value: " " + parts[i++] + " ", + type: "text" + }); + if (parts[i+1]) { + options = parts[i+1]; + tokens.push({ + value: "(" + parts[i+1] + ")", + type: "text" + }); + i += 1; + } else { + i -= 1; + } + while (i++ < parts.length) { + parts[i] && tokens.push({ + value: parts[i], + type: "text" + }); + } + + if (search) { + if (!/regex/.test(options)) + search = lang.escapeRegExp(search); + if (/whole/.test(options)) + search = "\\b" + search + "\\b"; + } + + var regex = search && safeCreateRegexp( + "(" + search + ")", + / sensitive/.test(options) ? "g" : "ig" + ); + if (regex) { + stack[0] = state; + stack[1] = regex; + } + + return tokens; + } + }, + { + regex : "^(?=Found \\d+ matches)", + token : "text", + next : "numbers" + }, + { + token : "string", // single line + regex : "^\\S:?[^:]+", + next : "numbers" + } + ], + numbers:[{ + regex : "\\d+", + token : "constant.numeric" + }, { + regex : "$", + token : "text", + next : "start" + }] + }; + this.normalizeRules(); +}; + +oop.inherits(C9SearchHighlightRules, TextHighlightRules); + +exports.C9SearchHighlightRules = C9SearchHighlightRules; + +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/c9search",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /^(\S.*:|Searching for.*)$/; + this.foldingStopMarker = /^(\s+|Found.*)$/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var lines = session.doc.getAllLines(row); + var line = lines[row]; + var level1 = /^(Found.*|Searching for.*)$/; + var level2 = /^(\S.*:|\s*)$/; + var re = level1.test(line) ? level1 : level2; + + var startRow = row; + var endRow = row; + + if (this.foldingStartMarker.test(line)) { + for (var i = row + 1, l = session.getLength(); i < l; i++) { + if (re.test(lines[i])) + break; + } + endRow = i; + } + else if (this.foldingStopMarker.test(line)) { + for (var i = row - 1; i >= 0; i--) { + line = lines[i]; + if (re.test(line)) + break; + } + startRow = i; + } + if (startRow != endRow) { + var col = line.length; + if (re === level1) + col = line.search(/\(Found[^)]+\)$|$/); + return new Range(startRow, col, endRow, 0); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/c9search",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/c9search_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/c9search"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var C9SearchHighlightRules = require("./c9search_highlight_rules").C9SearchHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var C9StyleFoldMode = require("./folding/c9search").FoldMode; + +var Mode = function() { + this.HighlightRules = C9SearchHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new C9StyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/c9search"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-c_cpp.js b/src/libs/ace/mode-c_cpp.js new file mode 100755 index 0000000..ea6d222 --- /dev/null +++ b/src/libs/ace/mode-c_cpp.js @@ -0,0 +1,487 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/c_cpp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template|char16_t|char32_t" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private|" + + "protected|public|friend|explicit|virtual|export|mutable|typename|" + + "constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE|nullptr" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + var escapeRe = /\\(?:['"?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}U[a-fA-F\d]{8}|.)/.source; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "//$", + next : "start" + }, { + token : "comment", + regex : "//", + next : "singleLineComment" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // character + regex : "'(?:" + escapeRe + "|.)?'" + }, { + token : "string.start", + regex : '"', + stateName: "qqstring", + next: [ + { token: "string", regex: /\\\s*$/, next: "qqstring" }, + { token: "constant.language.escape", regex: escapeRe }, + { token: "constant.language.escape", regex: /%[^'"\\]/ }, + { token: "string.end", regex: '"|$', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "string.start", + regex : 'R"\\(', + stateName: "rawString", + next: [ + { token: "string.end", regex: '\\)"', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "#\\s*(?:endif|if|ifdef|else|elif|ifndef)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*" + }, { + token : "keyword.operator", + regex : /--|\+\+|<<=|>>=|>>>=|<>|&&|\|\||\?:|[*%\/+\-&\^|~!<>=]=?/ + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "singleLineComment" : [ + { + token : "comment", + regex : /\\$/, + next : "singleLineComment" + }, { + token : "comment", + regex : /$/, + next : "start" + }, { + defaultToken: "comment" + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/c_cpp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/c_cpp_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = c_cppHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/c_cpp"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-cirru.js b/src/libs/ace/mode-cirru.js new file mode 100755 index 0000000..9d3bab8 --- /dev/null +++ b/src/libs/ace/mode-cirru.js @@ -0,0 +1,203 @@ +ace.define("ace/mode/cirru_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CirruHighlightRules = function() { + this.$rules = { + start: [{ + token: 'constant.numeric', + regex: /[\d\.]+/ + }, { + token: 'comment.line.double-dash', + regex: /--/, + next: 'comment' + }, { + token: 'storage.modifier', + regex: /\(/ + }, { + token: 'storage.modifier', + regex: /,/, + next: 'line' + }, { + token: 'support.function', + regex: /[^\(\)"\s]+/, + next: 'line' + }, { + token: 'string.quoted.double', + regex: /"/, + next: 'string' + }, { + token: 'storage.modifier', + regex: /\)/ + }], + comment: [{ + token: 'comment.line.double-dash', + regex: / +[^\n]+/, + next: 'start' + }], + string: [{ + token: 'string.quoted.double', + regex: /"/, + next: 'line' + }, { + token: 'constant.character.escape', + regex: /\\/, + next: 'escape' + }, { + token: 'string.quoted.double', + regex: /[^\\"]+/ + }], + escape: [{ + token: 'constant.character.escape', + regex: /./, + next: 'string' + }], + line: [{ + token: 'constant.numeric', + regex: /[\d\.]+/ + }, { + token: 'markup.raw', + regex: /^\s*/, + next: 'start' + }, { + token: 'storage.modifier', + regex: /\$/, + next: 'start' + }, { + token: 'variable.parameter', + regex: /[^\(\)"\s]+/ + }, { + token: 'storage.modifier', + regex: /\(/, + next: 'start' + }, { + token: 'storage.modifier', + regex: /\)/ + }, { + token: 'markup.raw', + regex: /^ */, + next: 'start' + }, { + token: 'string.quoted.double', + regex: /"/, + next: 'string' + }] + } + +}; + +oop.inherits(CirruHighlightRules, TextHighlightRules); + +exports.CirruHighlightRules = CirruHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/cirru",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/cirru_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CirruHighlightRules = require("./cirru_highlight_rules").CirruHighlightRules; +var CoffeeFoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = CirruHighlightRules; + this.foldingRules = new CoffeeFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.$id = "ace/mode/cirru"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-clojure.js b/src/libs/ace/mode-clojure.js new file mode 100755 index 0000000..c8f7a0d --- /dev/null +++ b/src/libs/ace/mode-clojure.js @@ -0,0 +1,307 @@ +ace.define("ace/mode/clojure_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + + +var ClojureHighlightRules = function() { + + var builtinFunctions = ( + '* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* ' + + '*command-line-args* *compile-files* *compile-path* *e *err* *file* ' + + '*flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* ' + + '*print-dup* *print-length* *print-level* *print-meta* *print-readably* ' + + '*read-eval* *source-path* *use-context-classloader* ' + + '*warn-on-reflection* + - -> ->> .. / < <= = ' + + '== > > >= >= accessor aclone ' + + 'add-classpath add-watch agent agent-errors aget alength alias all-ns ' + + 'alter alter-meta! alter-var-root amap ancestors and apply areduce ' + + 'array-map aset aset-boolean aset-byte aset-char aset-double aset-float ' + + 'aset-int aset-long aset-short assert assoc assoc! assoc-in associative? ' + + 'atom await await-for await1 bases bean bigdec bigint binding bit-and ' + + 'bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left ' + + 'bit-shift-right bit-test bit-xor boolean boolean-array booleans ' + + 'bound-fn bound-fn* butlast byte byte-array bytes cast char char-array ' + + 'char-escape-string char-name-string char? chars chunk chunk-append ' + + 'chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? ' + + 'class class? clear-agent-errors clojure-version coll? comment commute ' + + 'comp comparator compare compare-and-set! compile complement concat cond ' + + 'condp conj conj! cons constantly construct-proxy contains? count ' + + 'counted? create-ns create-struct cycle dec decimal? declare definline ' + + 'defmacro defmethod defmulti defn defn- defonce defstruct delay delay? ' + + 'deliver deref derive descendants destructure disj disj! dissoc dissoc! ' + + 'distinct distinct? doall doc dorun doseq dosync dotimes doto double ' + + 'double-array doubles drop drop-last drop-while empty empty? ensure ' + + 'enumeration-seq eval even? every? false? ffirst file-seq filter find ' + + 'find-doc find-ns find-var first float float-array float? floats flush ' + + 'fn fn? fnext for force format future future-call future-cancel ' + + 'future-cancelled? future-done? future? gen-class gen-interface gensym ' + + 'get get-in get-method get-proxy-class get-thread-bindings get-validator ' + + 'hash hash-map hash-set identical? identity if-let if-not ifn? import ' + + 'in-ns inc init-proxy instance? int int-array integer? interleave intern ' + + 'interpose into into-array ints io! isa? iterate iterator-seq juxt key ' + + 'keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list ' + + 'list* list? load load-file load-reader load-string loaded-libs locking ' + + 'long long-array longs loop macroexpand macroexpand-1 make-array ' + + 'make-hierarchy map map? mapcat max max-key memfn memoize merge ' + + 'merge-with meta method-sig methods min min-key mod name namespace neg? ' + + 'newline next nfirst nil? nnext not not-any? not-empty not-every? not= ' + + 'ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ' + + 'ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? ' + + 'or parents partial partition pcalls peek persistent! pmap pop pop! ' + + 'pop-thread-bindings pos? pr pr-str prefer-method prefers ' + + 'primitives-classnames print print-ctor print-doc print-dup print-method ' + + 'print-namespace-doc print-simple print-special-doc print-str printf ' + + 'println println-str prn prn-str promise proxy proxy-call-with-super ' + + 'proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot ' + + 'rand rand-int range ratio? rational? rationalize re-find re-groups ' + + 're-matcher re-matches re-pattern re-seq read read-line read-string ' + + 'reduce ref ref-history-count ref-max-history ref-min-history ref-set ' + + 'refer refer-clojure release-pending-sends rem remove remove-method ' + + 'remove-ns remove-watch repeat repeatedly replace replicate require ' + + 'reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq ' + + 'rsubseq second select-keys send send-off seq seq? seque sequence ' + + 'sequential? set set-validator! set? short short-array shorts ' + + 'shutdown-agents slurp some sort sort-by sorted-map sorted-map-by ' + + 'sorted-set sorted-set-by sorted? special-form-anchor special-symbol? ' + + 'split-at split-with str stream? string? struct struct-map subs subseq ' + + 'subvec supers swap! symbol symbol? sync syntax-symbol-anchor take ' + + 'take-last take-nth take-while test the-ns time to-array to-array-2d ' + + 'trampoline transient tree-seq true? type unchecked-add unchecked-dec ' + + 'unchecked-divide unchecked-inc unchecked-multiply unchecked-negate ' + + 'unchecked-remainder unchecked-subtract underive unquote ' + + 'unquote-splicing update-in update-proxy use val vals var-get var-set ' + + 'var? vary-meta vec vector vector? when when-first when-let when-not ' + + 'while with-bindings with-bindings* with-in-str with-loading-context ' + + 'with-local-vars with-meta with-open with-out-str with-precision xml-seq ' + + 'zero? zipmap' + ); + + var keywords = ('throw try var ' + + 'def do fn if let loop monitor-enter monitor-exit new quote recur set!' + ); + + var buildinConstants = ("true false nil"); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": builtinFunctions + }, "identifier", false, " "); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : ";.*$" + }, { + token : "keyword", //parens + regex : "[\\(|\\)]" + }, { + token : "keyword", //lists + regex : "[\\'\\(]" + }, { + token : "keyword", //vectors + regex : "[\\[|\\]]" + }, { + token : "keyword", //sets and maps + regex : "[\\{|\\}|\\#\\{|\\#\\}]" + }, { + token : "keyword", // ampersands + regex : '[\\&]' + }, { + token : "keyword", // metadata + regex : '[\\#\\^\\{]' + }, { + token : "keyword", // anonymous fn syntactic sugar + regex : '[\\%]' + }, { + token : "keyword", // deref reader macro + regex : '[@]' + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language", + regex : '[!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+||=|!=|<=|>=|<>|<|>|!|&&]' + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$\\-]*\\b" + }, { + token : "string", // single line + regex : '"', + next: "string" + }, { + token : "constant", // symbol + regex : /:[^()\[\]{}'"\^%`,;\s]+/ + }, { + token : "string.regexp", //Regular Expressions + regex : '/#"(?:\\.|(?:\\")|[^""\n])*"/g' + } + + ], + "string" : [ + { + token : "constant.language.escape", + regex : "\\\\.|\\\\$" + }, { + token : "string", + regex : '[^"\\\\]+' + }, { + token : "string", + regex : '"', + next : "start" + } + ] + }; +}; + +oop.inherits(ClojureHighlightRules, TextHighlightRules); + +exports.ClojureHighlightRules = ClojureHighlightRules; +}); + +ace.define("ace/mode/matching_parens_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingParensOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\)/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\))/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + var match = line.match(/^(\s+)/); + if (match) { + return match[1]; + } + + return ""; + }; + +}).call(MatchingParensOutdent.prototype); + +exports.MatchingParensOutdent = MatchingParensOutdent; +}); + +ace.define("ace/mode/clojure",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/clojure_highlight_rules","ace/mode/matching_parens_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ClojureHighlightRules = require("./clojure_highlight_rules").ClojureHighlightRules; +var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensOutdent; + +var Mode = function() { + this.HighlightRules = ClojureHighlightRules; + this.$outdent = new MatchingParensOutdent(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ";"; + this.minorIndentFunctions = ["defn", "defn-", "defmacro", "def", "deftest", "testing"]; + + this.$toIndent = function(str) { + return str.split('').map(function(ch) { + if (/\s/.exec(ch)) { + return ch; + } else { + return ' '; + } + }).join(''); + }; + + this.$calculateIndent = function(line, tab) { + var baseIndent = this.$getIndent(line); + var delta = 0; + var isParen, ch; + for (var i = line.length - 1; i >= 0; i--) { + ch = line[i]; + if (ch === '(') { + delta--; + isParen = true; + } else if (ch === '(' || ch === '[' || ch === '{') { + delta--; + isParen = false; + } else if (ch === ')' || ch === ']' || ch === '}') { + delta++; + } + if (delta < 0) { + break; + } + } + if (delta < 0 && isParen) { + i += 1; + var iBefore = i; + var fn = ''; + while (true) { + ch = line[i]; + if (ch === ' ' || ch === '\t') { + if(this.minorIndentFunctions.indexOf(fn) !== -1) { + return this.$toIndent(line.substring(0, iBefore - 1) + tab); + } else { + return this.$toIndent(line.substring(0, i + 1)); + } + } else if (ch === undefined) { + return this.$toIndent(line.substring(0, iBefore - 1) + tab); + } + fn += line[i]; + i++; + } + } else if(delta < 0 && !isParen) { + return this.$toIndent(line.substring(0, i+1)); + } else if(delta > 0) { + baseIndent = baseIndent.substring(0, baseIndent.length - tab.length); + return baseIndent; + } else { + return baseIndent; + } + }; + + this.getNextLineIndent = function(state, line, tab) { + return this.$calculateIndent(line, tab); + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/clojure"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-cobol.js b/src/libs/ace/mode-cobol.js new file mode 100755 index 0000000..89367e0 --- /dev/null +++ b/src/libs/ace/mode-cobol.js @@ -0,0 +1,94 @@ +ace.define("ace/mode/cobol_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var CobolHighlightRules = function() { +var keywords = "ACCEPT|MERGE|SUM|ADD||MESSAGE|TABLE|ADVANCING|MODE|TAPE|" + +"AFTER|MULTIPLY|TEST|ALL|NEGATIVE|TEXT|ALPHABET|NEXT|THAN|" + +"ALSO|NO|THEN|ALTERNATE|NOT|THROUGH|AND|NUMBER|THRU|ANY|OCCURS|" + +"TIME|ARE|OF|TO|AREA|OFF|TOP||ASCENDING|OMITTED|TRUE|ASSIGN|ON|TYPE|AT|OPEN|" + +"UNIT|AUTHOR|OR|UNTIL|BEFORE|OTHER|UP|BLANK|OUTPUT|USE|BLOCK|PAGE|USING|BOTTOM|" + +"PERFORM|VALUE|BY|PIC|VALUES|CALL|PICTURE|WHEN|CANCEL|PLUS|WITH|CD|POINTER|WRITE|" + +"CHARACTER|POSITION||ZERO|CLOSE|POSITIVE|ZEROS|COLUMN|PROCEDURE|ZEROES|COMMA|PROGRAM|" + +"COMMON|PROGRAM-ID|COMMUNICATION|QUOTE|COMP|RANDOM|COMPUTE|READ|CONTAINS|RECEIVE|CONFIGURATION|" + +"RECORD|CONTINUE|REDEFINES|CONTROL|REFERENCE|COPY|REMAINDER|COUNT|REPLACE|DATA|REPORT|DATE|RESERVE|" + +"DAY|RESET|DELETE|RETURN|DESTINATION|REWIND|DISABLE|REWRITE|DISPLAY|RIGHT|DIVIDE|RUN|DOWN|SAME|" + +"ELSE|SEARCH|ENABLE|SECTION|END|SELECT|ENVIRONMENT|SENTENCE|EQUAL|SET|ERROR|SIGN|EXIT|SEQUENTIAL|" + +"EXTERNAL|SIZE|FLASE|SORT|FILE|SOURCE|LENGTH|SPACE|LESS|STANDARD|LIMIT|START|LINE|STOP|LOCK|STRING|LOW-VALUE|SUBTRACT"; + + var builtinConstants = ( + "true|false|null" + ); + + var builtinFunctions = ( + "count|min|max|avg|sum|rank|now|coalesce|main" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "\\*.*$" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; +}; + +oop.inherits(CobolHighlightRules, TextHighlightRules); + +exports.CobolHighlightRules = CobolHighlightRules; +}); + +ace.define("ace/mode/cobol",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/cobol_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CobolHighlightRules = require("./cobol_highlight_rules").CobolHighlightRules; + +var Mode = function() { + this.HighlightRules = CobolHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "*"; + + this.$id = "ace/mode/cobol"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-coffee.js b/src/libs/ace/mode-coffee.js new file mode 100755 index 0000000..5ba8589 --- /dev/null +++ b/src/libs/ace/mode-coffee.js @@ -0,0 +1,392 @@ +ace.define("ace/mode/coffee_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + + var oop = require("../lib/oop"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + oop.inherits(CoffeeHighlightRules, TextHighlightRules); + + function CoffeeHighlightRules() { + var identifier = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"; + + var keywords = ( + "this|throw|then|try|typeof|super|switch|return|break|by|continue|" + + "catch|class|in|instanceof|is|isnt|if|else|extends|for|own|" + + "finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|" + + "or|on|unless|until|and|yes" + ); + + var langConstant = ( + "true|false|null|undefined|NaN|Infinity" + ); + + var illegal = ( + "case|const|default|function|var|void|with|enum|export|implements|" + + "interface|let|package|private|protected|public|static|yield" + ); + + var supportClass = ( + "Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + + "SyntaxError|TypeError|URIError|" + + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray" + ); + + var supportFunction = ( + "Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|" + + "encodeURIComponent|decodeURI|decodeURIComponent|String|" + ); + + var variableLanguage = ( + "window|arguments|prototype|document" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": langConstant, + "invalid.illegal": illegal, + "language.support.class": supportClass, + "language.support.function": supportFunction, + "variable.language": variableLanguage + }, "identifier"); + + var functionRule = { + token: ["paren.lparen", "variable.parameter", "paren.rparen", "text", "storage.type"], + regex: /(?:(\()((?:"[^")]*?"|'[^')]*?'|\/[^\/)]*?\/|[^()"'\/])*?)(\))(\s*))?([\-=]>)/.source + }; + + var stringEscape = /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/; + + this.$rules = { + start : [ + { + token : "constant.numeric", + regex : "(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)" + }, { + stateName: "qdoc", + token : "string", regex : "'''", next : [ + {token : "string", regex : "'''", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qqdoc", + token : "string", + regex : '"""', + next : [ + {token : "string", regex : '"""', next : "start"}, + {token : "paren.string", regex : '#{', push : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qstring", + token : "string", regex : "'", next : [ + {token : "string", regex : "'", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qqstring", + token : "string.start", regex : '"', next : [ + {token : "string.end", regex : '"', next : "start"}, + {token : "paren.string", regex : '#{', push : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "js", + token : "string", regex : "`", next : [ + {token : "string", regex : "`", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift() || ""; + if (this.next.indexOf("string") != -1) + return "paren.string"; + } + return "paren"; + } + }, { + token : "string.regex", + regex : "///", + next : "heregex" + }, { + token : "string.regex", + regex : /(?:\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)(?:[imgy]{0,4})(?!\w)/ + }, { + token : "comment", + regex : "###(?!#)", + next : "comment" + }, { + token : "comment", + regex : "#.*" + }, { + token : ["punctuation.operator", "text", "identifier"], + regex : "(\\.)(\\s*)(" + illegal + ")" + }, { + token : "punctuation.operator", + regex : "\\.{1,3}" + }, { + token : ["keyword", "text", "language.support.class", + "text", "keyword", "text", "language.support.class"], + regex : "(class)(\\s+)(" + identifier + ")(?:(\\s+)(extends)(\\s+)(" + identifier + "))?" + }, { + token : ["entity.name.function", "text", "keyword.operator", "text"].concat(functionRule.token), + regex : "(" + identifier + ")(\\s*)([=:])(\\s*)" + functionRule.regex + }, + functionRule, + { + token : "variable", + regex : "@(?:" + identifier + ")?" + }, { + token: keywordMapper, + regex : identifier + }, { + token : "punctuation.operator", + regex : "\\,|\\." + }, { + token : "storage.type", + regex : "[\\-=]>" + }, { + token : "keyword.operator", + regex : "(?:[-+*/%<>&|^!?=]=|>>>=?|\\-\\-|\\+\\+|::|&&=|\\|\\|=|<<=|>>=|\\?\\.|\\.{2,3}|[!*+-=><])" + }, { + token : "paren.lparen", + regex : "[({[]" + }, { + token : "paren.rparen", + regex : "[\\]})]" + }, { + token : "text", + regex : "\\s+" + }], + + + heregex : [{ + token : "string.regex", + regex : '.*?///[imgy]{0,4}', + next : "start" + }, { + token : "comment.regex", + regex : "\\s+(?:#.*)?" + }, { + token : "string.regex", + regex : "\\S+" + }], + + comment : [{ + token : "comment", + regex : '###', + next : "start" + }, { + defaultToken : "comment" + }] + }; + this.normalizeRules(); + } + + exports.CoffeeHighlightRules = CoffeeHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/coffee",["require","exports","module","ace/mode/coffee_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/coffee","ace/range","ace/mode/text","ace/worker/worker_client","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Rules = require("./coffee_highlight_rules").CoffeeHighlightRules; +var Outdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var FoldMode = require("./folding/coffee").FoldMode; +var Range = require("../range").Range; +var TextMode = require("./text").Mode; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var oop = require("../lib/oop"); + +function Mode() { + this.HighlightRules = Rules; + this.$outdent = new Outdent(); + this.foldingRules = new FoldMode(); +} + +oop.inherits(Mode, TextMode); + +(function() { + var indenter = /(?:[({[=:]|[-=]>|\b(?:else|try|(?:swi|ca)tch(?:\s+[$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)?|finally))\s*$|^\s*(else\b\s*)?(?:if|for|while|loop)\b(?!.*\bthen\b)/; + + this.lineCommentStart = "#"; + this.blockComment = {start: "###", end: "###"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + + if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') && + state === 'start' && indenter.test(line)) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/coffee_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/coffee"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-coldfusion.js b/src/libs/ace/mode-coldfusion.js new file mode 100755 index 0000000..edbdb5b --- /dev/null +++ b/src/libs/ace/mode-coldfusion.js @@ -0,0 +1,2567 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/coldfusion_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/javascript_highlight_rules","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + +var ColdfusionHighlightRules = function() { + HtmlHighlightRules.call(this); + this.$rules.tag[2].token = function (start, tag) { + var group = tag.slice(0,2) == "cf" ? "keyword" : "meta.tag"; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + group + ".tag-name.xml"]; + } + + var jsAndCss = Object.keys(this.$rules).filter(function(x) { + return /^(js|css)-/.test(x); + }); + this.embedRules({ + cfmlComment: [ + { regex: "", token: "comment.end", next: "pop"}, + { defaultToken: "comment"} + ] + }, "", [ + { regex: "", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/curly_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + + +var CurlyHighlightRules = function() { + HtmlHighlightRules.call(this); + + this.$rules["start"].unshift({ + token: "variable", + regex: "{{", + push: "curly-start" + }); + + this.$rules["curly-start"] = [{ + token: "variable", + regex: "}}", + next: "pop" + }]; + + this.normalizeRules(); +}; + +oop.inherits(CurlyHighlightRules, HtmlHighlightRules); + +exports.CurlyHighlightRules = CurlyHighlightRules; + +}); + +ace.define("ace/mode/curly",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/matching_brace_outdent","ace/mode/folding/html","ace/mode/curly_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var HtmlFoldMode = require("./folding/html").FoldMode; +var CurlyHighlightRules = require("./curly_highlight_rules").CurlyHighlightRules; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = CurlyHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new HtmlFoldMode(); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.$id = "ace/mode/curly"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-d.js b/src/libs/ace/mode-d.js new file mode 100755 index 0000000..672411a --- /dev/null +++ b/src/libs/ace/mode-d.js @@ -0,0 +1,513 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/d_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DHighlightRules = function() { + + var keywords = ( + "this|super|import|module|body|mixin|__traits|invariant|alias|asm|delete|"+ + "typeof|typeid|sizeof|cast|new|in|is|typedef|__vector|__parameters" + ); + + var keywordControls = ( + "break|case|continue|default|do|else|for|foreach|foreach_reverse|goto|if|" + + "return|switch|while|catch|try|throw|finally|version|assert|unittest|with" + ); + + var types = ( + "auto|bool|char|dchar|wchar|byte|ubyte|float|double|real|" + + "cfloat|creal|cdouble|cent|ifloat|ireal|idouble|" + + "int|long|short|void|uint|ulong|ushort|ucent|" + + "function|delegate|string|wstring|dstring|size_t|ptrdiff_t|hash_t|Object" + ); + + var modifiers = ( + "abstract|align|debug|deprecated|export|extern|const|final|in|inout|out|" + + "ref|immutable|lazy|nothrow|override|package|pragma|private|protected|" + + "public|pure|scope|shared|__gshared|synchronized|static|volatile" + ); + + var storages = ( + "class|struct|union|template|interface|enum|macro" + ); + + var stringEscapesSeq = { + token: "constant.language.escape", + regex: "\\\\(?:(?:x[0-9A-F]{2})|(?:[0-7]{1,3})|(?:['\"\\?0abfnrtv\\\\])|" + + "(?:u[0-9a-fA-F]{4})|(?:U[0-9a-fA-F]{8}))" + }; + + var builtinConstants = ( + "null|true|false|"+ + "__DATE__|__EOF__|__TIME__|__TIMESTAMP__|__VENDOR__|__VERSION__|"+ + "__FILE__|__MODULE__|__LINE__|__FUNCTION__|__PRETTY_FUNCTION__" + ); + + var operators = ( + "/|/\\=|&|&\\=|&&|\\|\\|\\=|\\|\\||\\-|\\-\\=|\\-\\-|\\+|" + + "\\+\\=|\\+\\+|\\<|\\<\\=|\\<\\<|\\<\\<\\=|\\<\\>|\\<\\>\\=|\\>|\\>\\=|\\>\\>\\=|" + + "\\>\\>\\>\\=|\\>\\>|\\>\\>\\>|\\!|\\!\\=|\\!\\<\\>|\\!\\<\\>\\=|\\!\\<|\\!\\<\\=|" + + "\\!\\>|\\!\\>\\=|\\?|\\$|\\=|\\=\\=|\\*|\\*\\=|%|%\\=|" + + "\\^|\\^\\=|\\^\\^|\\^\\^\\=|~|~\\=|\\=\\>|#" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.modifier" : modifiers, + "keyword.control" : keywordControls, + "keyword.type" : types, + "keyword": keywords, + "keyword.storage": storages, + "punctation": "\\.|\\,|;|\\.\\.|\\.\\.\\.", + "keyword.operator" : operators, + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z_\u00a1-\uffff][a-zA-Z\\d_\u00a1-\uffff]*\\b"; + + this.$rules = { + "start" : [ + { //-------------------------------------------------------- COMMENTS + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "star-comment" + }, { + token: "comment.shebang", + regex: "^\\s*#!.*" + }, { + token : "comment", + regex : "\\/\\+", + next: "plus-comment" + }, { //-------------------------------------------------------- STRINGS + onMatch: function(value, currentState, state) { + state.unshift(this.next, value.substr(2)); + return "string"; + }, + regex: 'q"(?:[\\[\\(\\{\\<]+)', + next: 'operator-heredoc-string' + }, { + onMatch: function(value, currentState, state) { + state.unshift(this.next, value.substr(2)); + return "string"; + }, + regex: 'q"(?:[a-zA-Z_]+)$', + next: 'identifier-heredoc-string' + }, { + token : "string", // multi line string start + regex : '[xr]?"', + next : "quote-string" + }, { + token : "string", // multi line string start + regex : '[xr]?`', + next : "backtick-string" + }, { + token : "string", // single line + regex : "[xr]?['](?:(?:\\\\.)|(?:[^'\\\\]))*?['][cdw]?" + }, { //-------------------------------------------------------- RULES + token: ["keyword", "text", "paren.lparen"], + regex: /(asm)(\s*)({)/, + next: "d-asm" + }, { + token: ["keyword", "text", "paren.lparen", "constant.language"], + regex: "(__traits)(\\s*)(\\()("+identifierRe+")" + }, { // import|module abc + token: ["keyword", "text", "variable.module"], + regex: "(import|module)(\\s+)((?:"+identifierRe+"\\.?)*)" + }, { // storage Name + token: ["keyword.storage", "text", "entity.name.type"], + regex: "("+storages+")(\\s*)("+identifierRe+")" + }, { // alias|typedef foo bar; + token: ["keyword", "text", "variable.storage", "text"], + regex: "(alias|typedef)(\\s*)("+identifierRe+")(\\s*)" + }, { //-------------------------------------------------------- OTHERS + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F_]+(l|ul|u|f|F|L|U|UL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d[\\d_]*(?:(?:\\.[\\d_]*)?(?:[eE][+-]?[\\d_]+)?)?(l|ul|u|f|F|L|U|UL)?\\b" + }, { + token: "entity.other.attribute-name", + regex: "@"+identifierRe + }, { + token : keywordMapper, + regex : "[a-zA-Z_][a-zA-Z0-9_]*\\b" + }, { + token : "keyword.operator", + regex : operators + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\.|\\:" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "star-comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken: 'comment' + } + ], + "plus-comment" : [ + { + token : "comment", // closing comment + regex : "\\+\\/", + next : "start" + }, { + defaultToken: 'comment' + } + ], + + "quote-string" : [ + stringEscapesSeq, + { + token : "string", + regex : '"[cdw]?', + next : "start" + }, { + defaultToken: 'string' + } + ], + + "backtick-string" : [ + stringEscapesSeq, + { + token : "string", + regex : '`[cdw]?', + next : "start" + }, { + defaultToken: 'string' + } + ], + + "operator-heredoc-string": [ + { + onMatch: function(value, currentState, state) { + value = value.substring(value.length-2, value.length-1); + var map = {'>':'<',']':'[',')':'(','}':'{'}; + if(Object.keys(map).indexOf(value) != -1) + value = map[value]; + if(value != state[1]) return "string"; + state.shift(); + state.shift(); + + return "string"; + }, + regex: '(?:[\\]\\)}>]+)"', + next: 'start' + }, { + token: 'string', + regex: '[^\\]\\)}>]+' + } + ], + + "identifier-heredoc-string": [ + { + onMatch: function(value, currentState, state) { + value = value.substring(0, value.length-1); + if(value != state[1]) return "string"; + state.shift(); + state.shift(); + + return "string"; + }, + regex: '^(?:[A-Za-z_][a-zA-Z0-9]+)"', + next: 'start' + }, { + token: 'string', + regex: '[^\\]\\)}>]+' + } + ], + + "d-asm": [ + { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: 'keyword.instruction', + regex: '[a-zA-Z]+', + next: 'd-asm-instruction' + }, { + token: "text", + regex: "\\s+" + } + ], + 'd-asm-instruction': [ + { + token: 'constant.language', + regex: /AL|AH|AX|EAX|BL|BH|BX|EBX|CL|CH|CX|ECX|DL|DH|DX|EDX|BP|EBP|SP|ESP|DI|EDI|SI|ESI/i + }, { + token: 'identifier', + regex: '[a-zA-Z]+' + }, { + token: 'string', + regex: '".*"' + }, { + token: 'comment', + regex: '//.*$' + }, { + token: 'constant.numeric', + regex: '[0-9.xA-F]+' + }, { + token: 'punctuation.operator', + regex: '\\,' + }, { + token: 'punctuation.operator', + regex: ';', + next: 'd-asm' + }, { + token: 'text', + regex: '\\s+' + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +DHighlightRules.metaData = { + comment: 'D language', + fileTypes: [ 'd', 'di' ], + firstLineMatch: '^#!.*\\b[glr]?dmd\\b.', + foldingStartMarker: '(?x)/\\*\\*(?!\\*)|^(?![^{]*?//|[^{]*?/\\*(?!.*?\\*/.*?\\{)).*?\\{\\s*($|//|/\\*(?!.*?\\*/.*\\S))', + foldingStopMarker: '(? indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/d",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/d_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var DHighlightRules = require("./d_highlight_rules").DHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = DHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/d"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-dart.js b/src/libs/ace/mode-dart.js new file mode 100755 index 0000000..c704234 --- /dev/null +++ b/src/libs/ace/mode-dart.js @@ -0,0 +1,689 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/c_cpp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template|char16_t|char32_t" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private|" + + "protected|public|friend|explicit|virtual|export|mutable|typename|" + + "constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE|nullptr" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + var escapeRe = /\\(?:['"?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}U[a-fA-F\d]{8}|.)/.source; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "//$", + next : "start" + }, { + token : "comment", + regex : "//", + next : "singleLineComment" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // character + regex : "'(?:" + escapeRe + "|.)?'" + }, { + token : "string.start", + regex : '"', + stateName: "qqstring", + next: [ + { token: "string", regex: /\\\s*$/, next: "qqstring" }, + { token: "constant.language.escape", regex: escapeRe }, + { token: "constant.language.escape", regex: /%[^'"\\]/ }, + { token: "string.end", regex: '"|$', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "string.start", + regex : 'R"\\(', + stateName: "rawString", + next: [ + { token: "string.end", regex: '\\)"', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "#\\s*(?:endif|if|ifdef|else|elif|ifndef)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*" + }, { + token : "keyword.operator", + regex : /--|\+\+|<<=|>>=|>>>=|<>|&&|\|\||\?:|[*%\/+\-&\^|~!<>=]=?/ + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "singleLineComment" : [ + { + token : "comment", + regex : /\\$/, + next : "singleLineComment" + }, { + token : "comment", + regex : /$/, + next : "start" + }, { + defaultToken: "comment" + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/c_cpp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/c_cpp_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = c_cppHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/c_cpp"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/dart_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DartHighlightRules = function() { + + var constantLanguage = "true|false|null"; + var variableLanguage = "this|super"; + var keywordControl = "try|catch|finally|throw|rethrow|assert|break|case|continue|default|do|else|for|if|in|return|switch|while|new|deferred|async|await"; + var keywordDeclaration = "abstract|class|extends|external|factory|implements|get|native|operator|set|typedef|with|enum"; + var storageModifier = "static|final|const"; + var storageType = "void|bool|num|int|double|dynamic|var|String"; + + var keywordMapper = this.createKeywordMapper({ + "constant.language.dart": constantLanguage, + "variable.language.dart": variableLanguage, + "keyword.control.dart": keywordControl, + "keyword.declaration.dart": keywordDeclaration, + "storage.modifier.dart": storageModifier, + "storage.type.primitive.dart": storageType + }, "identifier"); + + var stringfill = { + defaultToken : "string" + }; + + this.$rules = + { + "start": [ + { + token : "comment", + regex : /\/\/.*$/ + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, + { + token: ["meta.preprocessor.script.dart"], + regex: "^(#!.*)$" + }, + { + token: "keyword.other.import.dart", + regex: "(?:\\b)(?:library|import|export|part|of|show|hide)(?:\\b)" + }, + { + token : ["keyword.other.import.dart", "text"], + regex : "(?:\\b)(prefix)(\\s*:)" + }, + { + regex: "\\bas\\b", + token: "keyword.cast.dart" + }, + { + regex: "\\?|:", + token: "keyword.control.ternary.dart" + }, + { + regex: "(?:\\b)(is\\!?)(?:\\b)", + token: ["keyword.operator.dart"] + }, + { + regex: "(<<|>>>?|~|\\^|\\||&)", + token: ["keyword.operator.bitwise.dart"] + }, + { + regex: "((?:&|\\^|\\||<<|>>>?)=)", + token: ["keyword.operator.assignment.bitwise.dart"] + }, + { + regex: "(===?|!==?|<=?|>=?)", + token: ["keyword.operator.comparison.dart"] + }, + { + regex: "((?:[+*/%-]|\\~)=)", + token: ["keyword.operator.assignment.arithmetic.dart"] + }, + { + regex: "=", + token: "keyword.operator.assignment.dart" + }, + { + token : "string", + regex : "'''", + next : "qdoc" + }, + { + token : "string", + regex : '"""', + next : "qqdoc" + }, + { + token : "string", + regex : "'", + next : "qstring" + }, + { + token : "string", + regex : '"', + next : "qqstring" + }, + { + regex: "(\\-\\-|\\+\\+)", + token: ["keyword.operator.increment-decrement.dart"] + }, + { + regex: "(\\-|\\+|\\*|\\/|\\~\\/|%)", + token: ["keyword.operator.arithmetic.dart"] + }, + { + regex: "(!|&&|\\|\\|)", + token: ["keyword.operator.logical.dart"] + }, + { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, + { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, + { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qdoc" : [ + { + token : "string", + regex : ".*?'''", + next : "start" + }, stringfill], + + "qqdoc" : [ + { + token : "string", + regex : '.*?"""', + next : "start" + }, stringfill], + + "qstring" : [ + { + token : "string", + regex : "[^\\\\']*(?:\\\\.[^\\\\']*)*'", + next : "start" + }, stringfill], + + "qqstring" : [ + { + token : "string", + regex : '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', + next : "start" + }, stringfill] +} + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(DartHighlightRules, TextHighlightRules); + +exports.DartHighlightRules = DartHighlightRules; +}); + +ace.define("ace/mode/dart",["require","exports","module","ace/lib/oop","ace/mode/c_cpp","ace/mode/dart_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var CMode = require("./c_cpp").Mode; +var DartHighlightRules = require("./dart_highlight_rules").DartHighlightRules; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + CMode.call(this); + this.HighlightRules = DartHighlightRules; + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, CMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/dart"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-diff.js b/src/libs/ace/mode-diff.js new file mode 100755 index 0000000..ae878db --- /dev/null +++ b/src/libs/ace/mode-diff.js @@ -0,0 +1,139 @@ +ace.define("ace/mode/diff_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DiffHighlightRules = function() { + + this.$rules = { + "start" : [{ + regex: "^(?:\\*{15}|={67}|-{3}|\\+{3})$", + token: "punctuation.definition.separator.diff", + "name": "keyword" + }, { //diff.range.unified + regex: "^(@@)(\\s*.+?\\s*)(@@)(.*)$", + token: [ + "constant", + "constant.numeric", + "constant", + "comment.doc.tag" + ] + }, { //diff.range.normal + regex: "^(\\d+)([,\\d]+)(a|d|c)(\\d+)([,\\d]+)(.*)$", + token: [ + "constant.numeric", + "punctuation.definition.range.diff", + "constant.function", + "constant.numeric", + "punctuation.definition.range.diff", + "invalid" + ], + "name": "meta." + }, { + regex: "^(\\-{3}|\\+{3}|\\*{3})( .+)$", + token: [ + "constant.numeric", + "meta.tag" + ] + }, { // added + regex: "^([!+>])(.*?)(\\s*)$", + token: [ + "support.constant", + "text", + "invalid" + ] + }, { // removed + regex: "^([<\\-])(.*?)(\\s*)$", + token: [ + "support.function", + "string", + "invalid" + ] + }, { + regex: "^(diff)(\\s+--\\w+)?(.+?)( .+)?$", + token: ["variable", "variable", "keyword", "variable"] + }, { + regex: "^Index.+$", + token: "variable" + }, { + regex: "^\\s+$", + token: "text" + }, { + regex: "\\s*$", + token: "invalid" + }, { + defaultToken: "invisible", + caseInsensitive: true + } + ] + }; +}; + +oop.inherits(DiffHighlightRules, TextHighlightRules); + +exports.DiffHighlightRules = DiffHighlightRules; +}); + +ace.define("ace/mode/folding/diff",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function(levels, flag) { + this.regExpList = levels; + this.flag = flag; + this.foldingStartMarker = RegExp("^(" + levels.join("|") + ")", this.flag); +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var start = {row: row, column: line.length}; + + var regList = this.regExpList; + for (var i = 1; i <= regList.length; i++) { + var re = RegExp("^(" + regList.slice(0, i).join("|") + ")", this.flag); + if (re.test(line)) + break; + } + + for (var l = session.getLength(); ++row < l; ) { + line = session.getLine(row); + if (re.test(line)) + break; + } + if (row == start.row + 1) + return; + return Range.fromPoints(start, {row: row - 1, column: line.length}); + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/diff",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/diff_highlight_rules","ace/mode/folding/diff"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HighlightRules = require("./diff_highlight_rules").DiffHighlightRules; +var FoldMode = require("./folding/diff").FoldMode; + +var Mode = function() { + this.HighlightRules = HighlightRules; + this.foldingRules = new FoldMode(["diff", "index", "\\+{3}", "@@|\\*{5}"], "i"); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.$id = "ace/mode/diff"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-django.js b/src/libs/ace/mode-django.js new file mode 100755 index 0000000..b681d99 --- /dev/null +++ b/src/libs/ace/mode-django.js @@ -0,0 +1,2565 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/django",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/html_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DjangoHighlightRules = function(){ + this.$rules = { + 'start': [{ + token: "string", + regex: '".*?"' + }, { + token: "string", + regex: "'.*?'" + }, { + token: "constant", + regex: '[0-9]+' + }, { + token: "variable", + regex: "[-_a-zA-Z0-9:]+" + }], + 'tag': [{ + token: "entity.name.function", + regex: "[a-zA-Z][_a-zA-Z0-9]*", + next: "start" + }] + }; +}; + +oop.inherits(DjangoHighlightRules, TextHighlightRules) + +var DjangoHtmlHighlightRules = function() { + this.$rules = new HtmlHighlightRules().getRules(); + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token: "comment.line", + regex: "\\{#.*?#\\}" + }, { + token: "comment.block", + regex: "\\{\\%\\s*comment\\s*\\%\\}", + merge: true, + next: "django-comment" + }, { + token: "constant.language", + regex: "\\{\\{", + next: "django-start" + }, { + token: "constant.language", + regex: "\\{\\%", + next: "django-tag" + }); + this.embedRules(DjangoHighlightRules, "django-", [{ + token: "comment.block", + regex: "\\{\\%\\s*endcomment\\s*\\%\\}", + merge: true, + next: "start" + }, { + token: "constant.language", + regex: "\\%\\}", + next: "start" + }, { + token: "constant.language", + regex: "\\}\\}", + next: "start" + }]); + } +}; + +oop.inherits(DjangoHtmlHighlightRules, HtmlHighlightRules); + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = DjangoHtmlHighlightRules; +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.$id = "ace/mode/django"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-dockerfile.js b/src/libs/ace/mode-dockerfile.js new file mode 100755 index 0000000..d030b9c --- /dev/null +++ b/src/libs/ace/mode-dockerfile.js @@ -0,0 +1,492 @@ +ace.define("ace/mode/sh_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var reservedKeywords = exports.reservedKeywords = ( + '!|{|}|case|do|done|elif|else|'+ + 'esac|fi|for|if|in|then|until|while|'+ + '&|;|export|local|read|typeset|unset|'+ + 'elif|select|set|function|declare|readonly' + ); + +var languageConstructs = exports.languageConstructs = ( + '[|]|alias|bg|bind|break|builtin|'+ + 'cd|command|compgen|complete|continue|'+ + 'dirs|disown|echo|enable|eval|exec|'+ + 'exit|fc|fg|getopts|hash|help|history|'+ + 'jobs|kill|let|logout|popd|printf|pushd|'+ + 'pwd|return|set|shift|shopt|source|'+ + 'suspend|test|times|trap|type|ulimit|'+ + 'umask|unalias|wait' +); + +var ShHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "keyword": reservedKeywords, + "support.function.builtin": languageConstructs, + "invalid.deprecated": "debugger" + }, "identifier"); + + var integer = "(?:(?:[1-9]\\d*)|(?:0))"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + var fileDescriptor = "(?:&" + intPart + ")"; + + var variableName = "[a-zA-Z_][a-zA-Z0-9_]*"; + var variable = "(?:" + variableName + "=)"; + + var builtinVariable = "(?:\\$(?:SHLVL|\\$|\\!|\\?))"; + + var func = "(?:" + variableName + "\\s*\\(\\))"; + + this.$rules = { + "start" : [{ + token : "constant", + regex : /\\./ + }, { + token : ["text", "comment"], + regex : /(^|\s)(#.*)$/ + }, { + token : "string.start", + regex : '"', + push : [{ + token : "constant.language.escape", + regex : /\\(?:[$`"\\]|$)/ + }, { + include : "variables" + }, { + token : "keyword.operator", + regex : /`/ // TODO highlight ` + }, { + token : "string.end", + regex : '"', + next: "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string", + regex : "\\$'", + push : [{ + token : "constant.language.escape", + regex : /\\(?:[abeEfnrtv\\'"]|x[a-fA-F\d]{1,2}|u[a-fA-F\d]{4}([a-fA-F\d]{4})?|c.|\d{1,3})/ + }, { + token : "string", + regex : "'", + next: "pop" + }, { + defaultToken: "string" + }] + }, { + regex : "<<<", + token : "keyword.operator" + }, { + stateName: "heredoc", + regex : "(<<-?)(\\s*)(['\"`]?)([\\w\\-]+)(['\"`]?)", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[4]); + return [ + {type:"constant", value: tokens[1]}, + {type:"text", value: tokens[2]}, + {type:"string", value: tokens[3]}, + {type:"support.class", value: tokens[4]}, + {type:"string", value: tokens[5]} + ]; + }, + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^\t+" + }, { + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + regex : "$", + token : "empty", + next : function(currentState, stack) { + if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc") + return stack[0]; + return currentState; + } + }, { + token : ["keyword", "text", "text", "text", "variable"], + regex : /(declare|local|readonly)(\s+)(?:(-[fixar]+)(\s+))?([a-zA-Z_][a-zA-Z0-9_]*\b)/ + }, { + token : "variable.language", + regex : builtinVariable + }, { + token : "variable", + regex : variable + }, { + include : "variables" + }, { + token : "support.function", + regex : func + }, { + token : "support.function", + regex : fileDescriptor + }, { + token : "string", // ' string + start : "'", end : "'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_][a-zA-Z0-9_]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|~|<|>|<=|=>|=|!=|[%&|`]" + }, { + token : "punctuation.operator", + regex : ";" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]]" + }, { + token : "paren.rparen", + regex : "[\\)\\}]", + next : "pop" + }], + variables: [{ + token : "variable", + regex : /(\$)(\w+)/ + }, { + token : ["variable", "paren.lparen"], + regex : /(\$)(\()/, + push : "start" + }, { + token : ["variable", "paren.lparen", "keyword.operator", "variable", "keyword.operator"], + regex : /(\$)(\{)([#!]?)(\w+|[*@#?\-$!0_])(:[?+\-=]?|##?|%%?|,,?\/|\^\^?)?/, + push : "start" + }, { + token : "variable", + regex : /\$[*@#?\-$!0_]/ + }, { + token : ["variable", "paren.lparen"], + regex : /(\$)(\{)/, + push : "start" + }] + }; + + this.normalizeRules(); +}; + +oop.inherits(ShHighlightRules, TextHighlightRules); + +exports.ShHighlightRules = ShHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/sh",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sh_highlight_rules","ace/range","ace/mode/folding/cstyle","ace/mode/behaviour/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ShHighlightRules = require("./sh_highlight_rules").ShHighlightRules; +var Range = require("../range").Range; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; + +var Mode = function() { + this.HighlightRules = ShHighlightRules; + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = new CstyleBehaviour(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + + this.$id = "ace/mode/sh"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/dockerfile_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/sh_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var ShHighlightRules = require("./sh_highlight_rules").ShHighlightRules; + +var DockerfileHighlightRules = function() { + ShHighlightRules.call(this); + + var startRules = this.$rules.start; + for (var i = 0; i < startRules.length; i++) { + if (startRules[i].token == "variable.language") { + startRules.splice(i, 0, { + token: "constant.language", + regex: "(?:^(?:FROM|MAINTAINER|RUN|CMD|EXPOSE|ENV|ADD|ENTRYPOINT|VOLUME|USER|WORKDIR|ONBUILD|COPY|LABEL)\\b)", + caseInsensitive: true + }); + break; + } + } + +}; + +oop.inherits(DockerfileHighlightRules, ShHighlightRules); + +exports.DockerfileHighlightRules = DockerfileHighlightRules; +}); + +ace.define("ace/mode/dockerfile",["require","exports","module","ace/lib/oop","ace/mode/sh","ace/mode/dockerfile_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var ShMode = require("./sh").Mode; +var DockerfileHighlightRules = require("./dockerfile_highlight_rules").DockerfileHighlightRules; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + ShMode.call(this); + + this.HighlightRules = DockerfileHighlightRules; + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, ShMode); + +(function() { + this.$id = "ace/mode/dockerfile"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-dot.js b/src/libs/ace/mode-dot.js new file mode 100755 index 0000000..7291476 --- /dev/null +++ b/src/libs/ace/mode-dot.js @@ -0,0 +1,410 @@ +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/dot_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/doc_comment_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; + +var DotHighlightRules = function() { + + var keywords = lang.arrayToMap( + ("strict|node|edge|graph|digraph|subgraph").split("|") + ); + + var attributes = lang.arrayToMap( + ("damping|k|url|area|arrowhead|arrowsize|arrowtail|aspect|bb|bgcolor|center|charset|clusterrank|color|colorscheme|comment|compound|concentrate|constraint|decorate|defaultdist|dim|dimen|dir|diredgeconstraints|distortion|dpi|edgeurl|edgehref|edgetarget|edgetooltip|epsilon|esep|fillcolor|fixedsize|fontcolor|fontname|fontnames|fontpath|fontsize|forcelabels|gradientangle|group|headurl|head_lp|headclip|headhref|headlabel|headport|headtarget|headtooltip|height|href|id|image|imagepath|imagescale|label|labelurl|label_scheme|labelangle|labeldistance|labelfloat|labelfontcolor|labelfontname|labelfontsize|labelhref|labeljust|labelloc|labeltarget|labeltooltip|landscape|layer|layerlistsep|layers|layerselect|layersep|layout|len|levels|levelsgap|lhead|lheight|lp|ltail|lwidth|margin|maxiter|mclimit|mindist|minlen|mode|model|mosek|nodesep|nojustify|normalize|nslimit|nslimit1|ordering|orientation|outputorder|overlap|overlap_scaling|pack|packmode|pad|page|pagedir|pencolor|penwidth|peripheries|pin|pos|quadtree|quantum|rank|rankdir|ranksep|ratio|rects|regular|remincross|repulsiveforce|resolution|root|rotate|rotation|samehead|sametail|samplepoints|scale|searchsize|sep|shape|shapefile|showboxes|sides|size|skew|smoothing|sortv|splines|start|style|stylesheet|tailurl|tail_lp|tailclip|tailhref|taillabel|tailport|tailtarget|tailtooltip|target|tooltip|truecolor|vertices|viewport|voro_margin|weight|width|xlabel|xlp|z").split("|") + ); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : /\/\/.*$/ + }, { + token : "comment", + regex : /#.*$/ + }, { + token : "comment", // multi line comment + merge : true, + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", + regex : /[+\-]?\d+(?:(?:\.\d*)?(?:[eE][+\-]?\d+)?)?\b/ + }, { + token : "keyword.operator", + regex : /\+|=|\->/ + }, { + token : "punctuation.operator", + regex : /,|;/ + }, { + token : "paren.lparen", + regex : /[\[{]/ + }, { + token : "paren.rparen", + regex : /[\]}]/ + }, { + token: "comment", + regex: /^#!.*$/ + }, { + token: function(value) { + if (keywords.hasOwnProperty(value.toLowerCase())) { + return "keyword"; + } + else if (attributes.hasOwnProperty(value.toLowerCase())) { + return "variable"; + } + else { + return "text"; + } + }, + regex: "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qqstring" : [ + { + token : "string", + regex : '[^"\\\\]+', + merge : true + }, { + token : "string", + regex : "\\\\$", + next : "qqstring", + merge : true + }, { + token : "string", + regex : '"|$', + next : "start", + merge : true + } + ], + "qstring" : [ + { + token : "string", + regex : "[^'\\\\]+", + merge : true + }, { + token : "string", + regex : "\\\\$", + next : "qstring", + merge : true + }, { + token : "string", + regex : "'|$", + next : "start", + merge : true + } + ] + }; +}; + +oop.inherits(DotHighlightRules, TextHighlightRules); + +exports.DotHighlightRules = DotHighlightRules; + +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/dot",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/matching_brace_outdent","ace/mode/dot_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var DotHighlightRules = require("./dot_highlight_rules").DotHighlightRules; +var DotFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = DotHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new DotFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ["//", "#"]; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/dot"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-drools.js b/src/libs/ace/mode-drools.js new file mode 100755 index 0000000..5863afe --- /dev/null +++ b/src/libs/ace/mode-drools.js @@ -0,0 +1,457 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/java_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaHighlightRules = function() { + var keywords = ( + "abstract|continue|for|new|switch|" + + "assert|default|goto|package|synchronized|" + + "boolean|do|if|private|this|" + + "break|double|implements|protected|throw|" + + "byte|else|import|public|throws|" + + "case|enum|instanceof|return|transient|" + + "catch|extends|int|short|try|" + + "char|final|interface|static|void|" + + "class|finally|long|strictfp|volatile|" + + "const|float|native|super|while" + ); + + var buildinConstants = ("null|Infinity|NaN|undefined"); + + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": langClasses + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : /0(?:[xX][0-9a-fA-F][0-9a-fA-F_]*|[bB][01][01_]*)[LlSsDdFfYy]?\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d[\d_]*(?:(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?)?[LlSsDdFfYy]?\b/ + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(JavaHighlightRules, TextHighlightRules); + +exports.JavaHighlightRules = JavaHighlightRules; +}); + +ace.define("ace/mode/drools_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/java_highlight_rules","ace/mode/doc_comment_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules; +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; + +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; +var packageIdentifierRe = "[a-zA-Z\\$_\u00a1-\uffff][\\.a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var DroolsHighlightRules = function() { + + var keywords = ("date|effective|expires|lock|on|active|no|loop|auto|focus" + + "|activation|group|agenda|ruleflow|duration|timer|calendars|refract|direct" + + "|dialect|salience|enabled|attributes|extends|template" + + "|function|contains|matches|eval|excludes|soundslike" + + "|memberof|not|in|or|and|exists|forall|over|from|entry|point|accumulate|acc|collect" + + "|action|reverse|result|end|init|instanceof|extends|super|boolean|char|byte|short" + + "|int|long|float|double|this|void|class|new|case|final|if|else|for|while|do" + + "|default|try|catch|finally|switch|synchronized|return|throw|break|continue|assert" + + "|modify|static|public|protected|private|abstract|native|transient|volatile" + + "|strictfp|throws|interface|enum|implements|type|window|trait|no-loop|str" + ); + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": "null", + "support.class" : langClasses, + "support.function" : "retract|update|modify|insert" + }, "identifier"); + + var stringRules = function() { + return [{ + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }]; + }; + + + var basicPreRules = function(blockCommentRules) { + return [{ + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : blockCommentRules + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }]; + }; + + var blockCommentRules = function(returnRule) { + return [ + { + token : "comment.block", // closing comment + regex : "\\*\\/", + next : returnRule + }, { + defaultToken : "comment.block" + } + ]; + } + + var basicPostRules = function() { + return [{ + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }]; + }; + + + this.$rules = { + "start" : [].concat(basicPreRules("block.comment"), [ + { + token : "entity.name.type", + regex : "@[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : ["keyword","text","entity.name.type"], + regex : "(package)(\\s+)(" + packageIdentifierRe +")" + }, { + token : ["keyword","text","keyword","text","entity.name.type"], + regex : "(import)(\\s+)(function)(\\s+)(" + packageIdentifierRe +")" + }, { + token : ["keyword","text","entity.name.type"], + regex : "(import)(\\s+)(" + packageIdentifierRe +")" + }, { + token : ["keyword","text","entity.name.type","text","variable"], + regex : "(global)(\\s+)(" + packageIdentifierRe +")(\\s+)(" + identifierRe +")" + }, { + token : ["keyword","text","keyword","text","entity.name.type"], + regex : "(declare)(\\s+)(trait)(\\s+)(" + identifierRe +")" + }, { + token : ["keyword","text","entity.name.type"], + regex : "(declare)(\\s+)(" + identifierRe +")" + }, { + token : ["keyword","text","entity.name.type"], + regex : "(extends)(\\s+)(" + packageIdentifierRe +")" + }, { + token : ["keyword","text"], + regex : "(rule)(\\s+)", + next : "asset.name" + }], + stringRules(), + [{ + token : ["variable.other","text","text"], + regex : "(" + identifierRe + ")(\\s*)(:)" + }, { + token : ["keyword","text"], + regex : "(query)(\\s+)", + next : "asset.name" + }, { + token : ["keyword","text"], + regex : "(when)(\\s*)" + }, { + token : ["keyword","text"], + regex : "(then)(\\s*)", + next : "java-start" + }, { + token : "paren.lparen", + regex : /[\[({]/ + }, { + token : "paren.rparen", + regex : /[\])}]/ + }], basicPostRules()), + "block.comment" : blockCommentRules("start"), + "asset.name" : [ + { + token : "entity.name", + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "entity.name", + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "entity.name", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "start" + }] + }; + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + + this.embedRules(JavaHighlightRules, "java-", [ + { + token : "support.function", + regex: "\\b(insert|modify|retract|update)\\b" + }, { + token : "keyword", + regex: "\\bend\\b", + next : "start" + }]); + +}; + +oop.inherits(DroolsHighlightRules, TextHighlightRules); + +exports.DroolsHighlightRules = DroolsHighlightRules; +}); + +ace.define("ace/mode/folding/drools",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + this.foldingStartMarker = /\b(rule|declare|query|when|then)\b/; + this.foldingStopMarker = /\bend\b/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) { + var position = {row: row, column: line.length}; + var iterator = new TokenIterator(session, position.row, position.column); + var seek = "end"; + var token = iterator.getCurrentToken(); + if (token.value == "when") { + seek = "then"; + } + while (token) { + if (token.value == seek) { + return Range.fromPoints(position ,{ + row: iterator.getCurrentTokenRow(), + column: iterator.getCurrentTokenColumn() + }); + } + token = iterator.stepForward(); + } + } + + } + } + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/drools",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/drools_highlight_rules","ace/mode/folding/drools"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var DroolsHighlightRules = require("./drools_highlight_rules").DroolsHighlightRules; +var DroolsFoldMode = require("./folding/drools").FoldMode; + +var Mode = function() { + this.HighlightRules = DroolsHighlightRules; + this.foldingRules = new DroolsFoldMode(); + this.$behaviour = this.$defaultBehaviour; + +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.$id = "ace/mode/drools"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-eiffel.js b/src/libs/ace/mode-eiffel.js new file mode 100755 index 0000000..decf61d --- /dev/null +++ b/src/libs/ace/mode-eiffel.js @@ -0,0 +1,128 @@ +ace.define("ace/mode/eiffel_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var EiffelHighlightRules = function() { + var keywords = "across|agent|alias|all|attached|as|assign|attribute|check|" + + "class|convert|create|debug|deferred|detachable|do|else|elseif|end|" + + "ensure|expanded|export|external|feature|from|frozen|if|inherit|" + + "inspect|invariant|like|local|loop|not|note|obsolete|old|once|" + + "Precursor|redefine|rename|require|rescue|retry|select|separate|" + + "some|then|undefine|until|variant|when"; + + var operatorKeywords = "and|implies|or|xor"; + + var languageConstants = "Void"; + + var booleanConstants = "True|False"; + + var languageVariables = "Current|Result"; + + var keywordMapper = this.createKeywordMapper({ + "constant.language": languageConstants, + "constant.language.boolean": booleanConstants, + "variable.language": languageVariables, + "keyword.operator": operatorKeywords, + "keyword": keywords + }, "identifier", true); + + var simpleString = /(?:[^"%\b\f\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)+?/; + + this.$rules = { + "start": [{ + token : "string.quoted.other", // Aligned-verbatim-strings (verbatim option not supported) + regex : /"\[/, + next: "aligned_verbatim_string" + }, { + token : "string.quoted.other", // Non-aligned-verbatim-strings (verbatim option not supported) + regex : /"\{/, + next: "non-aligned_verbatim_string" + }, { + token : "string.quoted.double", + regex : /"(?:[^%\b\f\n\r\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)*?"/ + }, { + token : "comment.line.double-dash", + regex : /--.*/ + }, { + token : "constant.character", + regex : /'(?:[^%\b\f\n\r\t\v]|%[A-DFHLNQR-V%'"()<>]|%\/(?:0[xX][\da-fA-F](?:_*[\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\d(?:_*\d)*)\/)'/ + }, { + token : "constant.numeric", // hexa | octal | bin + regex : /\b0(?:[xX][\da-fA-F](?:_*[\da-fA-F])*|[cC][0-7](?:_*[0-7])*|[bB][01](?:_*[01])*)\b/ + }, { + token : "constant.numeric", + regex : /(?:\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?[eE][+-]?)?\d(?:_*\d)*|\d(?:_*\d)*\.?/ + }, { + token : "paren.lparen", + regex : /[\[({]|<<|\|\(/ + }, { + token : "paren.rparen", + regex : /[\])}]|>>|\|\)/ + }, { + token : "keyword.operator", // punctuation + regex : /:=|->|\.(?=\w)|[;,:?]/ + }, { + token : "keyword.operator", + regex : /\\\\|\|\.\.\||\.\.|\/[~\/]?|[><\/]=?|[-+*^=~]/ + }, { + token : function (v) { + var result = keywordMapper(v); + if (result === "identifier" && v === v.toUpperCase()) { + result = "entity.name.type"; + } + return result; + }, + regex : /[a-zA-Z][a-zA-Z\d_]*\b/ + }, { + token : "text", + regex : /\s+/ + } + ], + "aligned_verbatim_string" : [{ + token : "string", + regex : /]"/, + next : "start" + }, { + token : "string", + regex : simpleString + } + ], + "non-aligned_verbatim_string" : [{ + token : "string.quoted.other", + regex : /}"/, + next : "start" + }, { + token : "string.quoted.other", + regex : simpleString + } + ]}; +}; + +oop.inherits(EiffelHighlightRules, TextHighlightRules); + +exports.EiffelHighlightRules = EiffelHighlightRules; +}); + +ace.define("ace/mode/eiffel",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/eiffel_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var EiffelHighlightRules = require("./eiffel_highlight_rules").EiffelHighlightRules; + +var Mode = function() { + this.HighlightRules = EiffelHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.$id = "ace/mode/eiffel"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-ejs.js b/src/libs/ace/mode-ejs.js new file mode 100755 index 0000000..4309c8b --- /dev/null +++ b/src/libs/ace/mode-ejs.js @@ -0,0 +1,2999 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var constantOtherSymbol = exports.constantOtherSymbol = { + token : "constant.other.symbol.ruby", // symbol + regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?" +}; + +var qString = exports.qString = { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" +}; + +var qqString = exports.qqString = { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' +}; + +var tString = exports.tString = { + token : "string", // backtick string + regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]" +}; + +var constantNumericHex = exports.constantNumericHex = { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b" +}; + +var constantNumericFloat = exports.constantNumericFloat = { + token : "constant.numeric", // float + regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b" +}; + +var instanceVariable = exports.instanceVariable = { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" +}; + +var RubyHighlightRules = function() { + + var builtinFunctions = ( + "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" + + "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" + + "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" + + "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" + + "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" + + "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" + + "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" + + "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" + + "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" + + "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" + + "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" + + "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" + + "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" + + "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" + + "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" + + "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" + + "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" + + "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" + + "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" + + "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" + + "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" + + "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" + + "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" + + "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" + + "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" + + "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" + + "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" + + "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" + + "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" + + "has_many|has_one|belongs_to|has_and_belongs_to_many" + ); + + var keywords = ( + "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" + + "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" + + "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield" + ); + + var buildinConstants = ( + "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" + + "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING" + ); + + var builtinVariables = ( + "$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|" + + "$!|root_url|flash|session|cookies|params|request|response|logger|self" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "variable.language": builtinVariables, + "support.function": builtinFunctions, + "invalid.deprecated": "debugger" // TODO is this a remnant from js mode? + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment", // multi line comment + regex : "^=begin(?:$|\\s.*$)", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, + + [{ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren.lparen"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1) + return "paren.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.start", + regex : /"/, + push : [{ + token : "constant.language.escape", + regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/ + }, { + token : "paren.start", + regex : /#{/, + push : "start" + }, { + token : "string.end", + regex : /"/, + next : "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/ + }, { + token : "paren.start", + regex : /#{/, + push : "start" + }, { + token : "string.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : /'/, + push : [{ + token : "constant.language.escape", + regex : /\\['\\]/ + }, { + token : "string.end", + regex : /'/, + next : "pop" + }, { + defaultToken: "string" + }] + }], + + { + token : "text", // namespaces aren't symbols + regex : "::" + }, { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" + }, { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + + constantOtherSymbol, + constantNumericHex, + constantNumericFloat, + + { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "punctuation.separator.key-value", + regex : "=>" + }, { + stateName: "heredoc", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[3]); + return [ + {type:"constant", value: tokens[1]}, + {type:"string", value: tokens[2]}, + {type:"support.class", value: tokens[3]}, + {type:"string", value: tokens[4]} + ]; + }, + regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)", + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^ +" + }, { + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + regex : "$", + token : "empty", + next : function(currentState, stack) { + if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc") + return stack[0]; + return currentState; + } + }, { + token : "string.character", + regex : "\\B\\?." + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "^=end(?:$|\\s.*$)", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.normalizeRules(); +}; + +oop.inherits(RubyHighlightRules, TextHighlightRules); + +exports.RubyHighlightRules = RubyHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = RubyHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + var startingClassOrMethod = line.match(/^\s*(class|def|module)\s.*$/); + var startingDoBlock = line.match(/.*do(\s*|\s+\|.*\|\s*)$/); + var startingConditional = line.match(/^\s*(if|else|when)\s*/) + if (match || startingClassOrMethod || startingDoBlock || startingConditional) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return /^\s+(end|else)$/.test(line + input) || this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, session, row) { + var line = session.getLine(row); + if (/}/.test(line)) + return this.$outdent.autoOutdent(session, row); + var indent = this.$getIndent(line); + var prevLine = session.getLine(row - 1); + var prevIndent = this.$getIndent(prevLine); + var tab = session.getTabString(); + if (prevIndent.length <= indent.length) { + if (indent.slice(-tab.length) == tab) + session.remove(new Range(row, indent.length-tab.length, row, indent.length)); + } + }; + + this.$id = "ace/mode/ruby"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/ejs",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/javascript_highlight_rules","ace/lib/oop","ace/mode/html","ace/mode/javascript","ace/mode/css","ace/mode/ruby"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +var EjsHighlightRules = function(start, end) { + HtmlHighlightRules.call(this); + + if (!start) + start = "(?:<%|<\\?|{{)"; + if (!end) + end = "(?:%>|\\?>|}})"; + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token : "markup.list.meta.tag", + regex : start + "(?![>}])[-=]?", + push : "ejs-start" + }); + } + + this.embedRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "ejs-", [{ + token : "markup.list.meta.tag", + regex : "-?" + end, + next : "pop" + }, { + token: "comment", + regex: "//.*?" + end, + next: "pop" + }]); + + this.normalizeRules(); +}; + + +oop.inherits(EjsHighlightRules, HtmlHighlightRules); + +exports.EjsHighlightRules = EjsHighlightRules; + + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var RubyMode = require("./ruby").Mode; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = EjsHighlightRules; + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode, + "ejs-": JavaScriptMode + }); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + + this.$id = "ace/mode/ejs"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-elixir.js b/src/libs/ace/mode-elixir.js new file mode 100755 index 0000000..d8931b9 --- /dev/null +++ b/src/libs/ace/mode-elixir.js @@ -0,0 +1,494 @@ +ace.define("ace/mode/elixir_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ElixirHighlightRules = function() { + + this.$rules = { start: + [ { token: + [ 'meta.module.elixir', + 'keyword.control.module.elixir', + 'meta.module.elixir', + 'entity.name.type.module.elixir' ], + regex: '^(\\s*)(defmodule)(\\s+)((?:[A-Z]\\w*\\s*\\.\\s*)*[A-Z]\\w*)' }, + { token: 'comment.documentation.heredoc', + regex: '@(?:module|type)?doc (?:~[a-z])?"""', + push: + [ { token: 'comment.documentation.heredoc', + regex: '\\s*"""', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'comment.documentation.heredoc' } ], + comment: '@doc with heredocs is treated as documentation' }, + { token: 'comment.documentation.heredoc', + regex: '@(?:module|type)?doc ~[A-Z]"""', + push: + [ { token: 'comment.documentation.heredoc', + regex: '\\s*"""', + next: 'pop' }, + { defaultToken: 'comment.documentation.heredoc' } ], + comment: '@doc with heredocs is treated as documentation' }, + { token: 'comment.documentation.heredoc', + regex: '@(?:module|type)?doc (?:~[a-z])?\'\'\'', + push: + [ { token: 'comment.documentation.heredoc', + regex: '\\s*\'\'\'', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'comment.documentation.heredoc' } ], + comment: '@doc with heredocs is treated as documentation' }, + { token: 'comment.documentation.heredoc', + regex: '@(?:module|type)?doc ~[A-Z]\'\'\'', + push: + [ { token: 'comment.documentation.heredoc', + regex: '\\s*\'\'\'', + next: 'pop' }, + { defaultToken: 'comment.documentation.heredoc' } ], + comment: '@doc with heredocs is treated as documentation' }, + { token: 'comment.documentation.false', + regex: '@(?:module|type)?doc false', + comment: '@doc false is treated as documentation' }, + { token: 'comment.documentation.string', + regex: '@(?:module|type)?doc "', + push: + [ { token: 'comment.documentation.string', + regex: '"', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'comment.documentation.string' } ], + comment: '@doc with string is treated as documentation' }, + { token: 'keyword.control.elixir', + regex: '\\b(?:do|end|case|bc|lc|for|if|cond|unless|try|receive|fn|defmodule|defp?|defprotocol|defimpl|defrecord|defstruct|defmacrop?|defdelegate|defcallback|defmacrocallback|defexception|defoverridable|exit|after|rescue|catch|else|raise|throw|import|require|alias|use|quote|unquote|super)\\b(?![?!])', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?_?\\h)*|\\d(?>_?\\d)*(\\.(?![^[:space:][:digit:]])(?>_?\\d)*)?([eE][-+]?\\d(?>_?\\d)*)?|0b[01]+|0o[0-7]+)\\b' }, + { token: 'punctuation.definition.constant.elixir', + regex: ':\'', + push: + [ { token: 'punctuation.definition.constant.elixir', + regex: '\'', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'constant.other.symbol.single-quoted.elixir' } ] }, + { token: 'punctuation.definition.constant.elixir', + regex: ':"', + push: + [ { token: 'punctuation.definition.constant.elixir', + regex: '"', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'constant.other.symbol.double-quoted.elixir' } ] }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '(?:\'\'\')', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?>\'\'\')', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '^\\s*\'\'\'', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'support.function.variable.quoted.single.heredoc.elixir' } ], + comment: 'Single-quoted heredocs' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\'', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'support.function.variable.quoted.single.elixir' } ], + comment: 'single quoted string (allows for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '(?:""")', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?>""")', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '^\\s*"""', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.quoted.double.heredoc.elixir' } ], + comment: 'Double-quoted heredocs' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '"', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.quoted.double.elixir' } ], + comment: 'double quoted string (allows for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z](?:""")', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '~[a-z](?>""")', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '^\\s*"""', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.quoted.double.heredoc.elixir' } ], + comment: 'Double-quoted heredocs sigils' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z]\\{', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\}[a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z]\\[', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\][a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z]\\<', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\>[a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z]\\(', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\)[a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z][^\\w]', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '[^\\w][a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z](?:""")', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '~[A-Z](?>""")', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '^\\s*"""', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'Double-quoted heredocs sigils' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z]\\{', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\}[a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z]\\[', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\][a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z]\\<', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\>[a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z]\\(', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\)[a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z][^\\w]', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '[^\\w][a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: ['punctuation.definition.constant.elixir', 'constant.other.symbol.elixir'], + regex: '(:)([a-zA-Z_][\\w@]*(?:[?!]|=(?![>=]))?|\\<\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\-|\\|>|=>|~|~=|=|/|\\\\\\\\|\\*\\*?|\\.\\.?\\.?|>=?|<=?|&&?&?|\\+\\+?|\\-\\-?|\\|\\|?\\|?|\\!|@|\\%?\\{\\}|%|\\[\\]|\\^(?:\\^\\^)?)', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?[a-zA-Z_][\\w@]*(?>[?!]|=(?![>=]))?|\\<\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\-|\\|>|=>|~|~=|=|/|\\\\\\\\|\\*\\*?|\\.\\.?\\.?|>=?|<=?|&&?&?|\\+\\+?|\\-\\-?|\\|\\|?\\|?|\\!|@|\\%?\\{\\}|%|\\[\\]|\\^(\\^\\^)?)', + comment: 'symbols' }, + { token: 'punctuation.definition.constant.elixir', + regex: '(?:[a-zA-Z_][\\w@]*(?:[?!])?):(?!:)', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?>[a-zA-Z_][\\w@]*(?>[?!])?)(:)(?!:)', + comment: 'symbols' }, + { token: + [ 'punctuation.definition.comment.elixir', + 'comment.line.number-sign.elixir' ], + regex: '(#)(.*)' }, + { token: 'constant.numeric.elixir', + regex: '\\?(?:\\\\(?:x[\\da-fA-F]{1,2}(?![\\da-fA-F])\\b|[^xMC])|[^\\s\\\\])', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?=?' }, + { token: 'keyword.operator.bitwise.elixir', + regex: '\\|{3}|&{3}|\\^{3}|<{3}|>{3}|~{3}' }, + { token: 'keyword.operator.logical.elixir', + regex: '!+|\\bnot\\b|&&|\\band\\b|\\|\\||\\bor\\b|\\bxor\\b', + originalRegex: '(?<=[ \\t])!+|\\bnot\\b|&&|\\band\\b|\\|\\||\\bor\\b|\\bxor\\b' }, + { token: 'keyword.operator.arithmetic.elixir', + regex: '\\*|\\+|\\-|/' }, + { token: 'keyword.operator.other.elixir', + regex: '\\||\\+\\+|\\-\\-|\\*\\*|\\\\\\\\|\\<\\-|\\<\\>|\\<\\<|\\>\\>|\\:\\:|\\.\\.|\\|>|~|=>' }, + { token: 'keyword.operator.assignment.elixir', regex: '=' }, + { token: 'punctuation.separator.other.elixir', regex: ':' }, + { token: 'punctuation.separator.statement.elixir', + regex: '\\;' }, + { token: 'punctuation.separator.object.elixir', regex: ',' }, + { token: 'punctuation.separator.method.elixir', regex: '\\.' }, + { token: 'punctuation.section.scope.elixir', regex: '\\{|\\}' }, + { token: 'punctuation.section.array.elixir', regex: '\\[|\\]' }, + { token: 'punctuation.section.function.elixir', + regex: '\\(|\\)' } ], + '#escaped_char': + [ { token: 'constant.character.escape.elixir', + regex: '\\\\(?:x[\\da-fA-F]{1,2}|.)' } ], + '#interpolated_elixir': + [ { token: + [ 'source.elixir.embedded.source', + 'source.elixir.embedded.source.empty' ], + regex: '(#\\{)(\\})' }, + { todo: + { token: 'punctuation.section.embedded.elixir', + regex: '#\\{', + push: + [ { token: 'punctuation.section.embedded.elixir', + regex: '\\}', + next: 'pop' }, + { include: '#nest_curly_and_self' }, + { include: '$self' }, + { defaultToken: 'source.elixir.embedded.source' } ] } } ], + '#nest_curly_and_self': + [ { token: 'punctuation.section.scope.elixir', + regex: '\\{', + push: + [ { token: 'punctuation.section.scope.elixir', + regex: '\\}', + next: 'pop' }, + { include: '#nest_curly_and_self' } ] }, + { include: '$self' } ], + '#regex_sub': + [ { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { token: + [ 'punctuation.definition.arbitrary-repitition.elixir', + 'string.regexp.arbitrary-repitition.elixir', + 'string.regexp.arbitrary-repitition.elixir', + 'punctuation.definition.arbitrary-repitition.elixir' ], + regex: '(\\{)(\\d+)((?:,\\d+)?)(\\})' }, + { token: 'punctuation.definition.character-class.elixir', + regex: '\\[(?:\\^?\\])?', + push: + [ { token: 'punctuation.definition.character-class.elixir', + regex: '\\]', + next: 'pop' }, + { include: '#escaped_char' }, + { defaultToken: 'string.regexp.character-class.elixir' } ] }, + { token: 'punctuation.definition.group.elixir', + regex: '\\(', + push: + [ { token: 'punctuation.definition.group.elixir', + regex: '\\)', + next: 'pop' }, + { include: '#regex_sub' }, + { defaultToken: 'string.regexp.group.elixir' } ] }, + { token: + [ 'punctuation.definition.comment.elixir', + 'comment.line.number-sign.elixir' ], + regex: '(?:^|\\s)(#)(\\s[[a-zA-Z0-9,. \\t?!-][^\\x00-\\x7F]]*$)', + originalRegex: '(?<=^|\\s)(#)\\s[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$', + comment: 'We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.' } ] } + + this.normalizeRules(); +}; + +ElixirHighlightRules.metaData = { comment: 'Textmate bundle for Elixir Programming Language.', + fileTypes: [ 'ex', 'exs' ], + firstLineMatch: '^#!/.*\\belixir', + foldingStartMarker: '(after|else|catch|rescue|\\-\\>|\\{|\\[|do)\\s*$', + foldingStopMarker: '^\\s*((\\}|\\]|after|else|catch|rescue)\\s*$|end\\b)', + keyEquivalent: '^~E', + name: 'Elixir', + scopeName: 'source.elixir' } + + +oop.inherits(ElixirHighlightRules, TextHighlightRules); + +exports.ElixirHighlightRules = ElixirHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/elixir",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/elixir_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ElixirHighlightRules = require("./elixir_highlight_rules").ElixirHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = ElixirHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.$id = "ace/mode/elixir" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-elm.js b/src/libs/ace/mode-elm.js new file mode 100755 index 0000000..24406af --- /dev/null +++ b/src/libs/ace/mode-elm.js @@ -0,0 +1,299 @@ +ace.define("ace/mode/elm_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ElmHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "keyword": "as|case|class|data|default|deriving|do|else|export|foreign|" + + "hiding|jsevent|if|import|in|infix|infixl|infixr|instance|let|" + + "module|newtype|of|open|then|type|where|_|port|\u03BB" + }, "identifier"); + + var escapeRe = /\\(\d+|['"\\&trnbvf])/; + + var smallRe = /[a-z_]/.source; + var largeRe = /[A-Z]/.source; + var idRe = /[a-z_A-Z0-9']/.source; + + this.$rules = { + start: [{ + token: "string.start", + regex: '"', + next: "string" + }, { + token: "string.character", + regex: "'(?:" + escapeRe.source + "|.)'?" + }, { + regex: /0(?:[xX][0-9A-Fa-f]+|[oO][0-7]+)|\d+(\.\d+)?([eE][-+]?\d*)?/, + token: "constant.numeric" + }, { + token: "comment", + regex: "--.*" + }, { + token : "keyword", + regex : /\.\.|\||:|=|\\|"|->|<-|\u2192/ + }, { + token : "keyword.operator", + regex : /[-!#$%&*+.\/<=>?@\\^|~:\u03BB\u2192]+/ + }, { + token : "operator.punctuation", + regex : /[,;`]/ + }, { + regex : largeRe + idRe + "+\\.?", + token : function(value) { + if (value[value.length - 1] == ".") + return "entity.name.function"; + return "constant.language"; + } + }, { + regex : "^" + smallRe + idRe + "+", + token : function(value) { + return "constant.language"; + } + }, { + token : keywordMapper, + regex : "[\\w\\xff-\\u218e\\u2455-\\uffff]+\\b" + }, { + regex: "{-#?", + token: "comment.start", + onMatch: function(value, currentState, stack) { + this.next = value.length == 2 ? "blockComment" : "docComment"; + return this.token; + } + }, { + token: "variable.language", + regex: /\[markdown\|/, + next: "markdown" + }, { + token: "paren.lparen", + regex: /[\[({]/ + }, { + token: "paren.rparen", + regex: /[\])}]/ + } ], + markdown: [{ + regex: /\|\]/, + next: "start" + }, { + defaultToken : "string" + }], + blockComment: [{ + regex: "{-", + token: "comment.start", + push: "blockComment" + }, { + regex: "-}", + token: "comment.end", + next: "pop" + }, { + defaultToken: "comment" + }], + docComment: [{ + regex: "{-", + token: "comment.start", + push: "docComment" + }, { + regex: "-}", + token: "comment.end", + next: "pop" + }, { + defaultToken: "doc.comment" + }], + string: [{ + token: "constant.language.escape", + regex: escapeRe + }, { + token: "text", + regex: /\\(\s|$)/, + next: "stringGap" + }, { + token: "string.end", + regex: '"', + next: "start" + }, { + defaultToken: "string" + }], + stringGap: [{ + token: "text", + regex: /\\/, + next: "string" + }, { + token: "error", + regex: "", + next: "start" + }] + }; + + this.normalizeRules(); +}; + +oop.inherits(ElmHighlightRules, TextHighlightRules); + +exports.ElmHighlightRules = ElmHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/elm",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/elm_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HighlightRules = require("./elm_highlight_rules").ElmHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = HighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "{-", end: "-}", nestable: true}; + this.$id = "ace/mode/elm"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-erlang.js b/src/libs/ace/mode-erlang.js new file mode 100755 index 0000000..3554bf7 --- /dev/null +++ b/src/libs/ace/mode-erlang.js @@ -0,0 +1,1002 @@ +ace.define("ace/mode/erlang_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ErlangHighlightRules = function() { + + this.$rules = { start: + [ { include: '#module-directive' }, + { include: '#import-export-directive' }, + { include: '#behaviour-directive' }, + { include: '#record-directive' }, + { include: '#define-directive' }, + { include: '#macro-directive' }, + { include: '#directive' }, + { include: '#function' }, + { include: '#everything-else' } ], + '#atom': + [ { token: 'punctuation.definition.symbol.begin.erlang', + regex: '\'', + push: + [ { token: 'punctuation.definition.symbol.end.erlang', + regex: '\'', + next: 'pop' }, + { token: + [ 'punctuation.definition.escape.erlang', + 'constant.other.symbol.escape.erlang', + 'punctuation.definition.escape.erlang', + 'constant.other.symbol.escape.erlang', + 'constant.other.symbol.escape.erlang' ], + regex: '(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' }, + { token: 'invalid.illegal.atom.erlang', regex: '\\\\\\^?.?' }, + { defaultToken: 'constant.other.symbol.quoted.single.erlang' } ] }, + { token: 'constant.other.symbol.unquoted.erlang', + regex: '[a-z][a-zA-Z\\d@_]*' } ], + '#behaviour-directive': + [ { token: + [ 'meta.directive.behaviour.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.behaviour.erlang', + 'keyword.control.directive.behaviour.erlang', + 'meta.directive.behaviour.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.behaviour.erlang', + 'entity.name.type.class.behaviour.definition.erlang', + 'meta.directive.behaviour.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.behaviour.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(behaviour)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\))(\\s*)(\\.)' } ], + '#binary': + [ { token: 'punctuation.definition.binary.begin.erlang', + regex: '<<', + push: + [ { token: 'punctuation.definition.binary.end.erlang', + regex: '>>', + next: 'pop' }, + { token: + [ 'punctuation.separator.binary.erlang', + 'punctuation.separator.value-size.erlang' ], + regex: '(,)|(:)' }, + { include: '#internal-type-specifiers' }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.binary.erlang' } ] } ], + '#character': + [ { token: + [ 'punctuation.definition.character.erlang', + 'punctuation.definition.escape.erlang', + 'constant.character.escape.erlang', + 'punctuation.definition.escape.erlang', + 'constant.character.escape.erlang', + 'constant.character.escape.erlang' ], + regex: '(\\$)(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' }, + { token: 'invalid.illegal.character.erlang', + regex: '\\$\\\\\\^?.?' }, + { token: + [ 'punctuation.definition.character.erlang', + 'constant.character.erlang' ], + regex: '(\\$)(\\S)' }, + { token: 'invalid.illegal.character.erlang', regex: '\\$.?' } ], + '#comment': + [ { token: 'punctuation.definition.comment.erlang', + regex: '%.*$', + push_: + [ { token: 'comment.line.percentage.erlang', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.percentage.erlang' } ] } ], + '#define-directive': + [ { token: + [ 'meta.directive.define.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.define.erlang', + 'keyword.control.directive.define.erlang', + 'meta.directive.define.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.define.erlang', + 'entity.name.function.macro.definition.erlang', + 'meta.directive.define.erlang', + 'punctuation.separator.parameters.erlang' ], + regex: '^(\\s*)(-)(\\s*)(define)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(,)', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.define.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\))(\\s*)(\\.)', + next: 'pop' }, + { include: '#everything-else' }, + { defaultToken: 'meta.directive.define.erlang' } ] }, + { token: 'meta.directive.define.erlang', + regex: '(?=^\\s*-\\s*define\\s*\\(\\s*[a-zA-Z\\d@_]+\\s*\\()', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.define.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\))(\\s*)(\\.)', + next: 'pop' }, + { token: + [ 'text', + 'punctuation.section.directive.begin.erlang', + 'text', + 'keyword.control.directive.define.erlang', + 'text', + 'punctuation.definition.parameters.begin.erlang', + 'text', + 'entity.name.function.macro.definition.erlang', + 'text', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '^(\\s*)(-)(\\s*)(define)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(\\()', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'text', + 'punctuation.separator.parameters.erlang' ], + regex: '(\\))(\\s*)(,)', + next: 'pop' }, + { token: 'punctuation.separator.parameters.erlang', regex: ',' }, + { include: '#everything-else' } ] }, + { token: 'punctuation.separator.define.erlang', + regex: '\\|\\||\\||:|;|,|\\.|->' }, + { include: '#everything-else' }, + { defaultToken: 'meta.directive.define.erlang' } ] } ], + '#directive': + [ { token: + [ 'meta.directive.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.erlang', + 'keyword.control.directive.erlang', + 'meta.directive.erlang', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '^(\\s*)(-)(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\(?)', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\)?)(\\s*)(\\.)', + next: 'pop' }, + { include: '#everything-else' }, + { defaultToken: 'meta.directive.erlang' } ] }, + { token: + [ 'meta.directive.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.erlang', + 'keyword.control.directive.erlang', + 'meta.directive.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\.)' } ], + '#everything-else': + [ { include: '#comment' }, + { include: '#record-usage' }, + { include: '#macro-usage' }, + { include: '#expression' }, + { include: '#keyword' }, + { include: '#textual-operator' }, + { include: '#function-call' }, + { include: '#tuple' }, + { include: '#list' }, + { include: '#binary' }, + { include: '#parenthesized-expression' }, + { include: '#character' }, + { include: '#number' }, + { include: '#atom' }, + { include: '#string' }, + { include: '#symbolic-operator' }, + { include: '#variable' } ], + '#expression': + [ { token: 'keyword.control.if.erlang', + regex: '\\bif\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.if.erlang' } ] }, + { token: 'keyword.control.case.erlang', + regex: '\\bcase\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.case.erlang' } ] }, + { token: 'keyword.control.receive.erlang', + regex: '\\breceive\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.receive.erlang' } ] }, + { token: + [ 'keyword.control.fun.erlang', + 'text', + 'entity.name.type.class.module.erlang', + 'text', + 'punctuation.separator.module-function.erlang', + 'text', + 'entity.name.function.erlang', + 'text', + 'punctuation.separator.function-arity.erlang' ], + regex: '\\b(fun)(\\s*)(?:([a-z][a-zA-Z\\d@_]*)(\\s*)(:)(\\s*))?([a-z][a-zA-Z\\d@_]*)(\\s*)(/)' }, + { token: 'keyword.control.fun.erlang', + regex: '\\bfun\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { token: 'text', + regex: '(?=\\()', + push: + [ { token: 'punctuation.separator.clauses.erlang', + regex: ';|(?=\\bend\\b)', + next: 'pop' }, + { include: '#internal-function-parts' } ] }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.fun.erlang' } ] }, + { token: 'keyword.control.try.erlang', + regex: '\\btry\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.try.erlang' } ] }, + { token: 'keyword.control.begin.erlang', + regex: '\\bbegin\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#internal-expression-punctuation' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.begin.erlang' } ] }, + { token: 'keyword.control.query.erlang', + regex: '\\bquery\\b', + push: + [ { token: 'keyword.control.end.erlang', + regex: '\\bend\\b', + next: 'pop' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.query.erlang' } ] } ], + '#function': + [ { token: + [ 'meta.function.erlang', + 'entity.name.function.definition.erlang', + 'meta.function.erlang' ], + regex: '^(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(?=\\()', + push: + [ { token: 'punctuation.terminator.function.erlang', + regex: '\\.', + next: 'pop' }, + { token: [ 'text', 'entity.name.function.erlang', 'text' ], + regex: '^(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(?=\\()' }, + { token: 'text', + regex: '(?=\\()', + push: + [ { token: 'punctuation.separator.clauses.erlang', + regex: ';|(?=\\.)', + next: 'pop' }, + { include: '#parenthesized-expression' }, + { include: '#internal-function-parts' } ] }, + { include: '#everything-else' }, + { defaultToken: 'meta.function.erlang' } ] } ], + '#function-call': + [ { token: 'meta.function-call.erlang', + regex: '(?=(?:[a-z][a-zA-Z\\d@_]*|\'[^\']*\')\\s*(?:\\(|:\\s*(?:[a-z][a-zA-Z\\d@_]*|\'[^\']*\')\\s*\\())', + push: + [ { token: 'punctuation.definition.parameters.end.erlang', + regex: '\\)', + next: 'pop' }, + { token: + [ 'entity.name.type.class.module.erlang', + 'text', + 'punctuation.separator.module-function.erlang', + 'text', + 'entity.name.function.guard.erlang', + 'text', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '(?:(erlang)(\\s*)(:)(\\s*))?(is_atom|is_binary|is_constant|is_float|is_function|is_integer|is_list|is_number|is_pid|is_port|is_reference|is_tuple|is_record|abs|element|hd|length|node|round|self|size|tl|trunc)(\\s*)(\\()', + push: + [ { token: 'text', regex: '(?=\\))', next: 'pop' }, + { token: 'punctuation.separator.parameters.erlang', regex: ',' }, + { include: '#everything-else' } ] }, + { token: + [ 'entity.name.type.class.module.erlang', + 'text', + 'punctuation.separator.module-function.erlang', + 'text', + 'entity.name.function.erlang', + 'text', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '(?:([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(:)(\\s*))?([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(\\()', + push: + [ { token: 'text', regex: '(?=\\))', next: 'pop' }, + { token: 'punctuation.separator.parameters.erlang', regex: ',' }, + { include: '#everything-else' } ] }, + { defaultToken: 'meta.function-call.erlang' } ] } ], + '#import-export-directive': + [ { token: + [ 'meta.directive.import.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.import.erlang', + 'keyword.control.directive.import.erlang', + 'meta.directive.import.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.import.erlang', + 'entity.name.type.class.module.erlang', + 'meta.directive.import.erlang', + 'punctuation.separator.parameters.erlang' ], + regex: '^(\\s*)(-)(\\s*)(import)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(,)', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.import.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\))(\\s*)(\\.)', + next: 'pop' }, + { include: '#internal-function-list' }, + { defaultToken: 'meta.directive.import.erlang' } ] }, + { token: + [ 'meta.directive.export.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.export.erlang', + 'keyword.control.directive.export.erlang', + 'meta.directive.export.erlang', + 'punctuation.definition.parameters.begin.erlang' ], + regex: '^(\\s*)(-)(\\s*)(export)(\\s*)(\\()', + push: + [ { token: + [ 'punctuation.definition.parameters.end.erlang', + 'meta.directive.export.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\))(\\s*)(\\.)', + next: 'pop' }, + { include: '#internal-function-list' }, + { defaultToken: 'meta.directive.export.erlang' } ] } ], + '#internal-expression-punctuation': + [ { token: + [ 'punctuation.separator.clause-head-body.erlang', + 'punctuation.separator.clauses.erlang', + 'punctuation.separator.expressions.erlang' ], + regex: '(->)|(;)|(,)' } ], + '#internal-function-list': + [ { token: 'punctuation.definition.list.begin.erlang', + regex: '\\[', + push: + [ { token: 'punctuation.definition.list.end.erlang', + regex: '\\]', + next: 'pop' }, + { token: + [ 'entity.name.function.erlang', + 'text', + 'punctuation.separator.function-arity.erlang' ], + regex: '([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(/)', + push: + [ { token: 'punctuation.separator.list.erlang', + regex: ',|(?=\\])', + next: 'pop' }, + { include: '#everything-else' } ] }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.list.function.erlang' } ] } ], + '#internal-function-parts': + [ { token: 'text', + regex: '(?=\\()', + push: + [ { token: 'punctuation.separator.clause-head-body.erlang', + regex: '->', + next: 'pop' }, + { token: 'punctuation.definition.parameters.begin.erlang', + regex: '\\(', + push: + [ { token: 'punctuation.definition.parameters.end.erlang', + regex: '\\)', + next: 'pop' }, + { token: 'punctuation.separator.parameters.erlang', regex: ',' }, + { include: '#everything-else' } ] }, + { token: 'punctuation.separator.guards.erlang', regex: ',|;' }, + { include: '#everything-else' } ] }, + { token: 'punctuation.separator.expressions.erlang', + regex: ',' }, + { include: '#everything-else' } ], + '#internal-record-body': + [ { token: 'punctuation.definition.class.record.begin.erlang', + regex: '\\{', + push: + [ { token: 'meta.structure.record.erlang', + regex: '(?=\\})', + next: 'pop' }, + { token: + [ 'variable.other.field.erlang', + 'variable.language.omitted.field.erlang', + 'text', + 'keyword.operator.assignment.erlang' ], + regex: '(?:([a-z][a-zA-Z\\d@_]*|\'[^\']*\')|(_))(\\s*)(=|::)', + push: + [ { token: 'punctuation.separator.class.record.erlang', + regex: ',|(?=\\})', + next: 'pop' }, + { include: '#everything-else' } ] }, + { token: + [ 'variable.other.field.erlang', + 'text', + 'punctuation.separator.class.record.erlang' ], + regex: '([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)((?:,)?)' }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.record.erlang' } ] } ], + '#internal-type-specifiers': + [ { token: 'punctuation.separator.value-type.erlang', + regex: '/', + push: + [ { token: 'text', regex: '(?=,|:|>>)', next: 'pop' }, + { token: + [ 'storage.type.erlang', + 'storage.modifier.signedness.erlang', + 'storage.modifier.endianness.erlang', + 'storage.modifier.unit.erlang', + 'punctuation.separator.type-specifiers.erlang' ], + regex: '(integer|float|binary|bytes|bitstring|bits)|(signed|unsigned)|(big|little|native)|(unit)|(-)' } ] } ], + '#keyword': + [ { token: 'keyword.control.erlang', + regex: '\\b(?:after|begin|case|catch|cond|end|fun|if|let|of|query|try|receive|when)\\b' } ], + '#list': + [ { token: 'punctuation.definition.list.begin.erlang', + regex: '\\[', + push: + [ { token: 'punctuation.definition.list.end.erlang', + regex: '\\]', + next: 'pop' }, + { token: 'punctuation.separator.list.erlang', + regex: '\\||\\|\\||,' }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.list.erlang' } ] } ], + '#macro-directive': + [ { token: + [ 'meta.directive.ifdef.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.ifdef.erlang', + 'keyword.control.directive.ifdef.erlang', + 'meta.directive.ifdef.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.ifdef.erlang', + 'entity.name.function.macro.erlang', + 'meta.directive.ifdef.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.ifdef.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(ifdef)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' }, + { token: + [ 'meta.directive.ifndef.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.ifndef.erlang', + 'keyword.control.directive.ifndef.erlang', + 'meta.directive.ifndef.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.ifndef.erlang', + 'entity.name.function.macro.erlang', + 'meta.directive.ifndef.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.ifndef.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(ifndef)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' }, + { token: + [ 'meta.directive.undef.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.undef.erlang', + 'keyword.control.directive.undef.erlang', + 'meta.directive.undef.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.undef.erlang', + 'entity.name.function.macro.erlang', + 'meta.directive.undef.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.undef.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(undef)(\\s*)(\\()(\\s*)([a-zA-Z\\d@_]+)(\\s*)(\\))(\\s*)(\\.)' } ], + '#macro-usage': + [ { token: + [ 'keyword.operator.macro.erlang', + 'meta.macro-usage.erlang', + 'entity.name.function.macro.erlang' ], + regex: '(\\?\\??)(\\s*)([a-zA-Z\\d@_]+)' } ], + '#module-directive': + [ { token: + [ 'meta.directive.module.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.module.erlang', + 'keyword.control.directive.module.erlang', + 'meta.directive.module.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.module.erlang', + 'entity.name.type.class.module.definition.erlang', + 'meta.directive.module.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.module.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '^(\\s*)(-)(\\s*)(module)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*)(\\s*)(\\))(\\s*)(\\.)' } ], + '#number': + [ { token: 'text', + regex: '(?=\\d)', + push: + [ { token: 'text', regex: '(?!\\d)', next: 'pop' }, + { token: + [ 'constant.numeric.float.erlang', + 'punctuation.separator.integer-float.erlang', + 'constant.numeric.float.erlang', + 'punctuation.separator.float-exponent.erlang' ], + regex: '(\\d+)(\\.)(\\d+)((?:[eE][\\+\\-]?\\d+)?)' }, + { token: + [ 'constant.numeric.integer.binary.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.binary.erlang' ], + regex: '(2)(#)([0-1]+)' }, + { token: + [ 'constant.numeric.integer.base-3.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-3.erlang' ], + regex: '(3)(#)([0-2]+)' }, + { token: + [ 'constant.numeric.integer.base-4.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-4.erlang' ], + regex: '(4)(#)([0-3]+)' }, + { token: + [ 'constant.numeric.integer.base-5.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-5.erlang' ], + regex: '(5)(#)([0-4]+)' }, + { token: + [ 'constant.numeric.integer.base-6.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-6.erlang' ], + regex: '(6)(#)([0-5]+)' }, + { token: + [ 'constant.numeric.integer.base-7.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-7.erlang' ], + regex: '(7)(#)([0-6]+)' }, + { token: + [ 'constant.numeric.integer.octal.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.octal.erlang' ], + regex: '(8)(#)([0-7]+)' }, + { token: + [ 'constant.numeric.integer.base-9.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-9.erlang' ], + regex: '(9)(#)([0-8]+)' }, + { token: + [ 'constant.numeric.integer.decimal.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.decimal.erlang' ], + regex: '(10)(#)(\\d+)' }, + { token: + [ 'constant.numeric.integer.base-11.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-11.erlang' ], + regex: '(11)(#)([\\daA]+)' }, + { token: + [ 'constant.numeric.integer.base-12.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-12.erlang' ], + regex: '(12)(#)([\\da-bA-B]+)' }, + { token: + [ 'constant.numeric.integer.base-13.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-13.erlang' ], + regex: '(13)(#)([\\da-cA-C]+)' }, + { token: + [ 'constant.numeric.integer.base-14.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-14.erlang' ], + regex: '(14)(#)([\\da-dA-D]+)' }, + { token: + [ 'constant.numeric.integer.base-15.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-15.erlang' ], + regex: '(15)(#)([\\da-eA-E]+)' }, + { token: + [ 'constant.numeric.integer.hexadecimal.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.hexadecimal.erlang' ], + regex: '(16)(#)([\\da-fA-F]+)' }, + { token: + [ 'constant.numeric.integer.base-17.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-17.erlang' ], + regex: '(17)(#)([\\da-gA-G]+)' }, + { token: + [ 'constant.numeric.integer.base-18.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-18.erlang' ], + regex: '(18)(#)([\\da-hA-H]+)' }, + { token: + [ 'constant.numeric.integer.base-19.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-19.erlang' ], + regex: '(19)(#)([\\da-iA-I]+)' }, + { token: + [ 'constant.numeric.integer.base-20.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-20.erlang' ], + regex: '(20)(#)([\\da-jA-J]+)' }, + { token: + [ 'constant.numeric.integer.base-21.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-21.erlang' ], + regex: '(21)(#)([\\da-kA-K]+)' }, + { token: + [ 'constant.numeric.integer.base-22.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-22.erlang' ], + regex: '(22)(#)([\\da-lA-L]+)' }, + { token: + [ 'constant.numeric.integer.base-23.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-23.erlang' ], + regex: '(23)(#)([\\da-mA-M]+)' }, + { token: + [ 'constant.numeric.integer.base-24.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-24.erlang' ], + regex: '(24)(#)([\\da-nA-N]+)' }, + { token: + [ 'constant.numeric.integer.base-25.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-25.erlang' ], + regex: '(25)(#)([\\da-oA-O]+)' }, + { token: + [ 'constant.numeric.integer.base-26.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-26.erlang' ], + regex: '(26)(#)([\\da-pA-P]+)' }, + { token: + [ 'constant.numeric.integer.base-27.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-27.erlang' ], + regex: '(27)(#)([\\da-qA-Q]+)' }, + { token: + [ 'constant.numeric.integer.base-28.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-28.erlang' ], + regex: '(28)(#)([\\da-rA-R]+)' }, + { token: + [ 'constant.numeric.integer.base-29.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-29.erlang' ], + regex: '(29)(#)([\\da-sA-S]+)' }, + { token: + [ 'constant.numeric.integer.base-30.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-30.erlang' ], + regex: '(30)(#)([\\da-tA-T]+)' }, + { token: + [ 'constant.numeric.integer.base-31.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-31.erlang' ], + regex: '(31)(#)([\\da-uA-U]+)' }, + { token: + [ 'constant.numeric.integer.base-32.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-32.erlang' ], + regex: '(32)(#)([\\da-vA-V]+)' }, + { token: + [ 'constant.numeric.integer.base-33.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-33.erlang' ], + regex: '(33)(#)([\\da-wA-W]+)' }, + { token: + [ 'constant.numeric.integer.base-34.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-34.erlang' ], + regex: '(34)(#)([\\da-xA-X]+)' }, + { token: + [ 'constant.numeric.integer.base-35.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-35.erlang' ], + regex: '(35)(#)([\\da-yA-Y]+)' }, + { token: + [ 'constant.numeric.integer.base-36.erlang', + 'punctuation.separator.base-integer.erlang', + 'constant.numeric.integer.base-36.erlang' ], + regex: '(36)(#)([\\da-zA-Z]+)' }, + { token: 'invalid.illegal.integer.erlang', + regex: '\\d+#[\\da-zA-Z]+' }, + { token: 'constant.numeric.integer.decimal.erlang', + regex: '\\d+' } ] } ], + '#parenthesized-expression': + [ { token: 'punctuation.section.expression.begin.erlang', + regex: '\\(', + push: + [ { token: 'punctuation.section.expression.end.erlang', + regex: '\\)', + next: 'pop' }, + { include: '#everything-else' }, + { defaultToken: 'meta.expression.parenthesized' } ] } ], + '#record-directive': + [ { token: + [ 'meta.directive.record.erlang', + 'punctuation.section.directive.begin.erlang', + 'meta.directive.record.erlang', + 'keyword.control.directive.import.erlang', + 'meta.directive.record.erlang', + 'punctuation.definition.parameters.begin.erlang', + 'meta.directive.record.erlang', + 'entity.name.type.class.record.definition.erlang', + 'meta.directive.record.erlang', + 'punctuation.separator.parameters.erlang' ], + regex: '^(\\s*)(-)(\\s*)(record)(\\s*)(\\()(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(,)', + push: + [ { token: + [ 'punctuation.definition.class.record.end.erlang', + 'meta.directive.record.erlang', + 'punctuation.definition.parameters.end.erlang', + 'meta.directive.record.erlang', + 'punctuation.section.directive.end.erlang' ], + regex: '(\\})(\\s*)(\\))(\\s*)(\\.)', + next: 'pop' }, + { include: '#internal-record-body' }, + { defaultToken: 'meta.directive.record.erlang' } ] } ], + '#record-usage': + [ { token: + [ 'keyword.operator.record.erlang', + 'meta.record-usage.erlang', + 'entity.name.type.class.record.erlang', + 'meta.record-usage.erlang', + 'punctuation.separator.record-field.erlang', + 'meta.record-usage.erlang', + 'variable.other.field.erlang' ], + regex: '(#)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')(\\s*)(\\.)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')' }, + { token: + [ 'keyword.operator.record.erlang', + 'meta.record-usage.erlang', + 'entity.name.type.class.record.erlang' ], + regex: '(#)(\\s*)([a-z][a-zA-Z\\d@_]*|\'[^\']*\')', + push: + [ { token: 'punctuation.definition.class.record.end.erlang', + regex: '\\}', + next: 'pop' }, + { include: '#internal-record-body' }, + { defaultToken: 'meta.record-usage.erlang' } ] } ], + '#string': + [ { token: 'punctuation.definition.string.begin.erlang', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.erlang', + regex: '"', + next: 'pop' }, + { token: + [ 'punctuation.definition.escape.erlang', + 'constant.character.escape.erlang', + 'punctuation.definition.escape.erlang', + 'constant.character.escape.erlang', + 'constant.character.escape.erlang' ], + regex: '(\\\\)(?:([bdefnrstv\\\\\'"])|(\\^)([@-_])|([0-7]{1,3}))' }, + { token: 'invalid.illegal.string.erlang', regex: '\\\\\\^?.?' }, + { token: + [ 'punctuation.definition.placeholder.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'constant.other.placeholder.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'constant.other.placeholder.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'constant.other.placeholder.erlang', + 'constant.other.placeholder.erlang' ], + regex: '(~)(?:((?:\\-)?)(\\d+)|(\\*))?(?:(\\.)(?:(\\d+)|(\\*)))?(?:(\\.)(?:(\\*)|(.)))?([~cfegswpWPBX#bx\\+ni])' }, + { token: + [ 'punctuation.definition.placeholder.erlang', + 'punctuation.separator.placeholder-parts.erlang', + 'constant.other.placeholder.erlang', + 'constant.other.placeholder.erlang' ], + regex: '(~)((?:\\*)?)((?:\\d+)?)([~du\\-#fsacl])' }, + { token: 'invalid.illegal.string.erlang', regex: '~.?' }, + { defaultToken: 'string.quoted.double.erlang' } ] } ], + '#symbolic-operator': + [ { token: 'keyword.operator.symbolic.erlang', + regex: '\\+\\+|\\+|--|-|\\*|/=|/|=/=|=:=|==|=<|=|<-|<|>=|>|!|::' } ], + '#textual-operator': + [ { token: 'keyword.operator.textual.erlang', + regex: '\\b(?:andalso|band|and|bxor|xor|bor|orelse|or|bnot|not|bsl|bsr|div|rem)\\b' } ], + '#tuple': + [ { token: 'punctuation.definition.tuple.begin.erlang', + regex: '\\{', + push: + [ { token: 'punctuation.definition.tuple.end.erlang', + regex: '\\}', + next: 'pop' }, + { token: 'punctuation.separator.tuple.erlang', regex: ',' }, + { include: '#everything-else' }, + { defaultToken: 'meta.structure.tuple.erlang' } ] } ], + '#variable': + [ { token: [ 'variable.other.erlang', 'variable.language.omitted.erlang' ], + regex: '(_[a-zA-Z\\d@_]+|[A-Z][a-zA-Z\\d@_]*)|(_)' } ] } + + this.normalizeRules(); +}; + +ErlangHighlightRules.metaData = { comment: 'The recognition of function definitions and compiler directives (such as module, record and macro definitions) requires that each of the aforementioned constructs must be the first string inside a line (except for whitespace). Also, the function/module/record/macro names must be given unquoted. -- desp', + fileTypes: [ 'erl', 'hrl' ], + keyEquivalent: '^~E', + name: 'Erlang', + scopeName: 'source.erlang' } + + +oop.inherits(ErlangHighlightRules, TextHighlightRules); + +exports.ErlangHighlightRules = ErlangHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/erlang",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/erlang_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ErlangHighlightRules = require("./erlang_highlight_rules").ErlangHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = ErlangHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "%"; + this.blockComment = null; + this.$id = "ace/mode/erlang"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-forth.js b/src/libs/ace/mode-forth.js new file mode 100755 index 0000000..f960fd6 --- /dev/null +++ b/src/libs/ace/mode-forth.js @@ -0,0 +1,290 @@ +ace.define("ace/mode/forth_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ForthHighlightRules = function() { + + this.$rules = { start: [ { include: '#forth' } ], + '#comment': + [ { token: 'comment.line.double-dash.forth', + regex: '(?:^|\\s)--\\s.*$', + comment: 'line comments for iForth' }, + { token: 'comment.line.backslash.forth', + regex: '(?:^|\\s)\\\\[\\s\\S]*$', + comment: 'ANSI line comment' }, + { token: 'comment.line.backslash-g.forth', + regex: '(?:^|\\s)\\\\[Gg] .*$', + comment: 'gForth line comment' }, + { token: 'comment.block.forth', + regex: '(?:^|\\s)\\(\\*(?=\\s|$)', + push: + [ { token: 'comment.block.forth', + regex: '(?:^|\\s)\\*\\)(?=\\s|$)', + next: 'pop' }, + { defaultToken: 'comment.block.forth' } ], + comment: 'multiline comments for iForth' }, + { token: 'comment.block.documentation.forth', + regex: '\\bDOC\\b', + caseInsensitive: true, + push: + [ { token: 'comment.block.documentation.forth', + regex: '\\bENDDOC\\b', + caseInsensitive: true, + next: 'pop' }, + { defaultToken: 'comment.block.documentation.forth' } ], + comment: 'documentation comments for iForth' }, + { token: 'comment.line.parentheses.forth', + regex: '(?:^|\\s)\\.?\\( [^)]*\\)', + comment: 'ANSI line comment' } ], + '#constant': + [ { token: 'constant.language.forth', + regex: '(?:^|\\s)(?:TRUE|FALSE|BL|PI|CELL|C/L|R/O|W/O|R/W)(?=\\s|$)', + caseInsensitive: true}, + { token: 'constant.numeric.forth', + regex: '(?:^|\\s)[$#%]?[-+]?[0-9]+(?:\\.[0-9]*e-?[0-9]+|\\.?[0-9a-fA-F]*)(?=\\s|$)'}, + { token: 'constant.character.forth', + regex: '(?:^|\\s)(?:[&^]\\S|(?:"|\')\\S(?:"|\'))(?=\\s|$)'}], + '#forth': + [ { include: '#constant' }, + { include: '#comment' }, + { include: '#string' }, + { include: '#word' }, + { include: '#variable' }, + { include: '#storage' }, + { include: '#word-def' } ], + '#storage': + [ { token: 'storage.type.forth', + regex: '(?:^|\\s)(?:2CONSTANT|2VARIABLE|ALIAS|CONSTANT|CREATE-INTERPRET/COMPILE[:]?|CREATE|DEFER|FCONSTANT|FIELD|FVARIABLE|USER|VALUE|VARIABLE|VOCABULARY)(?=\\s|$)', + caseInsensitive: true}], + '#string': + [ { token: 'string.quoted.double.forth', + regex: '(ABORT" |BREAK" |\\." |C" |0"|S\\\\?" )([^"]+")', + caseInsensitive: true}, + { token: 'string.unquoted.forth', + regex: '(?:INCLUDE|NEEDS|REQUIRE|USE)[ ]\\S+(?=\\s|$)', + caseInsensitive: true}], + '#variable': + [ { token: 'variable.language.forth', + regex: '\\b(?:I|J)\\b', + caseInsensitive: true } ], + '#word': + [ { token: 'keyword.control.immediate.forth', + regex: '(?:^|\\s)\\[(?:\\?DO|\\+LOOP|AGAIN|BEGIN|DEFINED|DO|ELSE|ENDIF|FOR|IF|IFDEF|IFUNDEF|LOOP|NEXT|REPEAT|THEN|UNTIL|WHILE)\\](?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.other.immediate.forth', + regex: '(?:^|\\s)(?:COMPILE-ONLY|IMMEDIATE|IS|RESTRICT|TO|WHAT\'S|])(?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.control.compile-only.forth', + regex: '(?:^|\\s)(?:-DO|\\-LOOP|\\?DO|\\?LEAVE|\\+DO|\\+LOOP|ABORT\\"|AGAIN|AHEAD|BEGIN|CASE|DO|ELSE|ENDCASE|ENDIF|ENDOF|ENDTRY\\-IFERROR|ENDTRY|FOR|IF|IFERROR|LEAVE|LOOP|NEXT|RECOVER|REPEAT|RESTORE|THEN|TRY|U\\-DO|U\\+DO|UNTIL|WHILE)(?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.other.compile-only.forth', + regex: '(?:^|\\s)(?:\\?DUP-0=-IF|\\?DUP-IF|\\)|\\[|\\[\'\\]|\\[CHAR\\]|\\[COMPILE\\]|\\[IS\\]|\\[TO\\]||DEFERS|DOES>|INTERPRETATION>|OF|POSTPONE)(?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.other.non-immediate.forth', + regex: '(?:^|\\s)(?:\'|||CHAR|END-STRUCT|INCLUDE[D]?|LOAD|NEEDS|REQUIRE[D]?|REVISION|SEE|STRUCT|THRU|USE)(?=\\s|$)', + caseInsensitive: true}, + { token: 'keyword.other.warning.forth', + regex: '(?:^|\\s)(?:~~|BREAK:|BREAK"|DBG)(?=\\s|$)', + caseInsensitive: true}], + '#word-def': + [ { token: + [ 'keyword.other.compile-only.forth', + 'keyword.other.compile-only.forth', + 'meta.block.forth', + 'entity.name.function.forth' ], + regex: '(:NONAME)|(^:|\\s:)(\\s)(\\S+)(?=\\s|$)', + caseInsensitive: true, + push: + [ { token: 'keyword.other.compile-only.forth', + regex: ';(?:CODE)?', + caseInsensitive: true, + next: 'pop' }, + { include: '#constant' }, + { include: '#comment' }, + { include: '#string' }, + { include: '#word' }, + { include: '#variable' }, + { include: '#storage' }, + { defaultToken: 'meta.block.forth' } ] } ] } + + this.normalizeRules(); +}; + +ForthHighlightRules.metaData = { fileTypes: [ 'frt', 'fs', 'ldr', 'fth', '4th' ], + foldingStartMarker: '/\\*\\*|\\{\\s*$', + foldingStopMarker: '\\*\\*/|^\\s*\\}', + keyEquivalent: '^~F', + name: 'Forth', + scopeName: 'source.forth' } + + +oop.inherits(ForthHighlightRules, TextHighlightRules); + +exports.ForthHighlightRules = ForthHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/forth",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/forth_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ForthHighlightRules = require("./forth_highlight_rules").ForthHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = ForthHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = null; + this.$id = "ace/mode/forth"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-fortran.js b/src/libs/ace/mode-fortran.js new file mode 100755 index 0000000..3f2c5bd --- /dev/null +++ b/src/libs/ace/mode-fortran.js @@ -0,0 +1,423 @@ +ace.define("ace/mode/fortran_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var FortranHighlightRules = function() { + + var keywords = ( + "call|case|contains|continue|cycle|do|else|elseif|end|enddo|endif|function|"+ + "if|implicit|in|include|inout|intent|module|none|only|out|print|program|return|"+ + "select|status|stop|subroutine|" + + "return|then|use|while|write|"+ + "CALL|CASE|CONTAINS|CONTINUE|CYCLE|DO|ELSE|ELSEIF|END|ENDDO|ENDIF|FUNCTION|"+ + "IF|IMPLICIT|IN|INCLUDE|INOUT|INTENT|MODULE|NONE|ONLY|OUT|PRINT|PROGRAM|RETURN|"+ + "SELECT|STATUS|STOP|SUBROUTINE|" + + "RETURN|THEN|USE|WHILE|WRITE" + ); + + var keywordOperators = ( + "and|or|not|eq|ne|gt|ge|lt|le|" + + "AND|OR|NOT|EQ|NE|GT|GE|LT|LE" + ); + + var builtinConstants = ( + "true|false|TRUE|FALSE" + ); + + var builtinFunctions = ( + "abs|achar|acos|acosh|adjustl|adjustr|aimag|aint|all|allocate|"+ + "anint|any|asin|asinh|associated|atan|atan2|atanh|"+ + "bessel_j0|bessel_j1|bessel_jn|bessel_y0|bessel_y1|bessel_yn|"+ + "bge|bgt|bit_size|ble|blt|btest|ceiling|char|cmplx|conjg|cos|cosh|"+ + "count|cpu_time|cshift|date_and_time|dble|deallocate|digits|dim|dot_product|dprod|"+ + "dshiftl|dshiftr|dsqrt|eoshift|epsilon|erf|erfc|erfc_scaled|exp|float|floor|"+ + "format|fraction|gamma|input|len|lge|lgt|lle|llt|log|log10|maskl|maskr|matmul|max|maxloc|maxval|"+ + "merge|min|minloc|minval|mod|modulo|nint|not|norm2|null|nullify|pack|parity|popcnt|poppar|"+ + "precision|present|product|radix|random_number|random_seed|range|repeat|reshape|round|"+ + "rrspacing|same_type_as|scale|scan|selected_char_kind|selected_int_kind|selected_real_kind|"+ + "set_exponent|shape|shifta|shiftl|shiftr|sign|sin|sinh|size|sngl|spacing|spread|"+ + "sqrt|sum|system_clock|tan|tanh|tiny|trailz|transfer|transpose|trim|ubound|unpack|verify|" + + "ABS|ACHAR|ACOS|ACOSH|ADJUSTL|ADJUSTR|AIMAG|AINT|ALL|ALLOCATE|"+ + "ANINT|ANY|ASIN|ASINH|ASSOCIATED|ATAN|ATAN2|ATANH|"+ + "BESSEL_J0|BESSEL_J1|BESSEL_JN|BESSEL_Y0|BESSEL_Y1|BESSEL_YN|"+ + "BGE|BGT|BIT_SIZE|BLE|BLT|BTEST|CEILING|CHAR|CMPLX|CONJG|COS|COSH|"+ + "COUNT|CPU_TIME|CSHIFT|DATE_AND_TIME|DBLE|DEALLOCATE|DIGITS|DIM|DOT_PRODUCT|DPROD|"+ + "DSHIFTL|DSHIFTR|DSQRT|EOSHIFT|EPSILON|ERF|ERFC|ERFC_SCALED|EXP|FLOAT|FLOOR|"+ + "FORMAT|FRACTION|GAMMA|INPUT|LEN|LGE|LGT|LLE|LLT|LOG|LOG10|MASKL|MASKR|MATMUL|MAX|MAXLOC|MAXVAL|"+ + "MERGE|MIN|MINLOC|MINVAL|MOD|MODULO|NINT|NOT|NORM2|NULL|NULLIFY|PACK|PARITY|POPCNT|POPPAR|"+ + "PRECISION|PRESENT|PRODUCT|RADIX|RANDOM_NUMBER|RANDOM_SEED|RANGE|REPEAT|RESHAPE|ROUND|"+ + "RRSPACING|SAME_TYPE_AS|SCALE|SCAN|SELECTED_CHAR_KIND|SELECTED_INT_KIND|SELECTED_REAL_KIND|"+ + "SET_EXPONENT|SHAPE|SHIFTA|SHIFTL|SHIFTR|SIGN|SIN|SINH|SIZE|SNGL|SPACING|SPREAD|"+ + "SQRT|SUM|SYSTEM_CLOCK|TAN|TANH|TINY|TRAILZ|TRANSFER|TRANSPOSE|TRIM|UBOUND|UNPACK|VERIFY" + ); + + var storageType = ( + "logical|character|integer|real|type|" + + "LOGICAL|CHARACTER|INTEGER|REAL|TYPE" + ); + + var storageModifiers = ( + "allocatable|dimension|intent|parameter|pointer|target|private|public|" + + "ALLOCATABLE|DIMENSION|INTENT|PARAMETER|POINTER|TARGET|PRIVATE|PUBLIC" + ); + + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "keyword": keywords, + "keyword.operator": keywordOperators, + "storage.type": storageType, + "storage.modifier" : storageModifiers + }, "identifier"); + + var strPre = "(?:r|u|ur|R|U|UR|Ur|uR)?"; + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})"; + + this.$rules = { + "start" : [ { + token : "comment", + regex : "!.*$" + }, { + token : "string", // multi line """ string start + regex : strPre + '"{3}', + next : "qqstring3" + }, { + token : "string", // " string + regex : strPre + '"(?=.)', + next : "qqstring" + }, { + token : "string", // multi line ''' string start + regex : strPre + "'{3}", + next : "qstring3" + }, { + token : "string", // ' string + regex : strPre + "'(?=.)", + next : "qstring" + }, { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // long integer + regex : integer + "[lL]\\b" + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|define|undef|INCLUDE|IMPORT|DEFINE|UNDEF)\\b" + }, { + token : "keyword", // special case pre-compiler directive + regex : "#\\s*(?:endif|ifdef|else|elseif|ifndef|ENDIF|IFDEF|ELSE|ELSEIF|IFNDEF)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+" + } ], + "qqstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line """ string end + regex : '"{3}', + next : "start" + }, { + defaultToken : "string" + } ], + "qstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line """ string end + regex : '"{3}', + next : "start" + }, { + defaultToken : "string" + } ], + "qqstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken: "string" + }], + "qstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "start" + }, { + defaultToken: "string" + }] + }; +}; + +oop.inherits(FortranHighlightRules, TextHighlightRules); + +exports.FortranHighlightRules = FortranHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/fortran",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/fortran_highlight_rules","ace/mode/folding/cstyle","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var FortranHighlightRules = require("./fortran_highlight_rules").FortranHighlightRules; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = FortranHighlightRules; + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "!"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "return": 1, + "break": 1, + "continue": 1, + "RETURN": 1, + "BREAK": 1, + "CONTINUE": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + + this.$id = "ace/mode/fortran"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-ftl.js b/src/libs/ace/mode-ftl.js new file mode 100755 index 0000000..dbca4fd --- /dev/null +++ b/src/libs/ace/mode-ftl.js @@ -0,0 +1,1182 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/ftl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var FtlLangHighlightRules = function () { + + var stringBuiltIns = "\\?|substring|cap_first|uncap_first|capitalize|chop_linebreak|date|time|datetime|" + + "ends_with|html|groups|index_of|j_string|js_string|json_string|last_index_of|length|lower_case|" + + "left_pad|right_pad|contains|matches|number|replace|rtf|url|split|starts_with|string|trim|" + + "upper_case|word_list|xhtml|xml"; + var numberBuiltIns = "c|round|floor|ceiling"; + var dateBuiltIns = "iso_[a-z_]+"; + var seqBuiltIns = "first|last|seq_contains|seq_index_of|seq_last_index_of|reverse|size|sort|sort_by|chunk"; + var hashBuiltIns = "keys|values"; + var xmlBuiltIns = "children|parent|root|ancestors|node_name|node_type|node_namespace"; + var expertBuiltIns = "byte|double|float|int|long|short|number_to_date|number_to_time|number_to_datetime|" + + "eval|has_content|interpret|is_[a-z_]+|namespacenew"; + var allBuiltIns = stringBuiltIns + numberBuiltIns + dateBuiltIns + seqBuiltIns + hashBuiltIns + + xmlBuiltIns + expertBuiltIns; + + var deprecatedBuiltIns = "default|exists|if_exists|web_safe"; + + var variables = "data_model|error|globals|lang|locale|locals|main|namespace|node|current_node|" + + "now|output_encoding|template_name|url_escaping_charset|vars|version"; + + var operators = "gt|gte|lt|lte|as|in|using"; + + var reserved = "true|false"; + + var attributes = "encoding|parse|locale|number_format|date_format|time_format|datetime_format|time_zone|" + + "url_escaping_charset|classic_compatible|strip_whitespace|strip_text|strict_syntax|ns_prefixes|" + + "attributes"; + + this.$rules = { + "start" : [{ + token : "constant.character.entity", + regex : /&[^;]+;/ + }, { + token : "support.function", + regex : "\\?("+allBuiltIns+")" + }, { + token : "support.function.deprecated", + regex : "\\?("+deprecatedBuiltIns+")" + }, { + token : "language.variable", + regex : "\\.(?:"+variables+")" + }, { + token : "constant.language", + regex : "\\b("+reserved+")\\b" + }, { + token : "keyword.operator", + regex : "\\b(?:"+operators+")\\b" + }, { + token : "entity.other.attribute-name", + regex : attributes + }, { + token : "string", // + regex : /['"]/, + next : "qstring" + }, { + token : function(value) { + if (value.match("^[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?$")) { + return "constant.numeric"; + } else { + return "variable"; + } + }, + regex : /[\w.+\-]+/ + }, { + token : "keyword.operator", + regex : "!|\\.|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }], + + "qstring" : [{ + token : "constant.character.escape", + regex : '\\\\[nrtvef\\\\"$]' + }, { + token : "string", + regex : /['"]/, + next : "start" + }, { + defaultToken : "string" + }] + }; +}; + +oop.inherits(FtlLangHighlightRules, TextHighlightRules); + +var FtlHighlightRules = function() { + HtmlHighlightRules.call(this); + + var directives = "assign|attempt|break|case|compress|default|elseif|else|escape|fallback|function|flush|" + + "ftl|global|if|import|include|list|local|lt|macro|nested|noescape|noparse|nt|recover|recurse|return|rt|" + + "setting|stop|switch|t|visit"; + + var startRules = [ + { + token : "comment", + regex : "<#--", + next : "ftl-dcomment" + }, { + token : "string.interpolated", + regex : "\\${", + push : "ftl-start" + }, { + token : "keyword.function", + regex : "", + next : "pop" + }, { + token : "string.interpolated", + regex : "}", + next : "pop" + } + ]; + + for (var key in this.$rules) + this.$rules[key].unshift.apply(this.$rules[key], startRules); + + this.embedRules(FtlLangHighlightRules, "ftl-", endRules, ["start"]); + + this.addRules({ + "ftl-dcomment" : [{ + token : "comment", + regex : "-->", + next : "pop" + }, { + defaultToken : "comment" + }] + }); + + this.normalizeRules(); +}; + +oop.inherits(FtlHighlightRules, HtmlHighlightRules); + +exports.FtlHighlightRules = FtlHighlightRules; +}); + +ace.define("ace/mode/ftl",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ftl_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var FtlHighlightRules = require("./ftl_highlight_rules").FtlHighlightRules; + +var Mode = function() { + this.HighlightRules = FtlHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.$id = "ace/mode/ftl"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-gcode.js b/src/libs/ace/mode-gcode.js new file mode 100755 index 0000000..a648426 --- /dev/null +++ b/src/libs/ace/mode-gcode.js @@ -0,0 +1,86 @@ +ace.define("ace/mode/gcode_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { + "use strict"; + + var oop = require("../lib/oop"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + var GcodeHighlightRules = function() { + + var keywords = ( + "IF|DO|WHILE|ENDWHILE|CALL|ENDIF|SUB|ENDSUB|GOTO|REPEAT|ENDREPEAT|CALL" + ); + + var builtinConstants = ( + "PI" + ); + + var builtinFunctions = ( + "ATAN|ABS|ACOS|ASIN|SIN|COS|EXP|FIX|FUP|ROUND|LN|TAN" + ); + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "\\(.*\\)" + }, { + token : "comment", // block number + regex : "([N])([0-9]+)" + }, { + token : "string", // " string + regex : "([G])([0-9]+\\.?[0-9]?)" + }, { + token : "string", // ' string + regex : "([M])([0-9]+\\.?[0-9]?)" + }, { + token : "constant.numeric", // float + regex : "([-+]?([0-9]*\\.?[0-9]+\\.?))|(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)" + }, { + token : keywordMapper, + regex : "[A-Z]" + }, { + token : "keyword.operator", + regex : "EQ|LT|GT|NE|GE|LE|OR|XOR" + }, { + token : "paren.lparen", + regex : "[\\[]" + }, { + token : "paren.rparen", + regex : "[\\]]" + }, { + token : "text", + regex : "\\s+" + } ] + }; + }; + + oop.inherits(GcodeHighlightRules, TextHighlightRules); + + exports.GcodeHighlightRules = GcodeHighlightRules; +}); + +ace.define("ace/mode/gcode",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/gcode_highlight_rules","ace/range"], function(require, exports, module) { + "use strict"; + + var oop = require("../lib/oop"); + var TextMode = require("./text").Mode; + var GcodeHighlightRules = require("./gcode_highlight_rules").GcodeHighlightRules; + var Range = require("../range").Range; + + var Mode = function() { + this.HighlightRules = GcodeHighlightRules; + this.$behaviour = this.$defaultBehaviour; + }; + oop.inherits(Mode, TextMode); + + (function() { + this.$id = "ace/mode/gcode"; + }).call(Mode.prototype); + + exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-gherkin.js b/src/libs/ace/mode-gherkin.js new file mode 100755 index 0000000..322dbe4 --- /dev/null +++ b/src/libs/ace/mode-gherkin.js @@ -0,0 +1,163 @@ +ace.define("ace/mode/gherkin_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})"; + +var GherkinHighlightRules = function() { + var languages = [{ + name: "en", + labels: "Feature|Background|Scenario(?: Outline)?|Examples", + keywords: "Given|When|Then|And|But" + }]; + + var labels = languages.map(function(l) { + return l.labels; + }).join("|"); + var keywords = languages.map(function(l) { + return l.keywords; + }).join("|"); + this.$rules = { + start : [{ + token: "constant.numeric", + regex: "(?:(?:[1-9]\\d*)|(?:0))" + }, { + token : "comment", + regex : "#.*$" + }, { + token : "keyword", + regex : "(?:" + labels + "):|(?:" + keywords + ")\\b" + }, { + token : "keyword", + regex : "\\*" + }, { + token : "string", // multi line """ string start + regex : '"{3}', + next : "qqstring3" + }, { + token : "string", // " string + regex : '"', + next : "qqstring" + }, { + token : "text", + regex : "^\\s*(?=@[\\w])", + next : [{ + token : "text", + regex : "\\s+" + }, { + token : "variable.parameter", + regex : "@[\\w]+" + }, { + token : "empty", + regex : "", + next : "start" + }] + }, { + token : "comment", + regex : "<[^>]+>" + }, { + token : "comment", + regex : "\\|(?=.)", + next : "table-item" + }, { + token : "comment", + regex : "\\|$", + next : "start" + }], + "qqstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line """ string end + regex : '"{3}', + next : "start" + }, { + defaultToken : "string" + }], + "qqstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken: "string" + }], + "table-item" : [{ + token : "comment", + regex : /$/, + next : "start" + }, { + token : "comment", + regex : /\|/ + }, { + token : "string", + regex : /\\./ + }, { + defaultToken : "string" + }] + }; + this.normalizeRules(); +} + +oop.inherits(GherkinHighlightRules, TextHighlightRules); + +exports.GherkinHighlightRules = GherkinHighlightRules; +}); + +ace.define("ace/mode/gherkin",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/gherkin_highlight_rules"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var GherkinHighlightRules = require("./gherkin_highlight_rules").GherkinHighlightRules; + +var Mode = function() { + this.HighlightRules = GherkinHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.$id = "ace/mode/gherkin"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var space2 = " "; + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + console.log(state) + + if(line.match("[ ]*\\|")) { + indent += "| "; + } + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + + if (state == "start") { + if (line.match("Scenario:|Feature:|Scenario Outline:|Background:")) { + indent += space2; + } else if(line.match("(Given|Then).+(:)$|Examples:")) { + indent += space2; + } else if(line.match("\\*.+")) { + indent += "* "; + } + } + + + return indent; + }; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-gitignore.js b/src/libs/ace/mode-gitignore.js new file mode 100755 index 0000000..c3eac55 --- /dev/null +++ b/src/libs/ace/mode-gitignore.js @@ -0,0 +1,52 @@ +ace.define("ace/mode/gitignore_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var GitignoreHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "comment", + regex : /^\s*#.*$/ + }, { + token : "keyword", // negated patterns + regex : /^\s*!.*$/ + } + ] + }; + + this.normalizeRules(); +}; + +GitignoreHighlightRules.metaData = { + fileTypes: ['gitignore'], + name: 'Gitignore' +}; + +oop.inherits(GitignoreHighlightRules, TextHighlightRules); + +exports.GitignoreHighlightRules = GitignoreHighlightRules; +}); + +ace.define("ace/mode/gitignore",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/gitignore_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var GitignoreHighlightRules = require("./gitignore_highlight_rules").GitignoreHighlightRules; + +var Mode = function() { + this.HighlightRules = GitignoreHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.$id = "ace/mode/gitignore"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-glsl.js b/src/libs/ace/mode-glsl.js new file mode 100755 index 0000000..ee95fee --- /dev/null +++ b/src/libs/ace/mode-glsl.js @@ -0,0 +1,564 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/c_cpp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template|char16_t|char32_t" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private|" + + "protected|public|friend|explicit|virtual|export|mutable|typename|" + + "constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE|nullptr" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + var escapeRe = /\\(?:['"?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}U[a-fA-F\d]{8}|.)/.source; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "//$", + next : "start" + }, { + token : "comment", + regex : "//", + next : "singleLineComment" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // character + regex : "'(?:" + escapeRe + "|.)?'" + }, { + token : "string.start", + regex : '"', + stateName: "qqstring", + next: [ + { token: "string", regex: /\\\s*$/, next: "qqstring" }, + { token: "constant.language.escape", regex: escapeRe }, + { token: "constant.language.escape", regex: /%[^'"\\]/ }, + { token: "string.end", regex: '"|$', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "string.start", + regex : 'R"\\(', + stateName: "rawString", + next: [ + { token: "string.end", regex: '\\)"', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "#\\s*(?:endif|if|ifdef|else|elif|ifndef)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*" + }, { + token : "keyword.operator", + regex : /--|\+\+|<<=|>>=|>>>=|<>|&&|\|\||\?:|[*%\/+\-&\^|~!<>=]=?/ + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "singleLineComment" : [ + { + token : "comment", + regex : /\\$/, + next : "singleLineComment" + }, { + token : "comment", + regex : /$/, + next : "start" + }, { + defaultToken: "comment" + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/c_cpp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/c_cpp_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = c_cppHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/c_cpp"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/glsl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/c_cpp_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; + +var glslHighlightRules = function() { + + var keywords = ( + "attribute|const|uniform|varying|break|continue|do|for|while|" + + "if|else|in|out|inout|float|int|void|bool|true|false|" + + "lowp|mediump|highp|precision|invariant|discard|return|mat2|mat3|" + + "mat4|vec2|vec3|vec4|ivec2|ivec3|ivec4|bvec2|bvec3|bvec4|sampler2D|" + + "samplerCube|struct" + ); + + var buildinConstants = ( + "radians|degrees|sin|cos|tan|asin|acos|atan|pow|" + + "exp|log|exp2|log2|sqrt|inversesqrt|abs|sign|floor|ceil|fract|mod|" + + "min|max|clamp|mix|step|smoothstep|length|distance|dot|cross|" + + "normalize|faceforward|reflect|refract|matrixCompMult|lessThan|" + + "lessThanEqual|greaterThan|greaterThanEqual|equal|notEqual|any|all|" + + "not|dFdx|dFdy|fwidth|texture2D|texture2DProj|texture2DLod|" + + "texture2DProjLod|textureCube|textureCubeLod|" + + "gl_MaxVertexAttribs|gl_MaxVertexUniformVectors|gl_MaxVaryingVectors|" + + "gl_MaxVertexTextureImageUnits|gl_MaxCombinedTextureImageUnits|" + + "gl_MaxTextureImageUnits|gl_MaxFragmentUniformVectors|gl_MaxDrawBuffers|" + + "gl_DepthRangeParameters|gl_DepthRange|" + + "gl_Position|gl_PointSize|" + + "gl_FragCoord|gl_FrontFacing|gl_PointCoord|gl_FragColor|gl_FragData" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = new c_cppHighlightRules().$rules; + this.$rules.start.forEach(function(rule) { + if (typeof rule.token == "function") + rule.token = keywordMapper; + }) +}; + +oop.inherits(glslHighlightRules, c_cppHighlightRules); + +exports.glslHighlightRules = glslHighlightRules; +}); + +ace.define("ace/mode/glsl",["require","exports","module","ace/lib/oop","ace/mode/c_cpp","ace/mode/glsl_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var CMode = require("./c_cpp").Mode; +var glslHighlightRules = require("./glsl_highlight_rules").glslHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = glslHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, CMode); + +(function() { + this.$id = "ace/mode/glsl"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-gobstones.js b/src/libs/ace/mode-gobstones.js new file mode 100755 index 0000000..746b341 --- /dev/null +++ b/src/libs/ace/mode-gobstones.js @@ -0,0 +1,922 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/gobstones_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var GobstonesHighlightRules = function() { + + var keywords = ( + "program|procedure|function|interactive|if|then|else|switch|repeat|while|foreach|in|not|div|mod|Skip|return" + ); + + var buildinConstants = ( + "False|True" + ); + + + var langClasses = ( + "Poner|Sacar|Mover|IrAlBorde|VaciarTablero|" + + "nroBolitas|hayBolitas|puedeMover|siguiente|previo|opuesto|minBool|maxBool|" + + "minDir|maxDir|minColor|maxColor" + ); + + var supportType = ( + "Verde|Rojo|Azul|Negro|Norte|Sur|Este|Oeste" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": langClasses, + "support.type": supportType + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + { + token : "comment", + regex : "\\-\\-.*$" + }, + { + token : "comment", + regex : "#.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : /0(?:[xX][0-9a-fA-F][0-9a-fA-F_]*|[bB][01][01_]*)[LlSsDdFfYy]?\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d[\d_]*(?:(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?)?[LlSsDdFfYy]?\b/ + }, { + token : "constant.language.boolean", + regex : "(?:True|False)\\b" + }, { + token : "keyword.operator", + regex : ":=|\\.\\.|,|;|\\|\\||\\/\\/|\\+|\\-|\\^|\\*|>|<|>=|=>|==|&&" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(GobstonesHighlightRules, TextHighlightRules); + +exports.GobstonesHighlightRules = GobstonesHighlightRules; +}); + +ace.define("ace/mode/gobstones",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/gobstones_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptMode = require("./javascript").Mode; +var GobstonesHighlightRules = require("./gobstones_highlight_rules").GobstonesHighlightRules; + +var Mode = function() { + JavaScriptMode.call(this); + this.HighlightRules = GobstonesHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, JavaScriptMode); + +(function() { + + this.createWorker = function(session) { + return null; + }; + + this.$id = "ace/mode/gobstones"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-golang.js b/src/libs/ace/mode-golang.js new file mode 100755 index 0000000..cb81eaf --- /dev/null +++ b/src/libs/ace/mode-golang.js @@ -0,0 +1,406 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/golang_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { + var oop = require("../lib/oop"); + var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + var GolangHighlightRules = function() { + var keywords = ( + "else|break|case|return|goto|if|const|select|" + + "continue|struct|default|switch|for|range|" + + "func|import|package|chan|defer|fallthrough|go|interface|map|range|" + + "select|type|var" + ); + var builtinTypes = ( + "string|uint8|uint16|uint32|uint64|int8|int16|int32|int64|float32|" + + "float64|complex64|complex128|byte|rune|uint|int|uintptr|bool|error" + ); + var builtinFunctions = ( + "new|close|cap|copy|panic|panicln|print|println|len|make|delete|real|recover|imag|append" + ); + var builtinConstants = ("nil|true|false|iota"); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": builtinConstants, + "support.function": builtinFunctions, + "support.type": builtinTypes + }, ""); + + var stringEscapeRe = "\\\\(?:[0-7]{3}|x\\h{2}|u{4}|U\\h{6}|[abfnrtv'\"\\\\])".replace(/\\h/g, "[a-fA-F\\d]"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment.start", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : /"(?:[^"\\]|\\.)*?"/ + }, { + token : "string", // raw + regex : '`', + next : "bqstring" + }, { + token : "constant.numeric", // rune + regex : "'(?:[^\\'\uD800-\uDBFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|" + stringEscapeRe.replace('"', '') + ")'" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : ["keyword", "text", "entity.name.function"], + regex : "(func)(\\s+)([a-zA-Z_$][a-zA-Z0-9_$]*)\\b" + }, { + token : function(val) { + if (val[val.length - 1] == "(") { + return [{ + type: keywordMapper(val.slice(0, -1)) || "support.function", + value: val.slice(0, -1) + }, { + type: "paren.lparen", + value: val.slice(-1) + }]; + } + + return keywordMapper(val) || "identifier"; + }, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b\\(?" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment.end", + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "bqstring" : [ + { + token : "string", + regex : '`', + next : "start" + }, { + defaultToken : "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + }; + oop.inherits(GolangHighlightRules, TextHighlightRules); + + exports.GolangHighlightRules = GolangHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/golang",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/golang_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var GolangHighlightRules = require("./golang_highlight_rules").GolangHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = GolangHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = new CstyleBehaviour(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + };//end getNextLineIndent + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/golang"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-graphqlschema.js b/src/libs/ace/mode-graphqlschema.js new file mode 100755 index 0000000..9d2833d --- /dev/null +++ b/src/libs/ace/mode-graphqlschema.js @@ -0,0 +1,206 @@ +ace.define("ace/mode/graphqlschema_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var GraphQLSchemaHighlightRules = function() { + + var keywords = ( + "type|interface|union|enum|schema|input|implements|extends|scalar" + ); + + var dataTypes = ( + "Int|Float|String|ID|Boolean" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "storage.type": dataTypes + }, "identifier"); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "#.*$" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + } ] + }; + this.normalizeRules(); +}; + +oop.inherits(GraphQLSchemaHighlightRules, TextHighlightRules); + +exports.GraphQLSchemaHighlightRules = GraphQLSchemaHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/graphqlschema",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/graphqlschema_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var GraphQLSchemaHighlightRules = require("./graphqlschema_highlight_rules").GraphQLSchemaHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = GraphQLSchemaHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.$id = "ace/mode/graphqlschema"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-groovy.js b/src/libs/ace/mode-groovy.js new file mode 100755 index 0000000..b04ffd9 --- /dev/null +++ b/src/libs/ace/mode-groovy.js @@ -0,0 +1,980 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/groovy_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var GroovyHighlightRules = function() { + + var keywords = ( + "assert|with|abstract|continue|for|new|switch|" + + "assert|default|goto|package|synchronized|" + + "boolean|do|if|private|this|" + + "break|double|implements|protected|throw|" + + "byte|else|import|public|throws|" + + "case|enum|instanceof|return|transient|" + + "catch|extends|int|short|try|" + + "char|final|interface|static|void|" + + "class|finally|long|strictfp|volatile|" + + "def|float|native|super|while" + ); + + var buildinConstants = ( + "null|Infinity|NaN|undefined" + ); + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "support.function": langClasses, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", + regex : '"""', + next : "qqstring" + }, { + token : "string", + regex : "'''", + next : "qstring" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\?:|\\?\\.|\\*\\.|<=>|=~|==~|\\.@|\\*\\.@|\\.&|as|in|is|!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : /\\(?:u[0-9A-Fa-f]{4}|.|$)/ + }, { + token : "constant.language.escape", + regex : /\$[\w\d]+/ + }, { + token : "constant.language.escape", + regex : /\$\{[^"\}]+\}?/ + }, { + token : "string", + regex : '"{3,5}', + next : "start" + }, { + token : "string", + regex : '.+?' + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : /\\(?:u[0-9A-Fa-f]{4}|.|$)/ + }, { + token : "string", + regex : "'{3,5}", + next : "start" + }, { + token : "string", + regex : ".+?" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(GroovyHighlightRules, TextHighlightRules); + +exports.GroovyHighlightRules = GroovyHighlightRules; +}); + +ace.define("ace/mode/groovy",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/groovy_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptMode = require("./javascript").Mode; +var GroovyHighlightRules = require("./groovy_highlight_rules").GroovyHighlightRules; + +var Mode = function() { + JavaScriptMode.call(this); + this.HighlightRules = GroovyHighlightRules; +}; +oop.inherits(Mode, JavaScriptMode); + +(function() { + + this.createWorker = function(session) { + return null; + }; + + this.$id = "ace/mode/groovy"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-haml.js b/src/libs/ace/mode-haml.js new file mode 100755 index 0000000..c4255c5 --- /dev/null +++ b/src/libs/ace/mode-haml.js @@ -0,0 +1,1547 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var constantOtherSymbol = exports.constantOtherSymbol = { + token : "constant.other.symbol.ruby", // symbol + regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?" +}; + +var qString = exports.qString = { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" +}; + +var qqString = exports.qqString = { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' +}; + +var tString = exports.tString = { + token : "string", // backtick string + regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]" +}; + +var constantNumericHex = exports.constantNumericHex = { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b" +}; + +var constantNumericFloat = exports.constantNumericFloat = { + token : "constant.numeric", // float + regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b" +}; + +var instanceVariable = exports.instanceVariable = { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" +}; + +var RubyHighlightRules = function() { + + var builtinFunctions = ( + "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" + + "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" + + "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" + + "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" + + "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" + + "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" + + "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" + + "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" + + "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" + + "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" + + "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" + + "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" + + "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" + + "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" + + "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" + + "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" + + "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" + + "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" + + "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" + + "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" + + "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" + + "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" + + "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" + + "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" + + "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" + + "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" + + "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" + + "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" + + "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" + + "has_many|has_one|belongs_to|has_and_belongs_to_many" + ); + + var keywords = ( + "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" + + "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" + + "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield" + ); + + var buildinConstants = ( + "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" + + "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING" + ); + + var builtinVariables = ( + "$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|" + + "$!|root_url|flash|session|cookies|params|request|response|logger|self" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "variable.language": builtinVariables, + "support.function": builtinFunctions, + "invalid.deprecated": "debugger" // TODO is this a remnant from js mode? + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment", // multi line comment + regex : "^=begin(?:$|\\s.*$)", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, + + [{ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren.lparen"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1) + return "paren.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.start", + regex : /"/, + push : [{ + token : "constant.language.escape", + regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/ + }, { + token : "paren.start", + regex : /#{/, + push : "start" + }, { + token : "string.end", + regex : /"/, + next : "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/ + }, { + token : "paren.start", + regex : /#{/, + push : "start" + }, { + token : "string.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : /'/, + push : [{ + token : "constant.language.escape", + regex : /\\['\\]/ + }, { + token : "string.end", + regex : /'/, + next : "pop" + }, { + defaultToken: "string" + }] + }], + + { + token : "text", // namespaces aren't symbols + regex : "::" + }, { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" + }, { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + + constantOtherSymbol, + constantNumericHex, + constantNumericFloat, + + { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "punctuation.separator.key-value", + regex : "=>" + }, { + stateName: "heredoc", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[3]); + return [ + {type:"constant", value: tokens[1]}, + {type:"string", value: tokens[2]}, + {type:"support.class", value: tokens[3]}, + {type:"string", value: tokens[4]} + ]; + }, + regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)", + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^ +" + }, { + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + regex : "$", + token : "empty", + next : function(currentState, stack) { + if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc") + return stack[0]; + return currentState; + } + }, { + token : "string.character", + regex : "\\B\\?." + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "^=end(?:$|\\s.*$)", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.normalizeRules(); +}; + +oop.inherits(RubyHighlightRules, TextHighlightRules); + +exports.RubyHighlightRules = RubyHighlightRules; +}); + +ace.define("ace/mode/haml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/ruby_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var RubyExports = require("./ruby_highlight_rules"); +var RubyHighlightRules = RubyExports.RubyHighlightRules; + +var HamlHighlightRules = function() { + HtmlHighlightRules.call(this); + + this.$rules = { + "start": [ + { + token: "comment.block", // multiline HTML comment + regex: /^\/$/, + next: "comment" + }, + { + token: "comment.block", // multiline HAML comment + regex: /^\-#$/, + next: "comment" + }, + { + token: "comment.line", // HTML comment + regex: /\/\s*.*/ + }, + { + token: "comment.line", // HAML comment + regex: /-#\s*.*/ + }, + { + token: "keyword.other.doctype", + regex: "^!!!\\s*(?:[a-zA-Z0-9-_]+)?" + }, + RubyExports.qString, + RubyExports.qqString, + RubyExports.tString, + { + token: "meta.tag.haml", + regex: /(%[\w:\-]+)/ + }, + { + token: "keyword.attribute-name.class.haml", + regex: /\.[\w-]+/ + }, + { + token: "keyword.attribute-name.id.haml", + regex: /#[\w-]+/, + next: "element_class" + }, + RubyExports.constantNumericHex, + RubyExports.constantNumericFloat, + RubyExports.constantOtherSymbol, + { + token: "text", + regex: /=|-|~/, + next: "embedded_ruby" + } + ], + "element_class": [ + { + token: "keyword.attribute-name.class.haml", + regex: /\.[\w-]+/ + }, + { + token: "punctuation.section", + regex: /\{/, + next: "element_attributes" + }, + RubyExports.constantOtherSymbol, + { + token: "empty", + regex: "$|(?!\\.|#|\\{|\\[|=|-|~|\\/])", + next: "start" + } + ], + "element_attributes": [ + RubyExports.constantOtherSymbol, + RubyExports.qString, + RubyExports.qqString, + RubyExports.tString, + RubyExports.constantNumericHex, + RubyExports.constantNumericFloat, + { + token: "punctuation.section", + regex: /$|\}/, + next: "start" + } + ], + "embedded_ruby": [ + RubyExports.constantNumericHex, + RubyExports.constantNumericFloat, + RubyExports.instanceVariable, + RubyExports.qString, + RubyExports.qqString, + RubyExports.tString, + { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + { + token : new RubyHighlightRules().getKeywords(), + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token : ["keyword", "text", "text"], + regex : "(?:do|\\{)(?: \\|[^|]+\\|)?$", + next : "start" + }, + { + token : ["text"], + regex : "^$", + next : "start" + }, + { + token : ["text"], + regex : "^(?!.*\\|\\s*$)", + next : "start" + } + ], + "comment": [ + { + token: "comment.block", + regex: /^$/, + next: "start" + }, + { + token: "comment.block", // comment spanning the whole line + regex: /\s+.*/ + } + ] + + }; + + this.normalizeRules(); +}; + +oop.inherits(HamlHighlightRules, HtmlHighlightRules); + +exports.HamlHighlightRules = HamlHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/haml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/haml_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HamlHighlightRules = require("./haml_highlight_rules").HamlHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = HamlHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + + this.$id = "ace/mode/haml"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-handlebars.js b/src/libs/ace/mode-handlebars.js new file mode 100755 index 0000000..c970820 --- /dev/null +++ b/src/libs/ace/mode-handlebars.js @@ -0,0 +1,2593 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/handlebars_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + +function pop2(currentState, stack) { + stack.splice(0, 3); + return stack.shift() || "start"; +} +var HandlebarsHighlightRules = function() { + HtmlHighlightRules.call(this); + var hbs = { + regex : "(?={{)", + push : "handlebars" + }; + for (var key in this.$rules) { + this.$rules[key].unshift(hbs); + } + this.$rules.handlebars = [{ + token : "comment.start", + regex : "{{!--", + push : [{ + token : "comment.end", + regex : "--}}", + next : pop2 + }, { + defaultToken : "comment" + }] + }, { + token : "comment.start", + regex : "{{!", + push : [{ + token : "comment.end", + regex : "}}", + next : pop2 + }, { + defaultToken : "comment" + }] + }, { + token : "support.function", // unescaped variable + regex : "{{{", + push : [{ + token : "support.function", + regex : "}}}", + next : pop2 + }, { + token : "variable.parameter", + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*" + }] + }, { + token : "storage.type.start", // begin section + regex : "{{[#\\^/&]?", + push : [{ + token : "storage.type.end", + regex : "}}", + next : pop2 + }, { + token : "variable.parameter", + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*" + }] + }]; + + this.normalizeRules(); +}; + +oop.inherits(HandlebarsHighlightRules, HtmlHighlightRules); + +exports.HandlebarsHighlightRules = HandlebarsHighlightRules; +}); + +ace.define("ace/mode/behaviour/html",["require","exports","module","ace/lib/oop","ace/mode/behaviour/xml"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var XmlBehaviour = require("../behaviour/xml").XmlBehaviour; + +var HtmlBehaviour = function () { + + XmlBehaviour.call(this); + +}; + +oop.inherits(HtmlBehaviour, XmlBehaviour); + +exports.HtmlBehaviour = HtmlBehaviour; +}); + +ace.define("ace/mode/handlebars",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/handlebars_highlight_rules","ace/mode/behaviour/html","ace/mode/folding/html"], function(require, exports, module) { + "use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var HandlebarsHighlightRules = require("./handlebars_highlight_rules").HandlebarsHighlightRules; +var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = HandlebarsHighlightRules; + this.$behaviour = new HtmlBehaviour(); +}; + +oop.inherits(Mode, HtmlMode); + +(function() { + this.blockComment = {start: "{{!--", end: "--}}"}; + this.$id = "ace/mode/handlebars"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-haskell.js b/src/libs/ace/mode-haskell.js new file mode 100755 index 0000000..51a5445 --- /dev/null +++ b/src/libs/ace/mode-haskell.js @@ -0,0 +1,372 @@ +ace.define("ace/mode/haskell_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var HaskellHighlightRules = function() { + + this.$rules = { start: + [ { token: + [ 'punctuation.definition.entity.haskell', + 'keyword.operator.function.infix.haskell', + 'punctuation.definition.entity.haskell' ], + regex: '(`)([a-zA-Z_\']*?)(`)', + comment: 'In case this regex seems unusual for an infix operator, note that Haskell allows any ordinary function application (elem 4 [1..10]) to be rewritten as an infix expression (4 `elem` [1..10]).' }, + { token: 'constant.language.unit.haskell', regex: '\\(\\)' }, + { token: 'constant.language.empty-list.haskell', + regex: '\\[\\]' }, + { token: 'keyword.other.haskell', + regex: '\\bmodule\\b', + push: + [ { token: 'keyword.other.haskell', regex: '\\bwhere\\b', next: 'pop' }, + { include: '#module_name' }, + { include: '#module_exports' }, + { token: 'invalid', regex: '[a-z]+' }, + { defaultToken: 'meta.declaration.module.haskell' } ] }, + { token: 'keyword.other.haskell', + regex: '\\bclass\\b', + push: + [ { token: 'keyword.other.haskell', + regex: '\\bwhere\\b', + next: 'pop' }, + { token: 'support.class.prelude.haskell', + regex: '\\b(?:Monad|Functor|Eq|Ord|Read|Show|Num|(?:Frac|Ra)tional|Enum|Bounded|Real(?:Frac|Float)?|Integral|Floating)\\b' }, + { token: 'entity.other.inherited-class.haskell', + regex: '[A-Z][A-Za-z_\']*' }, + { token: 'variable.other.generic-type.haskell', + regex: '\\b[a-z][a-zA-Z0-9_\']*\\b' }, + { defaultToken: 'meta.declaration.class.haskell' } ] }, + { token: 'keyword.other.haskell', + regex: '\\binstance\\b', + push: + [ { token: 'keyword.other.haskell', + regex: '\\bwhere\\b|$', + next: 'pop' }, + { include: '#type_signature' }, + { defaultToken: 'meta.declaration.instance.haskell' } ] }, + { token: 'keyword.other.haskell', + regex: 'import', + push: + [ { token: 'meta.import.haskell', regex: '$|;|^', next: 'pop' }, + { token: 'keyword.other.haskell', regex: 'qualified|as|hiding' }, + { include: '#module_name' }, + { include: '#module_exports' }, + { defaultToken: 'meta.import.haskell' } ] }, + { token: [ 'keyword.other.haskell', 'meta.deriving.haskell' ], + regex: '(deriving)(\\s*\\()', + push: + [ { token: 'meta.deriving.haskell', regex: '\\)', next: 'pop' }, + { token: 'entity.other.inherited-class.haskell', + regex: '\\b[A-Z][a-zA-Z_\']*' }, + { defaultToken: 'meta.deriving.haskell' } ] }, + { token: 'keyword.other.haskell', + regex: '\\b(?:deriving|where|data|type|case|of|let|in|newtype|default)\\b' }, + { token: 'keyword.operator.haskell', regex: '\\binfix[lr]?\\b' }, + { token: 'keyword.control.haskell', + regex: '\\b(?:do|if|then|else)\\b' }, + { token: 'constant.numeric.float.haskell', + regex: '\\b(?:[0-9]+\\.[0-9]+(?:[eE][+-]?[0-9]+)?|[0-9]+[eE][+-]?[0-9]+)\\b', + comment: 'Floats are always decimal' }, + { token: 'constant.numeric.haskell', + regex: '\\b(?:[0-9]+|0(?:[xX][0-9a-fA-F]+|[oO][0-7]+))\\b' }, + { token: + [ 'meta.preprocessor.c', + 'punctuation.definition.preprocessor.c', + 'meta.preprocessor.c' ], + regex: '^(\\s*)(#)(\\s*\\w+)', + comment: 'In addition to Haskell\'s "native" syntax, GHC permits the C preprocessor to be run on a source file.' }, + { include: '#pragma' }, + { token: 'punctuation.definition.string.begin.haskell', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.haskell', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.haskell', + regex: '\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\\\\"\'\\&])' }, + { token: 'constant.character.escape.octal.haskell', + regex: '\\\\o[0-7]+|\\\\x[0-9A-Fa-f]+|\\\\[0-9]+' }, + { token: 'constant.character.escape.control.haskell', + regex: '\\^[A-Z@\\[\\]\\\\\\^_]' }, + { defaultToken: 'string.quoted.double.haskell' } ] }, + { token: + [ 'punctuation.definition.string.begin.haskell', + 'string.quoted.single.haskell', + 'constant.character.escape.haskell', + 'constant.character.escape.octal.haskell', + 'constant.character.escape.hexadecimal.haskell', + 'constant.character.escape.control.haskell', + 'punctuation.definition.string.end.haskell' ], + regex: '(\')(?:([\\ -\\[\\]-~])|(\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\\\\"\'\\&]))|(\\\\o[0-7]+)|(\\\\x[0-9A-Fa-f]+)|(\\^[A-Z@\\[\\]\\\\\\^_]))(\')' }, + { token: + [ 'meta.function.type-declaration.haskell', + 'entity.name.function.haskell', + 'meta.function.type-declaration.haskell', + 'keyword.other.double-colon.haskell' ], + regex: '^(\\s*)([a-z_][a-zA-Z0-9_\']*|\\([|!%$+\\-.,=]+\\))(\\s*)(::)', + push: + [ { token: 'meta.function.type-declaration.haskell', + regex: '$', + next: 'pop' }, + { include: '#type_signature' }, + { defaultToken: 'meta.function.type-declaration.haskell' } ] }, + { token: 'support.constant.haskell', + regex: '\\b(?:Just|Nothing|Left|Right|True|False|LT|EQ|GT|\\(\\)|\\[\\])\\b' }, + { token: 'constant.other.haskell', regex: '\\b[A-Z]\\w*\\b' }, + { include: '#comments' }, + { token: 'support.function.prelude.haskell', + regex: '\\b(?:abs|acos|acosh|all|and|any|appendFile|applyM|asTypeOf|asin|asinh|atan|atan2|atanh|break|catch|ceiling|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|div|divMod|drop|dropWhile|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromEnum|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|head|id|init|interact|ioError|isDenormalized|isIEEE|isInfinite|isNaN|isNegativeZero|iterate|last|lcm|length|lex|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|odd|or|otherwise|pi|pred|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|read|readFile|readIO|readList|readLn|readParen|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showList|showParen|showString|shows|showsPrec|significand|signum|sin|sinh|snd|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|toEnum|toInteger|toRational|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\\b' }, + { include: '#infix_op' }, + { token: 'keyword.operator.haskell', + regex: '[|!%$?~+:\\-.=\\\\]+', + comment: 'In case this regex seems overly general, note that Haskell permits the definition of new operators which can be nearly any string of punctuation characters, such as $%^&*.' }, + { token: 'punctuation.separator.comma.haskell', regex: ',' } ], + '#block_comment': + [ { token: 'punctuation.definition.comment.haskell', + regex: '\\{-(?!#)', + push: + [ { include: '#block_comment' }, + { token: 'punctuation.definition.comment.haskell', + regex: '-\\}', + next: 'pop' }, + { defaultToken: 'comment.block.haskell' } ] } ], + '#comments': + [ { token: 'punctuation.definition.comment.haskell', + regex: '--.*', + push_: + [ { token: 'comment.line.double-dash.haskell', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-dash.haskell' } ] }, + { include: '#block_comment' } ], + '#infix_op': + [ { token: 'entity.name.function.infix.haskell', + regex: '\\([|!%$+:\\-.=]+\\)|\\(,+\\)' } ], + '#module_exports': + [ { token: 'meta.declaration.exports.haskell', + regex: '\\(', + push: + [ { token: 'meta.declaration.exports.haskell.end', + regex: '\\)', + next: 'pop' }, + { token: 'entity.name.function.haskell', + regex: '\\b[a-z][a-zA-Z_\']*' }, + { token: 'storage.type.haskell', regex: '\\b[A-Z][A-Za-z_\']*' }, + { token: 'punctuation.separator.comma.haskell', regex: ',' }, + { include: '#infix_op' }, + { token: 'meta.other.unknown.haskell', + regex: '\\(.*?\\)', + comment: 'So named because I don\'t know what to call this.' }, + { defaultToken: 'meta.declaration.exports.haskell.end' } ] } ], + '#module_name': + [ { token: 'support.other.module.haskell', + regex: '[A-Z][A-Za-z._\']*' } ], + '#pragma': + [ { token: 'meta.preprocessor.haskell', + regex: '\\{-#', + push: + [ { token: 'meta.preprocessor.haskell', + regex: '#-\\}', + next: 'pop' }, + { token: 'keyword.other.preprocessor.haskell', + regex: '\\b(?:LANGUAGE|UNPACK|INLINE)\\b' }, + { defaultToken: 'meta.preprocessor.haskell' } ] } ], + '#type_signature': + [ { token: + [ 'meta.class-constraint.haskell', + 'entity.other.inherited-class.haskell', + 'meta.class-constraint.haskell', + 'variable.other.generic-type.haskell', + 'meta.class-constraint.haskell', + 'keyword.other.big-arrow.haskell' ], + regex: '(\\(\\s*)([A-Z][A-Za-z]*)(\\s+)([a-z][A-Za-z_\']*)(\\)\\s*)(=>)' }, + { include: '#pragma' }, + { token: 'keyword.other.arrow.haskell', regex: '->' }, + { token: 'keyword.other.big-arrow.haskell', regex: '=>' }, + { token: 'support.type.prelude.haskell', + regex: '\\b(?:Int(?:eger)?|Maybe|Either|Bool|Float|Double|Char|String|Ordering|ShowS|ReadS|FilePath|IO(?:Error)?)\\b' }, + { token: 'variable.other.generic-type.haskell', + regex: '\\b[a-z][a-zA-Z0-9_\']*\\b' }, + { token: 'storage.type.haskell', + regex: '\\b[A-Z][a-zA-Z0-9_\']*\\b' }, + { token: 'support.constant.unit.haskell', regex: '\\(\\)' }, + { include: '#comments' } ] } + + this.normalizeRules(); +}; + +HaskellHighlightRules.metaData = { fileTypes: [ 'hs' ], + keyEquivalent: '^~H', + name: 'Haskell', + scopeName: 'source.haskell' } + + +oop.inherits(HaskellHighlightRules, TextHighlightRules); + +exports.HaskellHighlightRules = HaskellHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/haskell",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/haskell_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HaskellHighlightRules = require("./haskell_highlight_rules").HaskellHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = HaskellHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = null; + this.$id = "ace/mode/haskell"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-haskell_cabal.js b/src/libs/ace/mode-haskell_cabal.js new file mode 100755 index 0000000..5b69e04 --- /dev/null +++ b/src/libs/ace/mode-haskell_cabal.js @@ -0,0 +1,134 @@ +ace.define("ace/mode/haskell_cabal_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var CabalHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "comment", + regex : "^\\s*--.*$" + }, { + token: ["keyword"], + regex: /^(\s*\w.*?)(:(?:\s+|$))/ + }, { + token : "constant.numeric", // float + regex : /[\d_]+(?:(?:[\.\d_]*)?)/ + }, { + token : "constant.language.boolean", + regex : "(?:true|false|TRUE|FALSE|True|False|yes|no)\\b" + }, { + token : "markup.heading", + regex : /^(\w.*)$/ + } + ]}; + +}; + +oop.inherits(CabalHighlightRules, TextHighlightRules); + +exports.CabalHighlightRules = CabalHighlightRules; +}); + +ace.define("ace/mode/folding/haskell_cabal",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + this.isHeading = function (session,row) { + var heading = "markup.heading"; + var token = session.getTokens(row)[0]; + return row==0 || (token && token.type.lastIndexOf(heading, 0) === 0); + }; + + this.getFoldWidget = function(session, foldStyle, row) { + if (this.isHeading(session,row)){ + return "start"; + } else if (foldStyle === "markbeginend" && !(/^\s*$/.test(session.getLine(row)))){ + var maxRow = session.getLength(); + while (++row < maxRow) { + if (!(/^\s*$/.test(session.getLine(row)))){ + break; + } + } + if (row==maxRow || this.isHeading(session,row)){ + return "end"; + } + } + return ""; + }; + + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + if (this.isHeading(session,row)) { + while (++row < maxRow) { + if (this.isHeading(session,row)){ + row--; + break; + } + } + + endRow = row; + if (endRow > startRow) { + while (endRow > startRow && /^\s*$/.test(session.getLine(endRow))) + endRow--; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + } else if (this.getFoldWidget(session, foldStyle, row)==="end"){ + var endRow = row; + var endColumn = session.getLine(endRow).length; + while (--row>=0){ + if (this.isHeading(session,row)){ + break; + } + } + var line = session.getLine(row); + var startColumn = line.length; + return new Range(row, startColumn, endRow, endColumn); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/haskell_cabal",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/haskell_cabal_highlight_rules","ace/mode/folding/haskell_cabal"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CabalHighlightRules = require("./haskell_cabal_highlight_rules").CabalHighlightRules; +var FoldMode = require("./folding/haskell_cabal").FoldMode; + +var Mode = function() { + this.HighlightRules = CabalHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = null; + this.$id = "ace/mode/haskell_cabal"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-haxe.js b/src/libs/ace/mode-haxe.js new file mode 100755 index 0000000..694b9b8 --- /dev/null +++ b/src/libs/ace/mode-haxe.js @@ -0,0 +1,379 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/haxe_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); + +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var HaxeHighlightRules = function() { + + var keywords = ( + "break|case|cast|catch|class|continue|default|else|enum|extends|for|function|if|implements|import|in|inline|interface|new|override|package|private|public|return|static|super|switch|this|throw|trace|try|typedef|untyped|var|while|Array|Void|Bool|Int|UInt|Float|Dynamic|String|List|Hash|IntHash|Error|Unknown|Type|Std" + ); + + var buildinConstants = ( + "null|true|false" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({<]" + }, { + token : "paren.rparen", + regex : "[\\])}>]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(HaxeHighlightRules, TextHighlightRules); + +exports.HaxeHighlightRules = HaxeHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/haxe",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/haxe_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HaxeHighlightRules = require("./haxe_highlight_rules").HaxeHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = HaxeHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/haxe"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-hjson.js b/src/libs/ace/mode-hjson.js new file mode 100755 index 0000000..8575876 --- /dev/null +++ b/src/libs/ace/mode-hjson.js @@ -0,0 +1,346 @@ +ace.define("ace/mode/hjson_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var HjsonHighlightRules = function() { + + this.$rules = { + start: [{ + include: "#comments" + }, { + include: "#rootObject" + }, { + include: "#value" + }], + "#array": [{ + token: "paren.lparen", + regex: /\[/, + push: [{ + token: "paren.rparen", + regex: /\]/, + next: "pop" + }, { + include: "#value" + }, { + include: "#comments" + }, { + token: "text", + regex: /,|$/ + }, { + token: "invalid.illegal", + regex: /[^\s\]]/ + }, { + defaultToken: "array" + }] + }], + "#comments": [{ + token: [ + "comment.punctuation", + "comment.line" + ], + regex: /(#)(.*$)/ + }, { + token: "comment.punctuation", + regex: /\/\*/, + push: [{ + token: "comment.punctuation", + regex: /\*\//, + next: "pop" + }, { + defaultToken: "comment.block" + }] + }, { + token: [ + "comment.punctuation", + "comment.line" + ], + regex: /(\/\/)(.*$)/ + }], + "#constant": [{ + token: "constant", + regex: /\b(?:true|false|null)\b/ + }], + "#keyname": [{ + token: "keyword", + regex: /(?:[^,\{\[\}\]\s]+|"(?:[^"\\]|\\.)*")\s*(?=:)/ + }], + "#mstring": [{ + token: "string", + regex: /'''/, + push: [{ + token: "string", + regex: /'''/, + next: "pop" + }, { + defaultToken: "string" + }] + }], + "#number": [{ + token: "constant.numeric", + regex: /-?(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:[eE][+-]?\d+)?)?/, + comment: "handles integer and decimal numbers" + }], + "#object": [{ + token: "paren.lparen", + regex: /\{/, + push: [{ + token: "paren.rparen", + regex: /\}/, + next: "pop" + }, { + include: "#keyname" + }, { + include: "#value" + }, { + token: "text", + regex: /:/ + }, { + token: "text", + regex: /,/ + }, { + defaultToken: "paren" + }] + }], + "#rootObject": [{ + token: "paren", + regex: /(?=\s*(?:[^,\{\[\}\]\s]+|"(?:[^"\\]|\\.)*")\s*:)/, + push: [{ + token: "paren.rparen", + regex: /---none---/, + next: "pop" + }, { + include: "#keyname" + }, { + include: "#value" + }, { + token: "text", + regex: /:/ + }, { + token: "text", + regex: /,/ + }, { + defaultToken: "paren" + }] + }], + "#string": [{ + token: "string", + regex: /"/, + push: [{ + token: "string", + regex: /"/, + next: "pop" + }, { + token: "constant.language.escape", + regex: /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/ + }, { + token: "invalid.illegal", + regex: /\\./ + }, { + defaultToken: "string" + }] + }], + "#ustring": [{ + token: "string", + regex: /\b[^:,0-9\-\{\[\}\]\s].*$/ + }], + "#value": [{ + include: "#constant" + }, { + include: "#number" + }, { + include: "#string" + }, { + include: "#array" + }, { + include: "#object" + }, { + include: "#comments" + }, { + include: "#mstring" + }, { + include: "#ustring" + }] + } + + this.normalizeRules(); +}; + +HjsonHighlightRules.metaData = { + fileTypes: ["hjson"], + foldingStartMarker: "(?x: # turn on extended mode\n ^ # a line beginning with\n \\s* # some optional space\n [{\\[] # the start of an object or array\n (?! # but not followed by\n .* # whatever\n [}\\]] # and the close of an object or array\n ,? # an optional comma\n \\s* # some optional space\n $ # at the end of the line\n )\n | # ...or...\n [{\\[] # the start of an object or array\n \\s* # some optional space\n $ # at the end of the line\n )", + foldingStopMarker: "(?x: # turn on extended mode\n ^ # a line beginning with\n \\s* # some optional space\n [}\\]] # and the close of an object or array\n )", + keyEquivalent: "^~J", + name: "Hjson", + scopeName: "source.hjson" +} + + +oop.inherits(HjsonHighlightRules, TextHighlightRules); + +exports.HjsonHighlightRules = HjsonHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/hjson",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/hjson_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HjsonHighlightRules = require("./hjson_highlight_rules").HjsonHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = HjsonHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = { start: "/*", end: "*/" }; + this.$id = "ace/mode/hjson" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-html.js b/src/libs/ace/mode-html.js new file mode 100755 index 0000000..35aa2cc --- /dev/null +++ b/src/libs/ace/mode-html.js @@ -0,0 +1,2480 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-html_elixir.js b/src/libs/ace/mode-html_elixir.js new file mode 100755 index 0000000..207e489 --- /dev/null +++ b/src/libs/ace/mode-html_elixir.js @@ -0,0 +1,3059 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/elixir_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ElixirHighlightRules = function() { + + this.$rules = { start: + [ { token: + [ 'meta.module.elixir', + 'keyword.control.module.elixir', + 'meta.module.elixir', + 'entity.name.type.module.elixir' ], + regex: '^(\\s*)(defmodule)(\\s+)((?:[A-Z]\\w*\\s*\\.\\s*)*[A-Z]\\w*)' }, + { token: 'comment.documentation.heredoc', + regex: '@(?:module|type)?doc (?:~[a-z])?"""', + push: + [ { token: 'comment.documentation.heredoc', + regex: '\\s*"""', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'comment.documentation.heredoc' } ], + comment: '@doc with heredocs is treated as documentation' }, + { token: 'comment.documentation.heredoc', + regex: '@(?:module|type)?doc ~[A-Z]"""', + push: + [ { token: 'comment.documentation.heredoc', + regex: '\\s*"""', + next: 'pop' }, + { defaultToken: 'comment.documentation.heredoc' } ], + comment: '@doc with heredocs is treated as documentation' }, + { token: 'comment.documentation.heredoc', + regex: '@(?:module|type)?doc (?:~[a-z])?\'\'\'', + push: + [ { token: 'comment.documentation.heredoc', + regex: '\\s*\'\'\'', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'comment.documentation.heredoc' } ], + comment: '@doc with heredocs is treated as documentation' }, + { token: 'comment.documentation.heredoc', + regex: '@(?:module|type)?doc ~[A-Z]\'\'\'', + push: + [ { token: 'comment.documentation.heredoc', + regex: '\\s*\'\'\'', + next: 'pop' }, + { defaultToken: 'comment.documentation.heredoc' } ], + comment: '@doc with heredocs is treated as documentation' }, + { token: 'comment.documentation.false', + regex: '@(?:module|type)?doc false', + comment: '@doc false is treated as documentation' }, + { token: 'comment.documentation.string', + regex: '@(?:module|type)?doc "', + push: + [ { token: 'comment.documentation.string', + regex: '"', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'comment.documentation.string' } ], + comment: '@doc with string is treated as documentation' }, + { token: 'keyword.control.elixir', + regex: '\\b(?:do|end|case|bc|lc|for|if|cond|unless|try|receive|fn|defmodule|defp?|defprotocol|defimpl|defrecord|defstruct|defmacrop?|defdelegate|defcallback|defmacrocallback|defexception|defoverridable|exit|after|rescue|catch|else|raise|throw|import|require|alias|use|quote|unquote|super)\\b(?![?!])', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?_?\\h)*|\\d(?>_?\\d)*(\\.(?![^[:space:][:digit:]])(?>_?\\d)*)?([eE][-+]?\\d(?>_?\\d)*)?|0b[01]+|0o[0-7]+)\\b' }, + { token: 'punctuation.definition.constant.elixir', + regex: ':\'', + push: + [ { token: 'punctuation.definition.constant.elixir', + regex: '\'', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'constant.other.symbol.single-quoted.elixir' } ] }, + { token: 'punctuation.definition.constant.elixir', + regex: ':"', + push: + [ { token: 'punctuation.definition.constant.elixir', + regex: '"', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'constant.other.symbol.double-quoted.elixir' } ] }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '(?:\'\'\')', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?>\'\'\')', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '^\\s*\'\'\'', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'support.function.variable.quoted.single.heredoc.elixir' } ], + comment: 'Single-quoted heredocs' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\'', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'support.function.variable.quoted.single.elixir' } ], + comment: 'single quoted string (allows for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '(?:""")', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?>""")', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '^\\s*"""', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.quoted.double.heredoc.elixir' } ], + comment: 'Double-quoted heredocs' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '"', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.quoted.double.elixir' } ], + comment: 'double quoted string (allows for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z](?:""")', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '~[a-z](?>""")', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '^\\s*"""', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.quoted.double.heredoc.elixir' } ], + comment: 'Double-quoted heredocs sigils' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z]\\{', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\}[a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z]\\[', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\][a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z]\\<', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\>[a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z]\\(', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\)[a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[a-z][^\\w]', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '[^\\w][a-z]*', + next: 'pop' }, + { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { include: '#escaped_char' }, + { defaultToken: 'string.interpolated.elixir' } ], + comment: 'sigil (allow for interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z](?:""")', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '~[A-Z](?>""")', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '^\\s*"""', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'Double-quoted heredocs sigils' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z]\\{', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\}[a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z]\\[', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\][a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z]\\<', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\>[a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z]\\(', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '\\)[a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: 'punctuation.definition.string.begin.elixir', + regex: '~[A-Z][^\\w]', + push: + [ { token: 'punctuation.definition.string.end.elixir', + regex: '[^\\w][a-z]*', + next: 'pop' }, + { defaultToken: 'string.quoted.other.literal.upper.elixir' } ], + comment: 'sigil (without interpolation)' }, + { token: ['punctuation.definition.constant.elixir', 'constant.other.symbol.elixir'], + regex: '(:)([a-zA-Z_][\\w@]*(?:[?!]|=(?![>=]))?|\\<\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\-|\\|>|=>|~|~=|=|/|\\\\\\\\|\\*\\*?|\\.\\.?\\.?|>=?|<=?|&&?&?|\\+\\+?|\\-\\-?|\\|\\|?\\|?|\\!|@|\\%?\\{\\}|%|\\[\\]|\\^(?:\\^\\^)?)', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?[a-zA-Z_][\\w@]*(?>[?!]|=(?![>=]))?|\\<\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\-|\\|>|=>|~|~=|=|/|\\\\\\\\|\\*\\*?|\\.\\.?\\.?|>=?|<=?|&&?&?|\\+\\+?|\\-\\-?|\\|\\|?\\|?|\\!|@|\\%?\\{\\}|%|\\[\\]|\\^(\\^\\^)?)', + comment: 'symbols' }, + { token: 'punctuation.definition.constant.elixir', + regex: '(?:[a-zA-Z_][\\w@]*(?:[?!])?):(?!:)', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?>[a-zA-Z_][\\w@]*(?>[?!])?)(:)(?!:)', + comment: 'symbols' }, + { token: + [ 'punctuation.definition.comment.elixir', + 'comment.line.number-sign.elixir' ], + regex: '(#)(.*)' }, + { token: 'constant.numeric.elixir', + regex: '\\?(?:\\\\(?:x[\\da-fA-F]{1,2}(?![\\da-fA-F])\\b|[^xMC])|[^\\s\\\\])', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?=?' }, + { token: 'keyword.operator.bitwise.elixir', + regex: '\\|{3}|&{3}|\\^{3}|<{3}|>{3}|~{3}' }, + { token: 'keyword.operator.logical.elixir', + regex: '!+|\\bnot\\b|&&|\\band\\b|\\|\\||\\bor\\b|\\bxor\\b', + originalRegex: '(?<=[ \\t])!+|\\bnot\\b|&&|\\band\\b|\\|\\||\\bor\\b|\\bxor\\b' }, + { token: 'keyword.operator.arithmetic.elixir', + regex: '\\*|\\+|\\-|/' }, + { token: 'keyword.operator.other.elixir', + regex: '\\||\\+\\+|\\-\\-|\\*\\*|\\\\\\\\|\\<\\-|\\<\\>|\\<\\<|\\>\\>|\\:\\:|\\.\\.|\\|>|~|=>' }, + { token: 'keyword.operator.assignment.elixir', regex: '=' }, + { token: 'punctuation.separator.other.elixir', regex: ':' }, + { token: 'punctuation.separator.statement.elixir', + regex: '\\;' }, + { token: 'punctuation.separator.object.elixir', regex: ',' }, + { token: 'punctuation.separator.method.elixir', regex: '\\.' }, + { token: 'punctuation.section.scope.elixir', regex: '\\{|\\}' }, + { token: 'punctuation.section.array.elixir', regex: '\\[|\\]' }, + { token: 'punctuation.section.function.elixir', + regex: '\\(|\\)' } ], + '#escaped_char': + [ { token: 'constant.character.escape.elixir', + regex: '\\\\(?:x[\\da-fA-F]{1,2}|.)' } ], + '#interpolated_elixir': + [ { token: + [ 'source.elixir.embedded.source', + 'source.elixir.embedded.source.empty' ], + regex: '(#\\{)(\\})' }, + { todo: + { token: 'punctuation.section.embedded.elixir', + regex: '#\\{', + push: + [ { token: 'punctuation.section.embedded.elixir', + regex: '\\}', + next: 'pop' }, + { include: '#nest_curly_and_self' }, + { include: '$self' }, + { defaultToken: 'source.elixir.embedded.source' } ] } } ], + '#nest_curly_and_self': + [ { token: 'punctuation.section.scope.elixir', + regex: '\\{', + push: + [ { token: 'punctuation.section.scope.elixir', + regex: '\\}', + next: 'pop' }, + { include: '#nest_curly_and_self' } ] }, + { include: '$self' } ], + '#regex_sub': + [ { include: '#interpolated_elixir' }, + { include: '#escaped_char' }, + { token: + [ 'punctuation.definition.arbitrary-repitition.elixir', + 'string.regexp.arbitrary-repitition.elixir', + 'string.regexp.arbitrary-repitition.elixir', + 'punctuation.definition.arbitrary-repitition.elixir' ], + regex: '(\\{)(\\d+)((?:,\\d+)?)(\\})' }, + { token: 'punctuation.definition.character-class.elixir', + regex: '\\[(?:\\^?\\])?', + push: + [ { token: 'punctuation.definition.character-class.elixir', + regex: '\\]', + next: 'pop' }, + { include: '#escaped_char' }, + { defaultToken: 'string.regexp.character-class.elixir' } ] }, + { token: 'punctuation.definition.group.elixir', + regex: '\\(', + push: + [ { token: 'punctuation.definition.group.elixir', + regex: '\\)', + next: 'pop' }, + { include: '#regex_sub' }, + { defaultToken: 'string.regexp.group.elixir' } ] }, + { token: + [ 'punctuation.definition.comment.elixir', + 'comment.line.number-sign.elixir' ], + regex: '(?:^|\\s)(#)(\\s[[a-zA-Z0-9,. \\t?!-][^\\x00-\\x7F]]*$)', + originalRegex: '(?<=^|\\s)(#)\\s[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$', + comment: 'We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.' } ] } + + this.normalizeRules(); +}; + +ElixirHighlightRules.metaData = { comment: 'Textmate bundle for Elixir Programming Language.', + fileTypes: [ 'ex', 'exs' ], + firstLineMatch: '^#!/.*\\belixir', + foldingStartMarker: '(after|else|catch|rescue|\\-\\>|\\{|\\[|do)\\s*$', + foldingStopMarker: '^\\s*((\\}|\\]|after|else|catch|rescue)\\s*$|end\\b)', + keyEquivalent: '^~E', + name: 'Elixir', + scopeName: 'source.elixir' } + + +oop.inherits(ElixirHighlightRules, TextHighlightRules); + +exports.ElixirHighlightRules = ElixirHighlightRules; +}); + +ace.define("ace/mode/html_elixir_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/elixir_highlight_rules"], function(require, exports, module) { + "use strict"; + + var oop = require("../lib/oop"); + var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + var ElixirHighlightRules = require("./elixir_highlight_rules").ElixirHighlightRules; + + var HtmlElixirHighlightRules = function() { + HtmlHighlightRules.call(this); + + var startRules = [ + { + regex: "<%%|%%>", + token: "constant.language.escape" + }, { + token : "comment.start.eex", + regex : "<%#", + push : [{ + token : "comment.end.eex", + regex: "%>", + next: "pop", + defaultToken:"comment" + }] + }, { + token : "support.elixir_tag", + regex : "<%+(?!>)[-=]?", + push : "elixir-start" + } + ]; + + var endRules = [ + { + token : "support.elixir_tag", + regex : "%>", + next : "pop" + }, { + token: "comment", + regex: "#(?:[^%]|%[^>])*" + } + ]; + + for (var key in this.$rules) + this.$rules[key].unshift.apply(this.$rules[key], startRules); + + this.embedRules(ElixirHighlightRules, "elixir-", endRules, ["start"]); + + this.normalizeRules(); + }; + + + oop.inherits(HtmlElixirHighlightRules, HtmlHighlightRules); + + exports.HtmlElixirHighlightRules = HtmlElixirHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/elixir",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/elixir_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ElixirHighlightRules = require("./elixir_highlight_rules").ElixirHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = ElixirHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.$id = "ace/mode/elixir" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/html_elixir",["require","exports","module","ace/lib/oop","ace/mode/html_elixir_highlight_rules","ace/mode/html","ace/mode/javascript","ace/mode/css","ace/mode/elixir"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlElixirHighlightRules = require("./html_elixir_highlight_rules").HtmlElixirHighlightRules; +var HtmlMode = require("./html").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var ElixirMode = require("./elixir").Mode; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = HtmlElixirHighlightRules; + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode, + "elixir-": ElixirMode + }); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + + this.$id = "ace/mode/html_elixir"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-html_ruby.js b/src/libs/ace/mode-html_ruby.js new file mode 100755 index 0000000..593e955 --- /dev/null +++ b/src/libs/ace/mode-html_ruby.js @@ -0,0 +1,3016 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var constantOtherSymbol = exports.constantOtherSymbol = { + token : "constant.other.symbol.ruby", // symbol + regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?" +}; + +var qString = exports.qString = { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" +}; + +var qqString = exports.qqString = { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' +}; + +var tString = exports.tString = { + token : "string", // backtick string + regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]" +}; + +var constantNumericHex = exports.constantNumericHex = { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b" +}; + +var constantNumericFloat = exports.constantNumericFloat = { + token : "constant.numeric", // float + regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b" +}; + +var instanceVariable = exports.instanceVariable = { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" +}; + +var RubyHighlightRules = function() { + + var builtinFunctions = ( + "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" + + "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" + + "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" + + "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" + + "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" + + "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" + + "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" + + "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" + + "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" + + "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" + + "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" + + "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" + + "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" + + "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" + + "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" + + "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" + + "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" + + "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" + + "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" + + "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" + + "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" + + "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" + + "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" + + "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" + + "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" + + "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" + + "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" + + "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" + + "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" + + "has_many|has_one|belongs_to|has_and_belongs_to_many" + ); + + var keywords = ( + "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" + + "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" + + "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield" + ); + + var buildinConstants = ( + "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" + + "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING" + ); + + var builtinVariables = ( + "$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|" + + "$!|root_url|flash|session|cookies|params|request|response|logger|self" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "variable.language": builtinVariables, + "support.function": builtinFunctions, + "invalid.deprecated": "debugger" // TODO is this a remnant from js mode? + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment", // multi line comment + regex : "^=begin(?:$|\\s.*$)", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, + + [{ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren.lparen"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1) + return "paren.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.start", + regex : /"/, + push : [{ + token : "constant.language.escape", + regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/ + }, { + token : "paren.start", + regex : /#{/, + push : "start" + }, { + token : "string.end", + regex : /"/, + next : "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/ + }, { + token : "paren.start", + regex : /#{/, + push : "start" + }, { + token : "string.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : /'/, + push : [{ + token : "constant.language.escape", + regex : /\\['\\]/ + }, { + token : "string.end", + regex : /'/, + next : "pop" + }, { + defaultToken: "string" + }] + }], + + { + token : "text", // namespaces aren't symbols + regex : "::" + }, { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" + }, { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + + constantOtherSymbol, + constantNumericHex, + constantNumericFloat, + + { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "punctuation.separator.key-value", + regex : "=>" + }, { + stateName: "heredoc", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[3]); + return [ + {type:"constant", value: tokens[1]}, + {type:"string", value: tokens[2]}, + {type:"support.class", value: tokens[3]}, + {type:"string", value: tokens[4]} + ]; + }, + regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)", + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^ +" + }, { + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + regex : "$", + token : "empty", + next : function(currentState, stack) { + if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc") + return stack[0]; + return currentState; + } + }, { + token : "string.character", + regex : "\\B\\?." + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "^=end(?:$|\\s.*$)", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.normalizeRules(); +}; + +oop.inherits(RubyHighlightRules, TextHighlightRules); + +exports.RubyHighlightRules = RubyHighlightRules; +}); + +ace.define("ace/mode/html_ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/ruby_highlight_rules"], function(require, exports, module) { + "use strict"; + + var oop = require("../lib/oop"); + var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules; + + var HtmlRubyHighlightRules = function() { + HtmlHighlightRules.call(this); + + var startRules = [ + { + regex: "<%%|%%>", + token: "constant.language.escape" + }, { + token : "comment.start.erb", + regex : "<%#", + push : [{ + token : "comment.end.erb", + regex: "%>", + next: "pop", + defaultToken:"comment" + }] + }, { + token : "support.ruby_tag", + regex : "<%+(?!>)[-=]?", + push : "ruby-start" + } + ]; + + var endRules = [ + { + token : "support.ruby_tag", + regex : "%>", + next : "pop" + }, { + token: "comment", + regex: "#(?:[^%]|%[^>])*" + } + ]; + + for (var key in this.$rules) + this.$rules[key].unshift.apply(this.$rules[key], startRules); + + this.embedRules(RubyHighlightRules, "ruby-", endRules, ["start"]); + + this.normalizeRules(); + }; + + + oop.inherits(HtmlRubyHighlightRules, HtmlHighlightRules); + + exports.HtmlRubyHighlightRules = HtmlRubyHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = RubyHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + var startingClassOrMethod = line.match(/^\s*(class|def|module)\s.*$/); + var startingDoBlock = line.match(/.*do(\s*|\s+\|.*\|\s*)$/); + var startingConditional = line.match(/^\s*(if|else|when)\s*/) + if (match || startingClassOrMethod || startingDoBlock || startingConditional) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return /^\s+(end|else)$/.test(line + input) || this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, session, row) { + var line = session.getLine(row); + if (/}/.test(line)) + return this.$outdent.autoOutdent(session, row); + var indent = this.$getIndent(line); + var prevLine = session.getLine(row - 1); + var prevIndent = this.$getIndent(prevLine); + var tab = session.getTabString(); + if (prevIndent.length <= indent.length) { + if (indent.slice(-tab.length) == tab) + session.remove(new Range(row, indent.length-tab.length, row, indent.length)); + } + }; + + this.$id = "ace/mode/ruby"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/html_ruby",["require","exports","module","ace/lib/oop","ace/mode/html_ruby_highlight_rules","ace/mode/html","ace/mode/javascript","ace/mode/css","ace/mode/ruby"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlRubyHighlightRules = require("./html_ruby_highlight_rules").HtmlRubyHighlightRules; +var HtmlMode = require("./html").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var RubyMode = require("./ruby").Mode; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = HtmlRubyHighlightRules; + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode, + "ruby-": RubyMode + }); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + + this.$id = "ace/mode/html_ruby"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-ini.js b/src/libs/ace/mode-ini.js new file mode 100755 index 0000000..f53e87f --- /dev/null +++ b/src/libs/ace/mode-ini.js @@ -0,0 +1,155 @@ +ace.define("ace/mode/ini_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var escapeRe = "\\\\(?:[\\\\0abtrn;#=:]|x[a-fA-F\\d]{4})"; + +var IniHighlightRules = function() { + this.$rules = { + start: [{ + token: 'punctuation.definition.comment.ini', + regex: '#.*', + push_: [{ + token: 'comment.line.number-sign.ini', + regex: '$|^', + next: 'pop' + }, { + defaultToken: 'comment.line.number-sign.ini' + }] + }, { + token: 'punctuation.definition.comment.ini', + regex: ';.*', + push_: [{ + token: 'comment.line.semicolon.ini', + regex: '$|^', + next: 'pop' + }, { + defaultToken: 'comment.line.semicolon.ini' + }] + }, { + token: ['keyword.other.definition.ini', 'text', 'punctuation.separator.key-value.ini'], + regex: '\\b([a-zA-Z0-9_.-]+)\\b(\\s*)(=)' + }, { + token: ['punctuation.definition.entity.ini', 'constant.section.group-title.ini', 'punctuation.definition.entity.ini'], + regex: '^(\\[)(.*?)(\\])' + }, { + token: 'punctuation.definition.string.begin.ini', + regex: "'", + push: [{ + token: 'punctuation.definition.string.end.ini', + regex: "'", + next: 'pop' + }, { + token: "constant.language.escape", + regex: escapeRe + }, { + defaultToken: 'string.quoted.single.ini' + }] + }, { + token: 'punctuation.definition.string.begin.ini', + regex: '"', + push: [{ + token: "constant.language.escape", + regex: escapeRe + }, { + token: 'punctuation.definition.string.end.ini', + regex: '"', + next: 'pop' + }, { + defaultToken: 'string.quoted.double.ini' + }] + }] + }; + + this.normalizeRules(); +}; + +IniHighlightRules.metaData = { + fileTypes: ['ini', 'conf'], + keyEquivalent: '^~I', + name: 'Ini', + scopeName: 'source.ini' +}; + + +oop.inherits(IniHighlightRules, TextHighlightRules); + +exports.IniHighlightRules = IniHighlightRules; +}); + +ace.define("ace/mode/folding/ini",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function() { +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /^\s*\[([^\])]*)]\s*(?:$|[;#])/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var re = this.foldingStartMarker; + var line = session.getLine(row); + + var m = line.match(re); + + if (!m) return; + + var startName = m[1] + "."; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + if (/^\s*$/.test(line)) + continue; + m = line.match(re); + if (m && m[1].lastIndexOf(startName, 0) !== 0) + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/ini",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ini_highlight_rules","ace/mode/folding/ini"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var IniHighlightRules = require("./ini_highlight_rules").IniHighlightRules; +var FoldMode = require("./folding/ini").FoldMode; + +var Mode = function() { + this.HighlightRules = IniHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = ";"; + this.blockComment = null; + this.$id = "ace/mode/ini"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-io.js b/src/libs/ace/mode-io.js new file mode 100755 index 0000000..93d53e2 --- /dev/null +++ b/src/libs/ace/mode-io.js @@ -0,0 +1,246 @@ +ace.define("ace/mode/io_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var IoHighlightRules = function() { + + this.$rules = { start: + [ { token: [ 'text', 'meta.empty-parenthesis.io' ], + regex: '(\\()(\\))', + comment: 'we match this to overload return inside () --Allan; scoping rules for what gets the scope have changed, so we now group the ) instead of the ( -- Rob' }, + { token: [ 'text', 'meta.comma-parenthesis.io' ], + regex: '(\\,)(\\))', + comment: 'We want to do the same for ,) -- Seckar; same as above -- Rob' }, + { token: 'keyword.control.io', + regex: '\\b(?:if|ifTrue|ifFalse|ifTrueIfFalse|for|loop|reverseForeach|foreach|map|continue|break|while|do|return)\\b' }, + { token: 'punctuation.definition.comment.io', + regex: '/\\*', + push: + [ { token: 'punctuation.definition.comment.io', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.io' } ] }, + { token: 'punctuation.definition.comment.io', + regex: '//', + push: + [ { token: 'comment.line.double-slash.io', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-slash.io' } ] }, + { token: 'punctuation.definition.comment.io', + regex: '#', + push: + [ { token: 'comment.line.number-sign.io', regex: '$', next: 'pop' }, + { defaultToken: 'comment.line.number-sign.io' } ] }, + { token: 'variable.language.io', + regex: '\\b(?:self|sender|target|proto|protos|parent)\\b', + comment: 'I wonder if some of this isn\'t variable.other.language? --Allan; scoping this as variable.language to match Objective-C\'s handling of \'self\', which is inconsistent with C++\'s handling of \'this\' but perhaps intentionally so -- Rob' }, + { token: 'keyword.operator.io', + regex: '<=|>=|=|:=|\\*|\\||\\|\\||\\+|-|/|&|&&|>|<|\\?|@|@@|\\b(?:and|or)\\b' }, + { token: 'constant.other.io', regex: '\\bGL[\\w_]+\\b' }, + { token: 'support.class.io', regex: '\\b[A-Z](?:\\w+)?\\b' }, + { token: 'support.function.io', + regex: '\\b(?:clone|call|init|method|list|vector|block|\\w+(?=\\s*\\())\\b' }, + { token: 'support.function.open-gl.io', + regex: '\\bgl(?:u|ut)?[A-Z]\\w+\\b' }, + { token: 'punctuation.definition.string.begin.io', + regex: '"""', + push: + [ { token: 'punctuation.definition.string.end.io', + regex: '"""', + next: 'pop' }, + { token: 'constant.character.escape.io', regex: '\\\\.' }, + { defaultToken: 'string.quoted.triple.io' } ] }, + { token: 'punctuation.definition.string.begin.io', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.io', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.io', regex: '\\\\.' }, + { defaultToken: 'string.quoted.double.io' } ] }, + { token: 'constant.numeric.io', + regex: '\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\.?[0-9]*|\\.[0-9]+)(?:(?:e|E)(?:\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\b' }, + { token: 'variable.other.global.io', regex: 'Lobby\\b' }, + { token: 'constant.language.io', + regex: '\\b(?:TRUE|true|FALSE|false|NULL|null|Null|Nil|nil|YES|NO)\\b' } ] } + + this.normalizeRules(); +}; + +IoHighlightRules.metaData = { fileTypes: [ 'io' ], + keyEquivalent: '^~I', + name: 'Io', + scopeName: 'source.io' } + + +oop.inherits(IoHighlightRules, TextHighlightRules); + +exports.IoHighlightRules = IoHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/io",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/io_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var IoHighlightRules = require("./io_highlight_rules").IoHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = IoHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/io"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-jack.js b/src/libs/ace/mode-jack.js new file mode 100755 index 0000000..ceaf135 --- /dev/null +++ b/src/libs/ace/mode-jack.js @@ -0,0 +1,339 @@ +ace.define("ace/mode/jack_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JackHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "string", + regex : '"', + next : "string2" + }, { + token : "string", + regex : "'", + next : "string1" + }, { + token : "constant.numeric", // hex + regex: "-?0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "(?:0|[-+]?[1-9][0-9]*)\\b" + }, { + token : "constant.binary", + regex : "<[0-9A-Fa-f][0-9A-Fa-f](\\s+[0-9A-Fa-f][0-9A-Fa-f])*>" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : "constant.language.null", + regex : "null\\b" + }, { + token : "storage.type", + regex: "(?:Integer|Boolean|Null|String|Buffer|Tuple|List|Object|Function|Coroutine|Form)\\b" + }, { + token : "keyword", + regex : "(?:return|abort|vars|for|delete|in|is|escape|exec|split|and|if|elif|else|while)\\b" + }, { + token : "language.builtin", + regex : "(?:lines|source|parse|read-stream|interval|substr|parseint|write|print|range|rand|inspect|bind|i-values|i-pairs|i-map|i-filter|i-chunk|i-all\\?|i-any\\?|i-collect|i-zip|i-merge|i-each)\\b" + }, { + token : "comment", + regex : "--.*$" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "storage.form", + regex : "@[a-z]+" + }, { + token : "constant.other.symbol", + regex : ':+[a-zA-Z_]([-]?[a-zA-Z0-9_])*[?!]?' + }, { + token : "variable", + regex : '[a-zA-Z_]([-]?[a-zA-Z0-9_])*[?!]?' + }, { + token : "keyword.operator", + regex : "\\|\\||\\^\\^|&&|!=|==|<=|<|>=|>|\\+|-|\\*|\\/|\\^|\\%|\\#|\\!" + }, { + token : "text", + regex : "\\s+" + } + ], + "string1" : [ + { + token : "constant.language.escape", + regex : /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|['"\\\/bfnrt])/ + }, { + token : "string", + regex : "[^'\\\\]+" + }, { + token : "string", + regex : "'", + next : "start" + }, { + token : "string", + regex : "", + next : "start" + } + ], + "string2" : [ + { + token : "constant.language.escape", + regex : /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|['"\\\/bfnrt])/ + }, { + token : "string", + regex : '[^"\\\\]+' + }, { + token : "string", + regex : '"', + next : "start" + }, { + token : "string", + regex : "", + next : "start" + } + ] + }; + +}; + +oop.inherits(JackHighlightRules, TextHighlightRules); + +exports.JackHighlightRules = JackHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/jack",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/jack_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HighlightRules = require("./jack_highlight_rules").JackHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = HighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + + this.$id = "ace/mode/jack"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-jade.js b/src/libs/ace/mode-jade.js new file mode 100755 index 0000000..bfbe9c8 --- /dev/null +++ b/src/libs/ace/mode-jade.js @@ -0,0 +1,2129 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/markdown_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules","ace/mode/html_highlight_rules","ace/mode/css_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; + +var escaped = function(ch) { + return "(?:[^" + lang.escapeRegExp(ch) + "\\\\]|\\\\.)*"; +} + +function github_embed(tag, prefix) { + return { // Github style block + token : "support.function", + regex : "^\\s*```" + tag + "\\s*$", + push : prefix + "start" + }; +} + +var MarkdownHighlightRules = function() { + HtmlHighlightRules.call(this); + + this.$rules["start"].unshift({ + token : "empty_line", + regex : '^$', + next: "allowBlock" + }, { // h1 + token: "markup.heading.1", + regex: "^=+(?=\\s*$)" + }, { // h2 + token: "markup.heading.2", + regex: "^\\-+(?=\\s*$)" + }, { + token : function(value) { + return "markup.heading." + value.length; + }, + regex : /^#{1,6}(?=\s*[^ #]|\s+#.)/, + next : "header" + }, + github_embed("(?:javascript|js)", "jscode-"), + github_embed("xml", "xmlcode-"), + github_embed("html", "htmlcode-"), + github_embed("css", "csscode-"), + { // Github style block + token : "support.function", + regex : "^\\s*```\\s*\\S*(?:{.*?\\})?\\s*$", + next : "githubblock" + }, { // block quote + token : "string.blockquote", + regex : "^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+", + next : "blockquote" + }, { // HR * - _ + token : "constant", + regex : "^ {0,2}(?:(?: ?\\* ?){3,}|(?: ?\\- ?){3,}|(?: ?\\_ ?){3,})\\s*$", + next: "allowBlock" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic" + }); + + this.addRules({ + "basic" : [{ + token : "constant.language.escape", + regex : /\\[\\`*_{}\[\]()#+\-.!]/ + }, { // code span ` + token : "support.function", + regex : "(`+)(.*?[^`])(\\1)" + }, { // reference + token : ["text", "constant", "text", "url", "string", "text"], + regex : "^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:[\"][^\"]+[\"])?(\\s*))$" + }, { // link by reference + token : ["text", "string", "text", "constant", "text"], + regex : "(\\[)(" + escaped("]") + ")(\\]\\s*\\[)("+ escaped("]") + ")(\\])" + }, { // link by url + token : ["text", "string", "text", "markup.underline", "string", "text"], + regex : "(\\[)(" + // [ + escaped("]") + // link text + ")(\\]\\()"+ // ]( + '((?:[^\\)\\s\\\\]|\\\\.|\\s(?=[^"]))*)' + // href + '(\\s*"' + escaped('"') + '"\\s*)?' + // "title" + "(\\))" // ) + }, { // strong ** __ + token : "string.strong", + regex : "([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // emphasis * _ + token : "string.emphasis", + regex : "([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // + token : ["text", "url", "text"], + regex : "(<)("+ + "(?:https?|ftp|dict):[^'\">\\s]+"+ + "|"+ + "(?:mailto:)?[-.\\w]+\\@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+"+ + ")(>)" + }], + "allowBlock": [ + {token : "support.function", regex : "^ {4}.+", next : "allowBlock"}, + {token : "empty_line", regex : '^$', next: "allowBlock"}, + {token : "empty", regex : "", next : "start"} + ], + + "header" : [{ + regex: "$", + next : "start" + }, { + include: "basic" + }, { + defaultToken : "heading" + } ], + + "listblock-start" : [{ + token : "support.variable", + regex : /(?:\[[ x]\])?/, + next : "listblock" + }], + + "listblock" : [ { // Lists only escape on completely blank lines. + token : "empty_line", + regex : "^$", + next : "start" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic", noEscape: true + }, { // Github style block + token : "support.function", + regex : "^\\s*```\\s*[a-zA-Z]*(?:{.*?\\})?\\s*$", + next : "githubblock" + }, { + defaultToken : "list" //do not use markup.list to allow stling leading `*` differntly + } ], + + "blockquote" : [ { // Blockquotes only escape on blank lines. + token : "empty_line", + regex : "^\\s*$", + next : "start" + }, { // block quote + token : "string.blockquote", + regex : "^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+", + next : "blockquote" + }, { + include : "basic", noEscape: true + }, { + defaultToken : "string.blockquote" + } ], + + "githubblock" : [ { + token : "support.function", + regex : "^\\s*```", + next : "start" + }, { + defaultToken : "support.function" + } ] + }); + + this.embedRules(JavaScriptHighlightRules, "jscode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(HtmlHighlightRules, "htmlcode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(CssHighlightRules, "csscode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(XmlHighlightRules, "xmlcode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.normalizeRules(); +}; +oop.inherits(MarkdownHighlightRules, TextHighlightRules); + +exports.MarkdownHighlightRules = MarkdownHighlightRules; +}); + +ace.define("ace/mode/scss_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ScssHighlightRules = function() { + + var properties = lang.arrayToMap( (function () { + + var browserPrefix = ("-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-").split("|"); + + var prefixProperties = ("appearance|background-clip|background-inline-policy|background-origin|" + + "background-size|binding|border-bottom-colors|border-left-colors|" + + "border-right-colors|border-top-colors|border-end|border-end-color|" + + "border-end-style|border-end-width|border-image|border-start|" + + "border-start-color|border-start-style|border-start-width|box-align|" + + "box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|" + + "box-pack|box-sizing|column-count|column-gap|column-width|column-rule|" + + "column-rule-width|column-rule-style|column-rule-color|float-edge|" + + "font-feature-settings|font-language-override|force-broken-image-icon|" + + "image-region|margin-end|margin-start|opacity|outline|outline-color|" + + "outline-offset|outline-radius|outline-radius-bottomleft|" + + "outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|" + + "outline-style|outline-width|padding-end|padding-start|stack-sizing|" + + "tab-size|text-blink|text-decoration-color|text-decoration-line|" + + "text-decoration-style|transform|transform-origin|transition|" + + "transition-delay|transition-duration|transition-property|" + + "transition-timing-function|user-focus|user-input|user-modify|user-select|" + + "window-shadow|border-radius").split("|"); + + var properties = ("azimuth|background-attachment|background-color|background-image|" + + "background-position|background-repeat|background|border-bottom-color|" + + "border-bottom-style|border-bottom-width|border-bottom|border-collapse|" + + "border-color|border-left-color|border-left-style|border-left-width|" + + "border-left|border-right-color|border-right-style|border-right-width|" + + "border-right|border-spacing|border-style|border-top-color|" + + "border-top-style|border-top-width|border-top|border-width|border|bottom|" + + "box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|" + + "counter-reset|cue-after|cue-before|cue|cursor|direction|display|" + + "elevation|empty-cells|float|font-family|font-size-adjust|font-size|" + + "font-stretch|font-style|font-variant|font-weight|font|height|left|" + + "letter-spacing|line-height|list-style-image|list-style-position|" + + "list-style-type|list-style|margin-bottom|margin-left|margin-right|" + + "margin-top|marker-offset|margin|marks|max-height|max-width|min-height|" + + "min-width|opacity|orphans|outline-color|" + + "outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|" + + "padding-left|padding-right|padding-top|padding|page-break-after|" + + "page-break-before|page-break-inside|page|pause-after|pause-before|" + + "pause|pitch-range|pitch|play-during|position|quotes|richness|right|" + + "size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|" + + "stress|table-layout|text-align|text-decoration|text-indent|" + + "text-shadow|text-transform|top|unicode-bidi|vertical-align|" + + "visibility|voice-family|volume|white-space|widows|width|word-spacing|" + + "z-index").split("|"); + var ret = []; + for (var i=0, ln=browserPrefix.length; i|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; +}; + +oop.inherits(ScssHighlightRules, TextHighlightRules); + +exports.ScssHighlightRules = ScssHighlightRules; + +}); + +ace.define("ace/mode/less_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/css_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CssHighlightRules = require('./css_highlight_rules'); + +var LessHighlightRules = function() { + + + var keywordList = "@import|@media|@font-face|@keyframes|@-webkit-keyframes|@supports|" + + "@charset|@plugin|@namespace|@document|@page|@viewport|@-ms-viewport|" + + "or|and|when|not"; + + var keywords = keywordList.split('|'); + + var properties = CssHighlightRules.supportType.split('|'); + + var keywordMapper = this.createKeywordMapper({ + "support.constant": CssHighlightRules.supportConstant, + "keyword": keywordList, + "support.constant.color": CssHighlightRules.supportConstantColor, + "support.constant.fonts": CssHighlightRules.supportConstantFonts + }, "identifier", true); + + var numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : ["support.function", "paren.lparen", "string", "paren.rparen"], + regex : "(url)(\\()(.*)(\\))" + }, { + token : ["support.function", "paren.lparen"], + regex : "(:extend|[a-z0-9_\\-]+)(\\()" + }, { + token : function(value) { + if (keywords.indexOf(value.toLowerCase()) > -1) + return "keyword"; + else + return "variable"; + }, + regex : "[@\\$][a-z0-9_\\-@\\$]*\\b" + }, { + token : "variable", + regex : "[@\\$]\\{[a-z0-9_\\-@\\$]*\\}" + }, { + token : function(first, second) { + if(properties.indexOf(first.toLowerCase()) > -1) { + return ["support.type.property", "text"]; + } + else { + return ["support.type.unknownProperty", "text"]; + } + }, + regex : "([a-z0-9-_]+)(\\s*:)" + }, { + token : "keyword", + regex : "&" // special case - always treat as keyword + }, { + token : keywordMapper, + regex : "\\-?[@a-z_][@a-z0-9_\\-]*" + }, { + token: "variable.language", + regex: "#[a-z0-9-_]+" + }, { + token: "variable.language", + regex: "\\.[a-z0-9-_]+" + }, { + token: "variable.language", + regex: ":[a-z_][a-z0-9-_]*" + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + token : "keyword.operator", + regex : "<|>|<=|>=|=|!=|-|%|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + this.normalizeRules(); +}; + +oop.inherits(LessHighlightRules, TextHighlightRules); + +exports.LessHighlightRules = LessHighlightRules; + +}); + +ace.define("ace/mode/coffee_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + + var oop = require("../lib/oop"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + oop.inherits(CoffeeHighlightRules, TextHighlightRules); + + function CoffeeHighlightRules() { + var identifier = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"; + + var keywords = ( + "this|throw|then|try|typeof|super|switch|return|break|by|continue|" + + "catch|class|in|instanceof|is|isnt|if|else|extends|for|own|" + + "finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|" + + "or|on|unless|until|and|yes" + ); + + var langConstant = ( + "true|false|null|undefined|NaN|Infinity" + ); + + var illegal = ( + "case|const|default|function|var|void|with|enum|export|implements|" + + "interface|let|package|private|protected|public|static|yield" + ); + + var supportClass = ( + "Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + + "SyntaxError|TypeError|URIError|" + + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray" + ); + + var supportFunction = ( + "Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|" + + "encodeURIComponent|decodeURI|decodeURIComponent|String|" + ); + + var variableLanguage = ( + "window|arguments|prototype|document" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": langConstant, + "invalid.illegal": illegal, + "language.support.class": supportClass, + "language.support.function": supportFunction, + "variable.language": variableLanguage + }, "identifier"); + + var functionRule = { + token: ["paren.lparen", "variable.parameter", "paren.rparen", "text", "storage.type"], + regex: /(?:(\()((?:"[^")]*?"|'[^')]*?'|\/[^\/)]*?\/|[^()"'\/])*?)(\))(\s*))?([\-=]>)/.source + }; + + var stringEscape = /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/; + + this.$rules = { + start : [ + { + token : "constant.numeric", + regex : "(?:0x[\\da-fA-F]+|(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[eE][+-]?\\d+)?)" + }, { + stateName: "qdoc", + token : "string", regex : "'''", next : [ + {token : "string", regex : "'''", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qqdoc", + token : "string", + regex : '"""', + next : [ + {token : "string", regex : '"""', next : "start"}, + {token : "paren.string", regex : '#{', push : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qstring", + token : "string", regex : "'", next : [ + {token : "string", regex : "'", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "qqstring", + token : "string.start", regex : '"', next : [ + {token : "string.end", regex : '"', next : "start"}, + {token : "paren.string", regex : '#{', push : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + stateName: "js", + token : "string", regex : "`", next : [ + {token : "string", regex : "`", next : "start"}, + {token : "constant.language.escape", regex : stringEscape}, + {defaultToken: "string"} + ] + }, { + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift() || ""; + if (this.next.indexOf("string") != -1) + return "paren.string"; + } + return "paren"; + } + }, { + token : "string.regex", + regex : "///", + next : "heregex" + }, { + token : "string.regex", + regex : /(?:\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)(?:[imgy]{0,4})(?!\w)/ + }, { + token : "comment", + regex : "###(?!#)", + next : "comment" + }, { + token : "comment", + regex : "#.*" + }, { + token : ["punctuation.operator", "text", "identifier"], + regex : "(\\.)(\\s*)(" + illegal + ")" + }, { + token : "punctuation.operator", + regex : "\\.{1,3}" + }, { + token : ["keyword", "text", "language.support.class", + "text", "keyword", "text", "language.support.class"], + regex : "(class)(\\s+)(" + identifier + ")(?:(\\s+)(extends)(\\s+)(" + identifier + "))?" + }, { + token : ["entity.name.function", "text", "keyword.operator", "text"].concat(functionRule.token), + regex : "(" + identifier + ")(\\s*)([=:])(\\s*)" + functionRule.regex + }, + functionRule, + { + token : "variable", + regex : "@(?:" + identifier + ")?" + }, { + token: keywordMapper, + regex : identifier + }, { + token : "punctuation.operator", + regex : "\\,|\\." + }, { + token : "storage.type", + regex : "[\\-=]>" + }, { + token : "keyword.operator", + regex : "(?:[-+*/%<>&|^!?=]=|>>>=?|\\-\\-|\\+\\+|::|&&=|\\|\\|=|<<=|>>=|\\?\\.|\\.{2,3}|[!*+-=><])" + }, { + token : "paren.lparen", + regex : "[({[]" + }, { + token : "paren.rparen", + regex : "[\\]})]" + }, { + token : "text", + regex : "\\s+" + }], + + + heregex : [{ + token : "string.regex", + regex : '.*?///[imgy]{0,4}', + next : "start" + }, { + token : "comment.regex", + regex : "\\s+(?:#.*)?" + }, { + token : "string.regex", + regex : "\\S+" + }], + + comment : [{ + token : "comment", + regex : '###', + next : "start" + }, { + defaultToken : "comment" + }] + }; + this.normalizeRules(); + } + + exports.CoffeeHighlightRules = CoffeeHighlightRules; +}); + +ace.define("ace/mode/jade_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/markdown_highlight_rules","ace/mode/scss_highlight_rules","ace/mode/less_highlight_rules","ace/mode/coffee_highlight_rules","ace/mode/javascript_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var MarkdownHighlightRules = require("./markdown_highlight_rules").MarkdownHighlightRules; +var SassHighlightRules = require("./scss_highlight_rules").ScssHighlightRules; +var LessHighlightRules = require("./less_highlight_rules").LessHighlightRules; +var CoffeeHighlightRules = require("./coffee_highlight_rules").CoffeeHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +function mixin_embed(tag, prefix) { + return { + token : "entity.name.function.jade", + regex : "^\\s*\\:" + tag, + next : prefix + "start" + }; +} + +var JadeHighlightRules = function() { + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = + { + "start": [ + { + token: "keyword.control.import.include.jade", + regex: "\\s*\\binclude\\b" + }, + { + token: "keyword.other.doctype.jade", + regex: "^!!!\\s*(?:[a-zA-Z0-9-_]+)?" + }, + { + onMatch: function(value, currentState, stack) { + stack.unshift(this.next, value.length - 2, currentState); + return "comment"; + }, + regex: /^\s*\/\//, + next: "comment_block" + }, + mixin_embed("markdown", "markdown-"), + mixin_embed("sass", "sass-"), + mixin_embed("less", "less-"), + mixin_embed("coffee", "coffee-"), + { + token: [ "storage.type.function.jade", + "entity.name.function.jade", + "punctuation.definition.parameters.begin.jade", + "variable.parameter.function.jade", + "punctuation.definition.parameters.end.jade" + ], + regex: "^(\\s*mixin)( [\\w\\-]+)(\\s*\\()(.*?)(\\))" + }, + { + token: [ "storage.type.function.jade", "entity.name.function.jade"], + regex: "^(\\s*mixin)( [\\w\\-]+)" + }, + { + token: "source.js.embedded.jade", + regex: "^\\s*(?:-|=|!=)", + next: "js-start" + }, + { + token: "string.interpolated.jade", + regex: "[#!]\\{[^\\}]+\\}" + }, + { + token: "meta.tag.any.jade", + regex: /^\s*(?!\w+:)(?:[\w-]+|(?=\.|#)])/, + next: "tag_single" + }, + { + token: "suport.type.attribute.id.jade", + regex: "#\\w+" + }, + { + token: "suport.type.attribute.class.jade", + regex: "\\.\\w+" + }, + { + token: "punctuation", + regex: "\\s*(?:\\()", + next: "tag_attributes" + } + ], + "comment_block": [ + {regex: /^\s*(?:\/\/)?/, onMatch: function(value, currentState, stack) { + if (value.length <= stack[1]) { + if (value.slice(-1) == "/") { + stack[1] = value.length - 2; + this.next = ""; + return "comment"; + } + stack.shift(); + stack.shift(); + this.next = stack.shift(); + return "text"; + } else { + this.next = ""; + return "comment"; + } + }, next: "start"}, + {defaultToken: "comment"} + ], + "tag_single": [ + { + token: "entity.other.attribute-name.class.jade", + regex: "\\.[\\w-]+" + }, + { + token: "entity.other.attribute-name.id.jade", + regex: "#[\\w-]+" + }, + { + token: ["text", "punctuation"], + regex: "($)|((?!\\.|#|=|-))", + next: "start" + } + ], + "tag_attributes": [ + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, + { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, + { + token: ["entity.other.attribute-name.jade", "punctuation"], + regex: "([a-zA-Z:\\.-]+)(=)?", + next: "attribute_strings" + }, + { + token: "punctuation", + regex: "\\)", + next: "start" + } + ], + "attribute_strings": [ + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, + { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, + { + token : "string", + regex : '(?=\\S)', + next : "tag_attributes" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : '[^"\\\\]+' + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "tag_attributes" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "[^'\\\\]+" + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "tag_attributes" + } + ] +}; + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "text", + regex: ".$", + next: "start" + }]); +}; + +oop.inherits(JadeHighlightRules, TextHighlightRules); + +exports.JadeHighlightRules = JadeHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/jade",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/jade_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JadeHighlightRules = require("./jade_highlight_rules").JadeHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = JadeHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.$id = "ace/mode/jade"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-java.js b/src/libs/ace/mode-java.js new file mode 100755 index 0000000..8fac1eb --- /dev/null +++ b/src/libs/ace/mode-java.js @@ -0,0 +1,935 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/java_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaHighlightRules = function() { + var keywords = ( + "abstract|continue|for|new|switch|" + + "assert|default|goto|package|synchronized|" + + "boolean|do|if|private|this|" + + "break|double|implements|protected|throw|" + + "byte|else|import|public|throws|" + + "case|enum|instanceof|return|transient|" + + "catch|extends|int|short|try|" + + "char|final|interface|static|void|" + + "class|finally|long|strictfp|volatile|" + + "const|float|native|super|while" + ); + + var buildinConstants = ("null|Infinity|NaN|undefined"); + + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": langClasses + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : /0(?:[xX][0-9a-fA-F][0-9a-fA-F_]*|[bB][01][01_]*)[LlSsDdFfYy]?\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d[\d_]*(?:(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?)?[LlSsDdFfYy]?\b/ + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(JavaHighlightRules, TextHighlightRules); + +exports.JavaHighlightRules = JavaHighlightRules; +}); + +ace.define("ace/mode/java",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/java_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptMode = require("./javascript").Mode; +var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules; + +var Mode = function() { + JavaScriptMode.call(this); + this.HighlightRules = JavaHighlightRules; +}; +oop.inherits(Mode, JavaScriptMode); + +(function() { + + this.createWorker = function(session) { + return null; + }; + + this.$id = "ace/mode/java"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-javascript.js b/src/libs/ace/mode-javascript.js new file mode 100755 index 0000000..0e4a81a --- /dev/null +++ b/src/libs/ace/mode-javascript.js @@ -0,0 +1,789 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-json.js b/src/libs/ace/mode-json.js new file mode 100755 index 0000000..6be2035 --- /dev/null +++ b/src/libs/ace/mode-json.js @@ -0,0 +1,319 @@ +ace.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JsonHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "variable", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)' + }, { + token : "string", // single line + regex : '"', + next : "string" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : "text", // single quoted strings are not allowed + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "comment", // comments are not allowed, but who cares? + regex : "\\/\\/.*$" + }, { + token : "comment.start", // comments are not allowed, but who cares? + regex : "\\/\\*", + next : "comment" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "string" : [ + { + token : "constant.language.escape", + regex : /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/ + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken : "string" + } + ], + "comment" : [ + { + token : "comment.end", // comments are not allowed, but who cares? + regex : "\\*\\/", + next : "start" + }, { + defaultToken: "comment" + } + ] + }; + +}; + +oop.inherits(JsonHighlightRules, TextHighlightRules); + +exports.JsonHighlightRules = JsonHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HighlightRules = require("./json_highlight_rules").JsonHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.HighlightRules = HighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/json_worker", "JsonWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + + this.$id = "ace/mode/json"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-jsoniq.js b/src/libs/ace/mode-jsoniq.js new file mode 100755 index 0000000..c533c91 --- /dev/null +++ b/src/libs/ace/mode-jsoniq.js @@ -0,0 +1,2619 @@ +ace.define("ace/mode/xquery/jsoniq_lexer",["require","exports","module"], function(require, exports, module) { +module.exports = (function outer (modules, cache, entry) { + var previousRequire = typeof require == "function" && require; + function newRequire(name, jumped){ + if(!cache[name]) { + if(!modules[name]) { + var currentRequire = typeof require == "function" && require; + if (!jumped && currentRequire) return currentRequire(name, true); + if (previousRequire) return previousRequire(name, true); + var err = new Error('Cannot find module \'' + name + '\''); + err.code = 'MODULE_NOT_FOUND'; + throw err; + } + var m = cache[name] = {exports:{}}; + modules[name][0].call(m.exports, function(x){ + var id = modules[name][1][x]; + return newRequire(id ? id : x); + },m,m.exports,outer,modules,cache,entry); + } + return cache[name].exports; + } + for(var i=0;i= 0 ? JSONiqTokenizer.TOKEN[o] : null; + }; + + this.getExpectedTokenSet = function(e) + { + var expected; + if (e.getExpected() < 0) + { + expected = JSONiqTokenizer.getTokenSet(- e.getState()); + } + else + { + expected = [JSONiqTokenizer.TOKEN[e.getExpected()]]; + } + return expected; + }; + + this.getErrorMessage = function(e) + { + var tokenSet = this.getExpectedTokenSet(e); + var found = this.getOffendingToken(e); + var prefix = input.substring(0, e.getBegin()); + var lines = prefix.split("\n"); + var line = lines.length; + var column = lines[line - 1].length + 1; + var size = e.getEnd() - e.getBegin(); + return e.getMessage() + + (found == null ? "" : ", found " + found) + + "\nwhile expecting " + + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) + + "\n" + + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + + "at line " + line + ", column " + column + ":\n..." + + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64)) + + "..."; + }; + + this.parse_start = function() + { + eventHandler.startNonterminal("start", e0); + lookahead1W(14); // ModuleDecl | Annotation | OptionDecl | Operator | Variable | Tag | AttrTest | + switch (l1) + { + case 58: // '' | '=' | '>' + switch (l1) + { + case 61: // '>' + shift(61); // '>' + break; + case 53: // '/>' + shift(53); // '/>' + break; + case 29: // QName + shift(29); // QName + break; + case 60: // '=' + shift(60); // '=' + break; + case 37: // '"' + shift(37); // '"' + break; + case 41: // "'" + shift(41); // "'" + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("StartTag", e0); + }; + + this.parse_TagContent = function() + { + eventHandler.startNonterminal("TagContent", e0); + lookahead1(11); // Tag | EndTag | PredefinedEntityRef | ElementContentChar | CharRef | EOF | + switch (l1) + { + case 25: // ElementContentChar + shift(25); // ElementContentChar + break; + case 9: // Tag + shift(9); // Tag + break; + case 10: // EndTag + shift(10); // EndTag + break; + case 58: // '' + switch (l1) + { + case 14: // CDataSectionContents + shift(14); // CDataSectionContents + break; + case 67: // ']]>' + shift(67); // ']]>' + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("CData", e0); + }; + + this.parse_XMLComment = function() + { + eventHandler.startNonterminal("XMLComment", e0); + lookahead1(0); // DirCommentContents | EOF | '-->' + switch (l1) + { + case 12: // DirCommentContents + shift(12); // DirCommentContents + break; + case 50: // '-->' + shift(50); // '-->' + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("XMLComment", e0); + }; + + this.parse_PI = function() + { + eventHandler.startNonterminal("PI", e0); + lookahead1(3); // DirPIContents | EOF | '?' | '?>' + switch (l1) + { + case 13: // DirPIContents + shift(13); // DirPIContents + break; + case 62: // '?' + shift(62); // '?' + break; + case 63: // '?>' + shift(63); // '?>' + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("PI", e0); + }; + + this.parse_Pragma = function() + { + eventHandler.startNonterminal("Pragma", e0); + lookahead1(2); // PragmaContents | EOF | '#' | '#)' + switch (l1) + { + case 11: // PragmaContents + shift(11); // PragmaContents + break; + case 38: // '#' + shift(38); // '#' + break; + case 39: // '#)' + shift(39); // '#)' + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("Pragma", e0); + }; + + this.parse_Comment = function() + { + eventHandler.startNonterminal("Comment", e0); + lookahead1(4); // CommentContents | EOF | '(:' | ':)' + switch (l1) + { + case 55: // ':)' + shift(55); // ':)' + break; + case 44: // '(:' + shift(44); // '(:' + break; + case 32: // CommentContents + shift(32); // CommentContents + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("Comment", e0); + }; + + this.parse_CommentDoc = function() + { + eventHandler.startNonterminal("CommentDoc", e0); + lookahead1(6); // DocTag | DocCommentContents | EOF | '(:' | ':)' + switch (l1) + { + case 33: // DocTag + shift(33); // DocTag + break; + case 34: // DocCommentContents + shift(34); // DocCommentContents + break; + case 55: // ':)' + shift(55); // ':)' + break; + case 44: // '(:' + shift(44); // '(:' + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("CommentDoc", e0); + }; + + this.parse_QuotString = function() + { + eventHandler.startNonterminal("QuotString", e0); + lookahead1(5); // JSONChar | JSONCharRef | JSONPredefinedCharRef | EOF | '"' + switch (l1) + { + case 3: // JSONPredefinedCharRef + shift(3); // JSONPredefinedCharRef + break; + case 2: // JSONCharRef + shift(2); // JSONCharRef + break; + case 1: // JSONChar + shift(1); // JSONChar + break; + case 37: // '"' + shift(37); // '"' + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("QuotString", e0); + }; + + this.parse_AposString = function() + { + eventHandler.startNonterminal("AposString", e0); + lookahead1(7); // PredefinedEntityRef | EscapeApos | AposChar | CharRef | EOF | "'" + switch (l1) + { + case 21: // PredefinedEntityRef + shift(21); // PredefinedEntityRef + break; + case 31: // CharRef + shift(31); // CharRef + break; + case 23: // EscapeApos + shift(23); // EscapeApos + break; + case 24: // AposChar + shift(24); // AposChar + break; + case 41: // "'" + shift(41); // "'" + break; + default: + shift(35); // EOF + } + eventHandler.endNonterminal("AposString", e0); + }; + + this.parse_Prefix = function() + { + eventHandler.startNonterminal("Prefix", e0); + lookahead1W(13); // NCName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | + whitespace(); + parse_NCName(); + eventHandler.endNonterminal("Prefix", e0); + }; + + this.parse__EQName = function() + { + eventHandler.startNonterminal("_EQName", e0); + lookahead1W(12); // EQName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | + whitespace(); + parse_EQName(); + eventHandler.endNonterminal("_EQName", e0); + }; + + function parse_EQName() + { + eventHandler.startNonterminal("EQName", e0); + switch (l1) + { + case 80: // 'attribute' + shift(80); // 'attribute' + break; + case 94: // 'comment' + shift(94); // 'comment' + break; + case 118: // 'document-node' + shift(118); // 'document-node' + break; + case 119: // 'element' + shift(119); // 'element' + break; + case 122: // 'empty-sequence' + shift(122); // 'empty-sequence' + break; + case 143: // 'function' + shift(143); // 'function' + break; + case 150: // 'if' + shift(150); // 'if' + break; + case 163: // 'item' + shift(163); // 'item' + break; + case 183: // 'namespace-node' + shift(183); // 'namespace-node' + break; + case 189: // 'node' + shift(189); // 'node' + break; + case 214: // 'processing-instruction' + shift(214); // 'processing-instruction' + break; + case 224: // 'schema-attribute' + shift(224); // 'schema-attribute' + break; + case 225: // 'schema-element' + shift(225); // 'schema-element' + break; + case 241: // 'switch' + shift(241); // 'switch' + break; + case 242: // 'text' + shift(242); // 'text' + break; + case 251: // 'typeswitch' + shift(251); // 'typeswitch' + break; + default: + parse_FunctionName(); + } + eventHandler.endNonterminal("EQName", e0); + } + + function parse_FunctionName() + { + eventHandler.startNonterminal("FunctionName", e0); + switch (l1) + { + case 17: // EQName^Token + shift(17); // EQName^Token + break; + case 68: // 'after' + shift(68); // 'after' + break; + case 71: // 'ancestor' + shift(71); // 'ancestor' + break; + case 72: // 'ancestor-or-self' + shift(72); // 'ancestor-or-self' + break; + case 73: // 'and' + shift(73); // 'and' + break; + case 77: // 'as' + shift(77); // 'as' + break; + case 78: // 'ascending' + shift(78); // 'ascending' + break; + case 82: // 'before' + shift(82); // 'before' + break; + case 86: // 'case' + shift(86); // 'case' + break; + case 87: // 'cast' + shift(87); // 'cast' + break; + case 88: // 'castable' + shift(88); // 'castable' + break; + case 91: // 'child' + shift(91); // 'child' + break; + case 92: // 'collation' + shift(92); // 'collation' + break; + case 101: // 'copy' + shift(101); // 'copy' + break; + case 103: // 'count' + shift(103); // 'count' + break; + case 106: // 'declare' + shift(106); // 'declare' + break; + case 107: // 'default' + shift(107); // 'default' + break; + case 108: // 'delete' + shift(108); // 'delete' + break; + case 109: // 'descendant' + shift(109); // 'descendant' + break; + case 110: // 'descendant-or-self' + shift(110); // 'descendant-or-self' + break; + case 111: // 'descending' + shift(111); // 'descending' + break; + case 116: // 'div' + shift(116); // 'div' + break; + case 117: // 'document' + shift(117); // 'document' + break; + case 120: // 'else' + shift(120); // 'else' + break; + case 121: // 'empty' + shift(121); // 'empty' + break; + case 124: // 'end' + shift(124); // 'end' + break; + case 126: // 'eq' + shift(126); // 'eq' + break; + case 127: // 'every' + shift(127); // 'every' + break; + case 129: // 'except' + shift(129); // 'except' + break; + case 132: // 'first' + shift(132); // 'first' + break; + case 133: // 'following' + shift(133); // 'following' + break; + case 134: // 'following-sibling' + shift(134); // 'following-sibling' + break; + case 135: // 'for' + shift(135); // 'for' + break; + case 144: // 'ge' + shift(144); // 'ge' + break; + case 146: // 'group' + shift(146); // 'group' + break; + case 148: // 'gt' + shift(148); // 'gt' + break; + case 149: // 'idiv' + shift(149); // 'idiv' + break; + case 151: // 'import' + shift(151); // 'import' + break; + case 157: // 'insert' + shift(157); // 'insert' + break; + case 158: // 'instance' + shift(158); // 'instance' + break; + case 160: // 'intersect' + shift(160); // 'intersect' + break; + case 161: // 'into' + shift(161); // 'into' + break; + case 162: // 'is' + shift(162); // 'is' + break; + case 168: // 'last' + shift(168); // 'last' + break; + case 170: // 'le' + shift(170); // 'le' + break; + case 172: // 'let' + shift(172); // 'let' + break; + case 176: // 'lt' + shift(176); // 'lt' + break; + case 178: // 'mod' + shift(178); // 'mod' + break; + case 179: // 'modify' + shift(179); // 'modify' + break; + case 180: // 'module' + shift(180); // 'module' + break; + case 182: // 'namespace' + shift(182); // 'namespace' + break; + case 184: // 'ne' + shift(184); // 'ne' + break; + case 196: // 'only' + shift(196); // 'only' + break; + case 198: // 'or' + shift(198); // 'or' + break; + case 199: // 'order' + shift(199); // 'order' + break; + case 200: // 'ordered' + shift(200); // 'ordered' + break; + case 204: // 'parent' + shift(204); // 'parent' + break; + case 210: // 'preceding' + shift(210); // 'preceding' + break; + case 211: // 'preceding-sibling' + shift(211); // 'preceding-sibling' + break; + case 216: // 'rename' + shift(216); // 'rename' + break; + case 217: // 'replace' + shift(217); // 'replace' + break; + case 218: // 'return' + shift(218); // 'return' + break; + case 222: // 'satisfies' + shift(222); // 'satisfies' + break; + case 227: // 'self' + shift(227); // 'self' + break; + case 233: // 'some' + shift(233); // 'some' + break; + case 234: // 'stable' + shift(234); // 'stable' + break; + case 235: // 'start' + shift(235); // 'start' + break; + case 246: // 'to' + shift(246); // 'to' + break; + case 247: // 'treat' + shift(247); // 'treat' + break; + case 248: // 'try' + shift(248); // 'try' + break; + case 252: // 'union' + shift(252); // 'union' + break; + case 254: // 'unordered' + shift(254); // 'unordered' + break; + case 258: // 'validate' + shift(258); // 'validate' + break; + case 264: // 'where' + shift(264); // 'where' + break; + case 268: // 'with' + shift(268); // 'with' + break; + case 272: // 'xquery' + shift(272); // 'xquery' + break; + case 70: // 'allowing' + shift(70); // 'allowing' + break; + case 79: // 'at' + shift(79); // 'at' + break; + case 81: // 'base-uri' + shift(81); // 'base-uri' + break; + case 83: // 'boundary-space' + shift(83); // 'boundary-space' + break; + case 84: // 'break' + shift(84); // 'break' + break; + case 89: // 'catch' + shift(89); // 'catch' + break; + case 96: // 'construction' + shift(96); // 'construction' + break; + case 99: // 'context' + shift(99); // 'context' + break; + case 100: // 'continue' + shift(100); // 'continue' + break; + case 102: // 'copy-namespaces' + shift(102); // 'copy-namespaces' + break; + case 104: // 'decimal-format' + shift(104); // 'decimal-format' + break; + case 123: // 'encoding' + shift(123); // 'encoding' + break; + case 130: // 'exit' + shift(130); // 'exit' + break; + case 131: // 'external' + shift(131); // 'external' + break; + case 139: // 'ft-option' + shift(139); // 'ft-option' + break; + case 152: // 'in' + shift(152); // 'in' + break; + case 153: // 'index' + shift(153); // 'index' + break; + case 159: // 'integrity' + shift(159); // 'integrity' + break; + case 169: // 'lax' + shift(169); // 'lax' + break; + case 190: // 'nodes' + shift(190); // 'nodes' + break; + case 197: // 'option' + shift(197); // 'option' + break; + case 201: // 'ordering' + shift(201); // 'ordering' + break; + case 220: // 'revalidation' + shift(220); // 'revalidation' + break; + case 223: // 'schema' + shift(223); // 'schema' + break; + case 226: // 'score' + shift(226); // 'score' + break; + case 232: // 'sliding' + shift(232); // 'sliding' + break; + case 238: // 'strict' + shift(238); // 'strict' + break; + case 249: // 'tumbling' + shift(249); // 'tumbling' + break; + case 250: // 'type' + shift(250); // 'type' + break; + case 255: // 'updating' + shift(255); // 'updating' + break; + case 259: // 'value' + shift(259); // 'value' + break; + case 260: // 'variable' + shift(260); // 'variable' + break; + case 261: // 'version' + shift(261); // 'version' + break; + case 265: // 'while' + shift(265); // 'while' + break; + case 95: // 'constraint' + shift(95); // 'constraint' + break; + case 174: // 'loop' + shift(174); // 'loop' + break; + default: + shift(219); // 'returning' + } + eventHandler.endNonterminal("FunctionName", e0); + } + + function parse_NCName() + { + eventHandler.startNonterminal("NCName", e0); + switch (l1) + { + case 28: // NCName^Token + shift(28); // NCName^Token + break; + case 68: // 'after' + shift(68); // 'after' + break; + case 73: // 'and' + shift(73); // 'and' + break; + case 77: // 'as' + shift(77); // 'as' + break; + case 78: // 'ascending' + shift(78); // 'ascending' + break; + case 82: // 'before' + shift(82); // 'before' + break; + case 86: // 'case' + shift(86); // 'case' + break; + case 87: // 'cast' + shift(87); // 'cast' + break; + case 88: // 'castable' + shift(88); // 'castable' + break; + case 92: // 'collation' + shift(92); // 'collation' + break; + case 103: // 'count' + shift(103); // 'count' + break; + case 107: // 'default' + shift(107); // 'default' + break; + case 111: // 'descending' + shift(111); // 'descending' + break; + case 116: // 'div' + shift(116); // 'div' + break; + case 120: // 'else' + shift(120); // 'else' + break; + case 121: // 'empty' + shift(121); // 'empty' + break; + case 124: // 'end' + shift(124); // 'end' + break; + case 126: // 'eq' + shift(126); // 'eq' + break; + case 129: // 'except' + shift(129); // 'except' + break; + case 135: // 'for' + shift(135); // 'for' + break; + case 144: // 'ge' + shift(144); // 'ge' + break; + case 146: // 'group' + shift(146); // 'group' + break; + case 148: // 'gt' + shift(148); // 'gt' + break; + case 149: // 'idiv' + shift(149); // 'idiv' + break; + case 158: // 'instance' + shift(158); // 'instance' + break; + case 160: // 'intersect' + shift(160); // 'intersect' + break; + case 161: // 'into' + shift(161); // 'into' + break; + case 162: // 'is' + shift(162); // 'is' + break; + case 170: // 'le' + shift(170); // 'le' + break; + case 172: // 'let' + shift(172); // 'let' + break; + case 176: // 'lt' + shift(176); // 'lt' + break; + case 178: // 'mod' + shift(178); // 'mod' + break; + case 179: // 'modify' + shift(179); // 'modify' + break; + case 184: // 'ne' + shift(184); // 'ne' + break; + case 196: // 'only' + shift(196); // 'only' + break; + case 198: // 'or' + shift(198); // 'or' + break; + case 199: // 'order' + shift(199); // 'order' + break; + case 218: // 'return' + shift(218); // 'return' + break; + case 222: // 'satisfies' + shift(222); // 'satisfies' + break; + case 234: // 'stable' + shift(234); // 'stable' + break; + case 235: // 'start' + shift(235); // 'start' + break; + case 246: // 'to' + shift(246); // 'to' + break; + case 247: // 'treat' + shift(247); // 'treat' + break; + case 252: // 'union' + shift(252); // 'union' + break; + case 264: // 'where' + shift(264); // 'where' + break; + case 268: // 'with' + shift(268); // 'with' + break; + case 71: // 'ancestor' + shift(71); // 'ancestor' + break; + case 72: // 'ancestor-or-self' + shift(72); // 'ancestor-or-self' + break; + case 80: // 'attribute' + shift(80); // 'attribute' + break; + case 91: // 'child' + shift(91); // 'child' + break; + case 94: // 'comment' + shift(94); // 'comment' + break; + case 101: // 'copy' + shift(101); // 'copy' + break; + case 106: // 'declare' + shift(106); // 'declare' + break; + case 108: // 'delete' + shift(108); // 'delete' + break; + case 109: // 'descendant' + shift(109); // 'descendant' + break; + case 110: // 'descendant-or-self' + shift(110); // 'descendant-or-self' + break; + case 117: // 'document' + shift(117); // 'document' + break; + case 118: // 'document-node' + shift(118); // 'document-node' + break; + case 119: // 'element' + shift(119); // 'element' + break; + case 122: // 'empty-sequence' + shift(122); // 'empty-sequence' + break; + case 127: // 'every' + shift(127); // 'every' + break; + case 132: // 'first' + shift(132); // 'first' + break; + case 133: // 'following' + shift(133); // 'following' + break; + case 134: // 'following-sibling' + shift(134); // 'following-sibling' + break; + case 143: // 'function' + shift(143); // 'function' + break; + case 150: // 'if' + shift(150); // 'if' + break; + case 151: // 'import' + shift(151); // 'import' + break; + case 157: // 'insert' + shift(157); // 'insert' + break; + case 163: // 'item' + shift(163); // 'item' + break; + case 168: // 'last' + shift(168); // 'last' + break; + case 180: // 'module' + shift(180); // 'module' + break; + case 182: // 'namespace' + shift(182); // 'namespace' + break; + case 183: // 'namespace-node' + shift(183); // 'namespace-node' + break; + case 189: // 'node' + shift(189); // 'node' + break; + case 200: // 'ordered' + shift(200); // 'ordered' + break; + case 204: // 'parent' + shift(204); // 'parent' + break; + case 210: // 'preceding' + shift(210); // 'preceding' + break; + case 211: // 'preceding-sibling' + shift(211); // 'preceding-sibling' + break; + case 214: // 'processing-instruction' + shift(214); // 'processing-instruction' + break; + case 216: // 'rename' + shift(216); // 'rename' + break; + case 217: // 'replace' + shift(217); // 'replace' + break; + case 224: // 'schema-attribute' + shift(224); // 'schema-attribute' + break; + case 225: // 'schema-element' + shift(225); // 'schema-element' + break; + case 227: // 'self' + shift(227); // 'self' + break; + case 233: // 'some' + shift(233); // 'some' + break; + case 241: // 'switch' + shift(241); // 'switch' + break; + case 242: // 'text' + shift(242); // 'text' + break; + case 248: // 'try' + shift(248); // 'try' + break; + case 251: // 'typeswitch' + shift(251); // 'typeswitch' + break; + case 254: // 'unordered' + shift(254); // 'unordered' + break; + case 258: // 'validate' + shift(258); // 'validate' + break; + case 260: // 'variable' + shift(260); // 'variable' + break; + case 272: // 'xquery' + shift(272); // 'xquery' + break; + case 70: // 'allowing' + shift(70); // 'allowing' + break; + case 79: // 'at' + shift(79); // 'at' + break; + case 81: // 'base-uri' + shift(81); // 'base-uri' + break; + case 83: // 'boundary-space' + shift(83); // 'boundary-space' + break; + case 84: // 'break' + shift(84); // 'break' + break; + case 89: // 'catch' + shift(89); // 'catch' + break; + case 96: // 'construction' + shift(96); // 'construction' + break; + case 99: // 'context' + shift(99); // 'context' + break; + case 100: // 'continue' + shift(100); // 'continue' + break; + case 102: // 'copy-namespaces' + shift(102); // 'copy-namespaces' + break; + case 104: // 'decimal-format' + shift(104); // 'decimal-format' + break; + case 123: // 'encoding' + shift(123); // 'encoding' + break; + case 130: // 'exit' + shift(130); // 'exit' + break; + case 131: // 'external' + shift(131); // 'external' + break; + case 139: // 'ft-option' + shift(139); // 'ft-option' + break; + case 152: // 'in' + shift(152); // 'in' + break; + case 153: // 'index' + shift(153); // 'index' + break; + case 159: // 'integrity' + shift(159); // 'integrity' + break; + case 169: // 'lax' + shift(169); // 'lax' + break; + case 190: // 'nodes' + shift(190); // 'nodes' + break; + case 197: // 'option' + shift(197); // 'option' + break; + case 201: // 'ordering' + shift(201); // 'ordering' + break; + case 220: // 'revalidation' + shift(220); // 'revalidation' + break; + case 223: // 'schema' + shift(223); // 'schema' + break; + case 226: // 'score' + shift(226); // 'score' + break; + case 232: // 'sliding' + shift(232); // 'sliding' + break; + case 238: // 'strict' + shift(238); // 'strict' + break; + case 249: // 'tumbling' + shift(249); // 'tumbling' + break; + case 250: // 'type' + shift(250); // 'type' + break; + case 255: // 'updating' + shift(255); // 'updating' + break; + case 259: // 'value' + shift(259); // 'value' + break; + case 261: // 'version' + shift(261); // 'version' + break; + case 265: // 'while' + shift(265); // 'while' + break; + case 95: // 'constraint' + shift(95); // 'constraint' + break; + case 174: // 'loop' + shift(174); // 'loop' + break; + default: + shift(219); // 'returning' + } + eventHandler.endNonterminal("NCName", e0); + } + + function shift(t) + { + if (l1 == t) + { + whitespace(); + eventHandler.terminal(JSONiqTokenizer.TOKEN[l1], b1, e1 > size ? size : e1); + b0 = b1; e0 = e1; l1 = 0; + } + else + { + error(b1, e1, 0, l1, t); + } + } + + function whitespace() + { + if (e0 != b1) + { + b0 = e0; + e0 = b1; + eventHandler.whitespace(b0, e0); + } + } + + function matchW(set) + { + var code; + for (;;) + { + code = match(set); + if (code != 30) // S^WS + { + break; + } + } + return code; + } + + function lookahead1W(set) + { + if (l1 == 0) + { + l1 = matchW(set); + b1 = begin; + e1 = end; + } + } + + function lookahead1(set) + { + if (l1 == 0) + { + l1 = match(set); + b1 = begin; + e1 = end; + } + } + + function error(b, e, s, l, t) + { + throw new self.ParseException(b, e, s, l, t); + } + + var lk, b0, e0; + var l1, b1, e1; + var eventHandler; + + var input; + var size; + var begin; + var end; + + function match(tokenSetId) + { + var nonbmp = false; + begin = end; + var current = end; + var result = JSONiqTokenizer.INITIAL[tokenSetId]; + var state = 0; + + for (var code = result & 4095; code != 0; ) + { + var charclass; + var c0 = current < size ? input.charCodeAt(current) : 0; + ++current; + if (c0 < 0x80) + { + charclass = JSONiqTokenizer.MAP0[c0]; + } + else if (c0 < 0xd800) + { + var c1 = c0 >> 4; + charclass = JSONiqTokenizer.MAP1[(c0 & 15) + JSONiqTokenizer.MAP1[(c1 & 31) + JSONiqTokenizer.MAP1[c1 >> 5]]]; + } + else + { + if (c0 < 0xdc00) + { + var c1 = current < size ? input.charCodeAt(current) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) + { + ++current; + c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000; + nonbmp = true; + } + } + var lo = 0, hi = 5; + for (var m = 3; ; m = (hi + lo) >> 1) + { + if (JSONiqTokenizer.MAP2[m] > c0) hi = m - 1; + else if (JSONiqTokenizer.MAP2[6 + m] < c0) lo = m + 1; + else {charclass = JSONiqTokenizer.MAP2[12 + m]; break;} + if (lo > hi) {charclass = 0; break;} + } + } + + state = code; + var i0 = (charclass << 12) + code - 1; + code = JSONiqTokenizer.TRANSITION[(i0 & 15) + JSONiqTokenizer.TRANSITION[i0 >> 4]]; + + if (code > 4095) + { + result = code; + code &= 4095; + end = current; + } + } + + result >>= 12; + if (result == 0) + { + end = current - 1; + var c1 = end < size ? input.charCodeAt(end) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) --end; + return error(begin, end, state, -1, -1); + } + + if (nonbmp) + { + for (var i = result >> 9; i > 0; --i) + { + --end; + var c1 = end < size ? input.charCodeAt(end) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) --end; + } + } + else + { + end -= result >> 9; + } + + return (result & 511) - 1; + } +} + +JSONiqTokenizer.getTokenSet = function(tokenSetId) +{ + var set = []; + var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095; + for (var i = 0; i < 279; i += 32) + { + var j = i; + var i0 = (i >> 5) * 2066 + s - 1; + var i1 = i0 >> 2; + var i2 = i1 >> 2; + var f = JSONiqTokenizer.EXPECTED[(i0 & 3) + JSONiqTokenizer.EXPECTED[(i1 & 3) + JSONiqTokenizer.EXPECTED[(i2 & 3) + JSONiqTokenizer.EXPECTED[i2 >> 2]]]]; + for ( ; f != 0; f >>>= 1, ++j) + { + if ((f & 1) != 0) + { + set.push(JSONiqTokenizer.TOKEN[j]); + } + } + } + return set; +}; + +JSONiqTokenizer.MAP0 = +[ 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 37, 31, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 31, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 31, 62, 63, 64, 65, 37 +]; + +JSONiqTokenizer.MAP1 = +[ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 347, 363, 379, 416, 416, 416, 408, 331, 323, 331, 323, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 433, 433, 433, 433, 433, 433, 433, 316, 331, 331, 331, 331, 331, 331, 331, 331, 394, 416, 416, 417, 415, 416, 416, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 37, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 37, 31, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 31, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 31, 62, 63, 64, 65, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 31, 31, 37, 37, 37, 37, 37, 37, 37, 66, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66 +]; + +JSONiqTokenizer.MAP2 = +[ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 37, 31, 37, 31, 31, 37 +]; + +JSONiqTokenizer.INITIAL = +[ 1, 2, 49155, 57348, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +]; + +JSONiqTokenizer.TRANSITION = +[ 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 17408, 19288, 17439, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 22126, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17672, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 19469, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 36919, 18234, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18419, 18432, 18304, 18448, 18485, 18523, 18553, 18583, 18599, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 18825, 18841, 18871, 18906, 18944, 18960, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19074, 36169, 17439, 36866, 17466, 36890, 36866, 22314, 19105, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 22126, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17672, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 19469, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 36919, 18234, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18419, 18432, 18304, 18448, 18485, 18523, 18553, 18583, 18599, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 18825, 18841, 18871, 18906, 18944, 18960, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22182, 19288, 19121, 36866, 17466, 18345, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19273, 19552, 19304, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19332, 17423, 19363, 36866, 17466, 17537, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 18614, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 19391, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 19427, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36154, 19288, 19457, 36866, 17466, 17740, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22780, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22375, 22197, 18469, 36866, 17466, 36890, 36866, 21991, 24018, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 21331, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 19485, 19501, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19537, 22390, 19568, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19596, 19611, 19457, 36866, 17466, 36890, 36866, 18246, 19627, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22242, 20553, 19457, 36866, 17466, 36890, 36866, 18648, 30477, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36472, 19288, 19457, 36866, 17466, 17809, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 21770, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 19643, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 19672, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 20538, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 17975, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22345, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19726, 19742, 21529, 24035, 23112, 26225, 23511, 27749, 27397, 24035, 34360, 24035, 24036, 23114, 35166, 23114, 23114, 19758, 23511, 35247, 23511, 23511, 28447, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 24254, 19821, 23511, 23511, 23511, 23511, 23512, 19441, 36539, 24035, 24035, 24035, 24035, 19846, 19869, 23114, 23114, 23114, 28618, 32187, 19892, 23511, 23511, 23511, 34585, 20402, 36647, 24035, 24035, 24036, 23114, 33757, 23114, 23114, 23029, 20271, 23511, 27070, 23511, 23511, 30562, 24035, 24035, 29274, 26576, 23114, 23114, 31118, 23036, 29695, 23511, 23511, 32431, 23634, 30821, 24035, 23110, 19913, 23114, 23467, 31261, 23261, 34299, 19932, 24035, 32609, 19965, 35389, 19984, 27689, 19830, 29391, 29337, 20041, 22643, 35619, 33728, 20062, 20121, 20166, 35100, 26145, 20211, 23008, 19876, 20208, 20227, 25670, 20132, 26578, 27685, 20141, 20243, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36094, 19288, 19457, 36866, 17466, 21724, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22735, 19552, 20287, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22750, 19288, 21529, 24035, 23112, 28056, 23511, 29483, 28756, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 20327, 23511, 23511, 23511, 23511, 31156, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 24254, 20371, 23511, 23511, 23511, 23511, 27443, 20395, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 29457, 29700, 23511, 23511, 23511, 23511, 33444, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 28350, 20421, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 20447, 20475, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 20523, 22257, 20569, 20783, 21715, 17603, 20699, 20837, 20614, 20630, 21149, 20670, 21405, 17486, 17509, 17525, 18373, 19179, 20695, 20716, 20732, 20755, 19194, 18042, 21641, 20592, 20779, 20598, 21412, 17470, 17591, 20896, 17468, 17619, 20799, 20700, 21031, 20744, 20699, 20828, 18075, 21259, 20581, 20853, 18048, 20868, 20884, 17756, 17784, 17800, 17825, 17854, 21171, 21200, 20931, 20947, 21378, 20955, 20971, 18086, 20645, 21002, 20986, 18178, 17960, 18012, 18381, 18064, 29176, 21044, 21438, 21018, 21122, 21393, 21060, 21844, 21094, 20654, 17493, 18150, 18166, 18214, 25967, 20763, 21799, 21110, 21830, 21138, 21246, 21301, 18336, 18361, 21165, 21187, 20812, 21216, 21232, 21287, 21317, 18553, 21347, 21363, 21428, 21454, 21271, 21483, 21499, 21515, 21575, 21467, 18712, 21591, 21633, 21078, 18189, 18198, 20679, 21657, 21701, 21074, 21687, 21740, 21756, 21786, 21815, 21860, 21876, 21892, 21946, 21962, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36457, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 36813, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 21981, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 22151, 22007, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 27898, 17884, 18890, 17906, 17928, 22042, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 22070, 22112, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 22142, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36109, 19288, 18469, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22167, 19288, 19457, 36866, 17466, 17768, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22227, 36487, 22273, 36866, 17466, 36890, 36866, 19316, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18749, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 22304, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 19580, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22330, 19089, 19457, 36866, 17466, 18721, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22765, 19347, 19457, 36866, 17466, 36890, 36866, 18114, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34541, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 22540, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29908, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22561, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 23837, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22584, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36442, 19288, 21605, 24035, 23112, 28137, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 31568, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22690, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 27584, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 22659, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22360, 19552, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22675, 22811, 19457, 36866, 17466, 36890, 36866, 19133, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 22827, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36139, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36064, 19288, 22865, 22881, 32031, 22897, 22913, 22956, 29939, 24035, 24035, 24035, 23003, 23114, 23114, 23114, 23024, 22420, 23511, 23511, 23511, 23052, 29116, 23073, 29268, 24035, 25563, 26915, 23106, 23131, 23114, 23114, 23159, 23181, 23197, 23248, 23511, 23511, 23282, 23305, 22493, 32364, 24035, 33472, 30138, 26325, 31770, 33508, 27345, 33667, 23114, 23321, 23473, 23351, 35793, 36576, 23511, 23375, 22500, 24145, 24035, 29197, 20192, 24533, 23440, 23114, 19017, 23459, 22839, 23489, 23510, 23511, 33563, 23528, 32076, 25389, 24035, 26576, 23561, 23583, 23114, 32683, 22516, 23622, 23655, 23511, 23634, 35456, 37144, 23110, 23683, 34153, 20499, 32513, 25824, 23705, 24035, 24035, 23111, 23114, 19874, 27078, 33263, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 20507, 32241, 20150, 31862, 27464, 35108, 23727, 23007, 35895, 34953, 26578, 27685, 20141, 24569, 31691, 19787, 33967, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36427, 19552, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 27027, 26576, 23114, 23114, 23114, 31471, 23756, 22468, 23511, 23511, 23511, 34687, 23772, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 23788, 24035, 24035, 24035, 21559, 23828, 23114, 23114, 23114, 25086, 22839, 23853, 23511, 23511, 23511, 23876, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 31761, 23909, 23953, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36049, 19288, 21605, 30825, 23112, 23987, 23511, 24003, 31001, 27617, 24034, 24035, 24036, 24052, 24089, 23114, 23114, 22420, 24109, 24168, 23511, 23511, 29116, 24188, 27609, 20017, 29516, 24035, 26576, 24222, 19968, 23114, 24252, 33811, 22468, 24270, 33587, 23511, 24320, 27443, 22493, 24035, 24035, 24035, 24035, 24339, 23113, 23114, 23114, 23114, 28128, 28618, 29700, 23511, 23511, 23511, 28276, 34564, 20402, 24035, 24035, 32929, 24036, 23114, 23114, 23114, 24357, 23029, 22839, 23511, 23511, 23511, 24377, 25645, 24035, 34112, 24035, 26576, 23114, 26643, 23114, 32683, 22516, 23511, 25638, 23511, 23711, 24035, 24395, 27809, 23114, 24414, 20499, 24432, 30917, 23628, 24035, 30680, 23111, 23114, 30233, 27078, 25748, 24452, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 24475, 19829, 26577, 26597, 26154, 24519, 24556, 24596, 23007, 20046, 20132, 26578, 24634, 20141, 24569, 31691, 24679, 24727, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36412, 19288, 21605, 19943, 34861, 32618, 26027, 29483, 32016, 32050, 36233, 24776, 35574, 24801, 24819, 32671, 31289, 22420, 24868, 24886, 20087, 26849, 29116, 19803, 24035, 24035, 24035, 36228, 26576, 23114, 23114, 23114, 24981, 33811, 22468, 23511, 23511, 23511, 29028, 27443, 22493, 24923, 27965, 24035, 24035, 32797, 24946, 23443, 23114, 23114, 29636, 24997, 22849, 28252, 23511, 23511, 23511, 25042, 25110, 24035, 24035, 34085, 24036, 25133, 23114, 23114, 25152, 23029, 22839, 25169, 23511, 36764, 23511, 25645, 30403, 24035, 25186, 26576, 31806, 24093, 25212, 32683, 22516, 32713, 26245, 34293, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 32406, 23111, 23114, 28676, 30944, 27689, 25234, 24035, 23112, 19872, 37063, 23266, 24036, 23114, 30243, 20379, 26100, 29218, 20211, 30105, 25257, 25284, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 24834, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36034, 19288, 21671, 25314, 25072, 25330, 25346, 25362, 29939, 29951, 35288, 29984, 23812, 27216, 25405, 25424, 30456, 22584, 26292, 25461, 25480, 31592, 29116, 25516, 34963, 25545, 27007, 25579, 33937, 25614, 25661, 25686, 34872, 25702, 25718, 25734, 25769, 25795, 25811, 25840, 22493, 26533, 25856, 24035, 25876, 30763, 27481, 25909, 23114, 28987, 25936, 25954, 29700, 25983, 23511, 31412, 26043, 26063, 22568, 29241, 29592, 26116, 31216, 35383, 26170, 34783, 26194, 26221, 22839, 26241, 26261, 22477, 26283, 26308, 27306, 31035, 24655, 26576, 29854, 33386, 26341, 32683, 22516, 32153, 30926, 26361, 19996, 26381, 35463, 26397, 26424, 34646, 26478, 35605, 31386, 26494, 35567, 31964, 22940, 23689, 25218, 30309, 32289, 19830, 33605, 23112, 32109, 27733, 27084, 24496, 35886, 35221, 26525, 36602, 26549, 26558, 26574, 26594, 26613, 26629, 26666, 26700, 26578, 27685, 23740, 24285, 31691, 26733, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36397, 19552, 18991, 25887, 28117, 32618, 26776, 29483, 29939, 26802, 24035, 24035, 24036, 28664, 23114, 23114, 23114, 22420, 30297, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 25559, 26576, 23114, 23114, 23114, 30525, 33811, 22468, 23511, 23511, 23511, 28725, 27443, 22493, 24035, 24035, 27249, 24035, 24035, 23113, 23114, 23114, 26827, 23114, 28618, 29700, 23511, 23511, 26845, 23511, 34564, 20402, 24035, 24035, 26979, 24036, 23114, 23114, 23114, 24974, 23029, 22839, 23511, 23511, 23511, 26865, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 33305, 24035, 25598, 23114, 19874, 34253, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 26886, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 26931, 24569, 26439, 26947, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36019, 19288, 26995, 24035, 23112, 32618, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 27043, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 27061, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 29978, 24035, 24035, 23113, 23114, 33114, 23114, 23114, 30010, 29700, 23511, 35913, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 27155, 26576, 23114, 23114, 30447, 23036, 29695, 23511, 23511, 30935, 20099, 24152, 25529, 27100, 34461, 27121, 22625, 29156, 26009, 27137, 30422, 31903, 31655, 28870, 27171, 32439, 31731, 19830, 27232, 22612, 27265, 26786, 25494, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 20342, 27288, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 27322, 27339, 28020, 27361, 27382, 29939, 24035, 24035, 32581, 24036, 23114, 23114, 23114, 27425, 22420, 23511, 23511, 23511, 27442, 28306, 19803, 24035, 24035, 24035, 24035, 26710, 23114, 23114, 23114, 23114, 32261, 22468, 23511, 23511, 23511, 23511, 35719, 24694, 29510, 24035, 24035, 24035, 24035, 26717, 23114, 23114, 23114, 23114, 28618, 32217, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 27459, 23114, 23114, 23114, 36252, 23029, 20271, 23511, 23511, 23511, 28840, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 27480, 34483, 28401, 29761, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36382, 19288, 21605, 27497, 27517, 28504, 28898, 27569, 29939, 29401, 27600, 27323, 27633, 19025, 27662, 23114, 27705, 22420, 20483, 27721, 23511, 27765, 28306, 19803, 23540, 24035, 24610, 27781, 27805, 26650, 23114, 28573, 32990, 25920, 22468, 26870, 23511, 26684, 34262, 34737, 25057, 34622, 24035, 24035, 23971, 24206, 27825, 27847, 23114, 23114, 27865, 27885, 35766, 27914, 23511, 23511, 32766, 32844, 27934, 28795, 26909, 27955, 26092, 27988, 25445, 28005, 28036, 28052, 21965, 23511, 32196, 19897, 28072, 28102, 36534, 21541, 23801, 28153, 28180, 28197, 28221, 23036, 32695, 28251, 28268, 28292, 23667, 34825, 23930, 24580, 28322, 28344, 31627, 28366, 25996, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 35625, 33477, 33359, 27674, 28393, 33992, 24036, 23114, 30243, 19829, 28417, 28433, 28463, 23008, 19876, 20208, 23007, 20046, 20132, 28489, 28520, 20141, 24569, 31691, 19787, 28550, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 24694, 28589, 24035, 24035, 24035, 24035, 28608, 23114, 23114, 23114, 23114, 28618, 20431, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36004, 19288, 28634, 31951, 28565, 28702, 28718, 28741, 32544, 20175, 28792, 32086, 20105, 28811, 29059, 29862, 28856, 22420, 28886, 30354, 23359, 28922, 28306, 28952, 23888, 26320, 36506, 24035, 29331, 28968, 36609, 23114, 29003, 31661, 27061, 30649, 27366, 23511, 29023, 27918, 24694, 24035, 24035, 23893, 33094, 30867, 23113, 23114, 23114, 29044, 34184, 30010, 29700, 23511, 23511, 29081, 29102, 34585, 20402, 27789, 24035, 24035, 24036, 23114, 29132, 23114, 23114, 23029, 20271, 23511, 29153, 23511, 23511, 30562, 30174, 24035, 24035, 27409, 25438, 23114, 23114, 29172, 36668, 31332, 23511, 23511, 29192, 30144, 24035, 23110, 30203, 23114, 23467, 31544, 23261, 23628, 24035, 22545, 23111, 23114, 29213, 27078, 27689, 29234, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 29257, 23008, 19876, 20208, 28768, 29290, 29320, 34776, 29353, 20141, 22435, 29378, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36367, 19288, 21605, 34616, 19006, 32618, 31497, 31507, 36216, 20184, 24035, 34393, 29424, 34668, 23114, 34900, 29447, 22420, 30360, 23511, 37089, 29473, 28306, 19803, 29499, 24398, 24035, 24035, 26576, 31799, 29532, 29550, 23114, 33811, 22468, 32298, 29571, 31184, 23511, 23512, 37127, 36628, 29589, 24035, 24135, 24035, 23113, 29608, 23114, 27831, 29634, 28618, 29652, 30037, 23511, 24172, 29671, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 29555, 29690, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 29719, 24035, 23110, 29738, 23114, 23467, 34035, 29756, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 29777, 34364, 28181, 30243, 29799, 31920, 27272, 27185, 23008, 31126, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29828, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35989, 19552, 19687, 35139, 28649, 29878, 29894, 29924, 29939, 23224, 23085, 31969, 24036, 35173, 24752, 24803, 23114, 22420, 31190, 30318, 24870, 23511, 28306, 29967, 23967, 24035, 24035, 24035, 26576, 30000, 23114, 23114, 23114, 33811, 22468, 30026, 23511, 23511, 23511, 23512, 26078, 24035, 24035, 24035, 30053, 37137, 30071, 23114, 23114, 33368, 25136, 28618, 30723, 23511, 23511, 37096, 31356, 34585, 20402, 30092, 30127, 30160, 24036, 35740, 30219, 24960, 30259, 23029, 20271, 34042, 30285, 30342, 30376, 23289, 30055, 30400, 30419, 30438, 32640, 33532, 33514, 30472, 18792, 26267, 24323, 23057, 30493, 23639, 20008, 30196, 33188, 30517, 20075, 23511, 30541, 23628, 30578, 33928, 28776, 30594, 19874, 30610, 30637, 19830, 30677, 27646, 19872, 25779, 23266, 23232, 35016, 30243, 30696, 29812, 30712, 30746, 27206, 30779, 30807, 23007, 33395, 20132, 26578, 27685, 31703, 22928, 31691, 19787, 31079, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36352, 19288, 23335, 30841, 26131, 30888, 30904, 30986, 29939, 24035, 24704, 31017, 20025, 23114, 26178, 31051, 31095, 22420, 23511, 22524, 31142, 31172, 28534, 31206, 35497, 25196, 24035, 28592, 24503, 23114, 31239, 31285, 23114, 31305, 31321, 31355, 31372, 31407, 23511, 30556, 24694, 24035, 27501, 19805, 24035, 24035, 23113, 23114, 31428, 24066, 23114, 28618, 29700, 23511, 31837, 18809, 23511, 34585, 31448, 24035, 24035, 24035, 23090, 23114, 23114, 23114, 23114, 31619, 35038, 23511, 23511, 23511, 23511, 33714, 24035, 33085, 24035, 29431, 23114, 31467, 23114, 23143, 31487, 23511, 31523, 23511, 35195, 36783, 24035, 30111, 23567, 23114, 23467, 31543, 31560, 23628, 24035, 24035, 23111, 23114, 19874, 30953, 31584, 34508, 24035, 31608, 26345, 37055, 23266, 31643, 31677, 31719, 31747, 31786, 31822, 26898, 23008, 19876, 31859, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 31878, 31936, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35974, 19288, 21605, 27972, 35663, 31985, 29655, 32001, 36715, 24785, 25893, 23545, 31912, 19853, 19916, 25938, 24540, 22420, 31843, 29674, 29573, 32735, 28936, 19803, 24035, 24035, 32047, 24035, 26576, 23114, 23114, 27544, 23114, 33811, 22468, 23511, 23511, 32161, 23511, 23512, 32066, 24035, 33313, 24035, 24035, 24035, 23113, 27426, 32102, 23114, 23114, 28618, 32125, 23511, 32144, 23511, 23511, 33569, 20402, 24035, 27045, 24035, 24036, 23114, 23114, 28328, 23114, 30076, 32177, 23511, 23511, 30384, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23595, 32212, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 22635, 25753, 32233, 32257, 32277, 19829, 26577, 26597, 20211, 23008, 19876, 32322, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 32352, 35285, 32380, 34196, 33016, 30661, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 32404, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 32422, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 30269, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 19949, 24035, 23111, 32455, 19874, 31269, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36337, 19552, 19209, 21617, 26509, 32475, 32491, 32529, 29939, 24035, 32578, 25241, 32597, 23114, 32634, 29007, 32656, 22420, 23511, 32729, 26365, 32751, 28306, 32788, 32882, 24035, 24035, 32813, 36727, 23114, 33182, 23114, 27553, 33235, 32829, 23511, 32706, 23511, 28906, 28377, 26962, 32881, 32904, 32898, 32920, 24035, 32953, 23114, 32977, 26408, 23114, 28164, 33006, 23511, 33039, 35774, 23511, 32306, 20402, 33076, 30872, 24035, 24036, 25408, 33110, 28979, 23114, 23029, 20271, 35835, 33130, 33054, 23511, 30562, 33148, 24035, 24035, 33167, 23114, 23114, 33775, 23036, 20459, 23511, 23511, 25464, 24646, 24035, 24035, 22446, 23114, 23114, 25627, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 31391, 33204, 33220, 33251, 33287, 26577, 26597, 20211, 33329, 19876, 33345, 23007, 20046, 20132, 26578, 27685, 28473, 22599, 31691, 33411, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35959, 19288, 21907, 27243, 29843, 32618, 33427, 31507, 29939, 33460, 34090, 24035, 24036, 33493, 24416, 33530, 23114, 22420, 33548, 24379, 33585, 23511, 28306, 19803, 33603, 24202, 24035, 24035, 25593, 33749, 28205, 23114, 23114, 32388, 22468, 33853, 33060, 23511, 23511, 31339, 33621, 24035, 24035, 34397, 24618, 30757, 33663, 23114, 23114, 33683, 35684, 28618, 26678, 23511, 23511, 32506, 33699, 34585, 20402, 24035, 32562, 26973, 24036, 23114, 23114, 33377, 33773, 23029, 20271, 23511, 23511, 30621, 23511, 23860, 24035, 33791, 21553, 26576, 36558, 23114, 33809, 23036, 32857, 26047, 23511, 33827, 23634, 24035, 24035, 23110, 23114, 23114, 31252, 23511, 33845, 23628, 24035, 24459, 23111, 23114, 33869, 27078, 30791, 29783, 24035, 24742, 19872, 33895, 23266, 26462, 19710, 33879, 33919, 26577, 26597, 24123, 24930, 21930, 20208, 30501, 33953, 25268, 20252, 33983, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36322, 19552, 23390, 33634, 35154, 34008, 34024, 34058, 35544, 34106, 34128, 26811, 33151, 34144, 34169, 34212, 23114, 34228, 34244, 34278, 34315, 23511, 34331, 34347, 34380, 34413, 24035, 24663, 26576, 34429, 34453, 34477, 29534, 33811, 22468, 34499, 34524, 34557, 25170, 34580, 35436, 23937, 34601, 24035, 24341, 26453, 23113, 34638, 34662, 23114, 24236, 28618, 34684, 34703, 34729, 23511, 35352, 34753, 34799, 24035, 34815, 32558, 34848, 34888, 35814, 34923, 23165, 29137, 23606, 30326, 30730, 34939, 33023, 30562, 36848, 34979, 24035, 24847, 34996, 23114, 23114, 35032, 29695, 35054, 23511, 23511, 35091, 33296, 35124, 24296, 28235, 24361, 36276, 32772, 35067, 35189, 27301, 30855, 24852, 22452, 35211, 35237, 35316, 25500, 35270, 23405, 24304, 35304, 29362, 24036, 23114, 35332, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 35368, 28823, 23920, 32336, 35405, 20141, 24569, 31691, 35421, 35479, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35944, 22795, 21605, 33647, 35877, 35513, 30962, 35529, 34073, 35557, 24035, 24035, 20405, 31107, 23114, 23114, 23114, 35590, 34713, 23511, 23511, 23511, 35641, 19803, 29408, 32937, 25298, 24035, 35657, 23115, 27849, 24760, 35679, 26205, 22468, 23511, 35700, 24907, 24901, 35075, 31893, 34980, 24035, 24035, 24035, 24035, 23113, 35009, 23114, 23114, 23114, 28618, 35716, 30970, 23511, 23511, 23511, 34585, 23215, 24035, 24035, 24035, 24036, 35735, 23114, 23114, 23114, 27105, 35756, 35790, 23511, 23511, 23511, 35254, 35446, 24035, 24035, 31223, 35809, 23114, 23114, 23036, 36825, 35830, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 31031, 20355, 19872, 33903, 23266, 24036, 23114, 28686, 19829, 26577, 26597, 20211, 23008, 23424, 20208, 24711, 31065, 24486, 26578, 27685, 20141, 19773, 35851, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36307, 19288, 21605, 35494, 19702, 32618, 33437, 31507, 29939, 25117, 24035, 27939, 24036, 27869, 23114, 26829, 23114, 22420, 23494, 23511, 33132, 23511, 28306, 19803, 24035, 34832, 24035, 24035, 26576, 23114, 25153, 23114, 23114, 33811, 22468, 23511, 23511, 35911, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35929, 19288, 21605, 25860, 23112, 36185, 23511, 36201, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 26748, 24035, 24035, 24035, 24035, 24035, 36249, 23114, 23114, 23114, 23114, 28618, 28835, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 27151, 24035, 26760, 23114, 27989, 23114, 23114, 36268, 20271, 23511, 24436, 23511, 29703, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36292, 19288, 21605, 36503, 21922, 32618, 34534, 31507, 36522, 24035, 33793, 24035, 35864, 23114, 23114, 36555, 23417, 22420, 23511, 23511, 36574, 26020, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 36592, 24035, 24035, 36625, 24035, 24035, 23113, 23114, 32961, 23114, 23114, 29618, 29700, 23511, 29086, 23511, 23511, 34585, 20402, 36644, 24035, 24035, 24036, 29740, 23114, 23114, 23114, 29065, 36663, 31527, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 31451, 23112, 36684, 23511, 36700, 29939, 24035, 24035, 24035, 30185, 23114, 23114, 23114, 27526, 22420, 23511, 23511, 23511, 32865, 28306, 19803, 36743, 24035, 27017, 24035, 26576, 27535, 23114, 31432, 23114, 33811, 22468, 33271, 23511, 32128, 23511, 23512, 24694, 24035, 27196, 24035, 24035, 24035, 23113, 32459, 23114, 23114, 23114, 28618, 29700, 33829, 36762, 23511, 23511, 34585, 20402, 24035, 36746, 24035, 29722, 23114, 23114, 34437, 23114, 34907, 20271, 23511, 23511, 18801, 23511, 23206, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 36837, 24035, 24035, 33739, 23114, 23114, 25094, 23511, 23261, 23628, 24035, 36780, 23111, 24073, 19874, 27078, 35344, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22720, 19288, 36799, 36866, 17466, 36890, 36864, 21991, 22211, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 17631, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 36883, 36906, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22705, 19288, 19457, 36866, 17466, 36890, 36866, 19375, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36124, 19288, 36951, 36866, 17466, 36890, 36866, 21991, 22404, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18567, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 36979, 36995, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36139, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18027, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36139, 19288, 21529, 24035, 23112, 23033, 23511, 31507, 25377, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 37040, 23511, 23511, 23511, 23511, 28086, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 24254, 37079, 23511, 23511, 23511, 23511, 23512, 34766, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 37112, 37160, 18469, 36866, 17466, 36890, 36866, 17656, 37174, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18537, 22984, 17553, 17572, 22285, 18780, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 36883, 36906, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 127011, 110630, 114730, 106539, 127011, 127011, 127011, 53264, 18, 18, 0, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 0, 0, 127011, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2170880, 2170880, 2170880, 3002368, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2576384, 2215936, 2215936, 2215936, 2416640, 2424832, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2543616, 2215936, 2215936, 2215936, 2215936, 2215936, 2629632, 2215936, 2617344, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2691072, 2215936, 2707456, 2215936, 2715648, 2215936, 2723840, 2764800, 2215936, 2215936, 2797568, 2215936, 2822144, 2215936, 2215936, 2854912, 2215936, 2215936, 2215936, 2912256, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 180224, 0, 0, 2174976, 0, 0, 2170880, 2617344, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2691072, 2170880, 2707456, 2170880, 2715648, 2170880, 2723840, 2764800, 2170880, 2170880, 2797568, 2170880, 2170880, 2797568, 2170880, 2822144, 2170880, 2170880, 2854912, 2170880, 2170880, 2170880, 2912256, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2609152, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2654208, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 184599, 280, 0, 2174976, 0, 0, 2215936, 3117056, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 544, 0, 546, 0, 0, 2179072, 0, 0, 0, 552, 0, 0, 2170880, 2170880, 2170880, 3117056, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2158592, 2158592, 2232320, 2232320, 0, 2240512, 2240512, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3129344, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2400256, 2215936, 2215936, 2215936, 2215936, 2711552, 2170880, 2170880, 2170880, 2170880, 2170880, 2760704, 2768896, 2789376, 2813952, 2170880, 2170880, 2170880, 2875392, 2904064, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2453504, 2457600, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 167936, 0, 0, 0, 0, 2174976, 0, 0, 2215936, 2215936, 2514944, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2592768, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 32768, 0, 0, 0, 0, 0, 2174976, 32768, 0, 2633728, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2711552, 2215936, 2215936, 2215936, 2215936, 2215936, 2760704, 2768896, 2789376, 2813952, 2215936, 2215936, 2215936, 2875392, 2904064, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2174976, 0, 65819, 2215936, 2215936, 3031040, 2215936, 3055616, 2215936, 2215936, 2215936, 2215936, 3092480, 2215936, 2215936, 3125248, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3002368, 2215936, 2215936, 2170880, 2170880, 2494464, 2170880, 2170880, 0, 0, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3198976, 2215936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2379776, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2445312, 2170880, 2465792, 2473984, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2523136, 2170880, 2170880, 2641920, 2170880, 2170880, 2170880, 2699264, 2170880, 2727936, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2879488, 2170880, 2916352, 2170880, 2170880, 2170880, 2879488, 2170880, 2916352, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3026944, 2170880, 2170880, 3063808, 2170880, 2170880, 3112960, 2170880, 2170880, 3133440, 2170880, 2170880, 3112960, 2170880, 2170880, 3133440, 2170880, 2170880, 2170880, 3162112, 2170880, 2170880, 3182592, 3186688, 2170880, 2379776, 2215936, 2523136, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2596864, 2215936, 2621440, 2215936, 2215936, 2641920, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 548, 0, 0, 0, 0, 287, 2170880, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3117056, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2699264, 2215936, 2727936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2879488, 2215936, 2916352, 2215936, 2215936, 0, 0, 0, 0, 188416, 0, 2179072, 0, 0, 0, 0, 0, 287, 2170880, 0, 2171019, 2171019, 2171019, 2400395, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3031179, 2171019, 3055755, 2171019, 2171019, 2215936, 3133440, 2215936, 2215936, 2215936, 3162112, 2215936, 2215936, 3182592, 3186688, 2215936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2523275, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2597003, 2171019, 2621579, 2170880, 2170880, 2170880, 3162112, 2170880, 2170880, 3182592, 3186688, 2170880, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 24, 24, 0, 4337664, 28, 2170880, 2170880, 2170880, 2629632, 2170880, 2170880, 2170880, 2170880, 2719744, 2744320, 2170880, 2170880, 2170880, 2834432, 2838528, 2170880, 2908160, 2170880, 2170880, 2936832, 2215936, 2215936, 2215936, 2215936, 2719744, 2744320, 2215936, 2215936, 2215936, 2834432, 2838528, 2215936, 2908160, 2215936, 2215936, 2936832, 2215936, 2215936, 2985984, 2215936, 2994176, 2215936, 2215936, 3014656, 2215936, 3059712, 3076096, 3088384, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2445312, 2215936, 2465792, 2473984, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2171166, 2171166, 2171166, 2171166, 2171166, 0, 0, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171019, 2171019, 2494603, 2171019, 2171019, 2215936, 2215936, 2215936, 3215360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2379776, 2170880, 2170880, 2170880, 2170880, 2985984, 2170880, 2994176, 2170880, 2170880, 3016168, 2170880, 3059712, 3076096, 3088384, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 124, 124, 0, 128, 128, 2170880, 2170880, 2170880, 3215360, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2486272, 2170880, 2170880, 2506752, 2170880, 2170880, 2170880, 2535424, 2539520, 2170880, 2170880, 2588672, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2920448, 2170880, 2170880, 2170880, 2990080, 2170880, 2170880, 2170880, 2170880, 3051520, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3170304, 0, 2387968, 2392064, 2170880, 2170880, 2433024, 2170880, 2170880, 2170880, 3170304, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2486272, 2215936, 2215936, 2506752, 2215936, 2215936, 2215936, 2535424, 2539520, 2215936, 2215936, 2588672, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2174976, 136, 0, 2215936, 2215936, 2920448, 2215936, 2215936, 2215936, 2990080, 2215936, 2215936, 2215936, 2215936, 3051520, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3108864, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3026944, 2215936, 2215936, 3063808, 2215936, 2215936, 3112960, 2215936, 2215936, 2215936, 3170304, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2453504, 2457600, 2170880, 2170880, 2170880, 2486272, 2170880, 2170880, 2506752, 2170880, 2170880, 2170880, 2537049, 2539520, 2170880, 2170880, 2588672, 2170880, 2170880, 2170880, 1508, 2170880, 2170880, 2170880, 1512, 2170880, 2920448, 2170880, 2170880, 2170880, 2990080, 2170880, 2170880, 2170880, 2461696, 2170880, 2170880, 2170880, 2510848, 2170880, 2170880, 2170880, 2170880, 2580480, 2170880, 2605056, 2637824, 2170880, 2170880, 18, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2686976, 2748416, 2170880, 2170880, 2170880, 2924544, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3121152, 2170880, 2170880, 3145728, 3158016, 3166208, 2170880, 2420736, 2428928, 2170880, 2478080, 2170880, 2170880, 2170880, 2170880, 0, 0, 2170880, 2170880, 2170880, 2170880, 2646016, 2670592, 0, 0, 3145728, 3158016, 3166208, 2387968, 2392064, 2215936, 2215936, 2433024, 2215936, 2461696, 2215936, 2215936, 2215936, 2510848, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 0, 0, 2170880, 2215936, 2215936, 2580480, 2215936, 2605056, 2637824, 2215936, 2215936, 2686976, 2748416, 2215936, 2215936, 2215936, 2924544, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 0, 286, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 3121152, 2215936, 2215936, 3145728, 3158016, 3166208, 2387968, 2392064, 2170880, 2170880, 2433024, 2170880, 2461696, 2170880, 2170880, 2170880, 2510848, 2170880, 2170880, 1625, 2170880, 2170880, 2580480, 2170880, 2605056, 2637824, 2170880, 647, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2576384, 2170880, 2170880, 2170880, 2170880, 2170880, 2609152, 2170880, 2170880, 2686976, 0, 0, 2748416, 2170880, 2170880, 0, 2170880, 2924544, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 24, 0, 0, 28, 28, 2170880, 3141632, 2215936, 2420736, 2428928, 2215936, 2478080, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2646016, 2670592, 2752512, 2756608, 2846720, 2961408, 2215936, 2998272, 2215936, 3010560, 2215936, 2215936, 2215936, 3141632, 2170880, 2420736, 2428928, 2752512, 2756608, 0, 2846720, 2961408, 2170880, 2998272, 2170880, 3010560, 2170880, 2170880, 2170880, 3141632, 2170880, 2170880, 2490368, 2215936, 2490368, 2215936, 2215936, 2215936, 2547712, 2555904, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2174976, 245760, 0, 3129344, 2170880, 2170880, 2490368, 2170880, 2170880, 2170880, 0, 0, 2547712, 2555904, 2170880, 2170880, 2170880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 45056, 0, 2584576, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2170880, 2170880, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 0, 0, 0, 0, 0, 0, 1482, 97, 97, 97, 97, 97, 97, 97, 1354, 97, 97, 97, 97, 97, 97, 97, 97, 1148, 97, 97, 97, 97, 97, 97, 97, 2584576, 2170880, 2170880, 1512, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2441216, 2170880, 2527232, 2170880, 2600960, 2170880, 2850816, 2170880, 2170880, 2170880, 3022848, 2215936, 2441216, 2215936, 2527232, 2215936, 2600960, 2215936, 2850816, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 0, 287, 2170880, 2215936, 3022848, 2170880, 2441216, 2170880, 2527232, 0, 0, 2170880, 2600960, 2170880, 0, 2850816, 2170880, 2170880, 2170880, 2170880, 2170880, 2523136, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2596864, 2170880, 2621440, 2170880, 2170880, 2641920, 2170880, 2170880, 2170880, 3022848, 2170880, 2519040, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2519040, 2215936, 2215936, 2215936, 2215936, 2215936, 2170880, 2170880, 2170880, 2453504, 2457600, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2514944, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2592768, 2170880, 2170880, 2519040, 0, 2024, 2170880, 2170880, 0, 2170880, 2170880, 2170880, 2396160, 2170880, 2170880, 2170880, 2170880, 3018752, 2396160, 2215936, 2215936, 2215936, 2215936, 3018752, 2396160, 0, 2024, 2170880, 2170880, 2170880, 2170880, 3018752, 2170880, 2650112, 2965504, 2170880, 2215936, 2650112, 2965504, 2215936, 0, 0, 2170880, 2650112, 2965504, 2170880, 2551808, 2170880, 2551808, 2215936, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 141, 45, 45, 67, 67, 67, 67, 67, 224, 67, 67, 238, 67, 67, 67, 67, 67, 67, 67, 1288, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 0, 2551808, 2170880, 2170880, 2215936, 0, 2170880, 2170880, 2215936, 0, 2170880, 2170880, 2215936, 0, 2170880, 2977792, 2977792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53264, 18, 49172, 57366, 24, 8192, 29, 102432, 127011, 110630, 114730, 106539, 127011, 127011, 127011, 53264, 18, 18, 49172, 0, 0, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 0, 0, 0, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 136, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 4256099, 4256099, 24, 24, 0, 28, 28, 2170880, 2461696, 2170880, 2170880, 2170880, 2510848, 2170880, 2170880, 0, 2170880, 2170880, 2580480, 2170880, 2605056, 2637824, 2170880, 2170880, 2170880, 2547712, 2555904, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3129344, 2215936, 2215936, 543, 543, 545, 545, 0, 0, 2179072, 0, 550, 551, 551, 0, 287, 2171166, 2171166, 18, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 645, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 149, 2584576, 2170880, 2170880, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2441216, 2170880, 2527232, 2170880, 2600960, 2519040, 0, 0, 2170880, 2170880, 0, 2170880, 2170880, 2170880, 2396160, 2170880, 2170880, 2170880, 2170880, 3018752, 2396160, 2215936, 2215936, 2215936, 2215936, 3018752, 2396160, 0, 0, 2170880, 2170880, 2170880, 2170880, 3018752, 2170880, 2650112, 2965504, 53264, 18, 49172, 57366, 24, 155648, 28, 102432, 155648, 155687, 114730, 106539, 0, 0, 155648, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 0, 0, 0, 0, 2220032, 0, 94208, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 208896, 18, 278528, 24, 24, 0, 28, 28, 53264, 18, 159765, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 0, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 139394, 28, 28, 102432, 131, 0, 0, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 32768, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 546, 0, 0, 2183168, 0, 0, 552, 832, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2170880, 2609152, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2654208, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3198976, 2215936, 0, 1084, 0, 1088, 0, 1092, 0, 0, 0, 0, 0, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 937, 0, 0, 0, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3198976, 2170880, 0, 0, 644, 0, 0, 0, 2215936, 3117056, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 826, 0, 828, 0, 0, 2183168, 0, 0, 830, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2592768, 2170880, 2170880, 2170880, 2170880, 2633728, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2711552, 2170880, 2170880, 2170880, 2170880, 2170880, 2760704, 53264, 18, 49172, 57366, 24, 8192, 28, 172066, 172032, 110630, 172066, 106539, 0, 0, 172032, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 16384, 28, 28, 28, 28, 102432, 0, 98304, 0, 0, 2220032, 110630, 0, 0, 0, 0, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3198976, 2170880, 0, 0, 45056, 0, 0, 0, 53264, 18, 49172, 57366, 25, 8192, 30, 102432, 0, 110630, 114730, 106539, 0, 0, 176219, 53264, 18, 18, 49172, 0, 57366, 0, 124, 124, 124, 0, 128, 128, 128, 128, 102432, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 0, 546, 0, 0, 2183168, 0, 65536, 552, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2646016, 2670592, 2752512, 2756608, 2846720, 2961408, 2170880, 2998272, 2170880, 3010560, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3198976, 2215936, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 143, 45, 45, 67, 67, 67, 67, 67, 227, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1824, 67, 1826, 67, 67, 67, 67, 17, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 32768, 120, 121, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 67, 67, 37139, 37139, 24853, 24853, 0, 0, 2179072, 548, 0, 65820, 65820, 0, 287, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2033, 45, 67, 67, 67, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 369, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 978, 0, 546, 70179, 0, 2183168, 0, 0, 552, 0, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1013, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 473, 67, 67, 67, 67, 483, 67, 67, 1025, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1119, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1359, 97, 97, 97, 67, 67, 1584, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 497, 67, 67, 1659, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1667, 45, 45, 45, 45, 45, 169, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1668, 45, 45, 45, 45, 67, 67, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 774, 67, 67, 1713, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 1723, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 1538, 45, 45, 45, 45, 45, 1559, 45, 45, 1561, 45, 45, 45, 45, 45, 45, 45, 687, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1771, 1772, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 67, 67, 67, 67, 67, 1821, 67, 67, 67, 67, 67, 67, 1827, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 1614, 97, 97, 97, 97, 97, 603, 97, 97, 605, 97, 97, 608, 97, 97, 97, 97, 0, 1532, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 450, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 1839, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 1883, 97, 1885, 97, 0, 1888, 0, 97, 97, 0, 97, 97, 1848, 97, 97, 97, 97, 1852, 45, 45, 45, 45, 45, 45, 45, 384, 391, 45, 45, 45, 45, 45, 45, 45, 385, 45, 45, 45, 45, 45, 45, 45, 45, 1237, 45, 45, 45, 45, 45, 45, 67, 0, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1951, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1963, 97, 2023, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 1994, 67, 1995, 67, 67, 67, 67, 67, 67, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 0, 0, 0, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 137, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2793472, 2805760, 2170880, 2830336, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3031040, 2170880, 3055616, 2170880, 2170880, 67, 67, 37139, 37139, 24853, 24853, 0, 0, 281, 549, 0, 65820, 65820, 0, 287, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 2031, 2032, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1769, 67, 0, 546, 70179, 549, 549, 0, 0, 552, 0, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1858, 45, 641, 0, 0, 0, 0, 41606, 926, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 456, 67, 0, 0, 0, 1313, 0, 0, 0, 1096, 1319, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1110, 97, 97, 97, 97, 67, 67, 67, 67, 1301, 1476, 0, 0, 0, 0, 1307, 1478, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1486, 97, 1487, 97, 1313, 1480, 0, 0, 0, 0, 1319, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 566, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1476, 0, 1478, 0, 1480, 0, 97, 97, 97, 97, 97, 97, 97, 45, 1853, 45, 1855, 45, 45, 45, 45, 53264, 18, 49172, 57366, 26, 8192, 31, 102432, 0, 110630, 114730, 106539, 0, 0, 225368, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 32768, 53264, 18, 18, 49172, 163840, 57366, 0, 24, 24, 229376, 0, 28, 28, 28, 229376, 102432, 0, 0, 0, 0, 2220167, 110630, 0, 0, 0, 114730, 106539, 0, 2171019, 2171019, 2171019, 2171019, 2592907, 2171019, 2171019, 2171019, 2171019, 2633867, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2654347, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3117195, 2171019, 2171019, 2171019, 2171019, 2240641, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 140, 2171019, 2171019, 2171019, 2416779, 2424971, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2617483, 2171019, 2171019, 2642059, 2171019, 2171019, 2171019, 2699403, 2171019, 2728075, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3215499, 2215936, 2215936, 2215936, 2215936, 2215936, 2437120, 2215936, 2215936, 2171019, 2822283, 2171019, 2171019, 2855051, 2171019, 2171019, 2171019, 2912395, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3002507, 2171019, 2171019, 2215936, 2215936, 2494464, 2215936, 2215936, 2215936, 2171166, 2171166, 2416926, 2425118, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2576670, 2171166, 2617630, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2691358, 2171166, 2707742, 2171166, 2715934, 2171166, 2724126, 2765086, 2171166, 2171166, 2797854, 2171166, 2822430, 2171166, 2171166, 2855198, 2171166, 2171166, 2171166, 2912542, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2793758, 2806046, 2171166, 2830622, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3109150, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2543902, 2171166, 2171166, 2171166, 2171166, 2171166, 2629918, 2793611, 2805899, 2171019, 2830475, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 0, 546, 0, 0, 2183168, 0, 0, 552, 0, 2171166, 2171166, 2171166, 2400542, 2171166, 2171166, 2171166, 0, 2171166, 2171166, 2171166, 0, 2171166, 2920734, 2171166, 2171166, 2171166, 2990366, 2171166, 2171166, 2171166, 2171166, 3117342, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 0, 53264, 0, 18, 18, 4329472, 2232445, 0, 2240641, 4337664, 2711691, 2171019, 2171019, 2171019, 2171019, 2171019, 2760843, 2769035, 2789515, 2814091, 2171019, 2171019, 2171019, 2875531, 2904203, 2171019, 2171019, 3092619, 2171019, 2171019, 3125387, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3199115, 2171019, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2453504, 2457600, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2793472, 2805760, 2215936, 2830336, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2494464, 2170880, 2170880, 2171166, 2171166, 2634014, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2711838, 2171166, 2171166, 2171166, 2171166, 2171166, 2760990, 2769182, 2789662, 2814238, 2171166, 2171166, 2171166, 2875678, 2904350, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3199262, 2171166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2379915, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2445451, 2171019, 2465931, 2474123, 2171019, 2171019, 3113099, 2171019, 2171019, 3133579, 2171019, 2171019, 2171019, 3162251, 2171019, 2171019, 3182731, 3186827, 2171019, 2379776, 2879627, 2171019, 2916491, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3027083, 2171019, 2171019, 3063947, 2699550, 2171166, 2728222, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2879774, 2171166, 2916638, 2171166, 2171166, 2171166, 2171166, 2171166, 2609438, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2654494, 2171166, 2171166, 2171166, 2171166, 2171166, 2445598, 2171166, 2466078, 2474270, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2523422, 2171019, 2437259, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2543755, 2171019, 2171019, 2171019, 2584715, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2908299, 2171019, 2171019, 2936971, 2171019, 2171019, 2986123, 2171019, 2994315, 2171019, 2171019, 3014795, 2171019, 3059851, 3076235, 3088523, 2171166, 2171166, 2986270, 2171166, 2994462, 2171166, 2171166, 3014942, 2171166, 3059998, 3076382, 3088670, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3027230, 2171166, 2171166, 3064094, 2171166, 2171166, 3113246, 2171166, 2171166, 3133726, 2506891, 2171019, 2171019, 2171019, 2535563, 2539659, 2171019, 2171019, 2588811, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2691211, 2171019, 2707595, 2171019, 2715787, 2171019, 2723979, 2764939, 2171019, 2171019, 2797707, 2215936, 2215936, 3170304, 0, 0, 0, 0, 0, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2453790, 2457886, 2171166, 2171166, 2171166, 2486558, 2171166, 2171166, 2507038, 2171166, 2171166, 2171166, 2535710, 2539806, 2171166, 2171166, 2588958, 2171166, 2171166, 2171166, 2171166, 2515230, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2593054, 2171166, 2171166, 2171166, 2171166, 3051806, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3170590, 0, 2388107, 2392203, 2171019, 2171019, 2433163, 2171019, 2461835, 2171019, 2171019, 2171019, 2510987, 2171019, 2171019, 2171019, 2171019, 2580619, 2171019, 2605195, 2637963, 2171019, 2171019, 2171019, 2920587, 2171019, 2171019, 2171019, 2990219, 2171019, 2171019, 2171019, 2171019, 3051659, 2171019, 2171019, 2171019, 2453643, 2457739, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2515083, 2171019, 2171019, 2171019, 2171019, 2646155, 2670731, 2752651, 2756747, 2846859, 2961547, 2171019, 2998411, 2171019, 3010699, 2171019, 2171019, 2687115, 2748555, 2171019, 2171019, 2171019, 2924683, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3121291, 2171019, 2171019, 2171019, 3170443, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2486272, 2215936, 2215936, 2506752, 3145867, 3158155, 3166347, 2387968, 2392064, 2215936, 2215936, 2433024, 2215936, 2461696, 2215936, 2215936, 2215936, 2510848, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 0, 553, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 3121152, 2215936, 2215936, 3145728, 3158016, 3166208, 2388254, 2392350, 2171166, 2171166, 2433310, 2171166, 2461982, 2171166, 2171166, 2171166, 2511134, 2171166, 2171166, 0, 2171166, 2171166, 2580766, 2171166, 2605342, 2638110, 2171166, 2171166, 2171166, 2171166, 3031326, 2171166, 3055902, 2171166, 2171166, 2171166, 2171166, 3092766, 2171166, 2171166, 3125534, 2171166, 2171166, 2171166, 3162398, 2171166, 2171166, 3182878, 3186974, 2171166, 0, 0, 0, 2171019, 2171019, 2171019, 2171019, 3109003, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2215936, 2215936, 2215936, 2400256, 2215936, 2215936, 2215936, 2215936, 2171166, 2687262, 0, 0, 2748702, 2171166, 2171166, 0, 2171166, 2924830, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2597150, 2171166, 2621726, 2171166, 2171166, 2642206, 2171166, 2171166, 2171166, 2171166, 3121438, 2171166, 2171166, 3146014, 3158302, 3166494, 2171019, 2420875, 2429067, 2171019, 2478219, 2171019, 2171019, 2171019, 2171019, 2547851, 2556043, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3129483, 2215936, 2171019, 3141771, 2215936, 2420736, 2428928, 2215936, 2478080, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2646016, 2670592, 2752512, 2756608, 2846720, 2961408, 2215936, 2998272, 2215936, 3010560, 2215936, 2215936, 2215936, 3141632, 2171166, 2421022, 2429214, 2171166, 2478366, 2171166, 2171166, 2171166, 2171166, 0, 0, 2171166, 2171166, 2171166, 2171166, 2646302, 2670878, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 0, 45, 45, 45, 45, 45, 1405, 1406, 45, 45, 45, 45, 1409, 45, 45, 45, 45, 45, 1415, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1238, 45, 45, 45, 45, 67, 2752798, 2756894, 0, 2847006, 2961694, 2171166, 2998558, 2171166, 3010846, 2171166, 2171166, 2171166, 3141918, 2171019, 2171019, 2490507, 3129344, 2171166, 2171166, 2490654, 2171166, 2171166, 2171166, 0, 0, 2547998, 2556190, 2171166, 2171166, 2171166, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 45, 167, 45, 45, 45, 45, 185, 187, 45, 45, 198, 45, 45, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3129630, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2576523, 2171019, 2171019, 2171019, 2171019, 2171019, 2609291, 2171019, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3002368, 2215936, 2215936, 2171166, 2171166, 2494750, 2171166, 2171166, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 147, 2584576, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2171166, 2171166, 2171166, 2171166, 0, 0, 0, 2171166, 2171166, 2171166, 2171166, 0, 0, 0, 2171166, 2171166, 2171166, 3002654, 2171166, 2171166, 2171019, 2171019, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2175257, 0, 0, 2584862, 2171166, 2171166, 0, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2171019, 2441355, 2171019, 2527371, 2171019, 2601099, 2171019, 2850955, 2171019, 2171019, 2171019, 3022987, 2215936, 2441216, 2215936, 2527232, 2215936, 2600960, 2215936, 2850816, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 69632, 287, 2170880, 2215936, 3022848, 2171166, 2441502, 2171166, 2527518, 0, 0, 2171166, 2601246, 2171166, 0, 2851102, 2171166, 2171166, 2171166, 2171166, 2720030, 2744606, 2171166, 2171166, 2171166, 2834718, 2838814, 2171166, 2908446, 2171166, 2171166, 2937118, 3023134, 2171019, 2519179, 2171019, 2171019, 2171019, 2171019, 2171019, 2215936, 2519040, 2215936, 2215936, 2215936, 2215936, 2215936, 2171166, 2171166, 2171166, 3215646, 0, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2486411, 2171019, 2171019, 2171019, 2629771, 2171019, 2171019, 2171019, 2171019, 2719883, 2744459, 2171019, 2171019, 2171019, 2834571, 2838667, 2171019, 2519326, 0, 0, 2171166, 2171166, 0, 2171166, 2171166, 2171166, 2396299, 2171019, 2171019, 2171019, 2171019, 3018891, 2396160, 2215936, 2215936, 2215936, 2215936, 3018752, 2396446, 0, 0, 2171166, 2171166, 2171166, 2171166, 3019038, 2171019, 2650251, 2965643, 2171019, 2215936, 2650112, 2965504, 2215936, 0, 0, 2171166, 2650398, 2965790, 2171166, 2551947, 2171019, 2551808, 2215936, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 144, 45, 45, 67, 67, 67, 67, 67, 228, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1929, 97, 97, 97, 97, 0, 0, 0, 2552094, 2171166, 2171019, 2215936, 0, 2171166, 2171019, 2215936, 0, 2171166, 2171019, 2215936, 0, 2171166, 2977931, 2977792, 2978078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 1321, 97, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 140, 0, 2379776, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2445312, 2170880, 2465792, 2473984, 2170880, 2170880, 2170880, 2584576, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2170880, 2170880, 2170880, 3162112, 2170880, 2170880, 3182592, 3186688, 2170880, 0, 140, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3002368, 2170880, 2170880, 2215936, 2215936, 2494464, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3215360, 544, 0, 0, 0, 544, 0, 546, 0, 0, 0, 546, 0, 0, 2183168, 0, 0, 552, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 0, 2170880, 2170880, 2170880, 0, 2170880, 2920448, 2170880, 2170880, 2170880, 2990080, 2170880, 2170880, 552, 0, 0, 0, 552, 0, 287, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2437120, 2170880, 2170880, 18, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 644, 0, 2215936, 2215936, 3170304, 544, 0, 546, 0, 552, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3198976, 2170880, 0, 0, 0, 140, 0, 0, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 249856, 110630, 114730, 106539, 0, 0, 32768, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 151640, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2416640, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 253952, 110630, 114730, 106539, 0, 0, 32856, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 192512, 53264, 18, 18, 49172, 0, 57366, 0, 2232445, 184320, 2232445, 0, 2240641, 2240641, 184320, 2240641, 102432, 0, 0, 0, 221184, 2220032, 110630, 0, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3108864, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 0, 0, 0, 45056, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 24, 24, 0, 127, 127, 53264, 18, 49172, 258071, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 32768, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 204800, 53264, 18, 49172, 57366, 24, 27, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 0, 53264, 18, 49172, 57366, 24, 8192, 28, 33, 0, 33, 33, 33, 0, 0, 0, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 16384, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 2170880, 2170880, 2170880, 2416640, 67, 67, 37139, 37139, 24853, 24853, 0, 70179, 0, 0, 0, 65820, 65820, 369, 287, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 2030, 45, 45, 45, 45, 67, 1573, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1699, 67, 67, 67, 67, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1355, 97, 97, 97, 1358, 97, 97, 97, 641, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 1187, 45, 45, 45, 45, 45, 0, 1480, 0, 0, 0, 0, 1319, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 592, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1531, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1680, 45, 45, 45, 641, 0, 924, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1186, 45, 45, 45, 45, 45, 45, 67, 67, 37139, 37139, 24853, 24853, 0, 70179, 282, 0, 0, 65820, 65820, 369, 287, 97, 0, 0, 97, 97, 0, 97, 2028, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1767, 67, 67, 67, 0, 0, 0, 0, 0, 0, 1612, 97, 97, 97, 97, 97, 97, 0, 1785, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1790, 97, 0, 0, 2170880, 2170880, 3051520, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3170304, 241664, 2387968, 2392064, 2170880, 2170880, 2433024, 53264, 19, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 274432, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 270336, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 1134711, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 1126440, 1126440, 1126440, 0, 0, 1126400, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 36, 110630, 114730, 106539, 0, 0, 217088, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 94, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 96, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 24666, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 126, 28, 28, 28, 28, 102432, 53264, 122, 123, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 2170880, 2170880, 4256099, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 0, 0, 0, 0, 0, 0, 1319, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1109, 97, 97, 97, 97, 1113, 132, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 146, 150, 45, 45, 45, 45, 45, 175, 45, 180, 45, 186, 45, 189, 45, 45, 203, 67, 256, 67, 67, 270, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 97, 293, 297, 97, 97, 97, 97, 97, 322, 97, 327, 97, 333, 97, 0, 0, 97, 2026, 0, 2027, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1685, 67, 67, 67, 67, 67, 67, 67, 1690, 67, 336, 97, 97, 350, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 356, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 2424832, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2617344, 2170880, 45, 439, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 525, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 622, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1524, 97, 97, 1527, 369, 648, 45, 45, 45, 45, 45, 45, 45, 45, 45, 659, 45, 45, 45, 45, 408, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1239, 45, 45, 45, 67, 729, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 762, 67, 746, 67, 67, 67, 67, 67, 67, 67, 67, 67, 759, 67, 67, 67, 67, 0, 0, 0, 1477, 0, 1086, 0, 0, 0, 1479, 0, 1090, 67, 67, 796, 67, 67, 799, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1291, 67, 67, 67, 811, 67, 67, 67, 67, 67, 816, 67, 67, 67, 67, 67, 67, 67, 37689, 544, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 833, 97, 97, 97, 97, 97, 97, 97, 97, 1380, 0, 0, 0, 45, 45, 45, 45, 45, 1185, 45, 45, 45, 45, 45, 45, 45, 386, 45, 45, 45, 45, 45, 45, 45, 45, 1810, 45, 45, 45, 45, 45, 45, 67, 97, 97, 844, 97, 97, 97, 97, 97, 97, 97, 97, 97, 857, 97, 97, 97, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 97, 97, 97, 894, 97, 97, 897, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1382, 45, 45, 45, 97, 909, 97, 97, 97, 97, 97, 914, 97, 97, 97, 97, 97, 97, 97, 923, 67, 67, 1079, 67, 67, 67, 67, 67, 37689, 1085, 25403, 1089, 66365, 1093, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 148, 1114, 97, 97, 97, 97, 97, 97, 1122, 97, 97, 97, 97, 97, 97, 97, 97, 97, 606, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1173, 97, 97, 97, 97, 97, 12288, 0, 925, 0, 1179, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 145, 45, 45, 67, 67, 67, 67, 67, 1762, 67, 67, 67, 1766, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 1934, 67, 67, 1255, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1035, 67, 67, 67, 67, 67, 67, 1297, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1111, 97, 97, 97, 97, 97, 97, 1327, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 33344, 97, 97, 97, 1335, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 1377, 97, 97, 97, 97, 97, 97, 0, 1179, 0, 45, 45, 45, 45, 670, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 430, 45, 45, 45, 45, 67, 67, 1438, 67, 67, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1592, 67, 67, 67, 1451, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1458, 67, 67, 67, 67, 0, 0, 1305, 0, 0, 0, 0, 0, 1311, 0, 0, 0, 1317, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1322, 97, 97, 1491, 97, 97, 1495, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1551, 45, 1553, 45, 1504, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1513, 97, 97, 97, 97, 0, 45, 45, 45, 45, 1536, 45, 45, 45, 45, 1540, 45, 67, 67, 67, 67, 67, 1585, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1700, 67, 67, 67, 97, 1648, 97, 97, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1541, 0, 97, 97, 97, 97, 0, 1940, 0, 97, 97, 97, 97, 97, 97, 45, 45, 2011, 45, 45, 45, 2015, 67, 67, 2017, 67, 67, 67, 2021, 97, 67, 67, 812, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 544, 97, 97, 97, 910, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 923, 0, 0, 0, 45, 45, 45, 45, 1184, 45, 45, 45, 45, 1188, 45, 45, 45, 45, 1414, 45, 45, 45, 1417, 45, 1419, 45, 45, 45, 45, 45, 443, 45, 45, 45, 45, 45, 45, 453, 45, 45, 67, 67, 67, 67, 1244, 67, 67, 67, 67, 1248, 67, 67, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 282, 41098, 65820, 97, 1324, 97, 97, 97, 97, 1328, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 930, 45, 45, 45, 45, 97, 97, 97, 97, 1378, 97, 97, 97, 97, 0, 1179, 0, 45, 45, 45, 45, 671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 975, 45, 45, 45, 45, 67, 67, 1923, 67, 1925, 67, 67, 1927, 67, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1985, 45, 45, 45, 45, 45, 45, 1560, 45, 45, 45, 45, 45, 45, 45, 45, 45, 946, 45, 45, 950, 45, 45, 45, 0, 97, 97, 97, 1939, 0, 0, 0, 97, 1943, 97, 97, 1945, 97, 45, 45, 45, 669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 990, 45, 45, 45, 67, 257, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 337, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 356, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 2170880, 2170880, 2170880, 2416640, 401, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 459, 461, 67, 67, 67, 67, 67, 67, 67, 67, 475, 67, 480, 67, 67, 67, 67, 67, 67, 1054, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1698, 67, 67, 67, 67, 67, 484, 67, 67, 487, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1459, 67, 67, 97, 556, 558, 97, 97, 97, 97, 97, 97, 97, 97, 572, 97, 577, 97, 97, 0, 0, 1896, 97, 97, 97, 97, 97, 97, 1903, 45, 45, 45, 45, 983, 45, 45, 45, 45, 988, 45, 45, 45, 45, 45, 45, 1195, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1549, 45, 45, 45, 45, 45, 581, 97, 97, 584, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1153, 97, 97, 369, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 662, 45, 45, 45, 684, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1004, 45, 45, 45, 67, 67, 67, 749, 67, 67, 67, 67, 67, 67, 67, 67, 67, 761, 67, 67, 67, 67, 67, 67, 1068, 67, 67, 67, 1071, 67, 67, 67, 67, 1076, 794, 795, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 544, 97, 97, 97, 97, 847, 97, 97, 97, 97, 97, 97, 97, 97, 97, 859, 97, 0, 0, 2025, 97, 20480, 97, 97, 2029, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1775, 67, 67, 67, 97, 97, 97, 97, 892, 893, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1515, 97, 993, 994, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 992, 67, 67, 67, 1284, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1607, 67, 67, 97, 1364, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 596, 97, 45, 1556, 1557, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 696, 45, 1596, 1597, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 499, 67, 97, 97, 97, 1621, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1346, 97, 97, 97, 97, 1740, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1678, 45, 45, 45, 45, 45, 67, 97, 97, 97, 97, 97, 97, 1836, 0, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1984, 97, 45, 45, 45, 45, 45, 45, 1808, 45, 45, 45, 45, 45, 45, 45, 45, 67, 739, 67, 67, 67, 67, 67, 744, 45, 45, 1909, 45, 45, 45, 45, 45, 45, 45, 67, 1917, 67, 1918, 67, 67, 67, 67, 67, 67, 1247, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 532, 67, 67, 67, 67, 67, 67, 1922, 67, 67, 67, 67, 67, 67, 67, 97, 1930, 97, 1931, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1576, 67, 67, 67, 67, 1580, 67, 67, 0, 97, 97, 1938, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 699, 45, 45, 45, 704, 45, 45, 45, 45, 45, 45, 45, 45, 987, 45, 45, 45, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 0, 0, 97, 97, 97, 2006, 97, 97, 97, 97, 0, 45, 1533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1416, 45, 45, 45, 45, 45, 45, 45, 45, 722, 723, 45, 45, 45, 45, 45, 45, 2045, 67, 67, 67, 2047, 0, 0, 97, 97, 97, 2051, 45, 45, 67, 67, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1957, 45, 67, 67, 67, 67, 67, 1836, 97, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 45, 67, 67, 67, 1761, 67, 67, 67, 1764, 67, 67, 67, 67, 67, 67, 67, 494, 67, 67, 67, 67, 67, 67, 67, 67, 67, 787, 67, 67, 67, 67, 67, 67, 45, 45, 420, 45, 45, 422, 45, 45, 425, 45, 45, 45, 45, 45, 45, 45, 387, 45, 45, 45, 45, 397, 45, 45, 45, 67, 460, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 515, 67, 485, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 498, 67, 67, 67, 67, 67, 97, 0, 2039, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1426, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1689, 67, 67, 67, 97, 557, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 612, 97, 582, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 595, 97, 97, 97, 97, 97, 896, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 885, 97, 97, 97, 97, 97, 45, 939, 45, 45, 45, 45, 943, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1916, 67, 67, 67, 67, 67, 45, 67, 67, 67, 67, 67, 67, 67, 1015, 67, 67, 67, 67, 1019, 67, 67, 67, 67, 67, 67, 1271, 67, 67, 67, 67, 67, 67, 1277, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 804, 67, 67, 67, 67, 67, 1077, 67, 67, 67, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2437120, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2543616, 2170880, 2170880, 2170880, 2170880, 2170880, 2629632, 1169, 97, 1171, 97, 97, 97, 97, 97, 97, 97, 12288, 0, 925, 0, 1179, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 936, 45, 45, 67, 67, 214, 67, 220, 67, 67, 233, 67, 243, 67, 248, 67, 67, 67, 67, 67, 67, 1298, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1617, 97, 0, 0, 0, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 393, 45, 45, 45, 45, 45, 45, 67, 67, 1243, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1074, 67, 67, 1281, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 776, 1323, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 907, 45, 1412, 45, 45, 45, 45, 45, 45, 45, 1418, 45, 45, 45, 45, 45, 45, 686, 45, 45, 45, 690, 45, 45, 695, 45, 45, 67, 67, 67, 67, 67, 1465, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1712, 97, 97, 97, 97, 1741, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1924, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1983, 97, 97, 45, 45, 1987, 45, 1988, 45, 0, 97, 97, 97, 97, 0, 0, 0, 1942, 97, 97, 97, 97, 97, 45, 45, 45, 700, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 711, 45, 45, 153, 45, 45, 166, 45, 176, 45, 181, 45, 45, 188, 191, 196, 45, 204, 255, 258, 263, 67, 271, 67, 67, 0, 37139, 24853, 0, 0, 0, 282, 41098, 65820, 97, 97, 97, 294, 97, 300, 97, 97, 313, 97, 323, 97, 328, 97, 97, 335, 338, 343, 97, 351, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 356, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 41098, 0, 140, 45, 45, 45, 45, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1411, 67, 67, 486, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1251, 67, 67, 501, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 513, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1263, 67, 67, 67, 67, 67, 97, 97, 583, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1526, 97, 598, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 610, 97, 97, 0, 97, 97, 1796, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1744, 45, 45, 45, 369, 0, 651, 45, 653, 45, 654, 45, 656, 45, 45, 45, 660, 45, 45, 45, 45, 1558, 45, 45, 45, 45, 45, 45, 45, 45, 1566, 45, 45, 681, 45, 683, 45, 45, 45, 45, 45, 45, 45, 45, 691, 692, 694, 45, 45, 45, 716, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 709, 45, 45, 712, 45, 714, 45, 45, 45, 718, 45, 45, 45, 45, 45, 45, 45, 726, 45, 45, 45, 733, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1691, 67, 67, 747, 67, 67, 67, 67, 67, 67, 67, 67, 67, 760, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 1613, 97, 97, 97, 97, 97, 97, 1509, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1179, 0, 45, 45, 45, 45, 67, 764, 67, 67, 67, 67, 768, 67, 770, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 1977, 67, 778, 779, 781, 67, 67, 67, 67, 67, 67, 788, 789, 67, 67, 792, 793, 67, 67, 67, 813, 67, 67, 67, 67, 67, 67, 67, 67, 67, 824, 37689, 544, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 0, 836, 97, 838, 97, 839, 97, 841, 97, 97, 97, 845, 97, 97, 97, 97, 97, 97, 97, 97, 97, 858, 97, 97, 0, 1728, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 1802, 45, 97, 97, 862, 97, 97, 97, 97, 866, 97, 868, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1788, 97, 97, 97, 0, 0, 97, 97, 876, 877, 879, 97, 97, 97, 97, 97, 97, 886, 887, 97, 97, 890, 891, 97, 97, 97, 97, 97, 97, 97, 899, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1646, 97, 97, 97, 97, 911, 97, 97, 97, 97, 97, 97, 97, 97, 97, 922, 923, 45, 955, 45, 957, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 195, 45, 45, 45, 45, 45, 981, 982, 45, 45, 45, 45, 45, 45, 989, 45, 45, 45, 45, 45, 170, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 411, 45, 45, 45, 45, 45, 67, 1023, 67, 67, 67, 67, 67, 67, 1031, 67, 1033, 67, 67, 67, 67, 67, 67, 67, 817, 819, 67, 67, 67, 67, 67, 37689, 544, 67, 1065, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 516, 67, 67, 1078, 67, 67, 1081, 1082, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 0, 0, 0, 0, 0, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2437406, 2171166, 2171166, 97, 1115, 97, 1117, 97, 97, 97, 97, 97, 97, 1125, 97, 1127, 97, 97, 97, 0, 97, 97, 97, 0, 97, 97, 97, 97, 1644, 97, 97, 97, 0, 97, 97, 97, 0, 97, 97, 1642, 97, 97, 97, 97, 97, 97, 625, 97, 97, 97, 97, 97, 97, 97, 97, 97, 316, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1159, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1502, 97, 97, 97, 97, 97, 1172, 97, 97, 1175, 1176, 97, 97, 12288, 0, 925, 0, 1179, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 935, 45, 45, 45, 1233, 45, 45, 45, 1236, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1873, 67, 67, 45, 45, 1218, 45, 45, 45, 1223, 45, 45, 45, 45, 45, 45, 45, 1230, 45, 45, 67, 67, 215, 219, 222, 67, 230, 67, 67, 244, 246, 249, 67, 67, 67, 67, 67, 67, 1882, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 1904, 45, 1905, 45, 67, 67, 67, 67, 67, 1258, 67, 1260, 67, 67, 67, 67, 67, 67, 67, 67, 67, 495, 67, 67, 67, 67, 67, 67, 67, 67, 1283, 67, 67, 67, 67, 67, 67, 67, 1290, 67, 67, 67, 67, 67, 67, 67, 818, 67, 67, 67, 67, 67, 67, 37689, 544, 67, 67, 1295, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2174976, 0, 0, 97, 97, 97, 1326, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1514, 97, 97, 97, 97, 97, 1338, 97, 1340, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1500, 97, 97, 1503, 97, 1363, 97, 97, 97, 97, 97, 97, 97, 1370, 97, 97, 97, 97, 97, 97, 97, 563, 97, 97, 97, 97, 97, 97, 578, 97, 1375, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1179, 0, 45, 45, 45, 45, 685, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1003, 45, 45, 45, 45, 67, 67, 67, 1463, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1778, 97, 97, 97, 97, 97, 1518, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 609, 97, 97, 97, 45, 1542, 45, 45, 45, 45, 45, 45, 45, 1548, 45, 45, 45, 45, 45, 1554, 45, 1570, 1571, 45, 67, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 67, 1061, 67, 67, 1582, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 1594, 67, 67, 67, 67, 67, 97, 2038, 0, 97, 97, 97, 97, 97, 2044, 45, 45, 45, 995, 45, 45, 45, 45, 1000, 45, 45, 45, 45, 45, 45, 45, 1809, 45, 1811, 45, 45, 45, 45, 45, 67, 1610, 1611, 67, 1476, 0, 1478, 0, 1480, 0, 97, 97, 97, 97, 97, 97, 1618, 1647, 1649, 97, 97, 97, 1652, 97, 1654, 1655, 97, 0, 45, 45, 45, 1658, 45, 45, 67, 67, 216, 67, 67, 67, 67, 234, 67, 67, 67, 67, 252, 254, 1845, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 945, 45, 947, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1881, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 1902, 45, 45, 45, 45, 45, 45, 1908, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1921, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 0, 97, 1937, 97, 97, 1940, 0, 0, 97, 97, 97, 97, 97, 97, 1947, 1948, 1949, 45, 45, 45, 1952, 45, 1954, 45, 45, 45, 45, 1959, 1960, 1961, 67, 67, 67, 67, 67, 67, 1455, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 757, 67, 67, 67, 67, 67, 67, 1964, 67, 1966, 67, 67, 67, 67, 1971, 1972, 1973, 97, 0, 0, 0, 97, 97, 1104, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 884, 97, 97, 97, 889, 97, 97, 1978, 97, 0, 0, 1981, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 736, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1018, 67, 67, 67, 45, 67, 67, 67, 67, 0, 2049, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 933, 45, 45, 45, 45, 1234, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 97, 97, 288, 97, 97, 97, 97, 97, 97, 317, 97, 97, 97, 97, 97, 97, 0, 0, 97, 1787, 97, 97, 97, 97, 0, 0, 45, 45, 378, 45, 45, 45, 45, 45, 390, 45, 45, 45, 45, 45, 45, 45, 424, 45, 45, 45, 431, 433, 45, 45, 45, 67, 1050, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 518, 67, 97, 97, 97, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 632, 97, 97, 97, 97, 97, 97, 97, 1367, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 855, 97, 97, 97, 97, 67, 97, 97, 97, 97, 97, 97, 1837, 0, 97, 97, 97, 97, 97, 0, 0, 0, 1897, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1208, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 724, 45, 45, 45, 45, 45, 97, 2010, 45, 45, 45, 45, 45, 45, 2016, 67, 67, 67, 67, 67, 67, 2022, 45, 2046, 67, 67, 67, 0, 0, 2050, 97, 97, 97, 45, 45, 67, 67, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 932, 45, 45, 45, 45, 45, 1222, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1227, 45, 45, 45, 45, 45, 133, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 45, 701, 702, 45, 45, 705, 706, 45, 45, 45, 45, 45, 45, 703, 45, 45, 45, 45, 45, 45, 45, 45, 45, 719, 45, 45, 45, 45, 45, 725, 45, 45, 45, 369, 649, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1216, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 834, 97, 97, 97, 97, 97, 97, 97, 1342, 97, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1799, 97, 97, 45, 45, 45, 1569, 45, 45, 45, 1572, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 1306, 0, 67, 67, 67, 1598, 67, 67, 67, 67, 67, 67, 67, 67, 1606, 67, 67, 1609, 97, 97, 97, 1650, 97, 97, 1653, 97, 97, 97, 0, 45, 45, 1657, 45, 45, 45, 1206, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1421, 45, 45, 45, 1703, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 1711, 97, 97, 0, 1895, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 958, 45, 960, 45, 45, 45, 45, 45, 45, 45, 45, 1913, 45, 45, 1915, 67, 67, 67, 67, 67, 67, 67, 466, 67, 67, 67, 67, 67, 67, 481, 67, 45, 1749, 45, 45, 45, 45, 45, 45, 45, 45, 1755, 45, 45, 45, 45, 45, 173, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 974, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1773, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1886, 0, 0, 0, 97, 97, 67, 2035, 2036, 67, 67, 97, 0, 0, 97, 2041, 2042, 97, 97, 45, 45, 45, 45, 1662, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1397, 45, 45, 45, 45, 151, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 437, 205, 45, 67, 67, 67, 218, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1047, 67, 67, 67, 67, 97, 97, 97, 97, 298, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 870, 97, 97, 97, 97, 97, 97, 97, 97, 352, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 0, 0, 0, 0, 0, 365, 0, 41098, 0, 140, 45, 45, 45, 45, 45, 1427, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1435, 520, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1037, 617, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 923, 45, 1232, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1919, 67, 1759, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1021, 45, 154, 45, 162, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 964, 45, 45, 45, 206, 45, 67, 67, 67, 67, 221, 67, 229, 67, 67, 67, 67, 67, 67, 67, 67, 530, 67, 67, 67, 67, 67, 67, 67, 67, 755, 67, 67, 67, 67, 67, 67, 67, 67, 785, 67, 67, 67, 67, 67, 67, 67, 67, 802, 67, 67, 67, 807, 67, 67, 67, 97, 97, 97, 97, 353, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 402, 45, 45, 45, 45, 45, 45, 45, 410, 45, 45, 45, 45, 45, 45, 45, 674, 45, 45, 45, 45, 45, 45, 45, 45, 389, 45, 394, 45, 45, 398, 45, 45, 45, 45, 441, 45, 45, 45, 45, 45, 447, 45, 45, 45, 454, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1768, 67, 67, 67, 67, 67, 488, 67, 67, 67, 67, 67, 67, 67, 496, 67, 67, 67, 67, 67, 67, 67, 1774, 67, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 67, 67, 523, 67, 67, 527, 67, 67, 67, 67, 67, 533, 67, 67, 67, 540, 97, 97, 97, 585, 97, 97, 97, 97, 97, 97, 97, 593, 97, 97, 97, 97, 97, 97, 1784, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 0, 18, 18, 24, 24, 0, 28, 28, 97, 97, 620, 97, 97, 624, 97, 97, 97, 97, 97, 630, 97, 97, 97, 637, 713, 45, 45, 45, 45, 45, 45, 721, 45, 45, 45, 45, 45, 45, 45, 45, 1197, 45, 45, 45, 45, 45, 45, 45, 45, 730, 732, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1581, 67, 45, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1059, 67, 67, 67, 67, 67, 1024, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 775, 67, 67, 67, 67, 1066, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 479, 67, 67, 67, 67, 67, 67, 1080, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 287, 0, 2379776, 2170880, 2170880, 97, 97, 97, 1118, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 920, 97, 97, 0, 0, 0, 0, 45, 1181, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 432, 45, 45, 45, 45, 45, 45, 1219, 45, 45, 45, 45, 45, 45, 1226, 45, 45, 45, 45, 45, 45, 959, 45, 45, 45, 45, 45, 45, 45, 45, 45, 184, 45, 45, 45, 45, 202, 45, 1241, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1266, 67, 1268, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1279, 67, 67, 67, 67, 67, 272, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 67, 67, 67, 67, 67, 1286, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1293, 67, 67, 67, 1296, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 281, 94, 0, 0, 97, 97, 97, 1366, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1373, 97, 97, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 0, 0, 367, 0, 97, 1376, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 1384, 45, 45, 67, 208, 67, 67, 67, 67, 67, 67, 237, 67, 67, 67, 67, 67, 67, 67, 1069, 1070, 67, 67, 67, 67, 67, 67, 67, 0, 37140, 24854, 0, 0, 0, 0, 41098, 65821, 45, 1423, 45, 45, 45, 45, 45, 45, 67, 67, 1431, 67, 67, 67, 67, 67, 67, 67, 1083, 37689, 0, 25403, 0, 66365, 0, 0, 0, 1436, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1830, 67, 1452, 1453, 67, 67, 67, 67, 1456, 67, 67, 67, 67, 67, 67, 67, 67, 67, 771, 67, 67, 67, 67, 67, 67, 1461, 67, 67, 67, 1464, 67, 1466, 67, 67, 67, 67, 67, 67, 1470, 67, 67, 67, 67, 67, 67, 1587, 67, 67, 67, 67, 67, 67, 67, 67, 1595, 1489, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1129, 97, 1505, 1506, 97, 97, 97, 97, 1510, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1163, 1164, 97, 97, 97, 97, 97, 1516, 97, 97, 97, 1519, 97, 1521, 97, 97, 97, 97, 97, 97, 1525, 97, 97, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 0, 0, 367, 41606, 67, 67, 67, 67, 67, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1276, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1600, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1301, 0, 0, 0, 1307, 97, 97, 1620, 97, 97, 97, 97, 97, 97, 97, 1627, 97, 97, 97, 97, 97, 97, 913, 97, 97, 97, 97, 919, 97, 97, 97, 0, 97, 97, 97, 1781, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 1792, 1860, 45, 1862, 1863, 45, 1865, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1875, 67, 1877, 1878, 67, 1880, 67, 97, 97, 97, 97, 97, 1887, 0, 1889, 97, 97, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 237568, 0, 367, 0, 97, 1893, 0, 0, 0, 97, 1898, 1899, 97, 1901, 97, 45, 45, 45, 45, 45, 2014, 45, 67, 67, 67, 67, 67, 2020, 67, 97, 1989, 45, 1990, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1996, 67, 1997, 67, 67, 67, 67, 67, 273, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 67, 67, 97, 97, 97, 97, 0, 0, 97, 97, 2005, 0, 97, 2007, 97, 97, 18, 0, 139621, 0, 0, 0, 642, 0, 133, 364, 0, 0, 367, 41606, 0, 97, 97, 2056, 2057, 0, 2059, 45, 67, 0, 97, 45, 67, 0, 97, 45, 45, 67, 209, 67, 67, 67, 223, 67, 67, 67, 67, 67, 67, 67, 67, 67, 786, 67, 67, 67, 791, 67, 67, 45, 45, 940, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 727, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1016, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 0, 133, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 142, 45, 45, 67, 210, 67, 67, 67, 225, 67, 67, 239, 67, 67, 67, 250, 67, 67, 67, 67, 67, 464, 67, 67, 67, 67, 67, 476, 67, 67, 67, 67, 67, 67, 67, 1709, 67, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 1843, 0, 67, 259, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 289, 97, 97, 97, 303, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 901, 97, 97, 97, 97, 97, 339, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 358, 0, 0, 0, 0, 0, 0, 41098, 0, 140, 45, 45, 45, 45, 45, 1953, 45, 1955, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1687, 1688, 67, 67, 67, 67, 45, 45, 405, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1203, 45, 458, 67, 67, 67, 67, 67, 67, 67, 67, 67, 470, 477, 67, 67, 67, 67, 67, 67, 67, 1970, 97, 97, 97, 1974, 0, 0, 0, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1372, 97, 97, 97, 97, 67, 522, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 536, 67, 67, 67, 67, 67, 67, 1696, 67, 67, 67, 67, 67, 67, 67, 1701, 67, 555, 97, 97, 97, 97, 97, 97, 97, 97, 97, 567, 574, 97, 97, 97, 97, 97, 301, 97, 309, 97, 97, 97, 97, 97, 97, 97, 97, 97, 900, 97, 97, 97, 905, 97, 97, 97, 619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 633, 97, 97, 18, 0, 139621, 0, 0, 362, 0, 0, 0, 364, 0, 0, 367, 41606, 369, 649, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 663, 664, 67, 67, 67, 67, 750, 751, 67, 67, 67, 67, 758, 67, 67, 67, 67, 67, 67, 67, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1057, 1058, 67, 67, 67, 67, 67, 67, 67, 67, 797, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 512, 67, 67, 67, 97, 97, 97, 97, 895, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 902, 97, 97, 97, 97, 67, 67, 1051, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1062, 67, 67, 67, 67, 67, 491, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1302, 0, 0, 0, 1308, 97, 97, 97, 97, 1145, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1139, 97, 97, 97, 97, 1156, 97, 97, 97, 97, 97, 97, 1161, 97, 97, 97, 97, 97, 1166, 97, 97, 18, 640, 139621, 0, 641, 0, 0, 0, 0, 364, 0, 0, 367, 41606, 67, 67, 67, 67, 1257, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 1305, 0, 0, 97, 97, 1337, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1630, 97, 67, 1474, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2380062, 2171166, 2171166, 97, 1529, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1228, 45, 45, 45, 45, 67, 67, 67, 67, 1707, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1891, 1739, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1198, 45, 1200, 45, 45, 45, 45, 97, 97, 1894, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 672, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1420, 45, 45, 45, 45, 67, 67, 1965, 67, 1967, 67, 67, 67, 97, 97, 97, 97, 0, 1976, 0, 97, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 97, 97, 1979, 0, 0, 97, 1982, 97, 97, 97, 1986, 45, 45, 45, 45, 45, 735, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1770, 67, 67, 2000, 97, 97, 97, 2002, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1798, 97, 97, 97, 45, 45, 45, 2034, 67, 67, 67, 67, 97, 0, 0, 2040, 97, 97, 97, 97, 45, 45, 45, 45, 1752, 45, 45, 45, 1753, 1754, 45, 45, 45, 45, 45, 45, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, 675, 45, 45, 45, 45, 45, 45, 438, 45, 45, 45, 45, 45, 445, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1430, 67, 67, 67, 67, 67, 67, 67, 67, 67, 524, 67, 67, 67, 67, 67, 531, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 1096, 97, 97, 97, 621, 97, 97, 97, 97, 97, 628, 97, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 356, 28, 28, 665, 45, 45, 45, 45, 45, 45, 45, 45, 45, 676, 45, 45, 45, 45, 45, 942, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 707, 708, 45, 45, 45, 45, 763, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 809, 810, 67, 67, 67, 67, 783, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 1303, 0, 0, 0, 97, 861, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 613, 97, 45, 45, 956, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1215, 45, 67, 67, 67, 67, 1027, 67, 67, 67, 67, 1032, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 1097, 1064, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1075, 67, 1098, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 331, 97, 97, 97, 97, 1158, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 594, 97, 97, 1309, 0, 0, 0, 1315, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1374, 97, 45, 45, 1543, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1240, 67, 67, 1583, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1252, 67, 97, 97, 97, 1635, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1800, 97, 45, 45, 45, 97, 97, 1793, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1743, 45, 45, 45, 1746, 45, 0, 97, 97, 97, 97, 97, 1851, 97, 45, 45, 45, 45, 1856, 45, 45, 45, 45, 1864, 45, 45, 67, 67, 1869, 67, 67, 67, 67, 1874, 67, 0, 97, 97, 45, 67, 2058, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 45, 67, 211, 67, 67, 67, 67, 67, 67, 240, 67, 67, 67, 67, 67, 67, 67, 1444, 67, 67, 67, 67, 67, 67, 67, 67, 67, 509, 67, 67, 67, 67, 67, 67, 67, 67, 67, 268, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 290, 97, 97, 97, 305, 97, 97, 319, 97, 97, 97, 330, 97, 97, 18, 640, 139621, 0, 641, 0, 0, 0, 0, 364, 0, 643, 367, 41606, 97, 97, 348, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 380, 45, 45, 45, 45, 45, 45, 395, 45, 45, 45, 400, 369, 0, 45, 45, 45, 45, 45, 45, 45, 45, 658, 45, 45, 45, 45, 45, 972, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 427, 45, 45, 45, 45, 45, 745, 67, 67, 67, 67, 67, 67, 67, 67, 756, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 1086, 25403, 1090, 66365, 1094, 0, 0, 97, 843, 97, 97, 97, 97, 97, 97, 97, 97, 854, 97, 97, 97, 97, 97, 97, 1121, 97, 97, 97, 97, 1126, 97, 97, 97, 97, 45, 980, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1400, 45, 67, 67, 67, 1011, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 1304, 0, 0, 0, 1190, 45, 45, 1193, 1194, 45, 45, 45, 45, 45, 1199, 45, 1201, 45, 45, 45, 45, 1911, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1579, 67, 67, 67, 67, 45, 1205, 45, 45, 45, 45, 45, 45, 45, 45, 1211, 45, 45, 45, 45, 45, 984, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1550, 45, 45, 45, 45, 45, 1217, 45, 45, 45, 45, 45, 45, 1225, 45, 45, 45, 45, 1229, 45, 45, 45, 1388, 45, 45, 45, 45, 45, 45, 1396, 45, 45, 45, 45, 45, 444, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1574, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1590, 67, 67, 67, 67, 67, 1254, 67, 67, 67, 67, 67, 1259, 67, 1261, 67, 67, 67, 67, 1265, 67, 67, 67, 67, 67, 67, 1708, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 67, 67, 67, 67, 1285, 67, 67, 67, 67, 1289, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 1087, 25403, 1091, 66365, 1095, 0, 0, 97, 97, 97, 97, 1339, 97, 1341, 97, 97, 97, 97, 1345, 97, 97, 97, 97, 97, 561, 97, 97, 97, 97, 97, 573, 97, 97, 97, 97, 97, 97, 1717, 97, 0, 97, 97, 97, 97, 97, 97, 97, 591, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1329, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1351, 97, 97, 97, 97, 97, 97, 1357, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 568, 97, 97, 97, 97, 97, 97, 97, 1365, 97, 97, 97, 97, 1369, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1356, 97, 97, 97, 97, 97, 97, 45, 45, 1403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1399, 45, 45, 45, 1413, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1669, 45, 1422, 45, 45, 1425, 45, 45, 1428, 45, 1429, 67, 67, 67, 67, 67, 67, 67, 67, 1468, 67, 67, 67, 67, 67, 67, 67, 67, 529, 67, 67, 67, 67, 67, 67, 539, 67, 67, 1475, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 97, 97, 1530, 97, 0, 45, 45, 1534, 45, 45, 45, 45, 45, 45, 45, 45, 1956, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1599, 67, 67, 1601, 67, 67, 67, 67, 67, 67, 67, 67, 67, 803, 67, 67, 67, 67, 67, 67, 1632, 97, 1634, 0, 97, 97, 97, 1640, 97, 97, 97, 1643, 97, 97, 1645, 97, 97, 97, 97, 97, 912, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1660, 1661, 45, 45, 45, 45, 1665, 1666, 45, 45, 45, 45, 45, 1670, 1692, 1693, 67, 67, 67, 67, 67, 1697, 67, 67, 67, 67, 67, 67, 67, 1702, 97, 97, 1714, 1715, 97, 97, 97, 97, 0, 1721, 1722, 97, 97, 97, 97, 97, 97, 1353, 97, 97, 97, 97, 97, 97, 97, 97, 1362, 1726, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 1734, 97, 97, 97, 97, 97, 848, 849, 97, 97, 97, 97, 856, 97, 97, 97, 97, 97, 354, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 45, 45, 1750, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1681, 45, 0, 1846, 97, 97, 97, 97, 97, 97, 45, 45, 1854, 45, 45, 45, 45, 1859, 67, 67, 67, 1879, 67, 67, 97, 97, 1884, 97, 97, 0, 0, 0, 97, 97, 97, 1105, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1344, 97, 97, 97, 1347, 97, 1892, 97, 0, 0, 0, 97, 97, 97, 1900, 97, 97, 45, 45, 45, 45, 45, 997, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1002, 45, 45, 1005, 1006, 45, 67, 67, 67, 67, 67, 1926, 67, 67, 1928, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1737, 97, 0, 97, 97, 97, 97, 0, 0, 0, 97, 97, 1944, 97, 97, 1946, 45, 45, 45, 1544, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 190, 45, 45, 45, 152, 155, 45, 163, 45, 45, 177, 179, 182, 45, 45, 45, 193, 197, 45, 45, 45, 1672, 45, 45, 45, 45, 45, 1677, 45, 1679, 45, 45, 45, 45, 996, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1212, 45, 45, 45, 45, 67, 260, 264, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 97, 295, 299, 302, 97, 310, 97, 97, 324, 326, 329, 97, 97, 97, 0, 97, 97, 1639, 0, 1641, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 97, 97, 97, 1523, 97, 97, 97, 97, 97, 97, 97, 97, 1719, 97, 97, 97, 97, 97, 97, 97, 97, 1720, 97, 97, 97, 97, 97, 97, 97, 312, 97, 97, 97, 97, 97, 97, 97, 97, 1123, 97, 97, 97, 97, 97, 97, 97, 340, 344, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 373, 375, 419, 45, 45, 45, 45, 45, 45, 45, 45, 45, 428, 45, 45, 435, 45, 45, 45, 1751, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1410, 45, 45, 45, 67, 67, 67, 505, 67, 67, 67, 67, 67, 67, 67, 67, 67, 514, 67, 67, 67, 67, 67, 67, 1969, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 45, 67, 0, 97, 45, 67, 0, 97, 2064, 2065, 0, 2066, 45, 521, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 534, 67, 67, 67, 67, 67, 67, 465, 67, 67, 67, 474, 67, 67, 67, 67, 67, 67, 67, 1467, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 1933, 0, 97, 97, 97, 602, 97, 97, 97, 97, 97, 97, 97, 97, 97, 611, 97, 97, 18, 640, 139621, 358, 641, 0, 0, 0, 0, 364, 0, 0, 367, 0, 618, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 631, 97, 97, 97, 97, 97, 881, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 569, 97, 97, 97, 97, 97, 369, 0, 45, 652, 45, 45, 45, 45, 45, 657, 45, 45, 45, 45, 45, 45, 1235, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1432, 67, 67, 67, 67, 67, 67, 67, 766, 67, 67, 67, 67, 67, 67, 67, 67, 773, 67, 67, 67, 0, 1305, 0, 1311, 0, 1317, 97, 97, 97, 97, 97, 97, 97, 1624, 97, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, 1724, 97, 97, 97, 777, 67, 67, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 535, 67, 67, 67, 67, 67, 67, 67, 814, 67, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 544, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 0, 97, 837, 97, 97, 97, 97, 97, 97, 1496, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 918, 97, 97, 97, 97, 0, 842, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1168, 97, 97, 97, 97, 864, 97, 97, 97, 97, 97, 97, 97, 97, 871, 97, 97, 97, 0, 1637, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1801, 45, 45, 97, 875, 97, 97, 880, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1151, 1152, 97, 97, 97, 67, 67, 67, 1040, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 790, 67, 67, 67, 1180, 0, 649, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 200, 45, 45, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 806, 67, 67, 67, 0, 0, 0, 1481, 0, 1094, 0, 0, 97, 1483, 97, 97, 97, 97, 97, 97, 304, 97, 97, 318, 97, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 97, 97, 97, 1507, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1332, 97, 97, 97, 1619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1631, 97, 1633, 97, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1381, 0, 0, 45, 45, 45, 45, 97, 97, 1727, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 626, 97, 97, 97, 97, 97, 97, 636, 45, 45, 1760, 67, 67, 67, 67, 67, 67, 67, 1765, 67, 67, 67, 67, 67, 67, 67, 1299, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1616, 97, 97, 1803, 45, 45, 45, 45, 1807, 45, 45, 45, 45, 45, 1813, 45, 45, 45, 67, 67, 1684, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 822, 67, 67, 37689, 544, 67, 67, 1818, 67, 67, 67, 67, 1822, 67, 67, 67, 67, 67, 1828, 67, 67, 67, 67, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 2012, 2013, 45, 45, 67, 67, 67, 2018, 2019, 67, 67, 97, 67, 97, 97, 97, 1833, 97, 97, 0, 0, 97, 97, 1840, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 1733, 97, 1735, 97, 97, 97, 0, 97, 97, 97, 1849, 97, 97, 97, 45, 45, 45, 45, 45, 1857, 45, 45, 45, 1910, 45, 1912, 45, 45, 1914, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1017, 67, 67, 1020, 67, 45, 1861, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1872, 67, 67, 67, 67, 67, 67, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1446, 67, 67, 67, 67, 67, 1876, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1890, 97, 97, 97, 97, 97, 1134, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 570, 97, 97, 97, 97, 580, 1935, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1906, 45, 67, 67, 67, 67, 2048, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 931, 45, 45, 45, 45, 45, 45, 1674, 45, 1676, 45, 45, 45, 45, 45, 45, 45, 446, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1871, 67, 67, 67, 67, 0, 97, 97, 45, 67, 0, 97, 2060, 2061, 0, 2063, 45, 67, 0, 97, 45, 45, 156, 45, 45, 45, 45, 45, 45, 45, 45, 45, 192, 45, 45, 45, 45, 1673, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 429, 45, 45, 45, 45, 67, 67, 67, 269, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 349, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 374, 45, 45, 67, 67, 213, 217, 67, 67, 67, 67, 67, 242, 67, 247, 67, 253, 45, 45, 698, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 399, 45, 45, 0, 0, 0, 0, 925, 41606, 0, 929, 0, 0, 45, 45, 45, 45, 45, 45, 1391, 45, 45, 1395, 45, 45, 45, 45, 45, 45, 423, 45, 45, 45, 45, 45, 45, 45, 436, 45, 67, 67, 67, 67, 1041, 67, 1043, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1776, 67, 67, 97, 97, 97, 1099, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 888, 97, 97, 97, 1131, 97, 97, 97, 97, 1135, 97, 1137, 97, 97, 97, 97, 97, 97, 97, 1497, 97, 97, 97, 97, 97, 97, 97, 97, 97, 883, 97, 97, 97, 97, 97, 97, 1310, 0, 0, 0, 1316, 0, 0, 0, 0, 1100, 0, 0, 0, 97, 97, 97, 97, 97, 1107, 97, 97, 97, 97, 97, 97, 97, 97, 1343, 97, 97, 97, 97, 97, 97, 1348, 0, 0, 1317, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1112, 97, 45, 1804, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1868, 67, 1870, 67, 67, 67, 67, 67, 1817, 67, 67, 1819, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 823, 67, 37689, 544, 67, 97, 1832, 97, 97, 1834, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 0, 1732, 97, 97, 97, 97, 97, 97, 97, 850, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1177, 0, 0, 925, 0, 0, 0, 0, 97, 97, 97, 97, 0, 0, 1941, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1991, 1992, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1998, 134, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 45, 941, 45, 45, 944, 45, 45, 45, 45, 45, 45, 952, 45, 45, 207, 67, 67, 67, 67, 67, 226, 67, 67, 67, 67, 67, 67, 67, 67, 67, 820, 67, 67, 67, 67, 37689, 544, 369, 650, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1682, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 835, 97, 97, 97, 97, 97, 97, 97, 1522, 97, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1725, 67, 67, 67, 1695, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1034, 67, 1036, 67, 67, 67, 265, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 97, 296, 97, 97, 97, 97, 314, 97, 97, 97, 97, 332, 334, 97, 97, 97, 97, 97, 1146, 1147, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1626, 97, 97, 97, 97, 97, 97, 345, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 372, 45, 45, 45, 1220, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 45, 45, 404, 406, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 434, 45, 45, 45, 440, 45, 45, 45, 45, 45, 45, 45, 45, 451, 452, 45, 45, 45, 67, 1683, 67, 67, 67, 1686, 67, 67, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 67, 67, 67, 67, 490, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1447, 67, 67, 1450, 67, 67, 67, 67, 67, 526, 67, 67, 67, 67, 67, 67, 67, 67, 537, 538, 67, 67, 67, 67, 67, 506, 67, 67, 508, 67, 67, 511, 67, 67, 67, 67, 0, 1476, 0, 0, 0, 0, 0, 1478, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1484, 97, 97, 97, 97, 97, 97, 865, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1499, 97, 97, 97, 97, 97, 97, 97, 97, 97, 587, 589, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 97, 97, 97, 97, 623, 97, 97, 97, 97, 97, 97, 97, 97, 634, 635, 97, 97, 97, 97, 97, 1160, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1628, 97, 97, 97, 97, 369, 0, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 45, 45, 45, 999, 45, 1001, 45, 45, 45, 45, 45, 45, 45, 45, 715, 45, 45, 45, 720, 45, 45, 45, 45, 45, 45, 45, 45, 728, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 0, 97, 97, 97, 97, 97, 840, 97, 97, 97, 97, 97, 1174, 97, 97, 97, 97, 0, 0, 925, 0, 0, 0, 0, 0, 0, 0, 1100, 97, 97, 97, 97, 97, 97, 97, 97, 627, 97, 97, 97, 97, 97, 97, 97, 938, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 680, 45, 968, 45, 970, 45, 973, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 962, 45, 45, 45, 45, 45, 979, 45, 45, 45, 45, 45, 985, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1224, 45, 45, 45, 45, 45, 45, 45, 45, 688, 45, 45, 45, 45, 45, 45, 45, 1007, 1008, 67, 67, 67, 67, 67, 1014, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1045, 67, 67, 67, 67, 67, 67, 67, 1038, 67, 67, 67, 67, 67, 67, 1044, 67, 1046, 67, 1049, 67, 67, 67, 67, 67, 67, 800, 67, 67, 67, 67, 67, 67, 808, 67, 67, 0, 0, 0, 1102, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 97, 97, 306, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1371, 97, 97, 97, 97, 97, 97, 97, 97, 1132, 97, 97, 97, 97, 97, 97, 1138, 97, 1140, 97, 1143, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 869, 97, 97, 97, 97, 97, 45, 1191, 45, 45, 45, 45, 45, 1196, 45, 45, 45, 45, 45, 45, 45, 45, 1407, 45, 45, 45, 45, 45, 45, 45, 45, 986, 45, 45, 45, 45, 45, 45, 991, 45, 67, 67, 67, 1256, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1048, 67, 67, 67, 97, 1336, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 615, 97, 1386, 45, 1387, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 455, 45, 457, 45, 45, 1424, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1433, 67, 1434, 67, 67, 67, 67, 67, 767, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1591, 67, 1593, 67, 67, 45, 45, 1805, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1814, 45, 45, 1816, 67, 67, 67, 67, 1820, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1829, 67, 67, 67, 67, 67, 815, 67, 67, 67, 67, 821, 67, 67, 67, 37689, 544, 67, 1831, 97, 97, 97, 97, 1835, 0, 0, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1731, 97, 97, 97, 97, 97, 97, 97, 97, 97, 853, 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, 97, 1850, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1547, 45, 45, 45, 45, 45, 45, 45, 45, 1664, 45, 45, 45, 45, 45, 45, 45, 45, 961, 45, 45, 45, 45, 965, 45, 967, 1907, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1920, 0, 1936, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1457, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 28672, 97, 45, 67, 67, 67, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 2054, 97, 97, 291, 97, 97, 97, 97, 97, 97, 320, 97, 97, 97, 97, 97, 97, 307, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 12288, 0, 925, 926, 1179, 0, 45, 377, 45, 45, 45, 381, 45, 45, 392, 45, 45, 396, 45, 45, 45, 45, 971, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1756, 45, 45, 45, 67, 67, 67, 67, 463, 67, 67, 67, 467, 67, 67, 478, 67, 67, 482, 67, 67, 67, 67, 67, 1028, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1469, 67, 67, 1472, 67, 502, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1460, 67, 97, 97, 97, 97, 560, 97, 97, 97, 564, 97, 97, 575, 97, 97, 579, 97, 97, 97, 97, 97, 1368, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 925, 0, 0, 930, 97, 599, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 872, 97, 45, 666, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1758, 0, 362, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 934, 45, 45, 45, 164, 168, 174, 178, 45, 45, 45, 45, 45, 194, 45, 45, 45, 165, 45, 45, 45, 45, 45, 45, 45, 45, 45, 199, 45, 45, 45, 67, 67, 1010, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1060, 67, 67, 67, 67, 67, 67, 1052, 1053, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1063, 97, 1157, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1167, 97, 97, 97, 97, 97, 1379, 97, 97, 97, 0, 0, 0, 45, 1383, 45, 45, 45, 1806, 45, 45, 45, 45, 45, 45, 1812, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1577, 67, 67, 67, 67, 67, 67, 67, 753, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1262, 67, 67, 67, 67, 67, 67, 67, 1282, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1471, 67, 45, 1402, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 417, 45, 67, 1462, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 544, 97, 1517, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1128, 97, 97, 97, 97, 1636, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 851, 97, 97, 97, 97, 97, 97, 97, 67, 67, 1705, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1842, 0, 0, 1779, 97, 97, 97, 1782, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1789, 97, 97, 0, 0, 0, 97, 1847, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1675, 45, 45, 45, 45, 45, 45, 45, 45, 737, 738, 67, 740, 67, 741, 67, 743, 67, 67, 67, 67, 67, 67, 1968, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 45, 67, 0, 97, 45, 67, 2062, 97, 45, 67, 0, 97, 45, 67, 67, 97, 97, 2001, 97, 0, 0, 2004, 97, 97, 0, 97, 97, 97, 97, 1797, 97, 97, 97, 97, 97, 45, 45, 45, 67, 261, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 292, 97, 97, 97, 97, 311, 315, 321, 325, 97, 97, 97, 97, 97, 97, 1623, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1330, 97, 97, 1333, 1334, 97, 341, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 363, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 1221, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 413, 45, 45, 416, 45, 376, 45, 45, 45, 45, 382, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1408, 45, 45, 45, 45, 45, 403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 414, 45, 45, 45, 418, 67, 67, 67, 462, 67, 67, 67, 67, 468, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 1604, 67, 67, 67, 67, 67, 67, 67, 67, 489, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 500, 67, 67, 67, 67, 67, 1067, 67, 67, 67, 67, 67, 1072, 67, 67, 67, 67, 67, 67, 274, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 67, 67, 504, 67, 67, 67, 67, 67, 67, 67, 510, 67, 67, 67, 517, 519, 541, 67, 37139, 37139, 24853, 24853, 0, 70179, 0, 0, 0, 65820, 65820, 369, 287, 554, 97, 97, 97, 559, 97, 97, 97, 97, 565, 97, 97, 97, 97, 97, 97, 97, 1718, 0, 97, 97, 97, 97, 97, 97, 97, 898, 97, 97, 97, 97, 97, 97, 906, 97, 97, 97, 97, 586, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 597, 97, 97, 97, 97, 97, 1520, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 45, 1656, 45, 45, 45, 97, 97, 601, 97, 97, 97, 97, 97, 97, 97, 607, 97, 97, 97, 614, 616, 638, 97, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 0, 0, 367, 41606, 369, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 661, 45, 45, 45, 407, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1815, 45, 67, 45, 667, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 678, 45, 45, 45, 421, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 976, 977, 45, 45, 45, 682, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 693, 45, 45, 697, 67, 67, 748, 67, 67, 67, 67, 754, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1274, 67, 67, 67, 67, 67, 67, 67, 67, 765, 67, 67, 67, 67, 769, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 67, 780, 67, 67, 784, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1777, 67, 97, 97, 97, 97, 97, 97, 846, 97, 97, 97, 97, 852, 97, 97, 97, 97, 97, 97, 97, 1742, 45, 45, 45, 45, 45, 45, 45, 1747, 97, 97, 97, 863, 97, 97, 97, 97, 867, 97, 97, 97, 97, 97, 97, 97, 308, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 12288, 1178, 925, 0, 1179, 0, 97, 97, 97, 878, 97, 97, 882, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 12288, 0, 925, 0, 1179, 0, 908, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 925, 0, 0, 0, 954, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 963, 45, 45, 966, 45, 45, 157, 45, 45, 171, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 948, 45, 45, 45, 45, 45, 1022, 67, 67, 1026, 67, 67, 67, 1030, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 1605, 67, 67, 67, 1608, 67, 67, 67, 1039, 67, 67, 1042, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 67, 0, 1100, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 904, 97, 97, 97, 97, 1116, 97, 97, 1120, 97, 97, 97, 1124, 97, 97, 97, 97, 97, 97, 562, 97, 97, 97, 571, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1133, 97, 97, 1136, 97, 97, 97, 97, 97, 97, 97, 97, 915, 917, 97, 97, 97, 97, 97, 0, 97, 1170, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 925, 0, 0, 0, 0, 0, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1993, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1275, 67, 67, 67, 1278, 67, 0, 0, 0, 45, 45, 1182, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1189, 1204, 45, 45, 45, 1207, 45, 45, 1209, 45, 1210, 45, 45, 45, 45, 45, 45, 1546, 45, 45, 45, 45, 45, 45, 45, 45, 45, 689, 45, 45, 45, 45, 45, 45, 1231, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 236, 67, 67, 67, 67, 67, 67, 67, 801, 67, 67, 67, 805, 67, 67, 67, 67, 67, 1242, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1249, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1300, 0, 0, 0, 0, 0, 1267, 67, 67, 1269, 67, 1270, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1280, 97, 1349, 97, 1350, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1360, 97, 97, 97, 0, 1980, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 673, 45, 45, 45, 45, 677, 45, 45, 45, 45, 1401, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 953, 67, 1437, 67, 1440, 67, 67, 67, 67, 1445, 67, 67, 67, 1448, 67, 67, 67, 67, 67, 67, 1029, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1825, 67, 67, 67, 67, 67, 1473, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1320, 0, 834, 97, 97, 97, 97, 1490, 97, 1493, 97, 97, 97, 97, 1498, 97, 97, 97, 1501, 97, 97, 97, 0, 97, 1638, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 916, 97, 97, 97, 97, 97, 97, 0, 1528, 97, 97, 97, 0, 45, 45, 45, 1535, 45, 45, 45, 45, 45, 45, 45, 1867, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1932, 0, 0, 1555, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1567, 45, 45, 158, 45, 45, 172, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 45, 67, 212, 67, 67, 67, 67, 231, 235, 241, 245, 67, 67, 67, 67, 67, 67, 493, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 472, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1651, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 1539, 45, 45, 45, 67, 1704, 67, 1706, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1841, 97, 0, 1844, 97, 97, 97, 97, 1716, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 590, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 1385, 1748, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1757, 45, 45, 159, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 415, 45, 45, 97, 97, 1780, 97, 97, 97, 0, 0, 1786, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1730, 0, 97, 97, 97, 97, 97, 1736, 97, 1738, 67, 97, 97, 97, 97, 97, 97, 0, 1838, 97, 97, 97, 97, 97, 0, 0, 97, 1729, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1162, 97, 97, 97, 1165, 97, 97, 97, 45, 1950, 45, 45, 45, 45, 45, 45, 45, 45, 1958, 67, 67, 67, 1962, 67, 67, 67, 67, 67, 1246, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 1710, 97, 97, 97, 1999, 67, 97, 97, 97, 97, 0, 2003, 97, 97, 97, 0, 97, 97, 2008, 2009, 45, 67, 67, 67, 67, 0, 0, 97, 97, 97, 97, 45, 2052, 67, 2053, 0, 0, 0, 0, 925, 41606, 0, 0, 930, 0, 45, 45, 45, 45, 45, 45, 1392, 45, 1394, 45, 45, 45, 45, 45, 45, 45, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1563, 1565, 45, 45, 45, 1568, 0, 97, 2055, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 28672, 97, 45, 45, 160, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 679, 45, 45, 67, 67, 266, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 346, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 362, 0, 364, 0, 367, 41098, 369, 140, 371, 45, 45, 45, 379, 45, 45, 45, 388, 45, 45, 45, 45, 45, 45, 45, 45, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 449, 45, 45, 45, 45, 45, 67, 67, 542, 37139, 37139, 24853, 24853, 0, 70179, 0, 0, 0, 65820, 65820, 369, 287, 97, 97, 97, 97, 97, 1622, 97, 97, 97, 97, 97, 97, 97, 1629, 97, 97, 0, 1794, 1795, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1745, 45, 45, 97, 639, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 0, 0, 367, 41606, 45, 731, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 251, 67, 67, 67, 67, 67, 798, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1073, 67, 67, 67, 860, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 873, 0, 0, 1101, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 921, 97, 0, 67, 67, 67, 67, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1250, 67, 67, 1253, 0, 0, 1312, 0, 0, 0, 1318, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1106, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 97, 1155, 97, 97, 1325, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1141, 97, 97, 67, 67, 1439, 67, 1441, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1264, 67, 67, 67, 97, 97, 1492, 97, 1494, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1331, 97, 97, 97, 97, 67, 67, 67, 2037, 67, 97, 0, 0, 97, 97, 97, 2043, 97, 45, 45, 45, 442, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 232, 67, 67, 67, 67, 67, 67, 67, 67, 1823, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1975, 0, 0, 97, 874, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1142, 97, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 65, 86, 117, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 63, 84, 115, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 61, 82, 113, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 59, 80, 111, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 57, 78, 109, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 55, 76, 107, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 53, 74, 105, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 51, 72, 103, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 49, 70, 101, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 47, 68, 99, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 45, 67, 97, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 213085, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 0, 0, 44, 0, 0, 32863, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 41, 41, 41, 0, 0, 1138688, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 0, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 89, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 127, 127, 127, 127, 102432, 67, 262, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 342, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 360, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 717, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 412, 45, 45, 45, 45, 45, 67, 1009, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1292, 67, 67, 1294, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 97, 1615, 97, 97, 97, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 66, 87, 118, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 64, 85, 116, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 62, 83, 114, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 60, 81, 112, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 58, 79, 110, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 56, 77, 108, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 54, 75, 106, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 52, 73, 104, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 50, 71, 102, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 48, 69, 100, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 46, 67, 98, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 233472, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 69724, 53264, 18, 18, 49172, 0, 57366, 262144, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 45, 45, 161, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 710, 45, 45, 28, 139621, 359, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 1389, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 949, 45, 45, 45, 45, 67, 503, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1449, 67, 67, 97, 600, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1154, 97, 0, 0, 0, 0, 925, 41606, 927, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1866, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 772, 67, 67, 67, 67, 67, 45, 45, 969, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 951, 45, 45, 45, 45, 1192, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1202, 45, 45, 0, 0, 0, 1314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1488, 67, 67, 267, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 347, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 361, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 734, 45, 45, 45, 67, 67, 67, 67, 67, 742, 67, 67, 45, 45, 668, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1214, 45, 45, 1130, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1361, 97, 45, 45, 1671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1552, 45, 45, 0, 0, 0, 0, 2220032, 0, 0, 1130496, 0, 0, 0, 0, 2170880, 2171020, 2170880, 2170880, 18, 0, 0, 131072, 0, 0, 0, 90112, 0, 2220032, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 1485, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 1537, 45, 45, 45, 45, 45, 1390, 45, 1393, 45, 45, 45, 45, 1398, 45, 45, 45, 2170880, 2171167, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2576384, 2215936, 3117056, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2174976, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2721252, 2744320, 2170880, 2170880, 2170880, 2834432, 2840040, 2170880, 2908160, 2170880, 2170880, 2936832, 2170880, 2170880, 2985984, 2170880, 2994176, 2170880, 2170880, 3014656, 2170880, 3059712, 3076096, 3088384, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 0, 2220032, 0, 0, 0, 1142784, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3215360, 2215936, 2215936, 2215936, 2215936, 2215936, 2437120, 2215936, 2215936, 2215936, 3117056, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 543, 0, 545, 0, 0, 2183168, 0, 0, 831, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 3031040, 2170880, 3055616, 2170880, 2170880, 2170880, 2170880, 3092480, 2170880, 2170880, 3125248, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3198976, 2170880, 0, 0, 0, 0, 0, 0, 67, 67, 37139, 37139, 24853, 24853, 0, 0, 0, 0, 0, 65820, 65820, 0, 287, 97, 97, 97, 97, 97, 1783, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 1791, 0, 0, 546, 70179, 0, 0, 0, 0, 552, 0, 97, 97, 97, 97, 97, 97, 97, 604, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1150, 97, 97, 97, 97, 97, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 0, 0, 147456, 0, 0, 0, 0, 925, 41606, 0, 928, 0, 0, 45, 45, 45, 45, 45, 45, 998, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1562, 45, 1564, 45, 45, 45, 45, 0, 2158592, 2158592, 0, 0, 0, 0, 2232320, 2232320, 2232320, 0, 2240512, 2240512, 2240512, 2240512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2416640 +]; + +JSONiqTokenizer.EXPECTED = +[ 291, 300, 304, 341, 315, 309, 305, 295, 319, 323, 327, 329, 296, 333, 337, 339, 342, 346, 350, 294, 356, 360, 312, 367, 352, 371, 363, 375, 379, 383, 387, 391, 395, 726, 399, 405, 518, 684, 405, 405, 405, 405, 808, 405, 405, 405, 512, 405, 405, 405, 431, 405, 405, 406, 405, 405, 404, 405, 405, 405, 405, 405, 405, 405, 908, 631, 410, 415, 405, 414, 419, 608, 405, 429, 602, 405, 435, 443, 405, 441, 641, 478, 405, 447, 451, 450, 456, 643, 461, 460, 762, 679, 465, 469, 741, 473, 477, 482, 486, 492, 932, 931, 523, 498, 504, 720, 405, 510, 596, 405, 516, 941, 580, 522, 929, 527, 590, 589, 897, 939, 534, 538, 547, 551, 555, 559, 563, 567, 571, 969, 575, 708, 690, 689, 579, 584, 634, 405, 594, 731, 405, 600, 882, 405, 606, 895, 786, 452, 612, 405, 615, 620, 876, 624, 628, 638, 647, 651, 655, 659, 663, 667, 676, 683, 688, 695, 694, 791, 405, 699, 437, 405, 706, 714, 405, 712, 825, 870, 405, 718, 724, 769, 768, 823, 730, 735, 745, 751, 422, 755, 759, 425, 766, 902, 810, 587, 775, 888, 887, 405, 773, 992, 405, 779, 962, 405, 785, 781, 986, 790, 795, 797, 506, 500, 499, 801, 805, 814, 820, 829, 833, 837, 841, 845, 849, 853, 857, 861, 616, 865, 869, 868, 488, 405, 874, 816, 405, 880, 738, 405, 886, 892, 543, 405, 901, 906, 913, 912, 918, 494, 541, 922, 926, 936, 945, 949, 953, 957, 530, 966, 973, 960, 702, 701, 405, 979, 981, 405, 985, 747, 405, 990, 998, 914, 405, 996, 1004, 672, 975, 974, 1014, 1002, 1008, 670, 1012, 405, 405, 405, 405, 405, 401, 1018, 1022, 1026, 1106, 1071, 1111, 1111, 1111, 1082, 1145, 1030, 1101, 1034, 1038, 1106, 1106, 1106, 1106, 1046, 1206, 1052, 1106, 1072, 1111, 1111, 1042, 1134, 1065, 1111, 1112, 1056, 1160, 1207, 1062, 1204, 1208, 1069, 1106, 1106, 1106, 1076, 1111, 1207, 1161, 1122, 1205, 1064, 1094, 1106, 1106, 1107, 1111, 1111, 1111, 1078, 1086, 1207, 1092, 1098, 1046, 1058, 1106, 1106, 1110, 1111, 1111, 1116, 1120, 1161, 1126, 1202, 1104, 1106, 1145, 1146, 1129, 1138, 1088, 1151, 1048, 1157, 1153, 1132, 1141, 1165, 1107, 1111, 1172, 1179, 1109, 1183, 1175, 1143, 1147, 1187, 1108, 1191, 1195, 1144, 1199, 1168, 1212, 1216, 1220, 1224, 1228, 1232, 1236, 1557, 1247, 1241, 1241, 1038, 1434, 1241, 1241, 1241, 1241, 1254, 1275, 1617, 1241, 1280, 1287, 1241, 1241, 1241, 1287, 1241, 2114, 1291, 1241, 1243, 1241, 2049, 1824, 2094, 2095, 1520, 1309, 1241, 1241, 1302, 1241, 1321, 1311, 1241, 1241, 1313, 1778, 1325, 1336, 1241, 1241, 1325, 1330, 1353, 1241, 1241, 1695, 1354, 1241, 1241, 1241, 1294, 1686, 1331, 1241, 1696, 1368, 1241, 1338, 1370, 1241, 1392, 1399, 1364, 2017, 1406, 2016, 1405, 1716, 1406, 1407, 1422, 1417, 1421, 1241, 1241, 1241, 1349, 1426, 1241, 1774, 1756, 1241, 1773, 1241, 1241, 1345, 1964, 1812, 1432, 1241, 1241, 1345, 1993, 1459, 1241, 1241, 1241, 1395, 1848, 1767, 1465, 1241, 1241, 1394, 1847, 1242, 1477, 1241, 1241, 1428, 1241, 1445, 1492, 1241, 1241, 1438, 1241, 1499, 1241, 1241, 1241, 1455, 1241, 1818, 1448, 1241, 1250, 1241, 2026, 1623, 1449, 1241, 1612, 1616, 1241, 1614, 1241, 1257, 1241, 1241, 1985, 1292, 1586, 1512, 1241, 1517, 2050, 1526, 1674, 1519, 1524, 1647, 2051, 1532, 1537, 1551, 1544, 1550, 1555, 1561, 1571, 1578, 1584, 1590, 1591, 1653, 1595, 1602, 1606, 1610, 1634, 1628, 1640, 1633, 1645, 1241, 1241, 1241, 1469, 1241, 1970, 1651, 1241, 1270, 1241, 1241, 1819, 1449, 1241, 1293, 1664, 1241, 1241, 1481, 1485, 1574, 1672, 1241, 1241, 1513, 1317, 1487, 1684, 1241, 1241, 1533, 1299, 1694, 1241, 1241, 1295, 1241, 1241, 1241, 1546, 1700, 1241, 1241, 1707, 1241, 1713, 1241, 1849, 1715, 1241, 1720, 1241, 1276, 1267, 1241, 1241, 2107, 1657, 1864, 1241, 1881, 1241, 1326, 1292, 1241, 1685, 1358, 1724, 1338, 1241, 1363, 1362, 1342, 1340, 1361, 1339, 1833, 1372, 1360, 1833, 1833, 1342, 1343, 1835, 1341, 1731, 1738, 1344, 1241, 1745, 1241, 1379, 1241, 1241, 2092, 1241, 1388, 1761, 1754, 1241, 1386, 1241, 1400, 1760, 1241, 1241, 1241, 1598, 1734, 1241, 1241, 1241, 1635, 1645, 1241, 1780, 1766, 1241, 1241, 1332, 1771, 1241, 1241, 1629, 2079, 1241, 1242, 1784, 1241, 1241, 1680, 1639, 2063, 1790, 1241, 1241, 1741, 1241, 1241, 1800, 1241, 1241, 1762, 1473, 1241, 1806, 1241, 1241, 1786, 1240, 1709, 1241, 1241, 1241, 1668, 1811, 1241, 1940, 1241, 1401, 1974, 1241, 1408, 1413, 1382, 1241, 1816, 1241, 1241, 1802, 2086, 1811, 1241, 1817, 1945, 1823, 2095, 2095, 2047, 2094, 2046, 2080, 1241, 1409, 1312, 1376, 2096, 2048, 1241, 1241, 1807, 1241, 1241, 1241, 2035, 1241, 1241, 1828, 1241, 2057, 2061, 1241, 1241, 1843, 1241, 2059, 1241, 1241, 1241, 1690, 1847, 1241, 1241, 1241, 1703, 2102, 1848, 1241, 1241, 1853, 1292, 1848, 1241, 2016, 1857, 1241, 2002, 1868, 1241, 1436, 1241, 1241, 1271, 1305, 1241, 1874, 1241, 1241, 1884, 2037, 1892, 1241, 1890, 1241, 1461, 1241, 1241, 1795, 1241, 1241, 1891, 1241, 1878, 1241, 1888, 1241, 1888, 1905, 1896, 2087, 1912, 1903, 1241, 1911, 1906, 1916, 1905, 2027, 1863, 1925, 2088, 1859, 1861, 1922, 1927, 1931, 1935, 1494, 1241, 1241, 1918, 1907, 1939, 1917, 1944, 1949, 1241, 1241, 1451, 1955, 1241, 1241, 1241, 1796, 1727, 2061, 1241, 1241, 1899, 1241, 1660, 1968, 1241, 1241, 1951, 1678, 1978, 1241, 1241, 1241, 1839, 1241, 1241, 1984, 1982, 1241, 1488, 1241, 1241, 1624, 1450, 1989, 1241, 1241, 1241, 1870, 1995, 1292, 1241, 1241, 1958, 1261, 1241, 1996, 1241, 1241, 1241, 2039, 2008, 1241, 1241, 1750, 2000, 1241, 1256, 2001, 1960, 1241, 1564, 1241, 1504, 1241, 1241, 1442, 1241, 1241, 1564, 1528, 1263, 1241, 1508, 1241, 1241, 1468, 1498, 2006, 1540, 2015, 1539, 2014, 1748, 2013, 1539, 1831, 2014, 2012, 1500, 1567, 2022, 2021, 1241, 1580, 1241, 1241, 2033, 2037, 1791, 2045, 2031, 1241, 1621, 1241, 1641, 2044, 1241, 1241, 1241, 2093, 1241, 1241, 2055, 1241, 1241, 2067, 1241, 1283, 1241, 1241, 1241, 2101, 2071, 1241, 1241, 1241, 2073, 1848, 2040, 1241, 1241, 1241, 2077, 1241, 1241, 2106, 1241, 1241, 2084, 1241, 2111, 1241, 1241, 1381, 1380, 1241, 1241, 1241, 2100, 1241, 2129, 2118, 2122, 2126, 2197, 2133, 3010, 2825, 2145, 2698, 2156, 2226, 2160, 2161, 2165, 2174, 2293, 2194, 2630, 2201, 2203, 2152, 3019, 2226, 2263, 2209, 2213, 2218, 2269, 2292, 2269, 2269, 2184, 2226, 2238, 2148, 2151, 3017, 2245, 2214, 2269, 2269, 2185, 2226, 2292, 2269, 2291, 2269, 2269, 2269, 2292, 2205, 3019, 2226, 2226, 2160, 2160, 2160, 2261, 2160, 2160, 2160, 2262, 2276, 2160, 2160, 2277, 2216, 2283, 2216, 2269, 2269, 2268, 2269, 2267, 2269, 2269, 2269, 2271, 2568, 2292, 2269, 2293, 2269, 2182, 2190, 2269, 2186, 2226, 2226, 2226, 2226, 2227, 2160, 2160, 2160, 2160, 2263, 2160, 2275, 2277, 2282, 2215, 2217, 2269, 2269, 2291, 2269, 2269, 2293, 2291, 2269, 2220, 2269, 2295, 2294, 2269, 2269, 2305, 2233, 2262, 2278, 2218, 2269, 2234, 2226, 2226, 2228, 2160, 2160, 2160, 2289, 2220, 2294, 2294, 2269, 2269, 2304, 2269, 2160, 2160, 2287, 2269, 2269, 2305, 2269, 2269, 2312, 2269, 2269, 2225, 2226, 2160, 2287, 2289, 2219, 2304, 2295, 2314, 2234, 2226, 2314, 2269, 2226, 2226, 2160, 2288, 2219, 2222, 2304, 2296, 2269, 2224, 2160, 2160, 2269, 2302, 2294, 2314, 2224, 2226, 2288, 2220, 2294, 2269, 2290, 2269, 2269, 2293, 2269, 2269, 2269, 2269, 2270, 2221, 2313, 2225, 2227, 2160, 2300, 2269, 2225, 2261, 2309, 2234, 2229, 2223, 2318, 2318, 2318, 2328, 2336, 2340, 2344, 2350, 2637, 2712, 2358, 2362, 2372, 2135, 2378, 2398, 2135, 2135, 2135, 2135, 2136, 2417, 2241, 2135, 2378, 2135, 2135, 2980, 2984, 2135, 3006, 2135, 2135, 2135, 2945, 2931, 2425, 2400, 2135, 2135, 2135, 2954, 2135, 2481, 2433, 2135, 2135, 2988, 2824, 2135, 2135, 2482, 2434, 2135, 2135, 2440, 2445, 2452, 2135, 2135, 2998, 3002, 2961, 2441, 2446, 2453, 2463, 2974, 2135, 2135, 2135, 2140, 2642, 2709, 2459, 2470, 2465, 2135, 2135, 3005, 2135, 2135, 2987, 2823, 2458, 2469, 2464, 2975, 2135, 2135, 2135, 2353, 2488, 2447, 2324, 2974, 2135, 2409, 2459, 2448, 2135, 2961, 2487, 2446, 2476, 2323, 2973, 2135, 2135, 2135, 2354, 2476, 2974, 2135, 2135, 2135, 2957, 2135, 2135, 2960, 2135, 2135, 2135, 2363, 2409, 2459, 2474, 2465, 2487, 2571, 2973, 2135, 2135, 2168, 2973, 2135, 2135, 2135, 2959, 2135, 2135, 2135, 2506, 2135, 2957, 2488, 2170, 2135, 2135, 2135, 2960, 2135, 2818, 2493, 2135, 2135, 3033, 2135, 2135, 2135, 2934, 2819, 2494, 2135, 2135, 2135, 2976, 2780, 2499, 2135, 2135, 2135, 3000, 2968, 2135, 2935, 2135, 2135, 2135, 2364, 2507, 2135, 2135, 2934, 2135, 2135, 2780, 2492, 2507, 2135, 2135, 2506, 2780, 2135, 2135, 2782, 2780, 2135, 2782, 2135, 2783, 2374, 2514, 2135, 2135, 2135, 3007, 2530, 2974, 2135, 2135, 2135, 3008, 2135, 2135, 2134, 2135, 2526, 2531, 2975, 2135, 2135, 3042, 2581, 2575, 2956, 2135, 2135, 2135, 2394, 2135, 2508, 2535, 2840, 2844, 2495, 2135, 2135, 2136, 2684, 2537, 2842, 2846, 2135, 2136, 2561, 2581, 2551, 2536, 2841, 2845, 2975, 3043, 2582, 2843, 2555, 2135, 3040, 3044, 2538, 2844, 2975, 2135, 2135, 2253, 2644, 2672, 2542, 2554, 2135, 2135, 2346, 2873, 2551, 2555, 2135, 2135, 2135, 2381, 2559, 2565, 2538, 2553, 2135, 2560, 2914, 2576, 2590, 2135, 2135, 2135, 2408, 2136, 2596, 2624, 2135, 2135, 2135, 2409, 2135, 2618, 2597, 3008, 2135, 2135, 2380, 2956, 2601, 2135, 2135, 2135, 2410, 2620, 2624, 2135, 2136, 2383, 2135, 2135, 2783, 2623, 2135, 2135, 2393, 2888, 2136, 2621, 3008, 2135, 2618, 2618, 2622, 2135, 2135, 2405, 2414, 2619, 2384, 2624, 2135, 2136, 2950, 2135, 2138, 2135, 2139, 2135, 2604, 2623, 2135, 2140, 2878, 2665, 2957, 2622, 2135, 2135, 2428, 2762, 2606, 2612, 2135, 2135, 2501, 2586, 2604, 3038, 2135, 2604, 3036, 2387, 2958, 2386, 2135, 2141, 2135, 2421, 2387, 2385, 2135, 2385, 2384, 2384, 2135, 2386, 2628, 2384, 2135, 2135, 2501, 2596, 2591, 2135, 2135, 2135, 2400, 2135, 2634, 2135, 2135, 2559, 2580, 2575, 2648, 2135, 2135, 2135, 2429, 2649, 2135, 2135, 2135, 2435, 2654, 2658, 2135, 2135, 2135, 2436, 2649, 2178, 2659, 2135, 2135, 2595, 2601, 2669, 2677, 2135, 2135, 2616, 2957, 2879, 2665, 2691, 2135, 2363, 2367, 2900, 2878, 2664, 2690, 2975, 2877, 2643, 2670, 2974, 2671, 2975, 2135, 2135, 2619, 2608, 2669, 2673, 2135, 2135, 2653, 2177, 2672, 2135, 2135, 2135, 2486, 2168, 2251, 2255, 2695, 2974, 2709, 2135, 2135, 2135, 2487, 2169, 2399, 2716, 2975, 2135, 2363, 2770, 2776, 2640, 2717, 2135, 2135, 2729, 2135, 2135, 2641, 2718, 2135, 2135, 2135, 2505, 2135, 2640, 2257, 2974, 2135, 2727, 2975, 2135, 2365, 2332, 2895, 2957, 2135, 2959, 2135, 2365, 2749, 2754, 2959, 2958, 2958, 2135, 2380, 2793, 2799, 2135, 2735, 2738, 2135, 2381, 2135, 2135, 2940, 2974, 2135, 2744, 2135, 2135, 2739, 2519, 2976, 2745, 2135, 2135, 2135, 2509, 2755, 2135, 2135, 2135, 2510, 2772, 2778, 2135, 2135, 2740, 2520, 2135, 2771, 2777, 2135, 2135, 2759, 2750, 2792, 2798, 2135, 2135, 2781, 2392, 2779, 2135, 2135, 2135, 2521, 2135, 2679, 2248, 2135, 2135, 2681, 2480, 2135, 2135, 2786, 3000, 2135, 2679, 2683, 2135, 2135, 2416, 2135, 2135, 2135, 2525, 2135, 2730, 2135, 2135, 2135, 2560, 2581, 2135, 2805, 2135, 2135, 2804, 2962, 2832, 2974, 2135, 2382, 2135, 2135, 2958, 2135, 2135, 2960, 2135, 2829, 2833, 2975, 2961, 2965, 2969, 2973, 2968, 2972, 2135, 2135, 2135, 2641, 2135, 2515, 2966, 2970, 2851, 2478, 2135, 2135, 2808, 2135, 2809, 2135, 2135, 2135, 2722, 2852, 2479, 2135, 2135, 2815, 2135, 2135, 2766, 2853, 2480, 2135, 2857, 2479, 2135, 2388, 2723, 2135, 2364, 2331, 2894, 2858, 2480, 2135, 2135, 2850, 2478, 2135, 2135, 2135, 2806, 2864, 2135, 2399, 2256, 2974, 2865, 2135, 2135, 2862, 2135, 2135, 2135, 2685, 2807, 2865, 2135, 2135, 2807, 2863, 2135, 2135, 2135, 2686, 2884, 2807, 2135, 2809, 2807, 2135, 2135, 2807, 2806, 2705, 2810, 2808, 2700, 2869, 2702, 2702, 2702, 2704, 2883, 2135, 2135, 2135, 2730, 2884, 2135, 2135, 2135, 2731, 2321, 2546, 2135, 2135, 2876, 2255, 2889, 2322, 2547, 2135, 2401, 2135, 2135, 2135, 2949, 2367, 2893, 2544, 2973, 2906, 2973, 2135, 2135, 2877, 2663, 2368, 2901, 2907, 2974, 2366, 2899, 2905, 2972, 2920, 2974, 2135, 2135, 2911, 2900, 2920, 2363, 2913, 2918, 2465, 2941, 2975, 2135, 2135, 2924, 2928, 2974, 2945, 2931, 2135, 2135, 2135, 2765, 2136, 2955, 2135, 2135, 2939, 2931, 2380, 2135, 2135, 2380, 2135, 2135, 2135, 2780, 2507, 2137, 2135, 2137, 2135, 2139, 2135, 2806, 2810, 2135, 2135, 2135, 2992, 2135, 2135, 2962, 2966, 2970, 2974, 2135, 2135, 2787, 3014, 2135, 2521, 2993, 2135, 2135, 2135, 2803, 2135, 2135, 2135, 2618, 2607, 2997, 3001, 2135, 2135, 2963, 2967, 2971, 2975, 2135, 2135, 2791, 2797, 2135, 3009, 2999, 3003, 2787, 3001, 2135, 2135, 2964, 2968, 2785, 2999, 3003, 2135, 2135, 2135, 2804, 2785, 2999, 3004, 2135, 2135, 2135, 2807, 2135, 2135, 3023, 2135, 2135, 2135, 2811, 2135, 2135, 3027, 2135, 2135, 2135, 2837, 2968, 3028, 2135, 2135, 2135, 2875, 2135, 2784, 3029, 2135, 2408, 2457, 2446, 0, 14, 0, -2120220672, 1610612736, -2074083328, -2002780160, -2111830528, 1073872896, 1342177280, 1075807216, 4096, 16384, 2048, 8192, 0, 8192, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, -2145386496, 8388608, 1073741824, 0, 0x80000000, 0x80000000, 2097152, 2097152, 2097152, 536870912, 0, 0, 134217728, 33554432, 1536, 268435456, 268435456, 268435456, 268435456, 128, 256, 32, 0, 65536, 131072, 524288, 16777216, 268435456, 0x80000000, 1572864, 1835008, 640, 32768, 65536, 262144, 1048576, 2097152, 196608, 196800, 196608, 196608, 0, 131072, 131072, 131072, 196608, 196624, 196608, 196624, 196608, 196608, 128, 4096, 16384, 16384, 2048, 0, 4, 0, 0, 0x80000000, 2097152, 0, 1024, 32, 32, 0, 65536, 1572864, 1048576, 32768, 32768, 32768, 32768, 196608, 196608, 196608, 64, 64, 196608, 196608, 131072, 131072, 131072, 131072, 268435456, 268435456, 64, 196736, 196608, 196608, 196608, 131072, 196608, 196608, 16384, 4, 4, 4, 2, 32, 32, 65536, 1048576, 12582912, 1073741824, 0, 0, 2, 8, 16, 96, 2048, 32768, 0, 0, 131072, 268435456, 268435456, 268435456, 256, 256, 196608, 196672, 196608, 196608, 196608, 196608, 4, 0, 256, 256, 256, 256, 32, 32, 32768, 32, 32, 32, 32, 32768, 268435456, 268435456, 268435456, 196608, 196608, 196608, 196624, 196608, 196608, 196608, 16, 16, 16, 268435456, 196608, 64, 64, 64, 196608, 196608, 196608, 196672, 268435456, 64, 64, 196608, 196608, 16, 196608, 196608, 196608, 268435456, 64, 196608, 131072, 262144, 4194304, 25165824, 33554432, 134217728, 268435456, 268435456, 196608, 262152, 8, 256, 512, 3072, 16384, 200, -1073741816, 8392713, 40, 8392718, 520, 807404072, 40, 520, 100663304, 0, 0, -540651761, -540651761, 257589048, 0, 262144, 0, 0, 3, 8, 256, 0, 4, 6, 4100, 8388612, 0, 0, 0, 3, 4, 8, 256, 512, 1024, 0, 2097152, 0, 0, -537854471, -537854471, 0, 100663296, 0, 0, 1, 2, 0, 0, 0, 16384, 0, 0, 0, 96, 14336, 0, 0, 0, 7, 8, 234881024, 0, 0, 0, 8, 0, 0, 0, 0, 262144, 0, 0, 16, 64, 384, 512, 0, 1, 1, 0, 12582912, 0, 0, 0, 0, 33554432, 67108864, -606084144, -606084144, -606084138, 0, 0, 28, 32, 768, 1966080, -608174080, 0, 0, 0, 14, 35056, 16, 64, 896, 24576, 98304, 98304, 131072, 262144, 524288, 1048576, 4194304, 25165824, 1048576, 62914560, 134217728, -805306368, 0, 384, 512, 16384, 65536, 131072, 262144, 29360128, 33554432, 134217728, 268435456, 1073741824, 0x80000000, 262144, 524288, 1048576, 29360128, 33554432, 524288, 1048576, 16777216, 33554432, 134217728, 268435456, 1073741824, 0, 0, 0, 123856, 1966080, 0, 64, 384, 16384, 65536, 131072, 16384, 65536, 524288, 268435456, 0x80000000, 0, 0, 524288, 0x80000000, 0, 0, 1, 16, 0, 256, 524288, 0, 0, 0, 25, 96, 128, -537854471, 0, 0, 0, 32, 7404800, -545259520, 0, 0, 0, 60, 0, 249, 64768, 1048576, 6291456, 6291456, 25165824, 100663296, 402653184, 1073741824, 96, 128, 1280, 2048, 4096, 57344, 6291456, 57344, 6291456, 8388608, 16777216, 33554432, 201326592, 1342177280, 0x80000000, 0, 57344, 6291456, 8388608, 100663296, 134217728, 0x80000000, 0, 0, 0, 1, 8, 16, 64, 128, 64, 128, 256, 1024, 131072, 131072, 131072, 262144, 524288, 16777216, 57344, 6291456, 8388608, 67108864, 134217728, 64, 256, 1024, 2048, 4096, 57344, 64, 256, 0, 24576, 32768, 6291456, 67108864, 134217728, 0, 1, 64, 256, 24576, 32768, 4194304, 32768, 4194304, 67108864, 0, 0, 64, 256, 0, 0, 24576, 32768, 0, 16384, 4194304, 67108864, 64, 16384, 0, 0, 1, 64, 256, 16384, 4194304, 67108864, 0, 0, 0, 16384, 0, 16384, 16384, 0, -470447874, -470447874, -470447874, 0, 0, 128, 0, 0, 8, 96, 2048, 32768, 262144, 8388608, 35056, 1376256, -471859200, 0, 0, 14, 16, 224, 2048, 32768, 2097152, 4194304, 8388608, -486539264, 0, 96, 128, 2048, 32768, 262144, 2097152, 262144, 2097152, 8388608, 33554432, 536870912, 1073741824, 0x80000000, 0, 1610612736, 0x80000000, 0, 0, 1, 524288, 1048576, 12582912, 0, 0, 0, 151311, 264503296, 2097152, 8388608, 33554432, 1610612736, 0x80000000, 262144, 8388608, 33554432, 536870912, 67108864, 4194304, 0, 4194304, 0, 4194304, 4194304, 0, 0, 524288, 8388608, 536870912, 1073741824, 0x80000000, 1, 4097, 8388609, 96, 2048, 32768, 1073741824, 0x80000000, 0, 96, 2048, 0x80000000, 0, 0, 96, 2048, 0, 0, 1, 12582912, 0, 0, 0, 0, 1641895695, 1641895695, 0, 0, 0, 249, 7404800, 15, 87808, 1835008, 1639972864, 0, 768, 5120, 16384, 65536, 1835008, 1835008, 12582912, 16777216, 1610612736, 0, 3, 4, 8, 768, 4096, 65536, 0, 0, 256, 512, 786432, 8, 256, 512, 4096, 16384, 1835008, 16384, 1835008, 12582912, 1610612736, 0, 0, 0, 256, 0, 0, 0, 4, 8, 16, 32, 1, 2, 8, 256, 16384, 524288, 16384, 524288, 1048576, 12582912, 1610612736, 0, 0, 0, 8388608, 0, 0, 0, 524288, 4194304, 0, 0, 0, 8388608, -548662288, -548662288, -548662288, 0, 0, 256, 16384, 65536, 520093696, -1073741824, 0, 0, 0, 16777216, 0, 16, 32, 960, 4096, 4980736, 520093696, 1073741824, 0, 32, 896, 4096, 57344, 1048576, 6291456, 8388608, 16777216, 100663296, 134217728, 268435456, 0x80000000, 0, 512, 786432, 4194304, 33554432, 134217728, 268435456, 0, 786432, 4194304, 134217728, 268435456, 0, 524288, 4194304, 268435456, 0, 0, 0, 0, 0, 4194304, 4194304, -540651761, 0, 0, 0, 2, 4, 8, 16, 96, 128, 264503296, -805306368, 0, 0, 0, 8, 256, 512, 19456, 131072, 3072, 16384, 131072, 262144, 8388608, 16777216, 512, 1024, 2048, 16384, 131072, 262144, 131072, 262144, 8388608, 33554432, 201326592, 268435456, 0, 3, 4, 256, 1024, 2048, 57344, 16384, 131072, 8388608, 33554432, 134217728, 268435456, 0, 3, 256, 1024, 16384, 131072, 33554432, 134217728, 1073741824, 0x80000000, 0, 0, 256, 524288, 0x80000000, 0, 3, 256, 33554432, 134217728, 1073741824, 0, 1, 2, 33554432, 1, 2, 134217728, 1073741824, 0, 1, 2, 134217728, 0, 0, 0, 64, 0, 0, 0, 16, 32, 896, 4096, 786432, 4194304, 16777216, 33554432, 201326592, 268435456, 1073741824, 0x80000000, 0, 0, 0, 15, 0, 4980736, 4980736, 4980736, 70460, 70460, 3478332, 0, 0, 1008, 4984832, 520093696, 60, 4864, 65536, 0, 0, 0, 12, 16, 32, 256, 512, 4096, 65536, 0, 0, 0, 67108864, 0, 0, 0, 12, 0, 256, 512, 65536, 0, 0, 1024, 512, 131072, 131072, 4, 16, 32, 65536, 0, 4, 16, 32, 0, 0, 0, 4, 16, 0, 0, 16384, 67108864, 0, 0, 1, 24, 96, 128, 256, 1024 +]; + +JSONiqTokenizer.TOKEN = +[ + "(0)", + "JSONChar", + "JSONCharRef", + "JSONPredefinedCharRef", + "ModuleDecl", + "Annotation", + "OptionDecl", + "Operator", + "Variable", + "Tag", + "EndTag", + "PragmaContents", + "DirCommentContents", + "DirPIContents", + "CDataSectionContents", + "AttrTest", + "Wildcard", + "EQName", + "IntegerLiteral", + "DecimalLiteral", + "DoubleLiteral", + "PredefinedEntityRef", + "'\"\"'", + "EscapeApos", + "AposChar", + "ElementContentChar", + "QuotAttrContentChar", + "AposAttrContentChar", + "NCName", + "QName", + "S", + "CharRef", + "CommentContents", + "DocTag", + "DocCommentContents", + "EOF", + "'!'", + "'\"'", + "'#'", + "'#)'", + "'$$'", + "''''", + "'('", + "'(#'", + "'(:'", + "'(:~'", + "')'", + "'*'", + "'*'", + "','", + "'-->'", + "'.'", + "'/'", + "'/>'", + "':'", + "':)'", + "';'", + "''), token: xmlcomment, next: function(stack){ stack.pop(); } } + ], + CData: [ + { name: 'CDataSectionContents', token: cdata }, + { name: n(']]>'), token: cdata, next: function(stack){ stack.pop(); } } + ], + PI: [ + { name: 'DirPIContents', token: pi }, + { name: n('?'), token: pi }, + { name: n('?>'), token: pi, next: function(stack){ stack.pop(); } } + ], + AposString: [ + { name: n('\'\''), token: 'string', next: function(stack){ stack.pop(); } }, + { name: 'PredefinedEntityRef', token: 'constant.language.escape' }, + { name: 'CharRef', token: 'constant.language.escape' }, + { name: 'EscapeApos', token: 'constant.language.escape' }, + { name: 'AposChar', token: 'string' } + ], + QuotString: [ + { name: n('"'), token: 'string', next: function(stack){ stack.pop(); } }, + { name: 'JSONPredefinedCharRef', token: 'constant.language.escape' }, + { name: 'JSONCharRef', token: 'constant.language.escape' }, + { name: 'JSONChar', token: 'string' } + ] +}; + +exports.JSONiqLexer = function(){ return new Lexer(JSONiqTokenizer, Rules); }; +},{"./JSONiqTokenizer":"/node_modules/xqlint/lib/lexers/JSONiqTokenizer.js","./lexer":"/node_modules/xqlint/lib/lexers/lexer.js"}],"/node_modules/xqlint/lib/lexers/lexer.js":[function(_dereq_,module,exports){ +'use strict'; + +var TokenHandler = function(code) { + var input = code; + this.tokens = []; + + this.reset = function() { + input = input; + this.tokens = []; + }; + + this.startNonterminal = function() {}; + this.endNonterminal = function() {}; + + this.terminal = function(name, begin, end) { + this.tokens.push({ + name: name, + value: input.substring(begin, end) + }); + }; + + this.whitespace = function(begin, end) { + this.tokens.push({ + name: 'WS', + value: input.substring(begin, end) + }); + }; +}; + +exports.Lexer = function(Tokenizer, Rules) { + + this.tokens = []; + + this.getLineTokens = function(line, state) { + state = (state === 'start' || !state) ? '["start"]' : state; + var stack = JSON.parse(state); + var h = new TokenHandler(line); + var tokenizer = new Tokenizer(line, h); + var tokens = []; + + while(true) { + var currentState = stack[stack.length - 1]; + try { + h.tokens = []; + tokenizer['parse_' + currentState](); + var info = null; + + if(h.tokens.length > 1 && h.tokens[0].name === 'WS') { + tokens.push({ + type: 'text', + value: h.tokens[0].value + }); + h.tokens.splice(0, 1); + } + + var token = h.tokens[0]; + var rules = Rules[currentState]; + for(var k = 0; k < rules.length; k++) { + var rule = Rules[currentState][k]; + if((typeof(rule.name) === 'function' && rule.name(token)) || rule.name === token.name) { + info = rule; + break; + } + } + + if(token.name === 'EOF') { break; } + if(token.value === '') { throw 'Encountered empty string lexical rule.'; } + + tokens.push({ + type: info === null ? 'text' : (typeof(info.token) === 'function' ? info.token(token.value) : info.token), + value: token.value + }); + + if(info && info.next) { + info.next(stack); + } + + } catch(e) { + if(e instanceof tokenizer.ParseException) { + var index = 0; + for(var i=0; i < tokens.length; i++) { + index += tokens[i].value.length; + } + tokens.push({ type: 'text', value: line.substring(index) }); + return { + tokens: tokens, + state: JSON.stringify(['start']) + }; + } else { + throw e; + } + } + } + + return { + tokens: tokens, + state: JSON.stringify(stack) + }; + }; +}; +},{}]},{},["/node_modules/xqlint/lib/lexers/jsoniq_lexer.js"]); + +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === "') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + var state = JSON.parse(state).pop(); + if ((token && token.value === '>') || state !== "StartTag") return; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + var previous = iterator.stepBackward(); + if (!token || !hasType(token, 'meta.tag') || (previous !== null && previous.value.match('/'))) { + return + } + var tag = token.value.substring(1); + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + } + oop.inherits(XQueryBehaviour, Behaviour); + + exports.XQueryBehaviour = XQueryBehaviour; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/jsoniq",["require","exports","module","ace/worker/worker_client","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/xquery/jsoniq_lexer","ace/range","ace/mode/behaviour/xquery","ace/mode/folding/cstyle","ace/anchor"], function(require, exports, module) { +"use strict"; + +var WorkerClient = require("../worker/worker_client").WorkerClient; +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var JSONiqLexer = require("./xquery/jsoniq_lexer").JSONiqLexer; +var Range = require("../range").Range; +var XQueryBehaviour = require("./behaviour/xquery").XQueryBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var Anchor = require("../anchor").Anchor; + +var Mode = function() { + this.$tokenizer = new JSONiqLexer(); + this.$behaviour = new XQueryBehaviour(); + this.foldingRules = new CStyleFoldMode(); + this.$highlightRules = new TextHighlightRules(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.completer = { + getCompletions: function(editor, session, pos, prefix, callback) { + if (!session.$worker) + return callback(); + session.$worker.emit("complete", { data: { pos: pos, prefix: prefix } }); + session.$worker.on("complete", function(e){ + callback(null, e.data); + }); + } + }; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var match = line.match(/\s*(?:then|else|return|[{\(]|<\w+>)\s*$/); + if (match) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*[\}\)]/.test(input); + }; + + this.autoOutdent = function(state, doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*[\}\)])/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var i, line; + var outdent = true; + var re = /^\s*\(:(.*):\)/; + + for (i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + var range = new Range(0, 0, 0, 0); + for (i=startRow; i<= endRow; i++) { + line = doc.getLine(i); + range.start.row = i; + range.end.row = i; + range.end.column = line.length; + + doc.replace(range, outdent ? line.match(re)[1] : "(:" + line + ":)"); + } + }; + this.createWorker = function(session) { + + var worker = new WorkerClient(["ace"], "ace/mode/xquery_worker", "XQueryWorker"); + var that = this; + + worker.attachToDocument(session.getDocument()); + + worker.on("ok", function(e) { + session.clearAnnotations(); + }); + + worker.on("markers", function(e) { + session.clearAnnotations(); + that.addMarkers(e.data, session); + }); + + return worker; + }; + + this.removeMarkers = function(session) { + var markers = session.getMarkers(false); + for (var id in markers) { + if (markers[id].clazz.indexOf('language_highlight_') === 0) { + session.removeMarker(id); + } + } + for (var i = 0; i < session.markerAnchors.length; i++) { + session.markerAnchors[i].detach(); + } + session.markerAnchors = []; + }; + + this.addMarkers = function(annos, mySession) { + var _self = this; + + if (!mySession.markerAnchors) mySession.markerAnchors = []; + this.removeMarkers(mySession); + mySession.languageAnnos = []; + annos.forEach(function(anno) { + var anchor = new Anchor(mySession.getDocument(), anno.pos.sl, anno.pos.sc || 0); + mySession.markerAnchors.push(anchor); + var markerId; + var colDiff = anno.pos.ec - anno.pos.sc; + var rowDiff = anno.pos.el - anno.pos.sl; + var gutterAnno = { + guttertext: anno.message, + type: anno.level || "warning", + text: anno.message + }; + + function updateFloat(single) { + if (markerId) + mySession.removeMarker(markerId); + gutterAnno.row = anchor.row; + if (anno.pos.sc !== undefined && anno.pos.ec !== undefined) { + var range = new Range(anno.pos.sl, anno.pos.sc, anno.pos.el, anno.pos.ec); + markerId = mySession.addMarker(range, "language_highlight_" + (anno.type ? anno.type : "default")); + } + if (single) mySession.setAnnotations(mySession.languageAnnos); + } + updateFloat(); + anchor.on("change", function() { + updateFloat(true); + }); + if (anno.message) mySession.languageAnnos.push(gutterAnno); + }); + mySession.setAnnotations(mySession.languageAnnos); + }; + + this.$id = "ace/mode/jsoniq"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-jsp.js b/src/libs/ace/mode-jsp.js new file mode 100755 index 0000000..ad13aed --- /dev/null +++ b/src/libs/ace/mode-jsp.js @@ -0,0 +1,1388 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/java_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JavaHighlightRules = function() { + var keywords = ( + "abstract|continue|for|new|switch|" + + "assert|default|goto|package|synchronized|" + + "boolean|do|if|private|this|" + + "break|double|implements|protected|throw|" + + "byte|else|import|public|throws|" + + "case|enum|instanceof|return|transient|" + + "catch|extends|int|short|try|" + + "char|final|interface|static|void|" + + "class|finally|long|strictfp|volatile|" + + "const|float|native|super|while" + ); + + var buildinConstants = ("null|Infinity|NaN|undefined"); + + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": langClasses + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : /0(?:[xX][0-9a-fA-F][0-9a-fA-F_]*|[bB][01][01_]*)[LlSsDdFfYy]?\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d[\d_]*(?:(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?)?[LlSsDdFfYy]?\b/ + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(JavaHighlightRules, TextHighlightRules); + +exports.JavaHighlightRules = JavaHighlightRules; +}); + +ace.define("ace/mode/jsp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/java_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules; + +var JspHighlightRules = function() { + HtmlHighlightRules.call(this); + + var builtinVariables = 'request|response|out|session|' + + 'application|config|pageContext|page|Exception'; + + var keywords = 'page|include|taglib'; + + var startRules = [ + { + token : "comment", + regex : "<%--", + push : "jsp-dcomment" + }, { + token : "meta.tag", // jsp open tag + regex : "<%@?|<%=?|<%!?|]+>", + push : "jsp-start" + } + ]; + + var endRules = [ + { + token : "meta.tag", // jsp close tag + regex : "%>|<\\/jsp:[^>]+>", + next : "pop" + }, { + token: "variable.language", + regex : builtinVariables + }, { + token: "keyword", + regex : keywords + } + ]; + + for (var key in this.$rules) + this.$rules[key].unshift.apply(this.$rules[key], startRules); + + this.embedRules(JavaHighlightRules, "jsp-", endRules, ["start"]); + + this.addRules({ + "jsp-dcomment" : [{ + token : "comment", + regex : ".*?--%>", + next : "pop" + }] + }); + + this.normalizeRules(); +}; + +oop.inherits(JspHighlightRules, HtmlHighlightRules); + +exports.JspHighlightRules = JspHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/jsp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/jsp_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JspHighlightRules = require("./jsp_highlight_rules").JspHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JspHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.$id = "ace/mode/jsp"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-jsx.js b/src/libs/ace/mode-jsx.js new file mode 100755 index 0000000..3f3d3e4 --- /dev/null +++ b/src/libs/ace/mode-jsx.js @@ -0,0 +1,404 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/jsx_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JsxHighlightRules = function() { + var keywords = lang.arrayToMap( + ("break|do|instanceof|typeof|case|else|new|var|catch|finally|return|void|continue|for|switch|default|while|function|this|" + + "if|throw|" + + "delete|in|try|" + + "class|extends|super|import|from|into|implements|interface|static|mixin|override|abstract|final|" + + "number|int|string|boolean|variant|" + + "log|assert").split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("null|true|false|NaN|Infinity|__FILE__|__LINE__|undefined").split("|") + ); + + var reserved = lang.arrayToMap( + ("debugger|with|" + + "const|export|" + + "let|private|public|yield|protected|" + + "extern|native|as|operator|__fake__|__readonly__").split("|") + ); + + var identifierRe = "[a-zA-Z_][a-zA-Z0-9_]*\\b"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : [ + "storage.type", + "text", + "entity.name.function" + ], + regex : "(function)(\\s+)(" + identifierRe + ")" + }, { + token : function(value) { + if (value == "this") + return "variable.language"; + else if (value == "function") + return "storage.type"; + else if (keywords.hasOwnProperty(value) || reserved.hasOwnProperty(value)) + return "keyword"; + else if (buildinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (/^_?[A-Z][a-zA-Z0-9_]*$/.test(value)) + return "language.support.class"; + else + return "identifier"; + }, + regex : identifierRe + }, { + token : "keyword.operator", + regex : "!|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({<]" + }, { + token : "paren.rparen", + regex : "[\\])}>]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(JsxHighlightRules, TextHighlightRules); + +exports.JsxHighlightRules = JsxHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/jsx",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/jsx_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JsxHighlightRules = require("./jsx_highlight_rules").JsxHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +function Mode() { + this.HighlightRules = JsxHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +} +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/jsx"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-julia.js b/src/libs/ace/mode-julia.js new file mode 100755 index 0000000..ee1e88a --- /dev/null +++ b/src/libs/ace/mode-julia.js @@ -0,0 +1,296 @@ +ace.define("ace/mode/julia_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JuliaHighlightRules = function() { + + this.$rules = { start: + [ { include: '#function_decl' }, + { include: '#function_call' }, + { include: '#type_decl' }, + { include: '#keyword' }, + { include: '#operator' }, + { include: '#number' }, + { include: '#string' }, + { include: '#comment' } ], + '#bracket': + [ { token: 'keyword.bracket.julia', + regex: '\\(|\\)|\\[|\\]|\\{|\\}|,' } ], + '#comment': + [ { token: + [ 'punctuation.definition.comment.julia', + 'comment.line.number-sign.julia' ], + regex: '(#)(?!\\{)(.*$)'} ], + '#function_call': + [ { token: [ 'support.function.julia', 'text' ], + regex: '([a-zA-Z0-9_]+!?)([\\w\\xff-\\u218e\\u2455-\\uffff]*\\()'} ], + '#function_decl': + [ { token: [ 'keyword.other.julia', 'meta.function.julia', + 'entity.name.function.julia', 'meta.function.julia','text' ], + regex: '(function|macro)(\\s*)([a-zA-Z0-9_\\{]+!?)([\\w\\xff-\\u218e\\u2455-\\uffff]*)([(\\\\{])'} ], + '#keyword': + [ { token: 'keyword.other.julia', + regex: '\\b(?:function|type|immutable|macro|quote|abstract|bitstype|typealias|module|baremodule|new)\\b' }, + { token: 'keyword.control.julia', + regex: '\\b(?:if|else|elseif|while|for|in|begin|let|end|do|try|catch|finally|return|break|continue)\\b' }, + { token: 'storage.modifier.variable.julia', + regex: '\\b(?:global|local|const|export|import|importall|using)\\b' }, + { token: 'variable.macro.julia', regex: '@[\\w\\xff-\\u218e\\u2455-\\uffff]+\\b' } ], + '#number': + [ { token: 'constant.numeric.julia', + regex: '\\b0(?:x|X)[0-9a-fA-F]*|(?:\\b[0-9]+\\.?[0-9]*|\\.[0-9]+)(?:(?:e|E)(?:\\+|-)?[0-9]*)?(?:im)?|\\bInf(?:32)?\\b|\\bNaN(?:32)?\\b|\\btrue\\b|\\bfalse\\b' } ], + '#operator': + [ { token: 'keyword.operator.update.julia', + regex: '=|:=|\\+=|-=|\\*=|/=|//=|\\.//=|\\.\\*=|\\\\=|\\.\\\\=|^=|\\.^=|%=|\\|=|&=|\\$=|<<=|>>=' }, + { token: 'keyword.operator.ternary.julia', regex: '\\?|:' }, + { token: 'keyword.operator.boolean.julia', + regex: '\\|\\||&&|!' }, + { token: 'keyword.operator.arrow.julia', regex: '->|<-|-->' }, + { token: 'keyword.operator.relation.julia', + regex: '>|<|>=|<=|==|!=|\\.>|\\.<|\\.>=|\\.>=|\\.==|\\.!=|\\.=|\\.!|<:|:>' }, + { token: 'keyword.operator.range.julia', regex: ':' }, + { token: 'keyword.operator.shift.julia', regex: '<<|>>' }, + { token: 'keyword.operator.bitwise.julia', regex: '\\||\\&|~' }, + { token: 'keyword.operator.arithmetic.julia', + regex: '\\+|-|\\*|\\.\\*|/|\\./|//|\\.//|%|\\.%|\\\\|\\.\\\\|\\^|\\.\\^' }, + { token: 'keyword.operator.isa.julia', regex: '::' }, + { token: 'keyword.operator.dots.julia', + regex: '\\.(?=[a-zA-Z])|\\.\\.+' }, + { token: 'keyword.operator.interpolation.julia', + regex: '\\$#?(?=.)' }, + { token: [ 'variable', 'keyword.operator.transposed-variable.julia' ], + regex: '([\\w\\xff-\\u218e\\u2455-\\uffff]+)((?:\'|\\.\')*\\.?\')' }, + { token: 'text', + regex: '\\[|\\('}, + { token: [ 'text', 'keyword.operator.transposed-matrix.julia' ], + regex: "([\\]\\)])((?:'|\\.')*\\.?')"} ], + '#string': + [ { token: 'punctuation.definition.string.begin.julia', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.julia', + regex: '\'', + next: 'pop' }, + { include: '#string_escaped_char' }, + { defaultToken: 'string.quoted.single.julia' } ] }, + { token: 'punctuation.definition.string.begin.julia', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.julia', + regex: '"', + next: 'pop' }, + { include: '#string_escaped_char' }, + { defaultToken: 'string.quoted.double.julia' } ] }, + { token: 'punctuation.definition.string.begin.julia', + regex: '\\b[\\w\\xff-\\u218e\\u2455-\\uffff]+"', + push: + [ { token: 'punctuation.definition.string.end.julia', + regex: '"[\\w\\xff-\\u218e\\u2455-\\uffff]*', + next: 'pop' }, + { include: '#string_custom_escaped_char' }, + { defaultToken: 'string.quoted.custom-double.julia' } ] }, + { token: 'punctuation.definition.string.begin.julia', + regex: '`', + push: + [ { token: 'punctuation.definition.string.end.julia', + regex: '`', + next: 'pop' }, + { include: '#string_escaped_char' }, + { defaultToken: 'string.quoted.backtick.julia' } ] } ], + '#string_custom_escaped_char': [ { token: 'constant.character.escape.julia', regex: '\\\\"' } ], + '#string_escaped_char': + [ { token: 'constant.character.escape.julia', + regex: '\\\\(?:\\\\|[0-3]\\d{,2}|[4-7]\\d?|x[a-fA-F0-9]{,2}|u[a-fA-F0-9]{,4}|U[a-fA-F0-9]{,8}|.)' } ], + '#type_decl': + [ { token: + [ 'keyword.control.type.julia', + 'meta.type.julia', + 'entity.name.type.julia', + 'entity.other.inherited-class.julia', + 'punctuation.separator.inheritance.julia', + 'entity.other.inherited-class.julia' ], + regex: '(type|immutable)(\\s+)([a-zA-Z0-9_]+)(?:(\\s*)(<:)(\\s*[.a-zA-Z0-9_:]+))?' }, + { token: [ 'other.typed-variable.julia', 'support.type.julia' ], + regex: '([a-zA-Z0-9_]+)(::[a-zA-Z0-9_{}]+)' } ] } + + this.normalizeRules(); +}; + +JuliaHighlightRules.metaData = { fileTypes: [ 'jl' ], + firstLineMatch: '^#!.*\\bjulia\\s*$', + foldingStartMarker: '^\\s*(?:if|while|for|begin|function|macro|module|baremodule|type|immutable|let)\\b(?!.*\\bend\\b).*$', + foldingStopMarker: '^\\s*(?:end)\\b.*$', + name: 'Julia', + scopeName: 'source.julia' } + + +oop.inherits(JuliaHighlightRules, TextHighlightRules); + +exports.JuliaHighlightRules = JuliaHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/julia",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/julia_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JuliaHighlightRules = require("./julia_highlight_rules").JuliaHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JuliaHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.blockComment = ""; + this.$id = "ace/mode/julia"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-kotlin.js b/src/libs/ace/mode-kotlin.js new file mode 100755 index 0000000..2621bae --- /dev/null +++ b/src/libs/ace/mode-kotlin.js @@ -0,0 +1,786 @@ +ace.define("ace/mode/kotlin_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var KotlinHighlightRules = function() { + + this.$rules = { + start: [{ + include: "#comments" + }, { + token: [ + "text", + "keyword.other.kotlin", + "text", + "entity.name.package.kotlin", + "text" + ], + regex: /^(\s*)(package)\b(?:(\s*)([^ ;$]+)(\s*))?/ + }, { + include: "#imports" + }, { + include: "#statements" + }], + "#classes": [{ + token: "text", + regex: /(?=\s*(?:companion|class|object|interface))/, + push: [{ + token: "text", + regex: /}|(?=$)/, + next: "pop" + }, { + token: ["keyword.other.kotlin", "text"], + regex: /\b((?:companion\s*)?)(class|object|interface)\b/, + push: [{ + token: "text", + regex: /(?=<|{|\(|:)/, + next: "pop" + }, { + token: "keyword.other.kotlin", + regex: /\bobject\b/ + }, { + token: "entity.name.type.class.kotlin", + regex: /\w+/ + }] + }, { + token: "text", + regex: //, + next: "pop" + }, { + include: "#generics" + }] + }, { + token: "text", + regex: /\(/, + push: [{ + token: "text", + regex: /\)/, + next: "pop" + }, { + include: "#parameters" + }] + }, { + token: "keyword.operator.declaration.kotlin", + regex: /:/, + push: [{ + token: "text", + regex: /(?={|$)/, + next: "pop" + }, { + token: "entity.other.inherited-class.kotlin", + regex: /\w+/ + }, { + token: "text", + regex: /\(/, + push: [{ + token: "text", + regex: /\)/, + next: "pop" + }, { + include: "#expressions" + }] + }] + }, { + token: "text", + regex: /\{/, + push: [{ + token: "text", + regex: /\}/, + next: "pop" + }, { + include: "#statements" + }] + }] + }], + "#comments": [{ + token: "punctuation.definition.comment.kotlin", + regex: /\/\*/, + push: [{ + token: "punctuation.definition.comment.kotlin", + regex: /\*\//, + next: "pop" + }, { + defaultToken: "comment.block.kotlin" + }] + }, { + token: [ + "text", + "punctuation.definition.comment.kotlin", + "comment.line.double-slash.kotlin" + ], + regex: /(\s*)(\/\/)(.*$)/ + }], + "#constants": [{ + token: "constant.language.kotlin", + regex: /\b(?:true|false|null|this|super)\b/ + }, { + token: "constant.numeric.kotlin", + regex: /\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\.?[0-9]*|\.[0-9]+)(?:(?:e|E)(?:\+|-)?[0-9]+)?)(?:[LlFfUuDd]|UL|ul)?\b/ + }, { + token: "constant.other.kotlin", + regex: /\b[A-Z][A-Z0-9_]+\b/ + }], + "#expressions": [{ + token: "text", + regex: /\(/, + push: [{ + token: "text", + regex: /\)/, + next: "pop" + }, { + include: "#expressions" + }] + }, { + include: "#types" + }, { + include: "#strings" + }, { + include: "#constants" + }, { + include: "#comments" + }, { + include: "#keywords" + }], + "#functions": [{ + token: "text", + regex: /(?=\s*fun)/, + push: [{ + token: "text", + regex: /}|(?=$)/, + next: "pop" + }, { + token: "keyword.other.kotlin", + regex: /\bfun\b/, + push: [{ + token: "text", + regex: /(?=\()/, + next: "pop" + }, { + token: "text", + regex: //, + next: "pop" + }, { + include: "#generics" + }] + }, { + token: ["text", "entity.name.function.kotlin"], + regex: /((?:[\.<\?>\w]+\.)?)(\w+)/ + }] + }, { + token: "text", + regex: /\(/, + push: [{ + token: "text", + regex: /\)/, + next: "pop" + }, { + include: "#parameters" + }] + }, { + token: "keyword.operator.declaration.kotlin", + regex: /:/, + push: [{ + token: "text", + regex: /(?={|=|$)/, + next: "pop" + }, { + include: "#types" + }] + }, { + token: "text", + regex: /\{/, + push: [{ + token: "text", + regex: /(?=\})/, + next: "pop" + }, { + include: "#statements" + }] + }, { + token: "keyword.operator.assignment.kotlin", + regex: /=/, + push: [{ + token: "text", + regex: /(?=$)/, + next: "pop" + }, { + include: "#expressions" + }] + }] + }], + "#generics": [{ + token: "keyword.operator.declaration.kotlin", + regex: /:/, + push: [{ + token: "text", + regex: /(?=,|>)/, + next: "pop" + }, { + include: "#types" + }] + }, { + include: "#keywords" + }, { + token: "storage.type.generic.kotlin", + regex: /\w+/ + }], + "#getters-and-setters": [{ + token: ["entity.name.function.kotlin", "text"], + regex: /\b(get)\b(\s*\(\s*\))/, + push: [{ + token: "text", + regex: /\}|(?=\bset\b)|$/, + next: "pop" + }, { + token: "keyword.operator.assignment.kotlin", + regex: /=/, + push: [{ + token: "text", + regex: /(?=$|\bset\b)/, + next: "pop" + }, { + include: "#expressions" + }] + }, { + token: "text", + regex: /\{/, + push: [{ + token: "text", + regex: /\}/, + next: "pop" + }, { + include: "#expressions" + }] + }] + }, { + token: ["entity.name.function.kotlin", "text"], + regex: /\b(set)\b(\s*)(?=\()/, + push: [{ + token: "text", + regex: /\}|(?=\bget\b)|$/, + next: "pop" + }, { + token: "text", + regex: /\(/, + push: [{ + token: "text", + regex: /\)/, + next: "pop" + }, { + include: "#parameters" + }] + }, { + token: "keyword.operator.assignment.kotlin", + regex: /=/, + push: [{ + token: "text", + regex: /(?=$|\bset\b)/, + next: "pop" + }, { + include: "#expressions" + }] + }, { + token: "text", + regex: /\{/, + push: [{ + token: "text", + regex: /\}/, + next: "pop" + }, { + include: "#expressions" + }] + }] + }], + "#imports": [{ + token: [ + "text", + "keyword.other.kotlin", + "text", + "keyword.other.kotlin" + ], + regex: /^(\s*)(import)(\s+[^ $]+\s+)((?:as)?)/ + }], + "#keywords": [{ + token: "storage.modifier.kotlin", + regex: /\b(?:var|val|public|private|protected|abstract|final|enum|open|attribute|annotation|override|inline|var|val|vararg|lazy|in|out|internal|data|tailrec|operator|infix|const|yield|typealias|typeof)\b/ + }, { + token: "keyword.control.catch-exception.kotlin", + regex: /\b(?:try|catch|finally|throw)\b/ + }, { + token: "keyword.control.kotlin", + regex: /\b(?:if|else|while|for|do|return|when|where|break|continue)\b/ + }, { + token: "keyword.operator.kotlin", + regex: /\b(?:in|is|as|assert)\b/ + }, { + token: "keyword.operator.comparison.kotlin", + regex: /==|!=|===|!==|<=|>=|<|>/ + }, { + token: "keyword.operator.assignment.kotlin", + regex: /=/ + }, { + token: "keyword.operator.declaration.kotlin", + regex: /:/ + }, { + token: "keyword.operator.dot.kotlin", + regex: /\./ + }, { + token: "keyword.operator.increment-decrement.kotlin", + regex: /\-\-|\+\+/ + }, { + token: "keyword.operator.arithmetic.kotlin", + regex: /\-|\+|\*|\/|%/ + }, { + token: "keyword.operator.arithmetic.assign.kotlin", + regex: /\+=|\-=|\*=|\/=/ + }, { + token: "keyword.operator.logical.kotlin", + regex: /!|&&|\|\|/ + }, { + token: "keyword.operator.range.kotlin", + regex: /\.\./ + }, { + token: "punctuation.terminator.kotlin", + regex: /;/ + }], + "#namespaces": [{ + token: "keyword.other.kotlin", + regex: /\bnamespace\b/ + }, { + token: "text", + regex: /\{/, + push: [{ + token: "text", + regex: /\}/, + next: "pop" + }, { + include: "#statements" + }] + }], + "#parameters": [{ + token: "keyword.operator.declaration.kotlin", + regex: /:/, + push: [{ + token: "text", + regex: /(?=,|\)|=)/, + next: "pop" + }, { + include: "#types" + }] + }, { + token: "keyword.operator.declaration.kotlin", + regex: /=/, + push: [{ + token: "text", + regex: /(?=,|\))/, + next: "pop" + }, { + include: "#expressions" + }] + }, { + include: "#keywords" + }, { + token: "variable.parameter.function.kotlin", + regex: /\w+/ + }], + "#statements": [{ + include: "#namespaces" + }, { + include: "#typedefs" + }, { + include: "#classes" + }, { + include: "#functions" + }, { + include: "#variables" + }, { + include: "#getters-and-setters" + }, { + include: "#expressions" + }], + "#strings": [{ + token: "punctuation.definition.string.begin.kotlin", + regex: /"""/, + push: [{ + token: "punctuation.definition.string.end.kotlin", + regex: /"""/, + next: "pop" + }, { + token: "variable.parameter.template.kotlin", + regex: /\$\w+|\$\{[^\}]+\}/ + }, { + token: "constant.character.escape.kotlin", + regex: /\\./ + }, { + defaultToken: "string.quoted.third.kotlin" + }] + }, { + token: "punctuation.definition.string.begin.kotlin", + regex: /"/, + push: [{ + token: "punctuation.definition.string.end.kotlin", + regex: /"/, + next: "pop" + }, { + token: "variable.parameter.template.kotlin", + regex: /\$\w+|\$\{[^\}]+\}/ + }, { + token: "constant.character.escape.kotlin", + regex: /\\./ + }, { + defaultToken: "string.quoted.double.kotlin" + }] + }, { + token: "punctuation.definition.string.begin.kotlin", + regex: /'/, + push: [{ + token: "punctuation.definition.string.end.kotlin", + regex: /'/, + next: "pop" + }, { + token: "constant.character.escape.kotlin", + regex: /\\./ + }, { + defaultToken: "string.quoted.single.kotlin" + }] + }, { + token: "punctuation.definition.string.begin.kotlin", + regex: /`/, + push: [{ + token: "punctuation.definition.string.end.kotlin", + regex: /`/, + next: "pop" + }, { + defaultToken: "string.quoted.single.kotlin" + }] + }], + "#typedefs": [{ + token: "text", + regex: /(?=\s*type)/, + push: [{ + token: "text", + regex: /(?=$)/, + next: "pop" + }, { + token: "keyword.other.kotlin", + regex: /\btype\b/ + }, { + token: "text", + regex: //, + next: "pop" + }, { + include: "#generics" + }] + }, { + include: "#expressions" + }] + }], + "#types": [{ + token: "storage.type.buildin.kotlin", + regex: /\b(?:Any|Unit|String|Int|Boolean|Char|Long|Double|Float|Short|Byte|dynamic)\b/ + }, { + token: "storage.type.buildin.array.kotlin", + regex: /\b(?:IntArray|BooleanArray|CharArray|LongArray|DoubleArray|FloatArray|ShortArray|ByteArray)\b/ + }, { + token: [ + "storage.type.buildin.collection.kotlin", + "text" + ], + regex: /\b(Array|List|Map)(<\b)/, + push: [{ + token: "text", + regex: />/, + next: "pop" + }, { + include: "#types" + }, { + include: "#keywords" + }] + }, { + token: "text", + regex: /\w+/, + next: "pop" + }, { + include: "#types" + }, { + include: "#keywords" + }] + }, { + token: ["keyword.operator.tuple.kotlin", "text"], + regex: /(#)(\()/, + push: [{ + token: "text", + regex: /\)/, + next: "pop" + }, { + include: "#expressions" + }] + }, { + token: "text", + regex: /\{/, + push: [{ + token: "text", + regex: /\}/, + next: "pop" + }, { + include: "#statements" + }] + }, { + token: "text", + regex: /\(/, + push: [{ + token: "text", + regex: /\)/, + next: "pop" + }, { + include: "#types" + }] + }, { + token: "keyword.operator.declaration.kotlin", + regex: /->/ + }], + "#variables": [{ + token: "text", + regex: /(?=\s*(?:var|val))/, + push: [{ + token: "text", + regex: /(?=:|=|$)/, + next: "pop" + }, { + token: "keyword.other.kotlin", + regex: /\b(?:var|val)\b/, + push: [{ + token: "text", + regex: /(?=:|=|$)/, + next: "pop" + }, { + token: "text", + regex: //, + next: "pop" + }, { + include: "#generics" + }] + }, { + token: ["text", "entity.name.variable.kotlin"], + regex: /((?:[\.<\?>\w]+\.)?)(\w+)/ + }] + }, { + token: "keyword.operator.declaration.kotlin", + regex: /:/, + push: [{ + token: "text", + regex: /(?==|$)/, + next: "pop" + }, { + include: "#types" + }, { + include: "#getters-and-setters" + }] + }, { + token: "keyword.operator.assignment.kotlin", + regex: /=/, + push: [{ + token: "text", + regex: /(?=$)/, + next: "pop" + }, { + include: "#expressions" + }, { + include: "#getters-and-setters" + }] + }] + }] + } + + this.normalizeRules(); +}; + +KotlinHighlightRules.metaData = { + fileTypes: ["kt", "kts"], + name: "Kotlin", + scopeName: "source.Kotlin" +} + + +oop.inherits(KotlinHighlightRules, TextHighlightRules); + +exports.KotlinHighlightRules = KotlinHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/kotlin",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/kotlin_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var KotlinHighlightRules = require("./kotlin_highlight_rules").KotlinHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = KotlinHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/kotlin" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-latex.js b/src/libs/ace/mode-latex.js new file mode 100755 index 0000000..cfdf56f --- /dev/null +++ b/src/libs/ace/mode-latex.js @@ -0,0 +1,224 @@ +ace.define("ace/mode/latex_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LatexHighlightRules = function() { + + this.$rules = { + "start" : [{ + token : "comment", + regex : "%.*$" + }, { + token : ["keyword", "lparen", "variable.parameter", "rparen", "lparen", "storage.type", "rparen"], + regex : "(\\\\(?:documentclass|usepackage|input))(?:(\\[)([^\\]]*)(\\]))?({)([^}]*)(})" + }, { + token : ["keyword","lparen", "variable.parameter", "rparen"], + regex : "(\\\\(?:label|v?ref|cite(?:[^{]*)))(?:({)([^}]*)(}))?" + }, { + token : ["storage.type", "lparen", "variable.parameter", "rparen"], + regex : "(\\\\(?:begin|end))({)(\\w*)(})" + }, { + token : "storage.type", + regex : "\\\\[a-zA-Z]+" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "constant.character.escape", + regex : "\\\\[^a-zA-Z]?" + }, { + token : "string", + regex : "\\${1,2}", + next : "equation" + }], + "equation" : [{ + token : "comment", + regex : "%.*$" + }, { + token : "string", + regex : "\\${1,2}", + next : "start" + }, { + token : "constant.character.escape", + regex : "\\\\(?:[^a-zA-Z]|[a-zA-Z]+)" + }, { + token : "error", + regex : "^\\s*$", + next : "start" + }, { + defaultToken : "string" + }] + + }; +}; +oop.inherits(LatexHighlightRules, TextHighlightRules); + +exports.LatexHighlightRules = LatexHighlightRules; + +}); + +ace.define("ace/mode/folding/latex",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var FoldMode = exports.FoldMode = function() {}; + +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /^\s*\\(begin)|(section|subsection|paragraph)\b|{\s*$/; + this.foldingStopMarker = /^\s*\\(end)\b|^\s*}/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.doc.getLine(row); + var match = this.foldingStartMarker.exec(line); + if (match) { + if (match[1]) + return this.latexBlock(session, row, match[0].length - 1); + if (match[2]) + return this.latexSection(session, row, match[0].length - 1); + + return this.openingBracketBlock(session, "{", row, match.index); + } + + var match = this.foldingStopMarker.exec(line); + if (match) { + if (match[1]) + return this.latexBlock(session, row, match[0].length - 1); + + return this.closingBracketBlock(session, "}", row, match.index + match[0].length); + } + }; + + this.latexBlock = function(session, row, column) { + var keywords = { + "\\begin": 1, + "\\end": -1 + }; + + var stream = new TokenIterator(session, row, column); + var token = stream.getCurrentToken(); + if (!token || !(token.type == "storage.type" || token.type == "constant.character.escape")) + return; + + var val = token.value; + var dir = keywords[val]; + + var getType = function() { + var token = stream.stepForward(); + var type = token.type == "lparen" ?stream.stepForward().value : ""; + if (dir === -1) { + stream.stepBackward(); + if (type) + stream.stepBackward(); + } + return type; + }; + var stack = [getType()]; + var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length; + var startRow = row; + + stream.step = dir === -1 ? stream.stepBackward : stream.stepForward; + while(token = stream.step()) { + if (!token || !(token.type == "storage.type" || token.type == "constant.character.escape")) + continue; + var level = keywords[token.value]; + if (!level) + continue; + var type = getType(); + if (level === dir) + stack.unshift(type); + else if (stack.shift() !== type || !stack.length) + break; + } + + if (stack.length) + return; + + var row = stream.getCurrentTokenRow(); + if (dir === -1) + return new Range(row, session.getLine(row).length, startRow, startColumn); + stream.stepBackward(); + return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn()); + }; + + this.latexSection = function(session, row, column) { + var keywords = ["\\subsection", "\\section", "\\begin", "\\end", "\\paragraph"]; + + var stream = new TokenIterator(session, row, column); + var token = stream.getCurrentToken(); + if (!token || token.type != "storage.type") + return; + + var startLevel = keywords.indexOf(token.value); + var stackDepth = 0 + var endRow = row; + + while(token = stream.stepForward()) { + if (token.type !== "storage.type") + continue; + var level = keywords.indexOf(token.value); + + if (level >= 2) { + if (!stackDepth) + endRow = stream.getCurrentTokenRow() - 1; + stackDepth += level == 2 ? 1 : - 1; + if (stackDepth < 0) + break + } else if (level >= startLevel) + break; + } + + if (!stackDepth) + endRow = stream.getCurrentTokenRow() - 1; + + while (endRow > row && !/\S/.test(session.getLine(endRow))) + endRow--; + + return new Range( + row, session.getLine(row).length, + endRow, session.getLine(endRow).length + ); + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/latex",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/latex_highlight_rules","ace/mode/behaviour/cstyle","ace/mode/folding/latex"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LatexHighlightRules = require("./latex_highlight_rules").LatexHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var LatexFoldMode = require("./folding/latex").FoldMode; + +var Mode = function() { + this.HighlightRules = LatexHighlightRules; + this.foldingRules = new LatexFoldMode(); + this.$behaviour = new CstyleBehaviour({ braces: true }); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.type = "text"; + + this.lineCommentStart = "%"; + + this.$id = "ace/mode/latex"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-lean.js b/src/libs/ace/mode-lean.js new file mode 100755 index 0000000..00d95f8 --- /dev/null +++ b/src/libs/ace/mode-lean.js @@ -0,0 +1,281 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/lean_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var leanHighlightRules = function() { + + var keywordControls = ( + [ "add_rewrite", "alias", "as", "assume", "attribute", + "begin", "by", "calc", "calc_refl", "calc_subst", "calc_trans", "check", + "classes", "coercions", "conjecture", "constants", "context", + "corollary", "else", "end", "environment", "eval", "example", + "exists", "exit", "export", "exposing", "extends", "fields", "find_decl", + "forall", "from", "fun", "have", "help", "hiding", "if", + "import", "in", "infix", "infixl", "infixr", "instances", + "let", "local", "match", "namespace", "notation", "obtain", "obtains", + "omit", "opaque", "open", "options", "parameter", "parameters", "postfix", + "precedence", "prefix", "premise", "premises", "print", "private", "proof", + "protected", "qed", "raw", "renaming", "section", "set_option", + "show", "tactic_hint", "take", "then", "universe", + "universes", "using", "variable", "variables", "with"].join("|") + ); + + var nameProviders = ( + ["inductive", "structure", "record", "theorem", "axiom", + "axioms", "lemma", "hypothesis", "definition", "constant"].join("|") + ); + + var storageType = ( + ["Prop", "Type", "Type'", "Type₊", "Type₁", "Type₂", "Type₃"].join("|") + ); + + var storageModifiers = ( + "\\[(" + + ["abbreviations", "all-transparent", "begin-end-hints", "class", "classes", "coercion", + "coercions", "declarations", "decls", "instance", "irreducible", + "multiple-instances", "notation", "notations", "parsing-only", "persistent", + "reduce-hints", "reducible", "tactic-hints", "visible", "wf", "whnf" + ].join("|") + + ")\\]" + ); + + var keywordOperators = ( + [].join("|") + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "keyword.operator" : keywordOperators, + "variable.language": "sorry" + }, "identifier"); + + var identifierRe = "[A-Za-z_\u03b1-\u03ba\u03bc-\u03fb\u1f00-\u1ffe\u2100-\u214f][A-Za-z0-9_'\u03b1-\u03ba\u03bc-\u03fb\u1f00-\u1ffe\u2070-\u2079\u207f-\u2089\u2090-\u209c\u2100-\u214f]*"; + var operatorRe = new RegExp(["#", "@", "->", "∼", "↔", "/", "==", "=", ":=", "<->", + "/\\", "\\/", "∧", "∨", "≠", "<", ">", "≤", "≥", "¬", + "<=", ">=", "⁻¹", "⬝", "▸", "\\+", "\\*", "-", "/", + "λ", "→", "∃", "∀", ":="].join("|")); + + this.$rules = { + "start" : [ + { + token : "comment", // single line comment "--" + regex : "--.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment "/-" + regex : "\\/-", + next : "comment" + }, { + stateName: "qqstring", + token : "string.start", regex : '"', next : [ + {token : "string.end", regex : '"', next : "start"}, + {token : "constant.language.escape", regex : /\\[n"\\]/}, + {defaultToken: "string"} + ] + }, { + token : "keyword.control", regex : nameProviders, next : [ + {token : "variable.language", regex : identifierRe, next : "start"} ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "storage.modifier", + regex : storageModifiers + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "operator", + regex : operatorRe + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ {token: "comment", regex: "-/", next: "start"}, + {defaultToken: "comment"} ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(leanHighlightRules, TextHighlightRules); + +exports.leanHighlightRules = leanHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/lean",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/lean_highlight_rules","ace/mode/matching_brace_outdent","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var leanHighlightRules = require("./lean_highlight_rules").leanHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = leanHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + this.blockComment = {start: "/-", end: "-/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "- "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/lean"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-less.js b/src/libs/ace/mode-less.js new file mode 100755 index 0000000..c407a09 --- /dev/null +++ b/src/libs/ace/mode-less.js @@ -0,0 +1,819 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/less_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/css_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CssHighlightRules = require('./css_highlight_rules'); + +var LessHighlightRules = function() { + + + var keywordList = "@import|@media|@font-face|@keyframes|@-webkit-keyframes|@supports|" + + "@charset|@plugin|@namespace|@document|@page|@viewport|@-ms-viewport|" + + "or|and|when|not"; + + var keywords = keywordList.split('|'); + + var properties = CssHighlightRules.supportType.split('|'); + + var keywordMapper = this.createKeywordMapper({ + "support.constant": CssHighlightRules.supportConstant, + "keyword": keywordList, + "support.constant.color": CssHighlightRules.supportConstantColor, + "support.constant.fonts": CssHighlightRules.supportConstantFonts + }, "identifier", true); + + var numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : ["support.function", "paren.lparen", "string", "paren.rparen"], + regex : "(url)(\\()(.*)(\\))" + }, { + token : ["support.function", "paren.lparen"], + regex : "(:extend|[a-z0-9_\\-]+)(\\()" + }, { + token : function(value) { + if (keywords.indexOf(value.toLowerCase()) > -1) + return "keyword"; + else + return "variable"; + }, + regex : "[@\\$][a-z0-9_\\-@\\$]*\\b" + }, { + token : "variable", + regex : "[@\\$]\\{[a-z0-9_\\-@\\$]*\\}" + }, { + token : function(first, second) { + if(properties.indexOf(first.toLowerCase()) > -1) { + return ["support.type.property", "text"]; + } + else { + return ["support.type.unknownProperty", "text"]; + } + }, + regex : "([a-z0-9-_]+)(\\s*:)" + }, { + token : "keyword", + regex : "&" // special case - always treat as keyword + }, { + token : keywordMapper, + regex : "\\-?[@a-z_][@a-z0-9_\\-]*" + }, { + token: "variable.language", + regex: "#[a-z0-9-_]+" + }, { + token: "variable.language", + regex: "\\.[a-z0-9-_]+" + }, { + token: "variable.language", + regex: ":[a-z_][a-z0-9-_]*" + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + token : "keyword.operator", + regex : "<|>|<=|>=|=|!=|-|%|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + this.normalizeRules(); +}; + +oop.inherits(LessHighlightRules, TextHighlightRules); + +exports.LessHighlightRules = LessHighlightRules; + +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/less",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/less_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/css","ace/mode/css_completions","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LessHighlightRules = require("./less_highlight_rules").LessHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CssCompletions = require("./css_completions").CssCompletions; + +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = LessHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions("ruleset", session, pos, prefix); + }; + + this.$id = "ace/mode/less"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-liquid.js b/src/libs/ace/mode-liquid.js new file mode 100755 index 0000000..925ef30 --- /dev/null +++ b/src/libs/ace/mode-liquid.js @@ -0,0 +1,1184 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/liquid_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + +var LiquidHighlightRules = function() { + HtmlHighlightRules.call(this); + var functions = ( + "date|capitalize|downcase|upcase|first|last|join|sort|map|size|escape|" + + "escape_once|strip_html|strip_newlines|newline_to_br|replace|replace_first|" + + "truncate|truncatewords|prepend|append|minus|plus|times|divided_by|split" + ); + + var keywords = ( + "capture|endcapture|case|endcase|when|comment|endcomment|" + + "cycle|for|endfor|in|reversed|if|endif|else|elsif|include|endinclude|unless|endunless|" + + "style|text|image|widget|plugin|marker|endmarker|tablerow|endtablerow" + ); + + var builtinVariables = 'forloop|tablerowloop'; + + var definitions = ("assign"); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": builtinVariables, + "keyword": keywords, + "support.function": functions, + "keyword.definition": definitions + }, "identifier"); + for (var rule in this.$rules) { + this.$rules[rule].unshift({ + token : "variable", + regex : "{%", + push : "liquid-start" + }, { + token : "variable", + regex : "{{", + push : "liquid-start" + }); + } + + this.addRules({ + "liquid-start" : [{ + token: "variable", + regex: "}}", + next: "pop" + }, { + token: "variable", + regex: "%}", + next: "pop" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "/|\\*|\\-|\\+|=|!=|\\?\\:" + }, { + token : "paren.lparen", + regex : /[\[\({]/ + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "text", + regex : "\\s+" + }] + }); + + this.normalizeRules(); +}; +oop.inherits(LiquidHighlightRules, TextHighlightRules); + +exports.LiquidHighlightRules = LiquidHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/liquid",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/liquid_highlight_rules","ace/mode/matching_brace_outdent"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LiquidHighlightRules = require("./liquid_highlight_rules").LiquidHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + this.HighlightRules = LiquidHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/liquid"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-lisp.js b/src/libs/ace/mode-lisp.js new file mode 100755 index 0000000..fb0897d --- /dev/null +++ b/src/libs/ace/mode-lisp.js @@ -0,0 +1,105 @@ +ace.define("ace/mode/lisp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LispHighlightRules = function() { + var keywordControl = "case|do|let|loop|if|else|when"; + var keywordOperator = "eq|neq|and|or"; + var constantLanguage = "null|nil"; + var supportFunctions = "cons|car|cdr|cond|lambda|format|setq|setf|quote|eval|append|list|listp|memberp|t|load|progn"; + + var keywordMapper = this.createKeywordMapper({ + "keyword.control": keywordControl, + "keyword.operator": keywordOperator, + "constant.language": constantLanguage, + "support.function": supportFunctions + }, "identifier", true); + + this.$rules = + { + "start": [ + { + token : "comment", + regex : ";.*$" + }, + { + token: ["storage.type.function-type.lisp", "text", "entity.name.function.lisp"], + regex: "(?:\\b(?:(defun|defmethod|defmacro))\\b)(\\s+)((?:\\w|\\-|\\!|\\?)*)" + }, + { + token: ["punctuation.definition.constant.character.lisp", "constant.character.lisp"], + regex: "(#)((?:\\w|[\\\\+-=<>'\"&#])+)" + }, + { + token: ["punctuation.definition.variable.lisp", "variable.other.global.lisp", "punctuation.definition.variable.lisp"], + regex: "(\\*)(\\S*)(\\*)" + }, + { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(?:L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, + { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(?:L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, + { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token : "string", + regex : '"(?=.)', + next : "qqstring" + } + ], + "qqstring": [ + { + token: "constant.character.escape.lisp", + regex: "\\\\." + }, + { + token : "string", + regex : '[^"\\\\]+' + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + } + ] +} + +}; + +oop.inherits(LispHighlightRules, TextHighlightRules); + +exports.LispHighlightRules = LispHighlightRules; +}); + +ace.define("ace/mode/lisp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/lisp_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LispHighlightRules = require("./lisp_highlight_rules").LispHighlightRules; + +var Mode = function() { + this.HighlightRules = LispHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ";"; + + this.$id = "ace/mode/lisp"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-live_script.js b/src/libs/ace/mode-live_script.js new file mode 100755 index 0000000..a5d36eb --- /dev/null +++ b/src/libs/ace/mode-live_script.js @@ -0,0 +1,481 @@ +ace.define("ace/mode/live_script_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LiveScriptHighlightRules = function() { + + this.$rules = { start: + [ { token: 'punctuation.definition.comment.livescript', + regex: '\\/\\*', + push: + [ { token: 'punctuation.definition.comment.livescript', + regex: '\\*\\/', + next: 'pop' }, + { token: 'storage.type.annotation.livescriptscript', + regex: '@\\w*' }, + { defaultToken: 'comment.block.livescript' } ] }, + { token: + [ 'punctuation.definition.comment.livescript', + 'comment.line.number-sign.livescript' ], + regex: '(#)(?!\\{)(.*$)' }, + { token: + [ 'variable.parameter.function.livescript', + 'meta.inline.function.livescript', + 'storage.type.function.livescript', + 'meta.inline.function.livescript', + 'variable.parameter.function.livescript', + 'meta.inline.function.livescript', + 'storage.type.function.livescript' ], + regex: '(\\s*\\!?\\(\\s*[^()]*?\\))(\\s*)(!?[~-]{1,2}>)|(\\s*\\!?)(\\(?[^()]*?\\)?)(\\s*)(<[~-]{1,2}!?)', + comment: 'match stuff like: a -> … ' }, + { token: + [ 'keyword.operator.new.livescript', + 'meta.class.instance.constructor', + 'entity.name.type.instance.livescript' ], + regex: '(new)(\\s+)(\\w+(?:\\.\\w*)*)' }, + { token: 'keyword.illegal.livescript', + regex: '\\bp(?:ackage|r(?:ivate|otected)|ublic)|interface|enum|static|yield\\b' }, + { token: 'punctuation.definition.string.begin.livescript', + regex: '\'\'\'', + push: + [ { token: 'punctuation.definition.string.end.livescript', + regex: '\'\'\'', + next: 'pop' }, + { defaultToken: 'string.quoted.heredoc.livescript' } ] }, + { token: 'punctuation.definition.string.begin.livescript', + regex: '"""', + push: + [ { token: 'punctuation.definition.string.end.livescript', + regex: '"""', + next: 'pop' }, + { token: 'constant.character.escape.livescript', + regex: '\\\\.' }, + { include: '#interpolated_livescript' }, + { defaultToken: 'string.quoted.double.heredoc.livescript' } ] }, + { token: 'punctuation.definition.string.begin.livescript', + regex: '``', + push: + [ { token: 'punctuation.definition.string.end.livescript', + regex: '``', + next: 'pop' }, + { token: 'constant.character.escape.livescript', + regex: '\\\\(?:x[\\da-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)' }, + { defaultToken: 'string.quoted.script.livescript' } ] }, + { token: 'string.array-literal.livescript', + regex: '<\\[', + push: + [ { token: 'string.array-literal.livescript', + regex: '\\]>', + next: 'pop' }, + { defaultToken: 'string.array-literal.livescript' } ] }, + { token: 'string.regexp.livescript', + regex: '/{2}(?![\\s=/*+{}?]).*?[^\\\\]/[igmy]{0,4}(?![a-zA-Z0-9])/{2}' }, + { token: 'string.regexp.livescript', + regex: '/{2}$', + push: + [ { token: 'string.regexp.livescript', + regex: '/{2}[imgy]{0,4}', + next: 'pop' }, + { include: '#embedded_spaced_comment' }, + { include: '#interpolated_livescript' }, + { defaultToken: 'string.regexp.livescript' } ] }, + { token: 'string.regexp.livescript', + regex: '/{2}', + push: + [ { token: 'string.regexp.livescript', + regex: '/{2}[imgy]{0,4}', + next: 'pop' }, + { token: 'constant.character.escape.livescript', + regex: '\\\\(?:x[\\da-fA-F]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]|37[0-7]?|[4-7][0-7]?|.)' }, + { include: '#interpolated_livescript' }, + { defaultToken: 'string.regexp.livescript' } ] }, + { token: 'string.regexp.livescript', + regex: '/(?![\\s=/*+{}?]).*?[^\\\\]/[igmy]{0,4}(?![a-zA-Z0-9])' }, + { token: 'keyword.control.livescript', + regex: '\\b(?)|\\+\\+|\\+|~(?!~?>)|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<(?!\\[)|(?|(?)|&&|\\.\\.(?:\\.)?|\\s\\.\\s|\\?|\\||\\|\\||\\:|\\*=|(?)|\\+\\+|\\+|\n\t\t\t\t~(?!~?>)|==|=|!=|<=|>=|<<=|>>=|\n\t\t\t\t>>>=|<>|<(?!\\[)|(?|(?)|&&|\\.\\.(\\.)?|\\s\\.\\s|\\?|\\||\\|\\||\\:|\\*=|(?)' }, + { token: 'keyword.operator.livescript', + regex: '(?<=\\s|^)[\\[\\{](?=.*?[\\]\\}]\\s+[:=])', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?<=\\s|^)([\\[\\{])(?=.*?[\\]\\}]\\s+[:=])', + push: + [ { token: 'keyword.operator.livescript', + regex: '[\\]\\}]\\s*[:=]', + next: 'pop' }, + { include: '#variable_name' }, + { include: '#instance_variable' }, + { include: '#single_quoted_string' }, + { include: '#double_quoted_string' }, + { include: '#numeric' }, + { defaultToken: 'meta.variable.assignment.destructured.livescript' } ] }, + { token: + [ 'meta.function.livescript', + 'entity.name.function.livescript', + 'entity.name.function.livescript', + 'entity.name.function.livescript', + 'entity.name.function.livescript', + 'variable.parameter.function.livescript', + 'entity.name.function.livescript', + 'storage.type.function.livescript' ], + regex: '(\\s*)(?=[a-zA-Z\\$_])([a-zA-Z\\$_])((?:[\\w$.:-])*)(\\s*)([:=])((?:\\s*!?\\s*\\(.*\\))?)(\\s*)(!?[~-]{1,2}>)' }, + { token: 'storage.type.function.livescript', + regex: '!?[~-]{1,2}>' }, + { token: 'constant.language.boolean.true.livescript', + regex: '\\b(?|=>)\\s*$|.*[\\[{]\\s*$', + foldingStopMarker: '^\\s*$|^\\s*[}\\]]\\s*$', + keyEquivalent: '^~C', + name: 'LiveScript', + scopeName: 'source.livescript' } + + +oop.inherits(LiveScriptHighlightRules, TextHighlightRules); + +exports.LiveScriptHighlightRules = LiveScriptHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/)#(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/live_script",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/live_script_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LiveScriptHighlightRules = require("./live_script_highlight_rules").LiveScriptHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = LiveScriptHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/live_script" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-livescript.js b/src/libs/ace/mode-livescript.js new file mode 100755 index 0000000..0e480a9 --- /dev/null +++ b/src/libs/ace/mode-livescript.js @@ -0,0 +1,271 @@ +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/livescript",["require","exports","module","ace/tokenizer","ace/mode/matching_brace_outdent","ace/mode/text"], function(require, exports, module){ + var identifier, LiveScriptMode, keywordend, stringfill; + identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; + exports.Mode = LiveScriptMode = (function(superclass){ + var indenter, prototype = extend$((import$(LiveScriptMode, superclass).displayName = 'LiveScriptMode', LiveScriptMode), superclass).prototype, constructor = LiveScriptMode; + function LiveScriptMode(){ + var that; + this.$tokenizer = new (require('../tokenizer')).Tokenizer(LiveScriptMode.Rules); + if (that = require('../mode/matching_brace_outdent')) { + this.$outdent = new that.MatchingBraceOutdent; + } + this.$id = "ace/mode/livescript"; + } + indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); + prototype.getNextLineIndent = function(state, line, tab){ + var indent, tokens; + indent = this.$getIndent(line); + tokens = this.$tokenizer.getLineTokens(line, state).tokens; + if (!(tokens.length && tokens[tokens.length - 1].type === 'comment')) { + if (state === 'start' && indenter.test(line)) { + indent += tab; + } + } + return indent; + }; + prototype.lineCommentStart = "#"; + prototype.blockComment = {start: "###", end: "###"}; + prototype.checkOutdent = function(state, line, input){ + var ref$; + return (ref$ = this.$outdent) != null ? ref$.checkOutdent(line, input) : void 8; + }; + prototype.autoOutdent = function(state, doc, row){ + var ref$; + return (ref$ = this.$outdent) != null ? ref$.autoOutdent(doc, row) : void 8; + }; + return LiveScriptMode; + }(require('../mode/text').Mode)); + keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; + stringfill = { + defaultToken: 'string' + }; + LiveScriptMode.Rules = { + start: [ + { + token: 'keyword', + regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend + }, { + token: 'constant.language', + regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend + }, { + token: 'invalid.illegal', + regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend + }, { + token: 'language.support.class', + regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend + }, { + token: 'language.support.function', + regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend + }, { + token: 'variable.language', + regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend + }, { + token: 'identifier', + regex: identifier + '\\s*:(?![:=])' + }, { + token: 'variable', + regex: identifier + }, { + token: 'keyword.operator', + regex: '(?:\\.{3}|\\s+\\?)' + }, { + token: 'keyword.variable', + regex: '(?:@+|::|\\.\\.)', + next: 'key' + }, { + token: 'keyword.operator', + regex: '\\.\\s*', + next: 'key' + }, { + token: 'string', + regex: '\\\\\\S[^\\s,;)}\\]]*' + }, { + token: 'string.doc', + regex: '\'\'\'', + next: 'qdoc' + }, { + token: 'string.doc', + regex: '"""', + next: 'qqdoc' + }, { + token: 'string', + regex: '\'', + next: 'qstring' + }, { + token: 'string', + regex: '"', + next: 'qqstring' + }, { + token: 'string', + regex: '`', + next: 'js' + }, { + token: 'string', + regex: '<\\[', + next: 'words' + }, { + token: 'string.regex', + regex: '//', + next: 'heregex' + }, { + token: 'comment.doc', + regex: '/\\*', + next: 'comment' + }, { + token: 'comment', + regex: '#.*' + }, { + token: 'string.regex', + regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', + next: 'key' + }, { + token: 'constant.numeric', + regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' + }, { + token: 'lparen', + regex: '[({[]' + }, { + token: 'rparen', + regex: '[)}\\]]', + next: 'key' + }, { + token: 'keyword.operator', + regex: '[\\^!|&%+\\-]+' + }, { + token: 'text', + regex: '\\s+' + } + ], + heregex: [ + { + token: 'string.regex', + regex: '.*?//[gimy$?]{0,4}', + next: 'start' + }, { + token: 'string.regex', + regex: '\\s*#{' + }, { + token: 'comment.regex', + regex: '\\s+(?:#.*)?' + }, { + defaultToken: 'string.regex' + } + ], + key: [ + { + token: 'keyword.operator', + regex: '[.?@!]+' + }, { + token: 'identifier', + regex: identifier, + next: 'start' + }, { + token: 'text', + regex: '', + next: 'start' + } + ], + comment: [ + { + token: 'comment.doc', + regex: '.*?\\*/', + next: 'start' + }, { + defaultToken: 'comment.doc' + } + ], + qdoc: [ + { + token: 'string', + regex: ".*?'''", + next: 'key' + }, stringfill + ], + qqdoc: [ + { + token: 'string', + regex: '.*?"""', + next: 'key' + }, stringfill + ], + qstring: [ + { + token: 'string', + regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', + next: 'key' + }, stringfill + ], + qqstring: [ + { + token: 'string', + regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', + next: 'key' + }, stringfill + ], + js: [ + { + token: 'string', + regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', + next: 'key' + }, stringfill + ], + words: [ + { + token: 'string', + regex: '.*?\\]>', + next: 'key' + }, stringfill + ] + }; +function extend$(sub, sup){ + function fun(){} fun.prototype = (sub.superclass = sup).prototype; + (sub.prototype = new fun).constructor = sub; + if (typeof sup.extended == 'function') sup.extended(sub); + return sub; +} +function import$(obj, src){ + var own = {}.hasOwnProperty; + for (var key in src) if (own.call(src, key)) obj[key] = src[key]; + return obj; +} +}); diff --git a/src/libs/ace/mode-logiql.js b/src/libs/ace/mode-logiql.js new file mode 100755 index 0000000..f4ea30d --- /dev/null +++ b/src/libs/ace/mode-logiql.js @@ -0,0 +1,310 @@ +ace.define("ace/mode/logiql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LogiQLHighlightRules = function() { + + this.$rules = { start: + [ { token: 'comment.block', + regex: '/\\*', + push: + [ { token: 'comment.block', regex: '\\*/', next: 'pop' }, + { defaultToken: 'comment.block' } ] + }, + { token: 'comment.single', + regex: '//.*' + }, + { token: 'constant.numeric', + regex: '\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?[fd]?' + }, + { token: 'string', + regex: '"', + push: + [ { token: 'string', regex: '"', next: 'pop' }, + { defaultToken: 'string' } ] + }, + { token: 'constant.language', + regex: '\\b(true|false)\\b' + }, + { token: 'entity.name.type.logicblox', + regex: '`[a-zA-Z_:]+(\\d|\\a)*\\b' + }, + { token: 'keyword.start', regex: '->', comment: 'Constraint' }, + { token: 'keyword.start', regex: '-->', comment: 'Level 1 Constraint'}, + { token: 'keyword.start', regex: '<-', comment: 'Rule' }, + { token: 'keyword.start', regex: '<--', comment: 'Level 1 Rule' }, + { token: 'keyword.end', regex: '\\.', comment: 'Terminator' }, + { token: 'keyword.other', regex: '!', comment: 'Negation' }, + { token: 'keyword.other', regex: ',', comment: 'Conjunction' }, + { token: 'keyword.other', regex: ';', comment: 'Disjunction' }, + { token: 'keyword.operator', regex: '<=|>=|!=|<|>', comment: 'Equality'}, + { token: 'keyword.other', regex: '@', comment: 'Equality' }, + { token: 'keyword.operator', regex: '\\+|-|\\*|/', comment: 'Arithmetic operations'}, + { token: 'keyword', regex: '::', comment: 'Colon colon' }, + { token: 'support.function', + regex: '\\b(agg\\s*<<)', + push: + [ { include: '$self' }, + { token: 'support.function', + regex: '>>', + next: 'pop' } ] + }, + { token: 'storage.modifier', + regex: '\\b(lang:[\\w:]*)' + }, + { token: [ 'storage.type', 'text' ], + regex: '(export|sealed|clauses|block|alias|alias_all)(\\s*\\()(?=`)' + }, + { token: 'entity.name', + regex: '[a-zA-Z_][a-zA-Z_0-9:]*(@prev|@init|@final)?(?=(\\(|\\[))' + }, + { token: 'variable.parameter', + regex: '([a-zA-Z][a-zA-Z_0-9]*|_)\\s*(?=(,|\\.|<-|->|\\)|\\]|=))' + } ] } + + this.normalizeRules(); +}; + +oop.inherits(LogiQLHighlightRules, TextHighlightRules); + +exports.LogiQLHighlightRules = LogiQLHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/logiql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/logiql_highlight_rules","ace/mode/folding/coffee","ace/token_iterator","ace/range","ace/mode/behaviour/cstyle","ace/mode/matching_brace_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LogiQLHighlightRules = require("./logiql_highlight_rules").LogiQLHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + this.HighlightRules = LogiQLHighlightRules; + this.foldingRules = new FoldMode(); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + if (/comment|string/.test(endState)) + return indent; + if (tokens.length && tokens[tokens.length - 1].type == "comment.single") + return indent; + + var match = line.match(); + if (/(-->|<--|<-|->|{)\s*$/.test(line)) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (this.$outdent.checkOutdent(line, input)) + return true; + + if (input !== "\n" && input !== "\r\n") + return false; + + if (!/^\s+/.test(line)) + return false; + + return true; + }; + + this.autoOutdent = function(state, doc, row) { + if (this.$outdent.autoOutdent(doc, row)) + return; + var prevLine = doc.getLine(row); + var match = prevLine.match(/^\s+/); + var column = prevLine.lastIndexOf(".") + 1; + if (!match || !row || !column) return 0; + + var line = doc.getLine(row + 1); + var startRange = this.getMatching(doc, {row: row, column: column}); + if (!startRange || startRange.start.row == row) return 0; + + column = match[0].length; + var indent = this.$getIndent(doc.getLine(startRange.start.row)); + doc.replace(new Range(row + 1, 0, row + 1, column), indent); + }; + + this.getMatching = function(session, row, column) { + if (row == undefined) + row = session.selection.lead + if (typeof row == "object") { + column = row.column; + row = row.row; + } + + var startToken = session.getTokenAt(row, column); + var KW_START = "keyword.start", KW_END = "keyword.end"; + var tok; + if (!startToken) + return; + if (startToken.type == KW_START) { + var it = new TokenIterator(session, row, column); + it.step = it.stepForward; + } else if (startToken.type == KW_END) { + var it = new TokenIterator(session, row, column); + it.step = it.stepBackward; + } else + return; + + while (tok = it.step()) { + if (tok.type == KW_START || tok.type == KW_END) + break; + } + if (!tok || tok.type == startToken.type) + return; + + var col = it.getCurrentTokenColumn(); + var row = it.getCurrentTokenRow(); + return new Range(row, col, row, col + tok.value.length); + }; + this.$id = "ace/mode/logiql"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-lsl.js b/src/libs/ace/mode-lsl.js new file mode 100755 index 0000000..2531f6e --- /dev/null +++ b/src/libs/ace/mode-lsl.js @@ -0,0 +1,335 @@ +ace.define("ace/mode/lsl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +oop.inherits(LSLHighlightRules, TextHighlightRules); + +function LSLHighlightRules() { + var keywordMapper = this.createKeywordMapper({ + "constant.language.float.lsl" : "DEG_TO_RAD|PI|PI_BY_TWO|RAD_TO_DEG|SQRT2|TWO_PI", + "constant.language.integer.lsl": "ACTIVE|AGENT|AGENT_ALWAYS_RUN|AGENT_ATTACHMENTS|AGENT_AUTOPILOT|AGENT_AWAY|AGENT_BUSY|AGENT_BY_LEGACY_NAME|AGENT_BY_USERNAME|AGENT_CROUCHING|AGENT_FLYING|AGENT_IN_AIR|AGENT_LIST_PARCEL|AGENT_LIST_PARCEL_OWNER|AGENT_LIST_REGION|AGENT_MOUSELOOK|AGENT_ON_OBJECT|AGENT_SCRIPTED|AGENT_SITTING|AGENT_TYPING|AGENT_WALKING|ALL_SIDES|ANIM_ON|ATTACH_AVATAR_CENTER|ATTACH_BACK|ATTACH_BELLY|ATTACH_CHEST|ATTACH_CHIN|ATTACH_HEAD|ATTACH_HUD_BOTTOM|ATTACH_HUD_BOTTOM_LEFT|ATTACH_HUD_BOTTOM_RIGHT|ATTACH_HUD_CENTER_1|ATTACH_HUD_CENTER_2|ATTACH_HUD_TOP_CENTER|ATTACH_HUD_TOP_LEFT|ATTACH_HUD_TOP_RIGHT|ATTACH_LEAR|ATTACH_LEFT_PEC|ATTACH_LEYE|ATTACH_LFOOT|ATTACH_LHAND|ATTACH_LHIP|ATTACH_LLARM|ATTACH_LLLEG|ATTACH_LSHOULDER|ATTACH_LUARM|ATTACH_LULEG|ATTACH_MOUTH|ATTACH_NECK|ATTACH_NOSE|ATTACH_PELVIS|ATTACH_REAR|ATTACH_REYE|ATTACH_RFOOT|ATTACH_RHAND|ATTACH_RHIP|ATTACH_RIGHT_PEC|ATTACH_RLARM|ATTACH_RLLEG|ATTACH_RSHOULDER|ATTACH_RUARM|ATTACH_RULEG|AVOID_CHARACTERS|AVOID_DYNAMIC_OBSTACLES|AVOID_NONE|CAMERA_ACTIVE|CAMERA_BEHINDNESS_ANGLE|CAMERA_BEHINDNESS_LAG|CAMERA_DISTANCE|CAMERA_FOCUS|CAMERA_FOCUS_LAG|CAMERA_FOCUS_LOCKED|CAMERA_FOCUS_OFFSET|CAMERA_FOCUS_THRESHOLD|CAMERA_PITCH|CAMERA_POSITION|CAMERA_POSITION_LAG|CAMERA_POSITION_LOCKED|CAMERA_POSITION_THRESHOLD|CHANGED_ALLOWED_DROP|CHANGED_COLOR|CHANGED_INVENTORY|CHANGED_LINK|CHANGED_MEDIA|CHANGED_OWNER|CHANGED_REGION|CHANGED_REGION_START|CHANGED_SCALE|CHANGED_SHAPE|CHANGED_TELEPORT|CHANGED_TEXTURE|CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES|CHARACTER_AVOIDANCE_MODE|CHARACTER_CMD_JUMP|CHARACTER_CMD_SMOOTH_STOP|CHARACTER_CMD_STOP|CHARACTER_DESIRED_SPEED|CHARACTER_DESIRED_TURN_SPEED|CHARACTER_LENGTH|CHARACTER_MAX_ACCEL|CHARACTER_MAX_DECEL|CHARACTER_MAX_SPEED|CHARACTER_MAX_TURN_RADIUS|CHARACTER_ORIENTATION|CHARACTER_RADIUS|CHARACTER_STAY_WITHIN_PARCEL|CHARACTER_TYPE|CHARACTER_TYPE_A|CHARACTER_TYPE_B|CHARACTER_TYPE_C|CHARACTER_TYPE_D|CHARACTER_TYPE_NONE|CLICK_ACTION_BUY|CLICK_ACTION_NONE|CLICK_ACTION_OPEN|CLICK_ACTION_OPEN_MEDIA|CLICK_ACTION_PAY|CLICK_ACTION_PLAY|CLICK_ACTION_SIT|CLICK_ACTION_TOUCH|CONTENT_TYPE_ATOM|CONTENT_TYPE_FORM|CONTENT_TYPE_HTML|CONTENT_TYPE_JSON|CONTENT_TYPE_LLSD|CONTENT_TYPE_RSS|CONTENT_TYPE_TEXT|CONTENT_TYPE_XHTML|CONTENT_TYPE_XML|CONTROL_BACK|CONTROL_DOWN|CONTROL_FWD|CONTROL_LBUTTON|CONTROL_LEFT|CONTROL_ML_LBUTTON|CONTROL_RIGHT|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT|CONTROL_UP|DATA_BORN|DATA_NAME|DATA_ONLINE|DATA_PAYINFO|DATA_SIM_POS|DATA_SIM_RATING|DATA_SIM_STATUS|DEBUG_CHANNEL|DENSITY|ERR_GENERIC|ERR_MALFORMED_PARAMS|ERR_PARCEL_PERMISSIONS|ERR_RUNTIME_PERMISSIONS|ERR_THROTTLED|ESTATE_ACCESS_ALLOWED_AGENT_ADD|ESTATE_ACCESS_ALLOWED_AGENT_REMOVE|ESTATE_ACCESS_ALLOWED_GROUP_ADD|ESTATE_ACCESS_ALLOWED_GROUP_REMOVE|ESTATE_ACCESS_BANNED_AGENT_ADD|ESTATE_ACCESS_BANNED_AGENT_REMOVE|FALSE|FORCE_DIRECT_PATH|FRICTION|GCNP_RADIUS|GCNP_STATIC|GRAVITY_MULTIPLIER|HORIZONTAL|HTTP_BODY_MAXLENGTH|HTTP_BODY_TRUNCATED|HTTP_CUSTOM_HEADER|HTTP_METHOD|HTTP_MIMETYPE|HTTP_PRAGMA_NO_CACHE|HTTP_VERBOSE_THROTTLE|HTTP_VERIFY_CERT|INVENTORY_ALL|INVENTORY_ANIMATION|INVENTORY_BODYPART|INVENTORY_CLOTHING|INVENTORY_GESTURE|INVENTORY_LANDMARK|INVENTORY_NONE|INVENTORY_NOTECARD|INVENTORY_OBJECT|INVENTORY_SCRIPT|INVENTORY_SOUND|INVENTORY_TEXTURE|JSON_APPEND|KFM_CMD_PAUSE|KFM_CMD_PLAY|KFM_CMD_SET_MODE|KFM_CMD_STOP|KFM_COMMAND|KFM_DATA|KFM_FORWARD|KFM_LOOP|KFM_MODE|KFM_PING_PONG|KFM_REVERSE|KFM_ROTATION|KFM_TRANSLATION|LAND_LEVEL|LAND_LOWER|LAND_NOISE|LAND_RAISE|LAND_REVERT|LAND_SMOOTH|LINK_ALL_CHILDREN|LINK_ALL_OTHERS|LINK_ROOT|LINK_SET|LINK_THIS|LIST_STAT_GEOMETRIC_MEAN|LIST_STAT_MAX|LIST_STAT_MEAN|LIST_STAT_MEDIAN|LIST_STAT_MIN|LIST_STAT_NUM_COUNT|LIST_STAT_RANGE|LIST_STAT_STD_DEV|LIST_STAT_SUM|LIST_STAT_SUM_SQUARES|LOOP|MASK_BASE|MASK_EVERYONE|MASK_GROUP|MASK_NEXT|MASK_OWNER|OBJECT_ATTACHED_POINT|OBJECT_BODY_SHAPE_TYPE|OBJECT_CHARACTER_TIME|OBJECT_CLICK_ACTION|OBJECT_CREATOR|OBJECT_DESC|OBJECT_GROUP|OBJECT_HOVER_HEIGHT|OBJECT_LAST_OWNER_ID|OBJECT_NAME|OBJECT_OWNER|OBJECT_PATHFINDING_TYPE|OBJECT_PHANTOM|OBJECT_PHYSICS|OBJECT_PHYSICS_COST|OBJECT_POS|OBJECT_PRIM_EQUIVALENCE|OBJECT_RENDER_WEIGHT|OBJECT_RETURN_PARCEL|OBJECT_RETURN_PARCEL_OWNER|OBJECT_RETURN_REGION|OBJECT_ROOT|OBJECT_ROT|OBJECT_RUNNING_SCRIPT_COUNT|OBJECT_SCRIPT_MEMORY|OBJECT_SCRIPT_TIME|OBJECT_SERVER_COST|OBJECT_STREAMING_COST|OBJECT_TEMP_ON_REZ|OBJECT_TOTAL_SCRIPT_COUNT|OBJECT_UNKNOWN_DETAIL|OBJECT_VELOCITY|OPT_AVATAR|OPT_CHARACTER|OPT_EXCLUSION_VOLUME|OPT_LEGACY_LINKSET|OPT_MATERIAL_VOLUME|OPT_OTHER|OPT_STATIC_OBSTACLE|OPT_WALKABLE|PARCEL_COUNT_GROUP|PARCEL_COUNT_OTHER|PARCEL_COUNT_OWNER|PARCEL_COUNT_SELECTED|PARCEL_COUNT_TEMP|PARCEL_COUNT_TOTAL|PARCEL_DETAILS_AREA|PARCEL_DETAILS_DESC|PARCEL_DETAILS_GROUP|PARCEL_DETAILS_ID|PARCEL_DETAILS_NAME|PARCEL_DETAILS_OWNER|PARCEL_DETAILS_SEE_AVATARS|PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY|PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS|PARCEL_FLAG_ALLOW_CREATE_OBJECTS|PARCEL_FLAG_ALLOW_DAMAGE|PARCEL_FLAG_ALLOW_FLY|PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY|PARCEL_FLAG_ALLOW_GROUP_SCRIPTS|PARCEL_FLAG_ALLOW_LANDMARK|PARCEL_FLAG_ALLOW_SCRIPTS|PARCEL_FLAG_ALLOW_TERRAFORM|PARCEL_FLAG_LOCAL_SOUND_ONLY|PARCEL_FLAG_RESTRICT_PUSHOBJECT|PARCEL_FLAG_USE_ACCESS_GROUP|PARCEL_FLAG_USE_ACCESS_LIST|PARCEL_FLAG_USE_BAN_LIST|PARCEL_FLAG_USE_LAND_PASS_LIST|PARCEL_MEDIA_COMMAND_AGENT|PARCEL_MEDIA_COMMAND_AUTO_ALIGN|PARCEL_MEDIA_COMMAND_DESC|PARCEL_MEDIA_COMMAND_LOOP|PARCEL_MEDIA_COMMAND_LOOP_SET|PARCEL_MEDIA_COMMAND_PAUSE|PARCEL_MEDIA_COMMAND_PLAY|PARCEL_MEDIA_COMMAND_SIZE|PARCEL_MEDIA_COMMAND_STOP|PARCEL_MEDIA_COMMAND_TEXTURE|PARCEL_MEDIA_COMMAND_TIME|PARCEL_MEDIA_COMMAND_TYPE|PARCEL_MEDIA_COMMAND_UNLOAD|PARCEL_MEDIA_COMMAND_URL|PASS_ALWAYS|PASS_IF_NOT_HANDLED|PASS_NEVER|PASSIVE|PATROL_PAUSE_AT_WAYPOINTS|PAYMENT_INFO_ON_FILE|PAYMENT_INFO_USED|PAY_DEFAULT|PAY_HIDE|PERMISSION_ATTACH|PERMISSION_CHANGE_LINKS|PERMISSION_CONTROL_CAMERA|PERMISSION_DEBIT|PERMISSION_OVERRIDE_ANIMATIONS|PERMISSION_RETURN_OBJECTS|PERMISSION_SILENT_ESTATE_MANAGEMENT|PERMISSION_TAKE_CONTROLS|PERMISSION_TELEPORT|PERMISSION_TRACK_CAMERA|PERMISSION_TRIGGER_ANIMATION|PERM_ALL|PERM_COPY|PERM_MODIFY|PERM_MOVE|PERM_TRANSFER|PING_PONG|PRIM_ALPHA_MODE|PRIM_ALPHA_MODE_BLEND|PRIM_ALPHA_MODE_EMISSIVE|PRIM_ALPHA_MODE_MASK|PRIM_ALPHA_MODE_NONE|PRIM_BUMP_BARK|PRIM_BUMP_BLOBS|PRIM_BUMP_BRICKS|PRIM_BUMP_BRIGHT|PRIM_BUMP_CHECKER|PRIM_BUMP_CONCRETE|PRIM_BUMP_DARK|PRIM_BUMP_DISKS|PRIM_BUMP_GRAVEL|PRIM_BUMP_LARGETILE|PRIM_BUMP_NONE|PRIM_BUMP_SHINY|PRIM_BUMP_SIDING|PRIM_BUMP_STONE|PRIM_BUMP_STUCCO|PRIM_BUMP_SUCTION|PRIM_BUMP_TILE|PRIM_BUMP_WEAVE|PRIM_BUMP_WOOD|PRIM_COLOR|PRIM_DESC|PRIM_FLEXIBLE|PRIM_FULLBRIGHT|PRIM_GLOW|PRIM_HOLE_CIRCLE|PRIM_HOLE_DEFAULT|PRIM_HOLE_SQUARE|PRIM_HOLE_TRIANGLE|PRIM_LINK_TARGET|PRIM_MATERIAL|PRIM_MATERIAL_FLESH|PRIM_MATERIAL_GLASS|PRIM_MATERIAL_METAL|PRIM_MATERIAL_PLASTIC|PRIM_MATERIAL_RUBBER|PRIM_MATERIAL_STONE|PRIM_MATERIAL_WOOD|PRIM_MEDIA_ALT_IMAGE_ENABLE|PRIM_MEDIA_AUTO_LOOP|PRIM_MEDIA_AUTO_PLAY|PRIM_MEDIA_AUTO_SCALE|PRIM_MEDIA_AUTO_ZOOM|PRIM_MEDIA_CONTROLS|PRIM_MEDIA_CONTROLS_MINI|PRIM_MEDIA_CONTROLS_STANDARD|PRIM_MEDIA_CURRENT_URL|PRIM_MEDIA_FIRST_CLICK_INTERACT|PRIM_MEDIA_HEIGHT_PIXELS|PRIM_MEDIA_HOME_URL|PRIM_MEDIA_MAX_HEIGHT_PIXELS|PRIM_MEDIA_MAX_URL_LENGTH|PRIM_MEDIA_MAX_WHITELIST_COUNT|PRIM_MEDIA_MAX_WHITELIST_SIZE|PRIM_MEDIA_MAX_WIDTH_PIXELS|PRIM_MEDIA_PARAM_MAX|PRIM_MEDIA_PERMS_CONTROL|PRIM_MEDIA_PERMS_INTERACT|PRIM_MEDIA_PERM_ANYONE|PRIM_MEDIA_PERM_GROUP|PRIM_MEDIA_PERM_NONE|PRIM_MEDIA_PERM_OWNER|PRIM_MEDIA_WHITELIST|PRIM_MEDIA_WHITELIST_ENABLE|PRIM_MEDIA_WIDTH_PIXELS|PRIM_NAME|PRIM_NORMAL|PRIM_OMEGA|PRIM_PHANTOM|PRIM_PHYSICS|PRIM_PHYSICS_SHAPE_CONVEX|PRIM_PHYSICS_SHAPE_NONE|PRIM_PHYSICS_SHAPE_PRIM|PRIM_PHYSICS_SHAPE_TYPE|PRIM_POINT_LIGHT|PRIM_POSITION|PRIM_POS_LOCAL|PRIM_ROTATION|PRIM_ROT_LOCAL|PRIM_SCULPT_FLAG_INVERT|PRIM_SCULPT_FLAG_MIRROR|PRIM_SCULPT_TYPE_CYLINDER|PRIM_SCULPT_TYPE_MASK|PRIM_SCULPT_TYPE_PLANE|PRIM_SCULPT_TYPE_SPHERE|PRIM_SCULPT_TYPE_TORUS|PRIM_SHINY_HIGH|PRIM_SHINY_LOW|PRIM_SHINY_MEDIUM|PRIM_SHINY_NONE|PRIM_SIZE|PRIM_SLICE|PRIM_SPECULAR|PRIM_TEMP_ON_REZ|PRIM_TEXGEN|PRIM_TEXGEN_DEFAULT|PRIM_TEXGEN_PLANAR|PRIM_TEXT|PRIM_TEXTURE|PRIM_TYPE|PRIM_TYPE_BOX|PRIM_TYPE_CYLINDER|PRIM_TYPE_PRISM|PRIM_TYPE_RING|PRIM_TYPE_SCULPT|PRIM_TYPE_SPHERE|PRIM_TYPE_TORUS|PRIM_TYPE_TUBE|PROFILE_NONE|PROFILE_SCRIPT_MEMORY|PSYS_PART_BF_DEST_COLOR|PSYS_PART_BF_ONE|PSYS_PART_BF_ONE_MINUS_DEST_COLOR|PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA|PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR|PSYS_PART_BF_SOURCE_ALPHA|PSYS_PART_BF_SOURCE_COLOR|PSYS_PART_BF_ZERO|PSYS_PART_BLEND_FUNC_DEST|PSYS_PART_BLEND_FUNC_SOURCE|PSYS_PART_BOUNCE_MASK|PSYS_PART_EMISSIVE_MASK|PSYS_PART_END_ALPHA|PSYS_PART_END_COLOR|PSYS_PART_END_GLOW|PSYS_PART_END_SCALE|PSYS_PART_FLAGS|PSYS_PART_FOLLOW_SRC_MASK|PSYS_PART_FOLLOW_VELOCITY_MASK|PSYS_PART_INTERP_COLOR_MASK|PSYS_PART_INTERP_SCALE_MASK|PSYS_PART_MAX_AGE|PSYS_PART_RIBBON_MASK|PSYS_PART_START_ALPHA|PSYS_PART_START_COLOR|PSYS_PART_START_GLOW|PSYS_PART_START_SCALE|PSYS_PART_TARGET_LINEAR_MASK|PSYS_PART_TARGET_POS_MASK|PSYS_PART_WIND_MASK|PSYS_SRC_ACCEL|PSYS_SRC_ANGLE_BEGIN|PSYS_SRC_ANGLE_END|PSYS_SRC_BURST_PART_COUNT|PSYS_SRC_BURST_RADIUS|PSYS_SRC_BURST_RATE|PSYS_SRC_BURST_SPEED_MAX|PSYS_SRC_BURST_SPEED_MIN|PSYS_SRC_MAX_AGE|PSYS_SRC_OMEGA|PSYS_SRC_PATTERN|PSYS_SRC_PATTERN_ANGLE|PSYS_SRC_PATTERN_ANGLE_CONE|PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY|PSYS_SRC_PATTERN_DROP|PSYS_SRC_PATTERN_EXPLODE|PSYS_SRC_TARGET_KEY|PSYS_SRC_TEXTURE|PUBLIC_CHANNEL|PURSUIT_FUZZ_FACTOR|PURSUIT_GOAL_TOLERANCE|PURSUIT_INTERCEPT|PURSUIT_OFFSET|PU_EVADE_HIDDEN|PU_EVADE_SPOTTED|PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED|PU_FAILURE_INVALID_GOAL|PU_FAILURE_INVALID_START|PU_FAILURE_NO_NAVMESH|PU_FAILURE_NO_VALID_DESTINATION|PU_FAILURE_OTHER|PU_FAILURE_PARCEL_UNREACHABLE|PU_FAILURE_TARGET_GONE|PU_FAILURE_UNREACHABLE|PU_GOAL_REACHED|PU_SLOWDOWN_DISTANCE_REACHED|RCERR_CAST_TIME_EXCEEDED|RCERR_SIM_PERF_LOW|RCERR_UNKNOWN|RC_DATA_FLAGS|RC_DETECT_PHANTOM|RC_GET_LINK_NUM|RC_GET_NORMAL|RC_GET_ROOT_KEY|RC_MAX_HITS|RC_REJECT_AGENTS|RC_REJECT_LAND|RC_REJECT_NONPHYSICAL|RC_REJECT_PHYSICAL|RC_REJECT_TYPES|REGION_FLAG_ALLOW_DAMAGE|REGION_FLAG_ALLOW_DIRECT_TELEPORT|REGION_FLAG_BLOCK_FLY|REGION_FLAG_BLOCK_TERRAFORM|REGION_FLAG_DISABLE_COLLISIONS|REGION_FLAG_DISABLE_PHYSICS|REGION_FLAG_FIXED_SUN|REGION_FLAG_RESTRICT_PUSHOBJECT|REGION_FLAG_SANDBOX|REMOTE_DATA_CHANNEL|REMOTE_DATA_REPLY|REMOTE_DATA_REQUEST|REQUIRE_LINE_OF_SIGHT|RESTITUTION|REVERSE|ROTATE|SCALE|SCRIPTED|SIM_STAT_PCT_CHARS_STEPPED|SMOOTH|STATUS_BLOCK_GRAB|STATUS_BLOCK_GRAB_OBJECT|STATUS_BOUNDS_ERROR|STATUS_CAST_SHADOWS|STATUS_DIE_AT_EDGE|STATUS_INTERNAL_ERROR|STATUS_MALFORMED_PARAMS|STATUS_NOT_FOUND|STATUS_NOT_SUPPORTED|STATUS_OK|STATUS_PHANTOM|STATUS_PHYSICS|STATUS_RETURN_AT_EDGE|STATUS_ROTATE_X|STATUS_ROTATE_Y|STATUS_ROTATE_Z|STATUS_SANDBOX|STATUS_TYPE_MISMATCH|STATUS_WHITELIST_FAILED|STRING_TRIM|STRING_TRIM_HEAD|STRING_TRIM_TAIL|TOUCH_INVALID_FACE|TRAVERSAL_TYPE|TRAVERSAL_TYPE_FAST|TRAVERSAL_TYPE_NONE|TRAVERSAL_TYPE_SLOW|TRUE|TYPE_FLOAT|TYPE_INTEGER|TYPE_INVALID|TYPE_KEY|TYPE_ROTATION|TYPE_STRING|TYPE_VECTOR|VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY|VEHICLE_ANGULAR_DEFLECTION_TIMESCALE|VEHICLE_ANGULAR_FRICTION_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DIRECTION|VEHICLE_ANGULAR_MOTOR_TIMESCALE|VEHICLE_BANKING_EFFICIENCY|VEHICLE_BANKING_MIX|VEHICLE_BANKING_TIMESCALE|VEHICLE_BUOYANCY|VEHICLE_FLAG_CAMERA_DECOUPLED|VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT|VEHICLE_FLAG_HOVER_TERRAIN_ONLY|VEHICLE_FLAG_HOVER_UP_ONLY|VEHICLE_FLAG_HOVER_WATER_ONLY|VEHICLE_FLAG_LIMIT_MOTOR_UP|VEHICLE_FLAG_LIMIT_ROLL_ONLY|VEHICLE_FLAG_MOUSELOOK_BANK|VEHICLE_FLAG_MOUSELOOK_STEER|VEHICLE_FLAG_NO_DEFLECTION_UP|VEHICLE_HOVER_EFFICIENCY|VEHICLE_HOVER_HEIGHT|VEHICLE_HOVER_TIMESCALE|VEHICLE_LINEAR_DEFLECTION_EFFICIENCY|VEHICLE_LINEAR_DEFLECTION_TIMESCALE|VEHICLE_LINEAR_FRICTION_TIMESCALE|VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE|VEHICLE_LINEAR_MOTOR_DIRECTION|VEHICLE_LINEAR_MOTOR_OFFSET|VEHICLE_LINEAR_MOTOR_TIMESCALE|VEHICLE_REFERENCE_FRAME|VEHICLE_TYPE_AIRPLANE|VEHICLE_TYPE_BALLOON|VEHICLE_TYPE_BOAT|VEHICLE_TYPE_CAR|VEHICLE_TYPE_NONE|VEHICLE_TYPE_SLED|VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY|VEHICLE_VERTICAL_ATTRACTION_TIMESCALE|VERTICAL|WANDER_PAUSE_AT_WAYPOINTS|XP_ERROR_EXPERIENCES_DISABLED|XP_ERROR_EXPERIENCE_DISABLED|XP_ERROR_EXPERIENCE_SUSPENDED|XP_ERROR_INVALID_EXPERIENCE|XP_ERROR_INVALID_PARAMETERS|XP_ERROR_KEY_NOT_FOUND|XP_ERROR_MATURITY_EXCEEDED|XP_ERROR_NONE|XP_ERROR_NOT_FOUND|XP_ERROR_NOT_PERMITTED|XP_ERROR_NO_EXPERIENCE|XP_ERROR_QUOTA_EXCEEDED|XP_ERROR_RETRY_UPDATE|XP_ERROR_STORAGE_EXCEPTION|XP_ERROR_STORE_DISABLED|XP_ERROR_THROTTLED|XP_ERROR_UNKNOWN_ERROR", + "constant.language.integer.boolean.lsl" : "FALSE|TRUE", + "constant.language.quaternion.lsl" : "ZERO_ROTATION", + "constant.language.string.lsl" : "EOF|JSON_ARRAY|JSON_DELETE|JSON_FALSE|JSON_INVALID|JSON_NULL|JSON_NUMBER|JSON_OBJECT|JSON_STRING|JSON_TRUE|NULL_KEY|TEXTURE_BLANK|TEXTURE_DEFAULT|TEXTURE_MEDIA|TEXTURE_PLYWOOD|TEXTURE_TRANSPARENT|URL_REQUEST_DENIED|URL_REQUEST_GRANTED", + "constant.language.vector.lsl" : "TOUCH_INVALID_TEXCOORD|TOUCH_INVALID_VECTOR|ZERO_VECTOR", + "invalid.broken.lsl": "LAND_LARGE_BRUSH|LAND_MEDIUM_BRUSH|LAND_SMALL_BRUSH", + "invalid.deprecated.lsl" : "ATTACH_LPEC|ATTACH_RPEC|DATA_RATING|OBJECT_ATTACHMENT_GEOMETRY_BYTES|OBJECT_ATTACHMENT_SURFACE_AREA|PRIM_CAST_SHADOWS|PRIM_MATERIAL_LIGHT|PRIM_TYPE_LEGACY|PSYS_SRC_INNERANGLE|PSYS_SRC_OUTERANGLE|VEHICLE_FLAG_NO_FLY_UP|llClearExperiencePermissions|llCloud|llGetExperienceList|llMakeExplosion|llMakeFire|llMakeFountain|llMakeSmoke|llRemoteDataSetRegion|llSound|llSoundPreload|llXorBase64Strings|llXorBase64StringsCorrect", + "invalid.illegal.lsl": "event", + "invalid.unimplemented.lsl": "CHARACTER_MAX_ANGULAR_ACCEL|CHARACTER_MAX_ANGULAR_SPEED|CHARACTER_TURN_SPEED_MULTIPLIER|PERMISSION_CHANGE_JOINTS|PERMISSION_CHANGE_PERMISSIONS|PERMISSION_EXPERIENCE|PERMISSION_RELEASE_OWNERSHIP|PERMISSION_REMAP_CONTROLS|PRIM_PHYSICS_MATERIAL|PSYS_SRC_OBJ_REL_MASK|llCollisionSprite|llPointAt|llRefreshPrimURL|llReleaseCamera|llRemoteLoadScript|llSetPrimURL|llStopPointAt|llTakeCamera", + "reserved.godmode.lsl": "llGodLikeRezObject|llSetInventoryPermMask|llSetObjectPermMask", + "reserved.log.lsl" : "print", + "keyword.control.lsl" : "do|else|for|if|jump|return|while", + "storage.type.lsl" : "float|integer|key|list|quaternion|rotation|string|vector", + "support.function.lsl": "llAbs|llAcos|llAddToLandBanList|llAddToLandPassList|llAdjustSoundVolume|llAgentInExperience|llAllowInventoryDrop|llAngleBetween|llApplyImpulse|llApplyRotationalImpulse|llAsin|llAtan2|llAttachToAvatar|llAttachToAvatarTemp|llAvatarOnLinkSitTarget|llAvatarOnSitTarget|llAxes2Rot|llAxisAngle2Rot|llBase64ToInteger|llBase64ToString|llBreakAllLinks|llBreakLink|llCSV2List|llCastRay|llCeil|llClearCameraParams|llClearLinkMedia|llClearPrimMedia|llCloseRemoteDataChannel|llCollisionFilter|llCollisionSound|llCos|llCreateCharacter|llCreateKeyValue|llCreateLink|llDataSizeKeyValue|llDeleteCharacter|llDeleteKeyValue|llDeleteSubList|llDeleteSubString|llDetachFromAvatar|llDetectedGrab|llDetectedGroup|llDetectedKey|llDetectedLinkNumber|llDetectedName|llDetectedOwner|llDetectedPos|llDetectedRot|llDetectedTouchBinormal|llDetectedTouchFace|llDetectedTouchNormal|llDetectedTouchPos|llDetectedTouchST|llDetectedTouchUV|llDetectedType|llDetectedVel|llDialog|llDie|llDumpList2String|llEdgeOfWorld|llEjectFromLand|llEmail|llEscapeURL|llEuler2Rot|llEvade|llExecCharacterCmd|llFabs|llFleeFrom|llFloor|llForceMouselook|llFrand|llGenerateKey|llGetAccel|llGetAgentInfo|llGetAgentLanguage|llGetAgentList|llGetAgentSize|llGetAlpha|llGetAndResetTime|llGetAnimation|llGetAnimationList|llGetAnimationOverride|llGetAttached|llGetAttachedList|llGetBoundingBox|llGetCameraPos|llGetCameraRot|llGetCenterOfMass|llGetClosestNavPoint|llGetColor|llGetCreator|llGetDate|llGetDisplayName|llGetEnergy|llGetEnv|llGetExperienceDetails|llGetExperienceErrorMessage|llGetForce|llGetFreeMemory|llGetFreeURLs|llGetGMTclock|llGetGeometricCenter|llGetHTTPHeader|llGetInventoryCreator|llGetInventoryKey|llGetInventoryName|llGetInventoryNumber|llGetInventoryPermMask|llGetInventoryType|llGetKey|llGetLandOwnerAt|llGetLinkKey|llGetLinkMedia|llGetLinkName|llGetLinkNumber|llGetLinkNumberOfSides|llGetLinkPrimitiveParams|llGetListEntryType|llGetListLength|llGetLocalPos|llGetLocalRot|llGetMass|llGetMassMKS|llGetMaxScaleFactor|llGetMemoryLimit|llGetMinScaleFactor|llGetNextEmail|llGetNotecardLine|llGetNumberOfNotecardLines|llGetNumberOfPrims|llGetNumberOfSides|llGetObjectDesc|llGetObjectDetails|llGetObjectMass|llGetObjectName|llGetObjectPermMask|llGetObjectPrimCount|llGetOmega|llGetOwner|llGetOwnerKey|llGetParcelDetails|llGetParcelFlags|llGetParcelMaxPrims|llGetParcelMusicURL|llGetParcelPrimCount|llGetParcelPrimOwners|llGetPermissions|llGetPermissionsKey|llGetPhysicsMaterial|llGetPos|llGetPrimMediaParams|llGetPrimitiveParams|llGetRegionAgentCount|llGetRegionCorner|llGetRegionFPS|llGetRegionFlags|llGetRegionName|llGetRegionTimeDilation|llGetRootPosition|llGetRootRotation|llGetRot|llGetSPMaxMemory|llGetScale|llGetScriptName|llGetScriptState|llGetSimStats|llGetSimulatorHostname|llGetStartParameter|llGetStaticPath|llGetStatus|llGetSubString|llGetSunDirection|llGetTexture|llGetTextureOffset|llGetTextureRot|llGetTextureScale|llGetTime|llGetTimeOfDay|llGetTimestamp|llGetTorque|llGetUnixTime|llGetUsedMemory|llGetUsername|llGetVel|llGetWallclock|llGiveInventory|llGiveInventoryList|llGiveMoney|llGround|llGroundContour|llGroundNormal|llGroundRepel|llGroundSlope|llHTTPRequest|llHTTPResponse|llInsertString|llInstantMessage|llIntegerToBase64|llJson2List|llJsonGetValue|llJsonSetValue|llJsonValueType|llKey2Name|llKeyCountKeyValue|llKeysKeyValue|llLinkParticleSystem|llLinkSitTarget|llList2CSV|llList2Float|llList2Integer|llList2Json|llList2Key|llList2List|llList2ListStrided|llList2Rot|llList2String|llList2Vector|llListFindList|llListInsertList|llListRandomize|llListReplaceList|llListSort|llListStatistics|llListen|llListenControl|llListenRemove|llLoadURL|llLog|llLog10|llLookAt|llLoopSound|llLoopSoundMaster|llLoopSoundSlave|llMD5String|llManageEstateAccess|llMapDestination|llMessageLinked|llMinEventDelay|llModPow|llModifyLand|llMoveToTarget|llNavigateTo|llOffsetTexture|llOpenRemoteDataChannel|llOverMyLand|llOwnerSay|llParcelMediaCommandList|llParcelMediaQuery|llParseString2List|llParseStringKeepNulls|llParticleSystem|llPassCollisions|llPassTouches|llPatrolPoints|llPlaySound|llPlaySoundSlave|llPow|llPreloadSound|llPursue|llPushObject|llReadKeyValue|llRegionSay|llRegionSayTo|llReleaseControls|llReleaseURL|llRemoteDataReply|llRemoteLoadScriptPin|llRemoveFromLandBanList|llRemoveFromLandPassList|llRemoveInventory|llRemoveVehicleFlags|llRequestAgentData|llRequestDisplayName|llRequestExperiencePermissions|llRequestInventoryData|llRequestPermissions|llRequestSecureURL|llRequestSimulatorData|llRequestURL|llRequestUsername|llResetAnimationOverride|llResetLandBanList|llResetLandPassList|llResetOtherScript|llResetScript|llResetTime|llReturnObjectsByID|llReturnObjectsByOwner|llRezAtRoot|llRezObject|llRot2Angle|llRot2Axis|llRot2Euler|llRot2Fwd|llRot2Left|llRot2Up|llRotBetween|llRotLookAt|llRotTarget|llRotTargetRemove|llRotateTexture|llRound|llSHA1String|llSameGroup|llSay|llScaleByFactor|llScaleTexture|llScriptDanger|llScriptProfiler|llSendRemoteData|llSensor|llSensorRemove|llSensorRepeat|llSetAlpha|llSetAngularVelocity|llSetAnimationOverride|llSetBuoyancy|llSetCameraAtOffset|llSetCameraEyeOffset|llSetCameraParams|llSetClickAction|llSetColor|llSetContentType|llSetDamage|llSetForce|llSetForceAndTorque|llSetHoverHeight|llSetKeyframedMotion|llSetLinkAlpha|llSetLinkCamera|llSetLinkColor|llSetLinkMedia|llSetLinkPrimitiveParams|llSetLinkPrimitiveParamsFast|llSetLinkTexture|llSetLinkTextureAnim|llSetLocalRot|llSetMemoryLimit|llSetObjectDesc|llSetObjectName|llSetParcelMusicURL|llSetPayPrice|llSetPhysicsMaterial|llSetPos|llSetPrimMediaParams|llSetPrimitiveParams|llSetRegionPos|llSetRemoteScriptAccessPin|llSetRot|llSetScale|llSetScriptState|llSetSitText|llSetSoundQueueing|llSetSoundRadius|llSetStatus|llSetText|llSetTexture|llSetTextureAnim|llSetTimerEvent|llSetTorque|llSetTouchText|llSetVehicleFlags|llSetVehicleFloatParam|llSetVehicleRotationParam|llSetVehicleType|llSetVehicleVectorParam|llSetVelocity|llShout|llSin|llSitTarget|llSleep|llSqrt|llStartAnimation|llStopAnimation|llStopHover|llStopLookAt|llStopMoveToTarget|llStopSound|llStringLength|llStringToBase64|llStringTrim|llSubStringIndex|llTakeControls|llTan|llTarget|llTargetOmega|llTargetRemove|llTeleportAgent|llTeleportAgentGlobalCoords|llTeleportAgentHome|llTextBox|llToLower|llToUpper|llTransferLindenDollars|llTriggerSound|llTriggerSoundLimited|llUnSit|llUnescapeURL|llUpdateCharacter|llUpdateKeyValue|llVecDist|llVecMag|llVecNorm|llVolumeDetect|llWanderWithin|llWater|llWhisper|llWind|llXorBase64", + "support.function.event.lsl" : "at_rot_target|at_target|attach|changed|collision|collision_end|collision_start|control|dataserver|email|experience_permissions|experience_permissions_denied|http_request|http_response|land_collision|land_collision_end|land_collision_start|link_message|listen|money|moving_end|moving_start|no_sensor|not_at_rot_target|not_at_target|object_rez|on_rez|path_update|remote_data|run_time_permissions|sensor|state_entry|state_exit|timer|touch|touch_end|touch_start|transaction_result" + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment.line.double-slash.lsl", + regex : "\\/\\/.*$" + }, { + token : "comment.block.begin.lsl", + regex : "\\/\\*", + next : "comment" + }, { + token : "string.quoted.double.lsl", + start : '"', + end : '"', + next : [{ + token : "constant.character.escape.lsl", + regex : /\\[tn"\\]/ + }] + }, { + token : "constant.numeric.lsl", + regex : "(0[xX][0-9a-fA-F]+|[+-]?[0-9]+(?:(?:\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?)?)\\b" + }, { + token : "entity.name.state.lsl", + regex : "\\b((state)\\s+[A-Za-z_]\\w*|default)\\b" + }, { + token : keywordMapper, + regex : "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b" + }, { + token : "support.function.user-defined.lsl", + regex : /\b([a-zA-Z_]\w*)(?=\(.*?\))/ + }, { + token : "keyword.operator.lsl", + regex : "\\+\\+|\\-\\-|<<|>>|&&?|\\|\\|?|\\^|~|[!%<>=*+\\-\\/]=?" + }, { + token : "invalid.illegal.keyword.operator.lsl", + regex : ":=?" + }, { + token : "punctuation.operator.lsl", + regex : "\\,|\\;" + }, { + token : "paren.lparen.lsl", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen.lsl", + regex : "[\\]\\)\\}]" + }, { + token : "text.lsl", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment.block.end.lsl", + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment.block.lsl" + } + ] + }; + this.normalizeRules(); +} + +exports.LSLHighlightRules = LSLHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/lsl",["require","exports","module","ace/mode/lsl_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/text","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Rules = require("./lsl_highlight_rules").LSLHighlightRules; +var Outdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var TextMode = require("./text").Mode; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var oop = require("../lib/oop"); + +var Mode = function() { + this.HighlightRules = Rules; + this.$outdent = new Outdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ["//"]; + + this.blockComment = { + start: "/*", + end: "*/" + }; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type === "comment.block.lsl") { + return indent; + } + + if (state === "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/lsl"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-lua.js b/src/libs/ace/mode-lua.js new file mode 100755 index 0000000..bcf4daa --- /dev/null +++ b/src/libs/ace/mode-lua.js @@ -0,0 +1,424 @@ +ace.define("ace/mode/lua_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LuaHighlightRules = function() { + + var keywords = ( + "break|do|else|elseif|end|for|function|if|in|local|repeat|"+ + "return|then|until|while|or|and|not" + ); + + var builtinConstants = ("true|false|nil|_G|_VERSION"); + + var functions = ( + "string|xpcall|package|tostring|print|os|unpack|require|"+ + "getfenv|setmetatable|next|assert|tonumber|io|rawequal|"+ + "collectgarbage|getmetatable|module|rawset|math|debug|"+ + "pcall|table|newproxy|type|coroutine|_G|select|gcinfo|"+ + "pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|"+ + "load|error|loadfile|"+ + + "sub|upper|len|gfind|rep|find|match|char|dump|gmatch|"+ + "reverse|byte|format|gsub|lower|preload|loadlib|loaded|"+ + "loaders|cpath|config|path|seeall|exit|setlocale|date|"+ + "getenv|difftime|remove|time|clock|tmpname|rename|execute|"+ + "lines|write|close|flush|open|output|type|read|stderr|"+ + "stdin|input|stdout|popen|tmpfile|log|max|acos|huge|"+ + "ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|"+ + "frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|"+ + "atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|"+ + "gethook|setmetatable|setlocal|traceback|setfenv|getinfo|"+ + "setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|"+ + "foreachi|maxn|foreach|concat|sort|remove|resume|yield|"+ + "status|wrap|create|running|"+ + "__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|"+ + "__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber" + ); + + var stdLibaries = ("string|package|os|io|math|debug|table|coroutine"); + + var deprecatedIn5152 = ("setn|foreach|foreachi|gcinfo|log10|maxn"); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "support.function": functions, + "keyword.deprecated": deprecatedIn5152, + "constant.library": stdLibaries, + "constant.language": builtinConstants, + "variable.language": "self" + }, "identifier"); + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var integer = "(?:" + decimalInteger + "|" + hexInteger + ")"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var floatNumber = "(?:" + pointFloat + ")"; + + this.$rules = { + "start" : [{ + stateName: "bracketedComment", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length - 2, currentState); + return "comment"; + }, + regex : /\-\-\[=*\[/, + next : [ + { + onMatch : function(value, currentState, stack) { + if (value.length == stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return "comment"; + }, + regex : /\]=*\]/, + next : "start" + }, { + defaultToken : "comment" + } + ] + }, + + { + token : "comment", + regex : "\\-\\-.*$" + }, + { + stateName: "bracketedString", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length, currentState); + return "string.start"; + }, + regex : /\[=*\[/, + next : [ + { + onMatch : function(value, currentState, stack) { + if (value.length == stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return "string.end"; + }, + + regex : /\]=*\]/, + next : "start" + }, { + defaultToken : "string" + } + ] + }, + { + token : "string", // " string + regex : '"(?:[^\\\\]|\\\\.)*?"' + }, { + token : "string", // ' string + regex : "'(?:[^\\\\]|\\\\.)*?'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\/|%|\\#|\\^|~|<|>|<=|=>|==|~=|=|\\:|\\.\\.\\.|\\.\\." + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+|\\w+" + } ] + }; + + this.normalizeRules(); +} + +oop.inherits(LuaHighlightRules, TextHighlightRules); + +exports.LuaHighlightRules = LuaHighlightRules; +}); + +ace.define("ace/mode/folding/lua",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; +var TokenIterator = require("../../token_iterator").TokenIterator; + + +var FoldMode = exports.FoldMode = function() {}; + +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /\b(function|then|do|repeat)\b|{\s*$|(\[=*\[)/; + this.foldingStopMarker = /\bend\b|^\s*}|\]=*\]/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var isStart = this.foldingStartMarker.test(line); + var isEnd = this.foldingStopMarker.test(line); + + if (isStart && !isEnd) { + var match = line.match(this.foldingStartMarker); + if (match[1] == "then" && /\belseif\b/.test(line)) + return; + if (match[1]) { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return "start"; + } else if (match[2]) { + var type = session.bgTokenizer.getState(row) || ""; + if (type[0] == "bracketedComment" || type[0] == "bracketedString") + return "start"; + } else { + return "start"; + } + } + if (foldStyle != "markbeginend" || !isEnd || isStart && isEnd) + return ""; + + var match = line.match(this.foldingStopMarker); + if (match[0] === "end") { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return "end"; + } else if (match[0][0] === "]") { + var type = session.bgTokenizer.getState(row - 1) || ""; + if (type[0] == "bracketedComment" || type[0] == "bracketedString") + return "end"; + } else + return "end"; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.doc.getLine(row); + var match = this.foldingStartMarker.exec(line); + if (match) { + if (match[1]) + return this.luaBlock(session, row, match.index + 1); + + if (match[2]) + return session.getCommentFoldRange(row, match.index + 1); + + return this.openingBracketBlock(session, "{", row, match.index); + } + + var match = this.foldingStopMarker.exec(line); + if (match) { + if (match[0] === "end") { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return this.luaBlock(session, row, match.index + 1); + } + + if (match[0][0] === "]") + return session.getCommentFoldRange(row, match.index + 1); + + return this.closingBracketBlock(session, "}", row, match.index + match[0].length); + } + }; + + this.luaBlock = function(session, row, column) { + var stream = new TokenIterator(session, row, column); + var indentKeywords = { + "function": 1, + "do": 1, + "then": 1, + "elseif": -1, + "end": -1, + "repeat": 1, + "until": -1 + }; + + var token = stream.getCurrentToken(); + if (!token || token.type != "keyword") + return; + + var val = token.value; + var stack = [val]; + var dir = indentKeywords[val]; + + if (!dir) + return; + + var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length; + var startRow = row; + + stream.step = dir === -1 ? stream.stepBackward : stream.stepForward; + while(token = stream.step()) { + if (token.type !== "keyword") + continue; + var level = dir * indentKeywords[token.value]; + + if (level > 0) { + stack.unshift(token.value); + } else if (level <= 0) { + stack.shift(); + if (!stack.length && token.value != "elseif") + break; + if (level === 0) + stack.unshift(token.value); + } + } + + var row = stream.getCurrentTokenRow(); + if (dir === -1) + return new Range(row, session.getLine(row).length, startRow, startColumn); + else + return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn()); + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/lua",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/lua_highlight_rules","ace/mode/folding/lua","ace/range","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules; +var LuaFoldMode = require("./folding/lua").FoldMode; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.HighlightRules = LuaHighlightRules; + + this.foldingRules = new LuaFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + this.blockComment = {start: "--[", end: "]--"}; + + var indentKeywords = { + "function": 1, + "then": 1, + "do": 1, + "else": 1, + "elseif": 1, + "repeat": 1, + "end": -1, + "until": -1 + }; + var outdentKeywords = [ + "else", + "elseif", + "end", + "until" + ]; + + function getNetIndentLevel(tokens) { + var level = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type == "keyword") { + if (token.value in indentKeywords) { + level += indentKeywords[token.value]; + } + } else if (token.type == "paren.lparen") { + level += token.value.length; + } else if (token.type == "paren.rparen") { + level -= token.value.length; + } + } + if (level < 0) { + return -1; + } else if (level > 0) { + return 1; + } else { + return 0; + } + } + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var level = 0; + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (state == "start") { + level = getNetIndentLevel(tokens); + } + if (level > 0) { + return indent + tab; + } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) { + if (!this.checkOutdent(state, line, "\n")) { + return indent.substr(0, indent.length - tab.length); + } + } + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (input != "\n" && input != "\r" && input != "\r\n") + return false; + + if (line.match(/^\s*[\)\}\]]$/)) + return true; + + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + + if (!tokens || !tokens.length) + return false; + + return (tokens[0].type == "keyword" && outdentKeywords.indexOf(tokens[0].value) != -1); + }; + + this.autoOutdent = function(state, session, row) { + var prevLine = session.getLine(row - 1); + var prevIndent = this.$getIndent(prevLine).length; + var prevTokens = this.getTokenizer().getLineTokens(prevLine, "start").tokens; + var tabLength = session.getTabString().length; + var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens); + var curIndent = this.$getIndent(session.getLine(row)).length; + if (curIndent <= expectedIndent) { + return; + } + session.outdentRows(new Range(row, 0, row + 2, 0)); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/lua_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/lua"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-luapage.js b/src/libs/ace/mode-luapage.js new file mode 100755 index 0000000..be6b092 --- /dev/null +++ b/src/libs/ace/mode-luapage.js @@ -0,0 +1,2978 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/lua_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LuaHighlightRules = function() { + + var keywords = ( + "break|do|else|elseif|end|for|function|if|in|local|repeat|"+ + "return|then|until|while|or|and|not" + ); + + var builtinConstants = ("true|false|nil|_G|_VERSION"); + + var functions = ( + "string|xpcall|package|tostring|print|os|unpack|require|"+ + "getfenv|setmetatable|next|assert|tonumber|io|rawequal|"+ + "collectgarbage|getmetatable|module|rawset|math|debug|"+ + "pcall|table|newproxy|type|coroutine|_G|select|gcinfo|"+ + "pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|"+ + "load|error|loadfile|"+ + + "sub|upper|len|gfind|rep|find|match|char|dump|gmatch|"+ + "reverse|byte|format|gsub|lower|preload|loadlib|loaded|"+ + "loaders|cpath|config|path|seeall|exit|setlocale|date|"+ + "getenv|difftime|remove|time|clock|tmpname|rename|execute|"+ + "lines|write|close|flush|open|output|type|read|stderr|"+ + "stdin|input|stdout|popen|tmpfile|log|max|acos|huge|"+ + "ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|"+ + "frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|"+ + "atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|"+ + "gethook|setmetatable|setlocal|traceback|setfenv|getinfo|"+ + "setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|"+ + "foreachi|maxn|foreach|concat|sort|remove|resume|yield|"+ + "status|wrap|create|running|"+ + "__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|"+ + "__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber" + ); + + var stdLibaries = ("string|package|os|io|math|debug|table|coroutine"); + + var deprecatedIn5152 = ("setn|foreach|foreachi|gcinfo|log10|maxn"); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "support.function": functions, + "keyword.deprecated": deprecatedIn5152, + "constant.library": stdLibaries, + "constant.language": builtinConstants, + "variable.language": "self" + }, "identifier"); + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var integer = "(?:" + decimalInteger + "|" + hexInteger + ")"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var floatNumber = "(?:" + pointFloat + ")"; + + this.$rules = { + "start" : [{ + stateName: "bracketedComment", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length - 2, currentState); + return "comment"; + }, + regex : /\-\-\[=*\[/, + next : [ + { + onMatch : function(value, currentState, stack) { + if (value.length == stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return "comment"; + }, + regex : /\]=*\]/, + next : "start" + }, { + defaultToken : "comment" + } + ] + }, + + { + token : "comment", + regex : "\\-\\-.*$" + }, + { + stateName: "bracketedString", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length, currentState); + return "string.start"; + }, + regex : /\[=*\[/, + next : [ + { + onMatch : function(value, currentState, stack) { + if (value.length == stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return "string.end"; + }, + + regex : /\]=*\]/, + next : "start" + }, { + defaultToken : "string" + } + ] + }, + { + token : "string", // " string + regex : '"(?:[^\\\\]|\\\\.)*?"' + }, { + token : "string", // ' string + regex : "'(?:[^\\\\]|\\\\.)*?'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\/|%|\\#|\\^|~|<|>|<=|=>|==|~=|=|\\:|\\.\\.\\.|\\.\\." + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+|\\w+" + } ] + }; + + this.normalizeRules(); +} + +oop.inherits(LuaHighlightRules, TextHighlightRules); + +exports.LuaHighlightRules = LuaHighlightRules; +}); + +ace.define("ace/mode/folding/lua",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; +var TokenIterator = require("../../token_iterator").TokenIterator; + + +var FoldMode = exports.FoldMode = function() {}; + +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /\b(function|then|do|repeat)\b|{\s*$|(\[=*\[)/; + this.foldingStopMarker = /\bend\b|^\s*}|\]=*\]/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var isStart = this.foldingStartMarker.test(line); + var isEnd = this.foldingStopMarker.test(line); + + if (isStart && !isEnd) { + var match = line.match(this.foldingStartMarker); + if (match[1] == "then" && /\belseif\b/.test(line)) + return; + if (match[1]) { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return "start"; + } else if (match[2]) { + var type = session.bgTokenizer.getState(row) || ""; + if (type[0] == "bracketedComment" || type[0] == "bracketedString") + return "start"; + } else { + return "start"; + } + } + if (foldStyle != "markbeginend" || !isEnd || isStart && isEnd) + return ""; + + var match = line.match(this.foldingStopMarker); + if (match[0] === "end") { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return "end"; + } else if (match[0][0] === "]") { + var type = session.bgTokenizer.getState(row - 1) || ""; + if (type[0] == "bracketedComment" || type[0] == "bracketedString") + return "end"; + } else + return "end"; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.doc.getLine(row); + var match = this.foldingStartMarker.exec(line); + if (match) { + if (match[1]) + return this.luaBlock(session, row, match.index + 1); + + if (match[2]) + return session.getCommentFoldRange(row, match.index + 1); + + return this.openingBracketBlock(session, "{", row, match.index); + } + + var match = this.foldingStopMarker.exec(line); + if (match) { + if (match[0] === "end") { + if (session.getTokenAt(row, match.index + 1).type === "keyword") + return this.luaBlock(session, row, match.index + 1); + } + + if (match[0][0] === "]") + return session.getCommentFoldRange(row, match.index + 1); + + return this.closingBracketBlock(session, "}", row, match.index + match[0].length); + } + }; + + this.luaBlock = function(session, row, column) { + var stream = new TokenIterator(session, row, column); + var indentKeywords = { + "function": 1, + "do": 1, + "then": 1, + "elseif": -1, + "end": -1, + "repeat": 1, + "until": -1 + }; + + var token = stream.getCurrentToken(); + if (!token || token.type != "keyword") + return; + + var val = token.value; + var stack = [val]; + var dir = indentKeywords[val]; + + if (!dir) + return; + + var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length; + var startRow = row; + + stream.step = dir === -1 ? stream.stepBackward : stream.stepForward; + while(token = stream.step()) { + if (token.type !== "keyword") + continue; + var level = dir * indentKeywords[token.value]; + + if (level > 0) { + stack.unshift(token.value); + } else if (level <= 0) { + stack.shift(); + if (!stack.length && token.value != "elseif") + break; + if (level === 0) + stack.unshift(token.value); + } + } + + var row = stream.getCurrentTokenRow(); + if (dir === -1) + return new Range(row, session.getLine(row).length, startRow, startColumn); + else + return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn()); + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/lua",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/lua_highlight_rules","ace/mode/folding/lua","ace/range","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules; +var LuaFoldMode = require("./folding/lua").FoldMode; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.HighlightRules = LuaHighlightRules; + + this.foldingRules = new LuaFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + this.blockComment = {start: "--[", end: "]--"}; + + var indentKeywords = { + "function": 1, + "then": 1, + "do": 1, + "else": 1, + "elseif": 1, + "repeat": 1, + "end": -1, + "until": -1 + }; + var outdentKeywords = [ + "else", + "elseif", + "end", + "until" + ]; + + function getNetIndentLevel(tokens) { + var level = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type == "keyword") { + if (token.value in indentKeywords) { + level += indentKeywords[token.value]; + } + } else if (token.type == "paren.lparen") { + level += token.value.length; + } else if (token.type == "paren.rparen") { + level -= token.value.length; + } + } + if (level < 0) { + return -1; + } else if (level > 0) { + return 1; + } else { + return 0; + } + } + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var level = 0; + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (state == "start") { + level = getNetIndentLevel(tokens); + } + if (level > 0) { + return indent + tab; + } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) { + if (!this.checkOutdent(state, line, "\n")) { + return indent.substr(0, indent.length - tab.length); + } + } + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (input != "\n" && input != "\r" && input != "\r\n") + return false; + + if (line.match(/^\s*[\)\}\]]$/)) + return true; + + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + + if (!tokens || !tokens.length) + return false; + + return (tokens[0].type == "keyword" && outdentKeywords.indexOf(tokens[0].value) != -1); + }; + + this.autoOutdent = function(state, session, row) { + var prevLine = session.getLine(row - 1); + var prevIndent = this.$getIndent(prevLine).length; + var prevTokens = this.getTokenizer().getLineTokens(prevLine, "start").tokens; + var tabLength = session.getTabString().length; + var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens); + var curIndent = this.$getIndent(session.getLine(row)).length; + if (curIndent <= expectedIndent) { + return; + } + session.outdentRows(new Range(row, 0, row + 2, 0)); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/lua_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/lua"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/luapage_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules","ace/mode/lua_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules; + +var LuaPageHighlightRules = function() { + HtmlHighlightRules.call(this); + + var startRules = [ + { + token: "keyword", + regex: "<\\%\\=?", + push: "lua-start" + }, { + token: "keyword", + regex: "<\\?lua\\=?", + push: "lua-start" + } + ]; + + var endRules = [ + { + token: "keyword", + regex: "\\%>", + next: "pop" + }, { + token: "keyword", + regex: "\\?>", + next: "pop" + } + ]; + + this.embedRules(LuaHighlightRules, "lua-", endRules, ["start"]); + + for (var key in this.$rules) + this.$rules[key].unshift.apply(this.$rules[key], startRules); + + this.normalizeRules(); +}; + +oop.inherits(LuaPageHighlightRules, HtmlHighlightRules); + +exports.LuaPageHighlightRules = LuaPageHighlightRules; + +}); + +ace.define("ace/mode/luapage",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/lua","ace/mode/luapage_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var LuaMode = require("./lua").Mode; +var LuaPageHighlightRules = require("./luapage_highlight_rules").LuaPageHighlightRules; + +var Mode = function() { + HtmlMode.call(this); + + this.HighlightRules = LuaPageHighlightRules; + this.createModeDelegates({ + "lua-": LuaMode + }); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.$id = "ace/mode/luapage"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-lucene.js b/src/libs/ace/mode-lucene.js new file mode 100755 index 0000000..b830b7a --- /dev/null +++ b/src/libs/ace/mode-lucene.js @@ -0,0 +1,70 @@ +ace.define("ace/mode/lucene_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LuceneHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "constant.character.negation", + regex : "[\\-]" + }, { + token : "constant.character.interro", + regex : "[\\?]" + }, { + token : "constant.character.asterisk", + regex : "[\\*]" + }, { + token: 'constant.character.proximity', + regex: '~[0-9]+\\b' + }, { + token : 'keyword.operator', + regex: '(?:AND|OR|NOT)\\b' + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "keyword", + regex : "[\\S]+:" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "text", + regex : "\\s+" + } + ] + }; +}; + +oop.inherits(LuceneHighlightRules, TextHighlightRules); + +exports.LuceneHighlightRules = LuceneHighlightRules; +}); + +ace.define("ace/mode/lucene",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/lucene_highlight_rules"], function(require, exports, module) { +'use strict'; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var LuceneHighlightRules = require("./lucene_highlight_rules").LuceneHighlightRules; + +var Mode = function() { + this.HighlightRules = LuceneHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; + +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/lucene"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-makefile.js b/src/libs/ace/mode-makefile.js new file mode 100755 index 0000000..cc6fc65 --- /dev/null +++ b/src/libs/ace/mode-makefile.js @@ -0,0 +1,404 @@ +ace.define("ace/mode/sh_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var reservedKeywords = exports.reservedKeywords = ( + '!|{|}|case|do|done|elif|else|'+ + 'esac|fi|for|if|in|then|until|while|'+ + '&|;|export|local|read|typeset|unset|'+ + 'elif|select|set|function|declare|readonly' + ); + +var languageConstructs = exports.languageConstructs = ( + '[|]|alias|bg|bind|break|builtin|'+ + 'cd|command|compgen|complete|continue|'+ + 'dirs|disown|echo|enable|eval|exec|'+ + 'exit|fc|fg|getopts|hash|help|history|'+ + 'jobs|kill|let|logout|popd|printf|pushd|'+ + 'pwd|return|set|shift|shopt|source|'+ + 'suspend|test|times|trap|type|ulimit|'+ + 'umask|unalias|wait' +); + +var ShHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "keyword": reservedKeywords, + "support.function.builtin": languageConstructs, + "invalid.deprecated": "debugger" + }, "identifier"); + + var integer = "(?:(?:[1-9]\\d*)|(?:0))"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + var fileDescriptor = "(?:&" + intPart + ")"; + + var variableName = "[a-zA-Z_][a-zA-Z0-9_]*"; + var variable = "(?:" + variableName + "=)"; + + var builtinVariable = "(?:\\$(?:SHLVL|\\$|\\!|\\?))"; + + var func = "(?:" + variableName + "\\s*\\(\\))"; + + this.$rules = { + "start" : [{ + token : "constant", + regex : /\\./ + }, { + token : ["text", "comment"], + regex : /(^|\s)(#.*)$/ + }, { + token : "string.start", + regex : '"', + push : [{ + token : "constant.language.escape", + regex : /\\(?:[$`"\\]|$)/ + }, { + include : "variables" + }, { + token : "keyword.operator", + regex : /`/ // TODO highlight ` + }, { + token : "string.end", + regex : '"', + next: "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string", + regex : "\\$'", + push : [{ + token : "constant.language.escape", + regex : /\\(?:[abeEfnrtv\\'"]|x[a-fA-F\d]{1,2}|u[a-fA-F\d]{4}([a-fA-F\d]{4})?|c.|\d{1,3})/ + }, { + token : "string", + regex : "'", + next: "pop" + }, { + defaultToken: "string" + }] + }, { + regex : "<<<", + token : "keyword.operator" + }, { + stateName: "heredoc", + regex : "(<<-?)(\\s*)(['\"`]?)([\\w\\-]+)(['\"`]?)", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[4]); + return [ + {type:"constant", value: tokens[1]}, + {type:"text", value: tokens[2]}, + {type:"string", value: tokens[3]}, + {type:"support.class", value: tokens[4]}, + {type:"string", value: tokens[5]} + ]; + }, + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^\t+" + }, { + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + regex : "$", + token : "empty", + next : function(currentState, stack) { + if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc") + return stack[0]; + return currentState; + } + }, { + token : ["keyword", "text", "text", "text", "variable"], + regex : /(declare|local|readonly)(\s+)(?:(-[fixar]+)(\s+))?([a-zA-Z_][a-zA-Z0-9_]*\b)/ + }, { + token : "variable.language", + regex : builtinVariable + }, { + token : "variable", + regex : variable + }, { + include : "variables" + }, { + token : "support.function", + regex : func + }, { + token : "support.function", + regex : fileDescriptor + }, { + token : "string", // ' string + start : "'", end : "'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_][a-zA-Z0-9_]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|~|<|>|<=|=>|=|!=|[%&|`]" + }, { + token : "punctuation.operator", + regex : ";" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]]" + }, { + token : "paren.rparen", + regex : "[\\)\\}]", + next : "pop" + }], + variables: [{ + token : "variable", + regex : /(\$)(\w+)/ + }, { + token : ["variable", "paren.lparen"], + regex : /(\$)(\()/, + push : "start" + }, { + token : ["variable", "paren.lparen", "keyword.operator", "variable", "keyword.operator"], + regex : /(\$)(\{)([#!]?)(\w+|[*@#?\-$!0_])(:[?+\-=]?|##?|%%?|,,?\/|\^\^?)?/, + push : "start" + }, { + token : "variable", + regex : /\$[*@#?\-$!0_]/ + }, { + token : ["variable", "paren.lparen"], + regex : /(\$)(\{)/, + push : "start" + }] + }; + + this.normalizeRules(); +}; + +oop.inherits(ShHighlightRules, TextHighlightRules); + +exports.ShHighlightRules = ShHighlightRules; +}); + +ace.define("ace/mode/makefile_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/sh_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ShHighlightFile = require("./sh_highlight_rules"); + +var MakefileHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "keyword": ShHighlightFile.reservedKeywords, + "support.function.builtin": ShHighlightFile.languageConstructs, + "invalid.deprecated": "debugger" + }, "string"); + + this.$rules = + { + "start": [ + { + token: "string.interpolated.backtick.makefile", + regex: "`", + next: "shell-start" + }, + { + token: "punctuation.definition.comment.makefile", + regex: /#(?=.)/, + next: "comment" + }, + { + token: [ "keyword.control.makefile"], + regex: "^(?:\\s*\\b)(\\-??include|ifeq|ifneq|ifdef|ifndef|else|endif|vpath|export|unexport|define|endef|override)(?:\\b)" + }, + {// ^([^\t ]+(\s[^\t ]+)*:(?!\=))\s*.* + token: ["entity.name.function.makefile", "text"], + regex: "^([^\\t ]+(?:\\s[^\\t ]+)*:)(\\s*.*)" + } + ], + "comment": [ + { + token : "punctuation.definition.comment.makefile", + regex : /.+\\/ + }, + { + token : "punctuation.definition.comment.makefile", + regex : ".+", + next : "start" + } + ], + "shell-start": [ + { + token: keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token: "string", + regex : "\\w+" + }, + { + token : "string.interpolated.backtick.makefile", + regex : "`", + next : "start" + } + ] +} + +}; + +oop.inherits(MakefileHighlightRules, TextHighlightRules); + +exports.MakefileHighlightRules = MakefileHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/makefile",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/makefile_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MakefileHighlightRules = require("./makefile_highlight_rules").MakefileHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = MakefileHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + this.$indentWithTabs = true; + + this.$id = "ace/mode/makefile"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-markdown.js b/src/libs/ace/mode-markdown.js new file mode 100755 index 0000000..51df9be --- /dev/null +++ b/src/libs/ace/mode-markdown.js @@ -0,0 +1,2865 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/xml_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/xml","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var XmlFoldMode = require("./folding/xml").FoldMode; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.HighlightRules = XmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.foldingRules = new XmlFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.voidElements = lang.arrayToMap([]); + + this.blockComment = {start: ""}; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/xml_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/xml"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/folding/mixed",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(defaultMode, subModes) { + this.defaultMode = defaultMode; + this.subModes = subModes; +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + + this.$getMode = function(state) { + if (typeof state != "string") + state = state[0]; + for (var key in this.subModes) { + if (state.indexOf(key) === 0) + return this.subModes[key]; + } + return null; + }; + + this.$tryMode = function(state, session, foldStyle, row) { + var mode = this.$getMode(state); + return (mode ? mode.getFoldWidget(session, foldStyle, row) : ""); + }; + + this.getFoldWidget = function(session, foldStyle, row) { + return ( + this.$tryMode(session.getState(row-1), session, foldStyle, row) || + this.$tryMode(session.getState(row), session, foldStyle, row) || + this.defaultMode.getFoldWidget(session, foldStyle, row) + ); + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var mode = this.$getMode(session.getState(row-1)); + + if (!mode || !mode.getFoldWidget(session, foldStyle, row)) + mode = this.$getMode(session.getState(row)); + + if (!mode || !mode.getFoldWidget(session, foldStyle, row)) + mode = this.defaultMode; + + return mode.getFoldWidgetRange(session, foldStyle, row); + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/markdown_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules","ace/mode/html_highlight_rules","ace/mode/css_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; + +var escaped = function(ch) { + return "(?:[^" + lang.escapeRegExp(ch) + "\\\\]|\\\\.)*"; +} + +function github_embed(tag, prefix) { + return { // Github style block + token : "support.function", + regex : "^\\s*```" + tag + "\\s*$", + push : prefix + "start" + }; +} + +var MarkdownHighlightRules = function() { + HtmlHighlightRules.call(this); + + this.$rules["start"].unshift({ + token : "empty_line", + regex : '^$', + next: "allowBlock" + }, { // h1 + token: "markup.heading.1", + regex: "^=+(?=\\s*$)" + }, { // h2 + token: "markup.heading.2", + regex: "^\\-+(?=\\s*$)" + }, { + token : function(value) { + return "markup.heading." + value.length; + }, + regex : /^#{1,6}(?=\s*[^ #]|\s+#.)/, + next : "header" + }, + github_embed("(?:javascript|js)", "jscode-"), + github_embed("xml", "xmlcode-"), + github_embed("html", "htmlcode-"), + github_embed("css", "csscode-"), + { // Github style block + token : "support.function", + regex : "^\\s*```\\s*\\S*(?:{.*?\\})?\\s*$", + next : "githubblock" + }, { // block quote + token : "string.blockquote", + regex : "^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+", + next : "blockquote" + }, { // HR * - _ + token : "constant", + regex : "^ {0,2}(?:(?: ?\\* ?){3,}|(?: ?\\- ?){3,}|(?: ?\\_ ?){3,})\\s*$", + next: "allowBlock" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic" + }); + + this.addRules({ + "basic" : [{ + token : "constant.language.escape", + regex : /\\[\\`*_{}\[\]()#+\-.!]/ + }, { // code span ` + token : "support.function", + regex : "(`+)(.*?[^`])(\\1)" + }, { // reference + token : ["text", "constant", "text", "url", "string", "text"], + regex : "^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:[\"][^\"]+[\"])?(\\s*))$" + }, { // link by reference + token : ["text", "string", "text", "constant", "text"], + regex : "(\\[)(" + escaped("]") + ")(\\]\\s*\\[)("+ escaped("]") + ")(\\])" + }, { // link by url + token : ["text", "string", "text", "markup.underline", "string", "text"], + regex : "(\\[)(" + // [ + escaped("]") + // link text + ")(\\]\\()"+ // ]( + '((?:[^\\)\\s\\\\]|\\\\.|\\s(?=[^"]))*)' + // href + '(\\s*"' + escaped('"') + '"\\s*)?' + // "title" + "(\\))" // ) + }, { // strong ** __ + token : "string.strong", + regex : "([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // emphasis * _ + token : "string.emphasis", + regex : "([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // + token : ["text", "url", "text"], + regex : "(<)("+ + "(?:https?|ftp|dict):[^'\">\\s]+"+ + "|"+ + "(?:mailto:)?[-.\\w]+\\@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+"+ + ")(>)" + }], + "allowBlock": [ + {token : "support.function", regex : "^ {4}.+", next : "allowBlock"}, + {token : "empty_line", regex : '^$', next: "allowBlock"}, + {token : "empty", regex : "", next : "start"} + ], + + "header" : [{ + regex: "$", + next : "start" + }, { + include: "basic" + }, { + defaultToken : "heading" + } ], + + "listblock-start" : [{ + token : "support.variable", + regex : /(?:\[[ x]\])?/, + next : "listblock" + }], + + "listblock" : [ { // Lists only escape on completely blank lines. + token : "empty_line", + regex : "^$", + next : "start" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic", noEscape: true + }, { // Github style block + token : "support.function", + regex : "^\\s*```\\s*[a-zA-Z]*(?:{.*?\\})?\\s*$", + next : "githubblock" + }, { + defaultToken : "list" //do not use markup.list to allow stling leading `*` differntly + } ], + + "blockquote" : [ { // Blockquotes only escape on blank lines. + token : "empty_line", + regex : "^\\s*$", + next : "start" + }, { // block quote + token : "string.blockquote", + regex : "^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+", + next : "blockquote" + }, { + include : "basic", noEscape: true + }, { + defaultToken : "string.blockquote" + } ], + + "githubblock" : [ { + token : "support.function", + regex : "^\\s*```", + next : "start" + }, { + defaultToken : "support.function" + } ] + }); + + this.embedRules(JavaScriptHighlightRules, "jscode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(HtmlHighlightRules, "htmlcode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(CssHighlightRules, "csscode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(XmlHighlightRules, "xmlcode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.normalizeRules(); +}; +oop.inherits(MarkdownHighlightRules, TextHighlightRules); + +exports.MarkdownHighlightRules = MarkdownHighlightRules; +}); + +ace.define("ace/mode/folding/markdown",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + this.foldingStartMarker = /^(?:[=-]+\s*$|#{1,6} |`{3})/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + if (!this.foldingStartMarker.test(line)) + return ""; + + if (line[0] == "`") { + if (session.bgTokenizer.getState(row) == "start") + return "end"; + return "start"; + } + + return "start"; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + if (!line.match(this.foldingStartMarker)) + return; + + if (line[0] == "`") { + if (session.bgTokenizer.getState(row) !== "start") { + while (++row < maxRow) { + line = session.getLine(row); + if (line[0] == "`" & line.substring(0, 3) == "```") + break; + } + return new Range(startRow, startColumn, row, 0); + } else { + while (row -- > 0) { + line = session.getLine(row); + if (line[0] == "`" & line.substring(0, 3) == "```") + break; + } + return new Range(row, line.length, startRow, 0); + } + } + + var token; + function isHeading(row) { + token = session.getTokens(row)[0]; + return token && token.type.lastIndexOf(heading, 0) === 0; + } + + var heading = "markup.heading"; + function getLevel() { + var ch = token.value[0]; + if (ch == "=") return 6; + if (ch == "-") return 5; + return 7 - token.value.search(/[^#]/); + } + + if (isHeading(row)) { + var startHeadingLevel = getLevel(); + while (++row < maxRow) { + if (!isHeading(row)) + continue; + var level = getLevel(); + if (level >= startHeadingLevel) + break; + } + + endRow = row - (!token || ["=", "-"].indexOf(token.value[0]) == -1 ? 1 : 2); + + if (endRow > startRow) { + while (endRow > startRow && /^\s*$/.test(session.getLine(endRow))) + endRow--; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/markdown",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript","ace/mode/xml","ace/mode/html","ace/mode/markdown_highlight_rules","ace/mode/folding/markdown"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var XmlMode = require("./xml").Mode; +var HtmlMode = require("./html").Mode; +var MarkdownHighlightRules = require("./markdown_highlight_rules").MarkdownHighlightRules; +var MarkdownFoldMode = require("./folding/markdown").FoldMode; + +var Mode = function() { + this.HighlightRules = MarkdownHighlightRules; + + this.createModeDelegates({ + "js-": JavaScriptMode, + "xml-": XmlMode, + "html-": HtmlMode + }); + + this.foldingRules = new MarkdownFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.type = "text"; + this.blockComment = {start: ""}; + + this.getNextLineIndent = function(state, line, tab) { + if (state == "listblock") { + var match = /^(\s*)(?:([-+*])|(\d+)\.)(\s+)/.exec(line); + if (!match) + return ""; + var marker = match[2]; + if (!marker) + marker = parseInt(match[3], 10) + 1 + "."; + return match[1] + marker + match[4]; + } else { + return this.$getIndent(line); + } + }; + this.$id = "ace/mode/markdown"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-mask.js b/src/libs/ace/mode-mask.js new file mode 100755 index 0000000..983d02f --- /dev/null +++ b/src/libs/ace/mode-mask.js @@ -0,0 +1,1786 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/markdown_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules","ace/mode/html_highlight_rules","ace/mode/css_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; + +var escaped = function(ch) { + return "(?:[^" + lang.escapeRegExp(ch) + "\\\\]|\\\\.)*"; +} + +function github_embed(tag, prefix) { + return { // Github style block + token : "support.function", + regex : "^\\s*```" + tag + "\\s*$", + push : prefix + "start" + }; +} + +var MarkdownHighlightRules = function() { + HtmlHighlightRules.call(this); + + this.$rules["start"].unshift({ + token : "empty_line", + regex : '^$', + next: "allowBlock" + }, { // h1 + token: "markup.heading.1", + regex: "^=+(?=\\s*$)" + }, { // h2 + token: "markup.heading.2", + regex: "^\\-+(?=\\s*$)" + }, { + token : function(value) { + return "markup.heading." + value.length; + }, + regex : /^#{1,6}(?=\s*[^ #]|\s+#.)/, + next : "header" + }, + github_embed("(?:javascript|js)", "jscode-"), + github_embed("xml", "xmlcode-"), + github_embed("html", "htmlcode-"), + github_embed("css", "csscode-"), + { // Github style block + token : "support.function", + regex : "^\\s*```\\s*\\S*(?:{.*?\\})?\\s*$", + next : "githubblock" + }, { // block quote + token : "string.blockquote", + regex : "^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+", + next : "blockquote" + }, { // HR * - _ + token : "constant", + regex : "^ {0,2}(?:(?: ?\\* ?){3,}|(?: ?\\- ?){3,}|(?: ?\\_ ?){3,})\\s*$", + next: "allowBlock" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic" + }); + + this.addRules({ + "basic" : [{ + token : "constant.language.escape", + regex : /\\[\\`*_{}\[\]()#+\-.!]/ + }, { // code span ` + token : "support.function", + regex : "(`+)(.*?[^`])(\\1)" + }, { // reference + token : ["text", "constant", "text", "url", "string", "text"], + regex : "^([ ]{0,3}\\[)([^\\]]+)(\\]:\\s*)([^ ]+)(\\s*(?:[\"][^\"]+[\"])?(\\s*))$" + }, { // link by reference + token : ["text", "string", "text", "constant", "text"], + regex : "(\\[)(" + escaped("]") + ")(\\]\\s*\\[)("+ escaped("]") + ")(\\])" + }, { // link by url + token : ["text", "string", "text", "markup.underline", "string", "text"], + regex : "(\\[)(" + // [ + escaped("]") + // link text + ")(\\]\\()"+ // ]( + '((?:[^\\)\\s\\\\]|\\\\.|\\s(?=[^"]))*)' + // href + '(\\s*"' + escaped('"') + '"\\s*)?' + // "title" + "(\\))" // ) + }, { // strong ** __ + token : "string.strong", + regex : "([*]{2}|[_]{2}(?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // emphasis * _ + token : "string.emphasis", + regex : "([*]|[_](?=\\S))(.*?\\S[*_]*)(\\1)" + }, { // + token : ["text", "url", "text"], + regex : "(<)("+ + "(?:https?|ftp|dict):[^'\">\\s]+"+ + "|"+ + "(?:mailto:)?[-.\\w]+\\@[-a-z0-9]+(?:\\.[-a-z0-9]+)*\\.[a-z]+"+ + ")(>)" + }], + "allowBlock": [ + {token : "support.function", regex : "^ {4}.+", next : "allowBlock"}, + {token : "empty_line", regex : '^$', next: "allowBlock"}, + {token : "empty", regex : "", next : "start"} + ], + + "header" : [{ + regex: "$", + next : "start" + }, { + include: "basic" + }, { + defaultToken : "heading" + } ], + + "listblock-start" : [{ + token : "support.variable", + regex : /(?:\[[ x]\])?/, + next : "listblock" + }], + + "listblock" : [ { // Lists only escape on completely blank lines. + token : "empty_line", + regex : "^$", + next : "start" + }, { // list + token : "markup.list", + regex : "^\\s{0,3}(?:[*+-]|\\d+\\.)\\s+", + next : "listblock-start" + }, { + include : "basic", noEscape: true + }, { // Github style block + token : "support.function", + regex : "^\\s*```\\s*[a-zA-Z]*(?:{.*?\\})?\\s*$", + next : "githubblock" + }, { + defaultToken : "list" //do not use markup.list to allow stling leading `*` differntly + } ], + + "blockquote" : [ { // Blockquotes only escape on blank lines. + token : "empty_line", + regex : "^\\s*$", + next : "start" + }, { // block quote + token : "string.blockquote", + regex : "^\\s*>\\s*(?:[*+-]|\\d+\\.)?\\s+", + next : "blockquote" + }, { + include : "basic", noEscape: true + }, { + defaultToken : "string.blockquote" + } ], + + "githubblock" : [ { + token : "support.function", + regex : "^\\s*```", + next : "start" + }, { + defaultToken : "support.function" + } ] + }); + + this.embedRules(JavaScriptHighlightRules, "jscode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(HtmlHighlightRules, "htmlcode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(CssHighlightRules, "csscode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.embedRules(XmlHighlightRules, "xmlcode-", [{ + token : "support.function", + regex : "^\\s*```", + next : "pop" + }]); + + this.normalizeRules(); +}; +oop.inherits(MarkdownHighlightRules, TextHighlightRules); + +exports.MarkdownHighlightRules = MarkdownHighlightRules; +}); + +ace.define("ace/mode/mask_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/css_highlight_rules","ace/mode/markdown_highlight_rules","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +exports.MaskHighlightRules = MaskHighlightRules; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextRules = require("./text_highlight_rules").TextHighlightRules; +var JSRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var CssRules = require("./css_highlight_rules").CssHighlightRules; +var MDRules = require("./markdown_highlight_rules").MarkdownHighlightRules; +var HTMLRules = require("./html_highlight_rules").HtmlHighlightRules; + +var token_TAG = "keyword.support.constant.language", + token_COMPO = "support.function.markup.bold", + token_KEYWORD = "keyword", + token_LANG = "constant.language", + token_UTIL = "keyword.control.markup.italic", + token_ATTR = "support.variable.class", + token_PUNKT = "keyword.operator", + token_ITALIC = "markup.italic", + token_BOLD = "markup.bold", + token_LPARE = "paren.lparen", + token_RPARE = "paren.rparen"; + +var const_FUNCTIONS, + const_KEYWORDS, + const_CONST, + const_TAGS; +(function(){ + const_FUNCTIONS = lang.arrayToMap( + ("log").split("|") + ); + const_CONST = lang.arrayToMap( + (":dualbind|:bind|:import|slot|event|style|html|markdown|md").split("|") + ); + const_KEYWORDS = lang.arrayToMap( + ("debugger|define|var|if|each|for|of|else|switch|case|with|visible|+if|+each|+for|+switch|+with|+visible|include|import").split("|") + ); + const_TAGS = lang.arrayToMap( + ("a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|" + + "big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|" + + "command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|" + + "figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|" + + "header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|" + + "link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|" + + "option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|" + + "small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|" + + "textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp").split("|") + ); +}()); + +function MaskHighlightRules () { + + this.$rules = { + "start" : [ + Token("comment", "\\/\\/.*$"), + Token("comment", "\\/\\*", [ + Token("comment", ".*?\\*\\/", "start"), + Token("comment", ".+") + ]), + + Blocks.string("'''"), + Blocks.string('"""'), + Blocks.string('"'), + Blocks.string("'"), + + Blocks.syntax(/(markdown|md)\b/, "md-multiline", "multiline"), + Blocks.syntax(/html\b/, "html-multiline", "multiline"), + Blocks.syntax(/(slot|event)\b/, "js-block", "block"), + Blocks.syntax(/style\b/, "css-block", "block"), + Blocks.syntax(/var\b/, "js-statement", "attr"), + + Blocks.tag(), + + Token(token_LPARE, "[[({>]"), + Token(token_RPARE, "[\\])};]", "start"), + { + caseInsensitive: true + } + ] + }; + var rules = this; + + addJavaScript("interpolation", /\]/, token_RPARE + "." + token_ITALIC); + addJavaScript("statement", /\)|}|;/); + addJavaScript("block", /\}/); + addCss(); + addMarkdown(); + addHtml(); + + function addJavaScript(name, escape, closeType) { + var prfx = "js-" + name + "-", + rootTokens = name === "block" ? ["start"] : ["start", "no_regex"]; + add( + JSRules + , prfx + , escape + , rootTokens + , closeType + ); + } + function addCss() { + add(CssRules, "css-block-", /\}/); + } + function addMarkdown() { + add(MDRules, "md-multiline-", /("""|''')/, []); + } + function addHtml() { + add(HTMLRules, "html-multiline-", /("""|''')/); + } + function add(Rules, strPrfx, rgxEnd, rootTokens, closeType) { + var next = "pop"; + var tokens = rootTokens || [ "start" ]; + if (tokens.length === 0) { + tokens = null; + } + if (/block|multiline/.test(strPrfx)) { + next = strPrfx + "end"; + rules.$rules[next] = [ + Token("empty", "", "start") + ]; + } + rules.embedRules( + Rules + , strPrfx + , [ Token(closeType || token_RPARE, rgxEnd, next) ] + , tokens + , tokens == null ? true : false + ); + } + + this.normalizeRules(); +} +oop.inherits(MaskHighlightRules, TextRules); + +var Blocks = { + string: function(str, next){ + var token = Token( + "string.start" + , str + , [ + Token(token_LPARE + "." + token_ITALIC, /~\[/, Blocks.interpolation()), + Token("string.end", str, "pop"), + { + defaultToken: "string" + } + ] + , next + ); + if (str.length === 1){ + var escaped = Token("string.escape", "\\\\" + str); + token.push.unshift(escaped); + } + return token; + }, + interpolation: function(){ + return [ + Token(token_UTIL, /\s*\w*\s*:/), + "js-interpolation-start" + ]; + }, + tagHead: function (rgx) { + return Token(token_ATTR, rgx, [ + Token(token_ATTR, /[\w\-_]+/), + Token(token_LPARE + "." + token_ITALIC, /~\[/, Blocks.interpolation()), + Blocks.goUp() + ]); + }, + tag: function () { + return { + token: 'tag', + onMatch : function(value) { + if (void 0 !== const_KEYWORDS[value]) + return token_KEYWORD; + if (void 0 !== const_CONST[value]) + return token_LANG; + if (void 0 !== const_FUNCTIONS[value]) + return "support.function"; + if (void 0 !== const_TAGS[value.toLowerCase()]) + return token_TAG; + + return token_COMPO; + }, + regex : /([@\w\-_:+]+)|((^|\s)(?=\s*(\.|#)))/, + push: [ + Blocks.tagHead(/\./) , + Blocks.tagHead(/#/) , + Blocks.expression(), + Blocks.attribute(), + + Token(token_LPARE, /[;>{]/, "pop") + ] + }; + }, + syntax: function(rgx, next, type){ + return { + token: token_LANG, + regex : rgx, + push: ({ + "attr": [ + next + "-start", + Token(token_PUNKT, /;/, "start") + ], + "multiline": [ + Blocks.tagHead(/\./) , + Blocks.tagHead(/#/) , + Blocks.attribute(), + Blocks.expression(), + Token(token_LPARE, /[>\{]/), + Token(token_PUNKT, /;/, "start"), + Token(token_LPARE, /'''|"""/, [ next + "-start" ]) + ], + "block": [ + Blocks.tagHead(/\./) , + Blocks.tagHead(/#/) , + Blocks.attribute(), + Blocks.expression(), + Token(token_LPARE, /\{/, [ next + "-start" ]) + ] + })[type] + }; + }, + attribute: function(){ + return Token(function(value){ + return /^x\-/.test(value) + ? token_ATTR + "." + token_BOLD + : token_ATTR; + }, /[\w_-]+/, [ + Token(token_PUNKT, /\s*=\s*/, [ + Blocks.string('"'), + Blocks.string("'"), + Blocks.word(), + Blocks.goUp() + ]), + Blocks.goUp() + ]); + }, + expression: function(){ + return Token(token_LPARE, /\(/, [ "js-statement-start" ]); + }, + word: function(){ + return Token("string", /[\w-_]+/); + }, + goUp: function(){ + return Token("text", "", "pop"); + }, + goStart: function(){ + return Token("text", "", "start"); + } +}; + + +function Token(token, rgx, mix) { + var push, next, onMatch; + if (arguments.length === 4) { + push = mix; + next = arguments[3]; + } + else if (typeof mix === "string") { + next = mix; + } + else { + push = mix; + } + if (typeof token === "function") { + onMatch = token; + token = "empty"; + } + return { + token: token, + regex: rgx, + push: push, + next: next, + onMatch: onMatch + }; +} + +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/mask",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/mask_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MaskHighlightRules = require("./mask_highlight_rules").MaskHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = MaskHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/mask"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-matlab.js b/src/libs/ace/mode-matlab.js new file mode 100755 index 0000000..b887040 --- /dev/null +++ b/src/libs/ace/mode-matlab.js @@ -0,0 +1,256 @@ +ace.define("ace/mode/matlab_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MatlabHighlightRules = function() { + +var keywords = ( + "break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while" + ); + + var builtinConstants = ( + "true|false|inf|Inf|nan|NaN|eps|pi|ans|nargin|nargout|varargin|varargout" + ); + + var builtinFunctions = ( + "abs|accumarray|acos(?:d|h)?|acot(?:d|h)?|acsc(?:d|h)?|actxcontrol(?:list|select)?|actxGetRunningServer|actxserver|addlistener|addpath|addpref|addtodate|"+ + "airy|align|alim|all|allchild|alpha|alphamap|amd|ancestor|and|angle|annotation|any|area|arrayfun|asec(?:d|h)?|asin(?:d|h)?|assert|assignin|atan(?:2|d|h)?|" + + "audiodevinfo|audioplayer|audiorecorder|aufinfo|auread|autumn|auwrite|avifile|aviinfo|aviread|axes|axis|balance|bar(?:3|3h|h)?|base2dec|beep|BeginInvoke|bench|"+ + "bessel(?:h|i|j|k|y)|beta|betainc|betaincinv|betaln|bicg|bicgstab|bicgstabl|bin2dec|bitand|bitcmp|bitget|bitmax|bitnot|bitor|bitset|bitshift|bitxor|blanks|blkdiag|"+ + "bone|box|brighten|brush|bsxfun|builddocsearchdb|builtin|bvp4c|bvp5c|bvpget|bvpinit|bvpset|bvpxtend|calendar|calllib|callSoapService|camdolly|cameratoolbar|camlight|"+ + "camlookat|camorbit|campan|campos|camproj|camroll|camtarget|camup|camva|camzoom|cart2pol|cart2sph|cast|cat|caxis|cd|cdf2rdf|cdfepoch|cdfinfo|cdflib(?:.(?:close|closeVar|"+ + "computeEpoch|computeEpoch16|create|createAttr|createVar|delete|deleteAttr|deleteAttrEntry|deleteAttrgEntry|deleteVar|deleteVarRecords|epoch16Breakdown|epochBreakdown|getAttrEntry|"+ + "getAttrgEntry|getAttrMaxEntry|getAttrMaxgEntry|getAttrName|getAttrNum|getAttrScope|getCacheSize|getChecksum|getCompression|getCompressionCacheSize|getConstantNames|"+ + "getConstantValue|getCopyright|getFileBackward|getFormat|getLibraryCopyright|getLibraryVersion|getMajority|getName|getNumAttrEntries|getNumAttrgEntries|getNumAttributes|"+ + "getNumgAttributes|getReadOnlyMode|getStageCacheSize|getValidate|getVarAllocRecords|getVarBlockingFactor|getVarCacheSize|getVarCompression|getVarData|getVarMaxAllocRecNum|"+ + "getVarMaxWrittenRecNum|getVarName|getVarNum|getVarNumRecsWritten|getVarPadValue|getVarRecordData|getVarReservePercent|getVarsMaxWrittenRecNum|getVarSparseRecords|getVersion|"+ + "hyperGetVarData|hyperPutVarData|inquire|inquireAttr|inquireAttrEntry|inquireAttrgEntry|inquireVar|open|putAttrEntry|putAttrgEntry|putVarData|putVarRecordData|renameAttr|"+ + "renameVar|setCacheSize|setChecksum|setCompression|setCompressionCacheSize|setFileBackward|setFormat|setMajority|setReadOnlyMode|setStageCacheSize|setValidate|"+ + "setVarAllocBlockRecords|setVarBlockingFactor|setVarCacheSize|setVarCompression|setVarInitialRecs|setVarPadValue|SetVarReservePercent|setVarsCacheSize|setVarSparseRecords))?|"+ + "cdfread|cdfwrite|ceil|cell2mat|cell2struct|celldisp|cellfun|cellplot|cellstr|cgs|checkcode|checkin|checkout|chol|cholinc|cholupdate|circshift|cla|clabel|class|clc|clear|"+ + "clearvars|clf|clipboard|clock|close|closereq|cmopts|cmpermute|cmunique|colamd|colon|colorbar|colordef|colormap|colormapeditor|colperm|Combine|comet|comet3|commandhistory|"+ + "commandwindow|compan|compass|complex|computer|cond|condeig|condest|coneplot|conj|containers.Map|contour(?:3|c|f|slice)?|contrast|conv|conv2|convhull|convhulln|convn|cool|"+ + "copper|copyfile|copyobj|corrcoef|cos(?:d|h)?|cot(?:d|h)?|cov|cplxpair|cputime|createClassFromWsdl|createSoapMessage|cross|csc(?:d|h)?|csvread|csvwrite|ctranspose|cumprod|"+ + "cumsum|cumtrapz|curl|customverctrl|cylinder|daqread|daspect|datacursormode|datatipinfo|date|datenum|datestr|datetick|datevec|dbclear|dbcont|dbdown|dblquad|dbmex|dbquit|"+ + "dbstack|dbstatus|dbstep|dbstop|dbtype|dbup|dde23|ddeget|ddesd|ddeset|deal|deblank|dec2base|dec2bin|dec2hex|decic|deconv|del2|delaunay|delaunay3|delaunayn|DelaunayTri|delete|"+ + "demo|depdir|depfun|det|detrend|deval|diag|dialog|diary|diff|diffuse|dir|disp|display|dither|divergence|dlmread|dlmwrite|dmperm|doc|docsearch|dos|dot|dragrect|drawnow|dsearch|"+ + "dsearchn|dynamicprops|echo|echodemo|edit|eig|eigs|ellipj|ellipke|ellipsoid|empty|enableNETfromNetworkDrive|enableservice|EndInvoke|enumeration|eomday|eq|erf|erfc|erfcinv|"+ + "erfcx|erfinv|error|errorbar|errordlg|etime|etree|etreeplot|eval|evalc|evalin|event.(?:EventData|listener|PropertyEvent|proplistener)|exifread|exist|exit|exp|expint|expm|"+ + "expm1|export2wsdlg|eye|ezcontour|ezcontourf|ezmesh|ezmeshc|ezplot|ezplot3|ezpolar|ezsurf|ezsurfc|factor|factorial|fclose|feather|feature|feof|ferror|feval|fft|fft2|fftn|"+ + "fftshift|fftw|fgetl|fgets|fieldnames|figure|figurepalette|fileattrib|filebrowser|filemarker|fileparts|fileread|filesep|fill|fill3|filter|filter2|find|findall|findfigs|"+ + "findobj|findstr|finish|fitsdisp|fitsinfo|fitsread|fitswrite|fix|flag|flipdim|fliplr|flipud|floor|flow|fminbnd|fminsearch|fopen|format|fplot|fprintf|frame2im|fread|freqspace|"+ + "frewind|fscanf|fseek|ftell|FTP|full|fullfile|func2str|functions|funm|fwrite|fzero|gallery|gamma|gammainc|gammaincinv|gammaln|gca|gcbf|gcbo|gcd|gcf|gco|ge|genpath|genvarname|"+ + "get|getappdata|getenv|getfield|getframe|getpixelposition|getpref|ginput|gmres|gplot|grabcode|gradient|gray|graymon|grid|griddata(?:3|n)?|griddedInterpolant|gsvd|gt|gtext|"+ + "guidata|guide|guihandles|gunzip|gzip|h5create|h5disp|h5info|h5read|h5readatt|h5write|h5writeatt|hadamard|handle|hankel|hdf|hdf5|hdf5info|hdf5read|hdf5write|hdfinfo|"+ + "hdfread|hdftool|help|helpbrowser|helpdesk|helpdlg|helpwin|hess|hex2dec|hex2num|hgexport|hggroup|hgload|hgsave|hgsetget|hgtransform|hidden|hilb|hist|histc|hold|home|horzcat|"+ + "hostid|hot|hsv|hsv2rgb|hypot|ichol|idivide|ifft|ifft2|ifftn|ifftshift|ilu|im2frame|im2java|imag|image|imagesc|imapprox|imfinfo|imformats|import|importdata|imread|imwrite|"+ + "ind2rgb|ind2sub|inferiorto|info|inline|inmem|inpolygon|input|inputdlg|inputname|inputParser|inspect|instrcallback|instrfind|instrfindall|int2str|integral(?:2|3)?|interp(?:1|"+ + "1q|2|3|ft|n)|interpstreamspeed|intersect|intmax|intmin|inv|invhilb|ipermute|isa|isappdata|iscell|iscellstr|ischar|iscolumn|isdir|isempty|isequal|isequaln|isequalwithequalnans|"+ + "isfield|isfinite|isfloat|isglobal|ishandle|ishghandle|ishold|isinf|isinteger|isjava|iskeyword|isletter|islogical|ismac|ismatrix|ismember|ismethod|isnan|isnumeric|isobject|"+ + "isocaps|isocolors|isonormals|isosurface|ispc|ispref|isprime|isprop|isreal|isrow|isscalar|issorted|isspace|issparse|isstr|isstrprop|isstruct|isstudent|isunix|isvarname|"+ + "isvector|javaaddpath|javaArray|javachk|javaclasspath|javacomponent|javaMethod|javaMethodEDT|javaObject|javaObjectEDT|javarmpath|jet|keyboard|kron|lasterr|lasterror|"+ + "lastwarn|lcm|ldivide|ldl|le|legend|legendre|length|libfunctions|libfunctionsview|libisloaded|libpointer|libstruct|license|light|lightangle|lighting|lin2mu|line|lines|"+ + "linkaxes|linkdata|linkprop|linsolve|linspace|listdlg|listfonts|load|loadlibrary|loadobj|log|log10|log1p|log2|loglog|logm|logspace|lookfor|lower|ls|lscov|lsqnonneg|lsqr|"+ + "lt|lu|luinc|magic|makehgtform|mat2cell|mat2str|material|matfile|matlab.io.MatFile|matlab.mixin.(?:Copyable|Heterogeneous(?:.getDefaultScalarElement)?)|matlabrc|"+ + "matlabroot|max|maxNumCompThreads|mean|median|membrane|memmapfile|memory|menu|mesh|meshc|meshgrid|meshz|meta.(?:class(?:.fromName)?|DynamicProperty|EnumeratedValue|event|"+ + "MetaData|method|package(?:.(?:fromName|getAllPackages))?|property)|metaclass|methods|methodsview|mex(?:.getCompilerConfigurations)?|MException|mexext|mfilename|min|minres|"+ + "minus|mislocked|mkdir|mkpp|mldivide|mlint|mlintrpt|mlock|mmfileinfo|mmreader|mod|mode|more|move|movefile|movegui|movie|movie2avi|mpower|mrdivide|msgbox|mtimes|mu2lin|"+ + "multibandread|multibandwrite|munlock|namelengthmax|nargchk|narginchk|nargoutchk|native2unicode|nccreate|ncdisp|nchoosek|ncinfo|ncread|ncreadatt|ncwrite|ncwriteatt|"+ + "ncwriteschema|ndgrid|ndims|ne|NET(?:.(?:addAssembly|Assembly|convertArray|createArray|createGeneric|disableAutoRelease|enableAutoRelease|GenericClass|invokeGenericMethod|"+ + "NetException|setStaticProperty))?|netcdf.(?:abort|close|copyAtt|create|defDim|defGrp|defVar|defVarChunking|defVarDeflate|defVarFill|defVarFletcher32|delAtt|endDef|getAtt|"+ + "getChunkCache|getConstant|getConstantNames|getVar|inq|inqAtt|inqAttID|inqAttName|inqDim|inqDimID|inqDimIDs|inqFormat|inqGrpName|inqGrpNameFull|inqGrpParent|inqGrps|"+ + "inqLibVers|inqNcid|inqUnlimDims|inqVar|inqVarChunking|inqVarDeflate|inqVarFill|inqVarFletcher32|inqVarID|inqVarIDs|open|putAtt|putVar|reDef|renameAtt|renameDim|renameVar|"+ + "setChunkCache|setDefaultFormat|setFill|sync)|newplot|nextpow2|nnz|noanimate|nonzeros|norm|normest|not|notebook|now|nthroot|null|num2cell|num2hex|num2str|numel|nzmax|"+ + "ode(?:113|15i|15s|23|23s|23t|23tb|45)|odeget|odeset|odextend|onCleanup|ones|open|openfig|opengl|openvar|optimget|optimset|or|ordeig|orderfields|ordqz|ordschur|orient|"+ + "orth|pack|padecoef|pagesetupdlg|pan|pareto|parseSoapResponse|pascal|patch|path|path2rc|pathsep|pathtool|pause|pbaspect|pcg|pchip|pcode|pcolor|pdepe|pdeval|peaks|perl|perms|"+ + "permute|pie|pink|pinv|planerot|playshow|plot|plot3|plotbrowser|plotedit|plotmatrix|plottools|plotyy|plus|pol2cart|polar|poly|polyarea|polyder|polyeig|polyfit|polyint|polyval|"+ + "polyvalm|pow2|power|ppval|prefdir|preferences|primes|print|printdlg|printopt|printpreview|prod|profile|profsave|propedit|propertyeditor|psi|publish|PutCharArray|PutFullMatrix|"+ + "PutWorkspaceData|pwd|qhull|qmr|qr|qrdelete|qrinsert|qrupdate|quad|quad2d|quadgk|quadl|quadv|questdlg|quit|quiver|quiver3|qz|rand|randi|randn|randperm|RandStream(?:.(?:create|"+ + "getDefaultStream|getGlobalStream|list|setDefaultStream|setGlobalStream))?|rank|rat|rats|rbbox|rcond|rdivide|readasync|real|reallog|realmax|realmin|realpow|realsqrt|record|"+ + "rectangle|rectint|recycle|reducepatch|reducevolume|refresh|refreshdata|regexp|regexpi|regexprep|regexptranslate|rehash|rem|Remove|RemoveAll|repmat|reset|reshape|residue|"+ + "restoredefaultpath|rethrow|rgb2hsv|rgb2ind|rgbplot|ribbon|rmappdata|rmdir|rmfield|rmpath|rmpref|rng|roots|rose|rosser|rot90|rotate|rotate3d|round|rref|rsf2csf|run|save|saveas|"+ + "saveobj|savepath|scatter|scatter3|schur|sec|secd|sech|selectmoveresize|semilogx|semilogy|sendmail|serial|set|setappdata|setdiff|setenv|setfield|setpixelposition|setpref|setstr|"+ + "setxor|shading|shg|shiftdim|showplottool|shrinkfaces|sign|sin(?:d|h)?|size|slice|smooth3|snapnow|sort|sortrows|sound|soundsc|spalloc|spaugment|spconvert|spdiags|specular|speye|"+ + "spfun|sph2cart|sphere|spinmap|spline|spones|spparms|sprand|sprandn|sprandsym|sprank|spring|sprintf|spy|sqrt|sqrtm|squeeze|ss2tf|sscanf|stairs|startup|std|stem|stem3|stopasync|"+ + "str2double|str2func|str2mat|str2num|strcat|strcmp|strcmpi|stream2|stream3|streamline|streamparticles|streamribbon|streamslice|streamtube|strfind|strjust|strmatch|strncmp|"+ + "strncmpi|strread|strrep|strtok|strtrim|struct2cell|structfun|strvcat|sub2ind|subplot|subsasgn|subsindex|subspace|subsref|substruct|subvolume|sum|summer|superclasses|superiorto|"+ + "support|surf|surf2patch|surface|surfc|surfl|surfnorm|svd|svds|swapbytes|symamd|symbfact|symmlq|symrcm|symvar|system|tan(?:d|h)?|tar|tempdir|tempname|tetramesh|texlabel|text|"+ + "textread|textscan|textwrap|tfqmr|throw|tic|Tiff(?:.(?:getTagNames|getVersion))?|timer|timerfind|timerfindall|times|timeseries|title|toc|todatenum|toeplitz|toolboxdir|trace|"+ + "transpose|trapz|treelayout|treeplot|tril|trimesh|triplequad|triplot|TriRep|TriScatteredInterp|trisurf|triu|tscollection|tsearch|tsearchn|tstool|type|typecast|uibuttongroup|"+ + "uicontextmenu|uicontrol|uigetdir|uigetfile|uigetpref|uiimport|uimenu|uiopen|uipanel|uipushtool|uiputfile|uiresume|uisave|uisetcolor|uisetfont|uisetpref|uistack|uitable|"+ + "uitoggletool|uitoolbar|uiwait|uminus|undocheckout|unicode2native|union|unique|unix|unloadlibrary|unmesh|unmkpp|untar|unwrap|unzip|uplus|upper|urlread|urlwrite|usejava|"+ + "userpath|validateattributes|validatestring|vander|var|vectorize|ver|verctrl|verLessThan|version|vertcat|VideoReader(?:.isPlatformSupported)?|VideoWriter(?:.getProfiles)?|"+ + "view|viewmtx|visdiff|volumebounds|voronoi|voronoin|wait|waitbar|waitfor|waitforbuttonpress|warndlg|warning|waterfall|wavfinfo|wavplay|wavread|wavrecord|wavwrite|web|weekday|"+ + "what|whatsnew|which|whitebg|who|whos|wilkinson|winopen|winqueryreg|winter|wk1finfo|wk1read|wk1write|workspace|xlabel|xlim|xlsfinfo|xlsread|xlswrite|xmlread|xmlwrite|xor|xslt|"+ + "ylabel|ylim|zeros|zip|zlabel|zlim|zoom|addedvarplot|andrewsplot|anova(?:1|2|n)|ansaribradley|aoctool|barttest|bbdesign|beta(?:cdf|fit|inv|like|pdf|rnd|stat)|bino(?:cdf|fit|inv|"+ + "pdf|rnd|stat)|biplot|bootci|bootstrp|boxplot|candexch|candgen|canoncorr|capability|capaplot|caseread|casewrite|categorical|ccdesign|cdfplot|chi2(?:cdf|gof|inv|pdf|rnd|stat)|"+ + "cholcov|Classification(?:BaggedEnsemble|Discriminant(?:.(?:fit|make|template))?|Ensemble|KNN(?:.(?:fit|template))?|PartitionedEnsemble|PartitionedModel|Tree(?:.(?:fit|"+ + "template))?)|classify|classregtree|cluster|clusterdata|cmdscale|combnk|Compact(?:Classification(?:Discriminant|Ensemble|Tree)|Regression(?:Ensemble|Tree)|TreeBagger)|confusionmat|"+ + "controlchart|controlrules|cophenet|copula(?:cdf|fit|param|pdf|rnd|stat)|cordexch|corr|corrcov|coxphfit|createns|crosstab|crossval|cvpartition|datasample|dataset|daugment|dcovary|"+ + "dendrogram|dfittool|disttool|dummyvar|dwtest|ecdf|ecdfhist|ev(?:cdf|fit|inv|like|pdf|rnd|stat)|ExhaustiveSearcher|exp(?:cdf|fit|inv|like|pdf|rnd|stat)|factoran|fcdf|ff2n|finv|"+ + "fitdist|fitensemble|fpdf|fracfact|fracfactgen|friedman|frnd|fstat|fsurfht|fullfact|gagerr|gam(?:cdf|fit|inv|like|pdf|rnd|stat)|GeneralizedLinearModel(?:.fit)?|geo(?:cdf|inv|mean|"+ + "pdf|rnd|stat)|gev(?:cdf|fit|inv|like|pdf|rnd|stat)|gline|glmfit|glmval|glyphplot|gmdistribution(?:.fit)?|gname|gp(?:cdf|fit|inv|like|pdf|rnd|stat)|gplotmatrix|grp2idx|grpstats|"+ + "gscatter|haltonset|harmmean|hist3|histfit|hmm(?:decode|estimate|generate|train|viterbi)|hougen|hyge(?:cdf|inv|pdf|rnd|stat)|icdf|inconsistent|interactionplot|invpred|iqr|iwishrnd|"+ + "jackknife|jbtest|johnsrnd|KDTreeSearcher|kmeans|knnsearch|kruskalwallis|ksdensity|kstest|kstest2|kurtosis|lasso|lassoglm|lassoPlot|leverage|lhsdesign|lhsnorm|lillietest|"+ + "LinearModel(?:.fit)?|linhyptest|linkage|logn(?:cdf|fit|inv|like|pdf|rnd|stat)|lsline|mad|mahal|maineffectsplot|manova1|manovacluster|mdscale|mhsample|mle|mlecov|mnpdf|"+ + "mnrfit|mnrnd|mnrval|moment|multcompare|multivarichart|mvn(?:cdf|pdf|rnd)|mvregress|mvregresslike|mvt(?:cdf|pdf|rnd)|NaiveBayes(?:.fit)?|nan(?:cov|max|mean|median|min|std|"+ + "sum|var)|nbin(?:cdf|fit|inv|pdf|rnd|stat)|ncf(?:cdf|inv|pdf|rnd|stat)|nct(?:cdf|inv|pdf|rnd|stat)|ncx2(?:cdf|inv|pdf|rnd|stat)|NeighborSearcher|nlinfit|nlintool|nlmefit|nlmefitsa|"+ + "nlparci|nlpredci|nnmf|nominal|NonLinearModel(?:.fit)?|norm(?:cdf|fit|inv|like|pdf|rnd|stat)|normplot|normspec|ordinal|outlierMeasure|parallelcoords|paretotails|partialcorr|"+ + "pcacov|pcares|pdf|pdist|pdist2|pearsrnd|perfcurve|perms|piecewisedistribution|plsregress|poiss(?:cdf|fit|inv|pdf|rnd|tat)|polyconf|polytool|prctile|princomp|ProbDist(?:Kernel|"+ + "Parametric|UnivKernel|UnivParam)?|probplot|procrustes|qqplot|qrandset|qrandstream|quantile|randg|random|randsample|randtool|range|rangesearch|ranksum|rayl(?:cdf|fit|inv|pdf|"+ + "rnd|stat)|rcoplot|refcurve|refline|regress|Regression(?:BaggedEnsemble|Ensemble|PartitionedEnsemble|PartitionedModel|Tree(?:.(?:fit|template))?)|regstats|relieff|ridge|"+ + "robustdemo|robustfit|rotatefactors|rowexch|rsmdemo|rstool|runstest|sampsizepwr|scatterhist|sequentialfs|signrank|signtest|silhouette|skewness|slicesample|sobolset|squareform|"+ + "statget|statset|stepwise|stepwisefit|surfht|tabulate|tblread|tblwrite|tcdf|tdfread|tiedrank|tinv|tpdf|TreeBagger|treedisp|treefit|treeprune|treetest|treeval|trimmean|trnd|tstat|"+ + "ttest|ttest2|unid(?:cdf|inv|pdf|rnd|stat)|unif(?:cdf|inv|it|pdf|rnd|stat)|vartest(?:2|n)?|wbl(?:cdf|fit|inv|like|pdf|rnd|stat)|wblplot|wishrnd|x2fx|xptread|zscore|ztest"+ + "adapthisteq|analyze75info|analyze75read|applycform|applylut|axes2pix|bestblk|blockproc|bwarea|bwareaopen|bwboundaries|bwconncomp|bwconvhull|bwdist|bwdistgeodesic|bweuler|"+ + "bwhitmiss|bwlabel|bwlabeln|bwmorph|bwpack|bwperim|bwselect|bwtraceboundary|bwulterode|bwunpack|checkerboard|col2im|colfilt|conndef|convmtx2|corner|cornermetric|corr2|cp2tform|"+ + "cpcorr|cpselect|cpstruct2pairs|dct2|dctmtx|deconvblind|deconvlucy|deconvreg|deconvwnr|decorrstretch|demosaic|dicom(?:anon|dict|info|lookup|read|uid|write)|edge|edgetaper|entropy|"+ + "entropyfilt|fan2para|fanbeam|findbounds|fliptform|freqz2|fsamp2|fspecial|ftrans2|fwind1|fwind2|getheight|getimage|getimagemodel|getline|getneighbors|getnhood|getpts|"+ + "getrangefromclass|getrect|getsequence|gray2ind|graycomatrix|graycoprops|graydist|grayslice|graythresh|hdrread|hdrwrite|histeq|hough|houghlines|houghpeaks|iccfind|iccread|"+ + "iccroot|iccwrite|idct2|ifanbeam|im2bw|im2col|im2double|im2int16|im2java2d|im2single|im2uint16|im2uint8|imabsdiff|imadd|imadjust|ImageAdapter|imageinfo|imagemodel|imapplymatrix|"+ + "imattributes|imbothat|imclearborder|imclose|imcolormaptool|imcomplement|imcontour|imcontrast|imcrop|imdilate|imdisplayrange|imdistline|imdivide|imellipse|imerode|imextendedmax|"+ + "imextendedmin|imfill|imfilter|imfindcircles|imfreehand|imfuse|imgca|imgcf|imgetfile|imhandles|imhist|imhmax|imhmin|imimposemin|imlincomb|imline|immagbox|immovie|immultiply|imnoise|"+ + "imopen|imoverview|imoverviewpanel|impixel|impixelinfo|impixelinfoval|impixelregion|impixelregionpanel|implay|impoint|impoly|impositionrect|improfile|imputfile|impyramid|"+ + "imreconstruct|imrect|imregconfig|imregionalmax|imregionalmin|imregister|imresize|imroi|imrotate|imsave|imscrollpanel|imshow|imshowpair|imsubtract|imtool|imtophat|imtransform|"+ + "imview|ind2gray|ind2rgb|interfileinfo|interfileread|intlut|ippl|iptaddcallback|iptcheckconn|iptcheckhandle|iptcheckinput|iptcheckmap|iptchecknargin|iptcheckstrs|iptdemos|iptgetapi|"+ + "iptGetPointerBehavior|iptgetpref|ipticondir|iptnum2ordinal|iptPointerManager|iptprefs|iptremovecallback|iptSetPointerBehavior|iptsetpref|iptwindowalign|iradon|isbw|isflat|isgray|"+ + "isicc|isind|isnitf|isrgb|isrset|lab2double|lab2uint16|lab2uint8|label2rgb|labelmatrix|makecform|makeConstrainToRectFcn|makehdr|makelut|makeresampler|maketform|mat2gray|mean2|"+ + "medfilt2|montage|nitfinfo|nitfread|nlfilter|normxcorr2|ntsc2rgb|openrset|ordfilt2|otf2psf|padarray|para2fan|phantom|poly2mask|psf2otf|qtdecomp|qtgetblk|qtsetblk|radon|rangefilt|"+ + "reflect|regionprops|registration.metric.(?:MattesMutualInformation|MeanSquares)|registration.optimizer.(?:OnePlusOneEvolutionary|RegularStepGradientDescent)|rgb2gray|"+ + "rgb2ntsc|rgb2ycbcr|roicolor|roifill|roifilt2|roipoly|rsetwrite|std2|stdfilt|strel|stretchlim|subimage|tformarray|tformfwd|tforminv|tonemap|translate|truesize|uintlut|viscircles|"+ + "warp|watershed|whitepoint|wiener2|xyz2double|xyz2uint16|ycbcr2rgb|bintprog|color|fgoalattain|fminbnd|fmincon|fminimax|fminsearch|fminunc|fseminf|fsolve|fzero|fzmult|gangstr|ktrlink|"+ + "linprog|lsqcurvefit|lsqlin|lsqnonlin|lsqnonneg|optimget|optimset|optimtool|quadprog" + ); + var storageType = ( + "cell|struct|char|double|single|logical|u?int(?:8|16|32|64)|sparse" + ); + var keywordMapper = this.createKeywordMapper({ + "storage.type": storageType, + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + start: [{ + token : "string", + regex : "'", + stateName : "qstring", + next : [{ + token : "constant.language.escape", + regex : "''" + }, { + token : "string", + regex : "'|$", + next : "start" + }, { + defaultToken: "string" + }] + }, { + token : "text", + regex : "\\s+" + }, { + regex: "", + next: "noQstring" + }], + noQstring : [{ + regex: "^\\s*%{\\s*$", + token: "comment.start", + push: "blockComment" + }, { + token : "comment", + regex : "%[^\r\n]*" + }, { + token : "string", + regex : '"', + stateName : "qqstring", + next : [{ + token : "constant.language.escape", + regex : /\\./ + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken: "string" + }] + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=", + next: "start" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\.", + next: "start" + }, { + token : "paren.lparen", + regex : "[({\\[]", + next: "start" + }, { + token : "paren.rparen", + regex : "[\\]})]" + }, { + token : "text", + regex : "\\s+" + }, { + token : "text", + regex : "$", + next : "start" + }], + blockComment: [{ + regex: "^\\s*%{\\s*$", + token: "comment.start", + push: "blockComment" + }, { + regex: "^\\s*%}\\s*$", + token: "comment.end", + next: "pop" + }, { + defaultToken: "comment" + }] + }; + + this.normalizeRules(); +}; + +oop.inherits(MatlabHighlightRules, TextHighlightRules); + +exports.MatlabHighlightRules = MatlabHighlightRules; +}); + +ace.define("ace/mode/matlab",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/matlab_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MatlabHighlightRules = require("./matlab_highlight_rules").MatlabHighlightRules; + +var Mode = function() { + this.HighlightRules = MatlabHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "%"; + this.blockComment = {start: "%{", end: "%}"}; + + this.$id = "ace/mode/matlab"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-mavens_mate_log.js b/src/libs/ace/mode-mavens_mate_log.js new file mode 100755 index 0000000..8f73e66 --- /dev/null +++ b/src/libs/ace/mode-mavens_mate_log.js @@ -0,0 +1,160 @@ +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/mavens_mate_log",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/mavens_mate_log_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MavensMateLogHighlightRules = require("./mavens_mate_log_highlight_rules").MavensMateLogHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = MavensMateLogHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/mavens_mate_log" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-maze.js b/src/libs/ace/mode-maze.js new file mode 100755 index 0000000..cdc8d22 --- /dev/null +++ b/src/libs/ace/mode-maze.js @@ -0,0 +1,284 @@ +ace.define("ace/mode/maze_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MazeHighlightRules = function() { + + this.$rules = { + start: [{ + token: "keyword.control", + regex: /##|``/, + comment: "Wall" + }, { + token: "entity.name.tag", + regex: /\.\./, + comment: "Path" + }, { + token: "keyword.control", + regex: /<>/, + comment: "Splitter" + }, { + token: "entity.name.tag", + regex: /\*[\*A-Za-z0-9]/, + comment: "Signal" + }, { + token: "constant.numeric", + regex: /[0-9]{2}/, + comment: "Pause" + }, { + token: "keyword.control", + regex: /\^\^/, + comment: "Start" + }, { + token: "keyword.control", + regex: /\(\)/, + comment: "Hole" + }, { + token: "support.function", + regex: />>/, + comment: "Out" + }, { + token: "support.function", + regex: />\//, + comment: "Ln Out" + }, { + token: "support.function", + regex: /< *)(?:([-+*\/]=)( *)((?:-)?)([0-9]+)|(=)( *)(?:((?:-)?)([0-9]+)|("[^"]*")|('[^']*')))/, + comment: "Assignment function" + }, { + token: [ + "entity.name.function", + "keyword.other", + "keyword.control", + "keyword.other", + "keyword.operator", + "keyword.other", + "keyword.operator", + "constant.numeric", + "entity.name.tag", + "keyword.other", + "keyword.control", + "keyword.other", + "constant.language", + "keyword.other", + "keyword.control", + "keyword.other", + "constant.language" + ], + regex: /([A-Za-z][A-Za-z0-9])( *-> *)(IF|if)( *)(?:([<>]=?|==)( *)((?:-)?)([0-9]+)|(\*[\*A-Za-z0-9]))( *)(THEN|then)( *)(%[LRUDNlrudn])(?:( *)(ELSE|else)( *)(%[LRUDNlrudn]))?/, + comment: "Equality Function" + }, { + token: "entity.name.function", + regex: /[A-Za-z][A-Za-z0-9]/, + comment: "Function cell" + }, { + token: "comment.line.double-slash", + regex: / *\/\/.*/, + comment: "Comment" + }] + }; + + this.normalizeRules(); +}; + +MazeHighlightRules.metaData = { + fileTypes: ["mz"], + name: "Maze", + scopeName: "source.maze" +}; + + +oop.inherits(MazeHighlightRules, TextHighlightRules); + +exports.MazeHighlightRules = MazeHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/maze",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/maze_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MazeHighlightRules = require("./maze_highlight_rules").MazeHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = MazeHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.$id = "ace/mode/maze"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-mel.js b/src/libs/ace/mode-mel.js new file mode 100755 index 0000000..20de249 --- /dev/null +++ b/src/libs/ace/mode-mel.js @@ -0,0 +1,256 @@ +ace.define("ace/mode/mel_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MELHighlightRules = function() { + + this.$rules = { start: + [ { caseInsensitive: true, + token: 'storage.type.mel', + regex: '\\b(matrix|string|vector|float|int|void)\\b' }, + { caseInsensitive: true, + token: 'support.function.mel', + regex: '\\b((s(h(ow(ManipCtx|S(hadingGroupAttrEditor|electionInTitle)|H(idden|elp)|Window)|el(f(Button|TabLayout|Layout)|lField)|ading(GeometryRelCtx|Node|Connection|LightRelCtx))|y(s(tem|File)|mbol(Button|CheckBox))|nap(shot|Mode|2to2 |TogetherCtx|Key)|c(ulpt|ene(UIReplacement|Editor)|ale(BrushBrightness |Constraint|Key(Ctx)?)?|r(ipt(Node|Ctx|Table|edPanel(Type)?|Job|EditorInfo)|oll(Field|Layout))|mh)|t(itch(Surface(Points)?|AndExplodeShell )|a(ckTrace|rt(sWith |String ))|r(cmp|i(ng(ToStringArray |Array(Remove(Duplicates | )|C(ount |atenate )|ToString |Intersector))|p )|oke))|i(n(gleProfileBirailSurface)?|ze|gn|mplify)|o(u(nd(Control)?|rce)|ft(Mod(Ctx)?)?|rt)|u(perCtx|rface(S(haderList|ampler))?|b(st(itute(Geometry|AllString )?|ring)|d(M(irror|a(tchTopology|p(SewMove|Cut)))|iv(Crease|DisplaySmoothness)?|C(ollapse|leanTopology)|T(o(Blind|Poly)|ransferUVsToCache)|DuplicateAndConnect|EditUV|ListComponentConversion|AutoProjection)))|p(h(ere|rand)|otLight(PreviewPort)?|aceLocator|r(ing|eadSheetEditor))|e(t(s|MenuMode|Sta(te |rtupMessage|mpDensity )|NodeTypeFlag|ConstraintRestPosition |ToolTo|In(putDeviceMapping|finity)|D(ynamic|efaultShadingGroup|rivenKeyframe)|UITemplate|P(ar(ticleAttr|ent)|roject )|E(scapeCtx|dit(or|Ctx))|Key(Ctx|frame|Path)|F(ocus|luidAttr)|Attr(Mapping)?)|parator|ed|l(ect(Mode|ionConnection|Context|Type|edNodes|Pr(iority|ef)|Key(Ctx)?)?|LoadSettings)|archPathArray )|kin(Cluster|Percent)|q(uareSurface|rt)|w(itchTable|atchDisplayPort)|a(ve(Menu|Shelf|ToolSettings|I(nitialState|mage)|Pref(s|Objects)|Fluid|A(ttrPreset |llShelves))|mpleImage)|rtContext|mooth(step|Curve|TangentSurface))|h(sv_to_rgb|yp(ot|er(Graph|Shade|Panel))|i(tTest|de|lite)|ot(Box|key(Check)?)|ud(Button|Slider(Button)?)|e(lp(Line)?|adsUpDisplay|rmite)|wRe(nder(Load)?|flectionMap)|ard(enPointCurve|ware(RenderPanel)?))|n(o(nLinear|ise|de(Type|IconButton|Outliner|Preset)|rmal(ize |Constraint))|urbs(Boolean|S(elect|quare)|C(opyUVSet|ube)|To(Subdiv|Poly(gonsPref)?)|Plane|ViewDirectionVector )|ew(ton|PanelItems)|ame(space(Info)?|Command|Field))|c(h(oice|dir|eck(Box(Grp)?|DefaultRenderGlobals)|a(n(nelBox|geSubdiv(Region|ComponentDisplayLevel))|racter(Map|OutlineEditor)?))|y(cleCheck|linder)|tx(Completion|Traverse|EditMode|Abort)|irc(ularFillet|le)|o(s|n(str(uctionHistory|ain(Value)?)|nect(ionInfo|Control|Dynamic|Joint|Attr)|t(extInfo|rol)|dition|e|vert(SolidTx|Tessellation|Unit|FromOldLayers |Lightmap)|firmDialog)|py(SkinWeights|Key|Flexor|Array )|l(or(Slider(Grp|ButtonGrp)|Index(SliderGrp)?|Editor|AtPoint)?|umnLayout|lision)|arsenSubdivSelectionList|m(p(onentEditor|utePolysetVolume |actHairSystem )|mand(Port|Echo|Line)))|u(tKey|r(ve(MoveEPCtx|SketchCtx|CVCtx|Intersect|OnSurface|E(ditorCtx|PCtx)|AddPtCtx)?|rent(Ctx|Time(Ctx)?|Unit)))|p(GetSolverAttr|Button|S(olver(Types)?|e(t(SolverAttr|Edit)|am))|C(o(nstraint|llision)|ache)|Tool|P(anel|roperty))|eil|l(ip(Schedule(rOutliner)?|TrimBefore |Editor(CurrentTimeCtx)?)?|ose(Surface|Curve)|uster|ear(Cache)?|amp)|a(n(CreateManip|vas)|tch(Quiet)?|pitalizeString |mera(View)?)|r(oss(Product )?|eate(RenderLayer|MotionField |SubdivRegion|N(ode|ewShelf )|D(isplayLayer|rawCtx)|Editor))|md(Shell|FileOutput))|M(R(ender(ShadowData|Callback|Data|Util|View|Line(Array)?)|ampAttribute)|G(eometryData|lobal)|M(odelMessage|essage|a(nipData|t(erial|rix)))|BoundingBox|S(yntax|ceneMessage|t(atus|ring(Array)?)|imple|pace|elect(ion(Mask|List)|Info)|watchRender(Register|Base))|H(ardwareRenderer|WShaderSwatchGenerator)|NodeMessage|C(o(nditionMessage|lor(Array)?|m(putation|mand(Result|Message)))|ursor|loth(Material|S(ystem|olverRegister)|Con(straint|trol)|Triangle|Particle|Edge|Force)|allbackIdArray)|T(ypeId|ime(r(Message)?|Array)?|oolsInfo|esselationParams|r(imBoundaryArray|ansformationMatrix))|I(ntArray|t(Geometry|Mesh(Polygon|Edge|Vertex|FaceVertex)|S(urfaceCV|electionList)|CurveCV|Instancer|eratorType|D(ependency(Graph|Nodes)|ag)|Keyframe)|k(System|HandleGroup)|mage)|3dView|Object(SetMessage|Handle|Array)?|D(G(M(odifier|essage)|Context)|ynSwept(Triangle|Line)|istance|oubleArray|evice(State|Channel)|a(ta(Block|Handle)|g(M(odifier|essage)|Path(Array)?))|raw(Request(Queue)?|Info|Data|ProcedureBase))|U(serEventMessage|i(nt(Array|64Array)|Message))|P(o(int(Array)?|lyMessage)|lug(Array)?|rogressWindow|x(G(eometry(Iterator|Data)|lBuffer)|M(idiInputDevice|odelEditorCommand|anipContainer)|S(urfaceShape(UI)?|pringNode|electionContext)|HwShaderNode|Node|Co(ntext(Command)?|m(ponentShape|mand))|T(oolCommand|ransform(ationMatrix)?)|IkSolver(Node)?|3dModelView|ObjectSet|D(eformerNode|ata|ragAndDropBehavior)|PolyT(weakUVCommand|rg)|EmitterNode|F(i(eldNode|leTranslator)|luidEmitterNode)|LocatorNode))|E(ulerRotation|vent(Message)?)|ayatomr|Vector(Array)?|Quaternion|F(n(R(otateManip|eflectShader|adialField)|G(e(nericAttribute|ometry(Data|Filter))|ravityField)|M(otionPath|es(sageAttribute|h(Data)?)|a(nip3D|trix(Data|Attribute)))|B(l(innShader|endShapeDeformer)|ase)|S(caleManip|t(ateManip|ring(Data|ArrayData))|ingleIndexedComponent|ubd(Names|Data)?|p(hereData|otLight)|et|kinCluster)|HikEffector|N(on(ExtendedLight|AmbientLight)|u(rbs(Surface(Data)?|Curve(Data)?)|meric(Data|Attribute))|ewtonField)|C(haracter|ircleSweepManip|ompo(nent(ListData)?|undAttribute)|urveSegmentManip|lip|amera)|T(ypedAttribute|oggleManip|urbulenceField|r(ipleIndexedComponent|ansform))|I(ntArrayData|k(Solver|Handle|Joint|Effector))|D(ynSweptGeometryData|i(s(cManip|tanceManip)|rection(Manip|alLight))|ouble(IndexedComponent|ArrayData)|ependencyNode|a(ta|gNode)|ragField)|U(ni(tAttribute|formField)|Int64ArrayData)|P(hong(Shader|EShader)|oint(On(SurfaceManip|CurveManip)|Light|ArrayData)|fxGeometry|lugin(Data)?|arti(cleSystem|tion))|E(numAttribute|xpression)|V(o(lume(Light|AxisField)|rtexField)|ectorArrayData)|KeyframeDelta(Move|B(lockAddRemove|reakdown)|Scale|Tangent|InfType|Weighted|AddRemove)?|F(ield|luid|reePointTriadManip)|W(ireDeformer|eightGeometryFilter)|L(ight(DataAttribute)?|a(yeredShader|ttice(D(eformer|ata))?|mbertShader))|A(ni(sotropyShader|mCurve)|ttribute|irField|r(eaLight|rayAttrsData)|mbientLight))?|ile(IO|Object)|eedbackLine|loat(Matrix|Point(Array)?|Vector(Array)?|Array))|L(i(ghtLinks|brary)|ockMessage)|A(n(im(Message|C(ontrol|urveC(hange|lipboard(Item(Array)?)?))|Util)|gle)|ttribute(Spec(Array)?|Index)|r(rayData(Builder|Handle)|g(Database|Parser|List))))|t(hreePointArcCtx|ime(Control|Port|rX)|o(ol(Button|HasOptions|Collection|Dropped|PropertyWindow)|NativePath |upper|kenize(List )?|l(ower|erance)|rus|ggle(WindowVisibility|Axis)?)|u(rbulence|mble(Ctx)?)|ex(RotateContext|M(oveContext|anipContext)|t(ScrollList|Curves|ure(HairColor |DisplacePlane |PlacementContext|Window)|ToShelf |Field(Grp|ButtonGrp)?)?|S(caleContext|electContext|mudgeUVContext)|WinToolCtx)|woPointArcCtx|a(n(gentConstraint)?|bLayout)|r(im|unc(ate(HairCache|FluidCache))?|a(ns(formLimits|lator)|c(e|k(Ctx)?))))|i(s(olateSelect|Connected|True|Dirty|ParentOf |Valid(String |ObjectName |UiName )|AnimCurve )|n(s(tance(r)?|ert(Joint(Ctx)?|K(not(Surface|Curve)|eyCtx)))|heritTransform|t(S(crollBar|lider(Grp)?)|er(sect|nalVar|ToUI )|Field(Grp)?))|conText(Radio(Button|Collection)|Button|StaticLabel|CheckBox)|temFilter(Render|Type|Attr)?|prEngine|k(S(ystem(Info)?|olver|plineHandleCtx)|Handle(Ctx|DisplayScale)?|fkDisplayMethod)|m(portComposerCurves |fPlugins|age))|o(ceanNurbsPreviewPlane |utliner(Panel|Editor)|p(tion(Menu(Grp)?|Var)|en(GLExtension|MayaPref))|verrideModifier|ffset(Surface|Curve(OnSurface)?)|r(ientConstraint|bit(Ctx)?)|b(soleteProc |j(ect(Center|Type(UI)?|Layer )|Exists)))|d(yn(RelEd(itor|Panel)|Globals|C(ontrol|ache)|P(a(intEditor|rticleCtx)|ref)|Exp(ort|ression)|amicLoad)|i(s(connect(Joint|Attr)|tanceDim(Context|ension)|pla(y(RGBColor|S(tats|urface|moothness)|C(olor|ull)|Pref|LevelOfDetail|Affected)|cementToPoly)|kCache|able)|r(name |ect(ionalLight|KeyCtx)|map)|mWhen)|o(cServer|Blur|t(Product )?|ubleProfileBirailSurface|peSheetEditor|lly(Ctx)?)|uplicate(Surface|Curve)?|e(tach(Surface|Curve|DeviceAttr)|vice(Panel|Editor)|f(ine(DataServer|VirtualDevice)|ormer|ault(Navigation|LightListCheckBox))|l(ete(Sh(elfTab |adingGroupsAndMaterials )|U(nusedBrushes |I)|Attr)?|randstr)|g_to_rad)|agPose|r(opoffLocator|ag(gerContext)?)|g(timer|dirty|Info|eval))|CBG |u(serCtx|n(t(angleUV|rim)|i(t|form)|do(Info)?|loadPlugin|assignInputDevice|group)|iTemplate|p(dateAE |Axis)|v(Snapshot|Link))|joint(C(tx|luster)|DisplayScale|Lattice)?|p(sd(ChannelOutliner|TextureFile|E(ditTextureFile|xport))|close|i(c(ture|kWalk)|xelMove)|o(se|int(MatrixMult |C(onstraint|urveConstraint)|On(Surface|Curve)|Position|Light)|p(upMenu|en)|w|l(y(Reduce|GeoSampler|M(irrorFace|ove(UV|Edge|Vertex|Facet(UV)?)|erge(UV|Edge(Ctx)?|Vertex|Facet(Ctx)?)|ap(Sew(Move)?|Cut|Del))|B(oolOp|evel|l(indData|endColor))|S(traightenUVBorder|oftEdge|u(perCtx|bdivide(Edge|Facet))|p(her(icalProjection|e)|lit(Ring|Ctx|Edge|Vertex)?)|e(tToFaceNormal|parate|wEdge|lect(Constraint(Monitor)?|EditCtx))|mooth)|Normal(izeUV|PerVertex)?|C(hipOff|ylind(er|ricalProjection)|o(ne|pyUV|l(or(BlindData|Set|PerVertex)|lapse(Edge|Facet)))|u(t(Ctx)?|be)|l(ipboard|oseBorder)|acheMonitor|rea(seEdge|teFacet(Ctx)?))|T(o(Subdiv|rus)|r(iangulate|ansfer))|In(stallAction|fo)|Options|D(uplicate(Edge|AndConnect)|el(Edge|Vertex|Facet))|U(nite|VSet)|P(yramid|oke|lan(e|arProjection)|r(ism|ojection))|E(ditUV|valuate|xtrude(Edge|Facet))|Qu(eryBlindData|ad)|F(orceUV|lip(UV|Edge))|WedgeFace|L(istComponentConversion|ayoutUV)|A(utoProjection|ppend(Vertex|FacetCtx)?|verage(Normal|Vertex)))|eVectorConstraint))|utenv|er(cent|formanceOptions)|fxstrokes|wd|l(uginInfo|a(y(b(last|ackOptions))?|n(e|arSrf)))|a(steKey|ne(l(History|Configuration)?|Layout)|thAnimation|irBlend|use|lettePort|r(ti(cle(RenderInfo|Instancer|Exists)?|tion)|ent(Constraint)?|am(Dim(Context|ension)|Locator)))|r(int|o(j(ect(ion(Manip|Context)|Curve|Tangent)|FileViewer)|pMo(dCtx|ve)|gress(Bar|Window)|mptDialog)|eloadRefEd))|e(n(codeString|d(sWith |String )|v|ableDevice)|dit(RenderLayer(Globals|Members)|or(Template)?|DisplayLayer(Globals|Members)|AttrLimits )|v(ent|al(Deferred|Echo)?)|quivalent(Tol | )|ffector|r(f|ror)|x(clusiveLightCheckBox|t(end(Surface|Curve)|rude)|ists|p(ortComposerCurves |ression(EditorListen)?)?|ec(uteForEachObject )?|actWorldBoundingBox)|mit(ter)?)|v(i(sor|ew(Set|HeadOn|2dToolCtx|C(lipPlane|amera)|Place|Fit|LookAt))|o(lumeAxis|rtex)|e(ctorize|rifyCmd )|alidateShelfName )|key(Tangent|frame(Region(MoveKeyCtx|S(caleKeyCtx|e(tKeyCtx|lectKeyCtx))|CurrentTimeCtx|TrackCtx|InsertKeyCtx|D(irectKeyCtx|ollyCtx))|Stats|Outliner)?)|qu(it|erySubdiv)|f(c(heck|lose)|i(nd(RelatedSkinCluster |MenuItem |er|Keyframe|AllIntersections )|tBspline|l(ter(StudioImport|Curve|Expand)?|e(BrowserDialog|test|Info|Dialog|Extension )?|letCurve)|rstParentOf )|o(ntDialog|pen|rmLayout)|print|eof|flush|write|l(o(or|w|at(S(crollBar|lider(Grp|ButtonGrp|2)?)|Eq |Field(Grp)?))|u(shUndo|id(CacheInfo|Emitter|VoxelInfo))|exor)|r(omNativePath |e(eFormFillet|wind|ad)|ameLayout)|get(word|line)|mod)|w(hatIs|i(ndow(Pref)?|re(Context)?)|orkspace|ebBrowser(Prefs)?|a(itCursor|rning)|ri(nkle(Context)?|teTake))|l(s(T(hroughFilter|ype )|UI)?|i(st(Relatives|MenuAnnotation |Sets|History|NodeTypes|C(onnections|ameras)|Transforms |InputDevice(s|Buttons|Axes)|erEditor|DeviceAttachments|Unselected |A(nimatable|ttr))|n(step|eIntersection )|ght(link|List(Panel|Editor)?))|o(ckNode|okThru|ft|ad(NewShelf |P(lugin|refObjects)|Fluid)|g)|a(ssoContext|y(out|er(Button|ed(ShaderPort|TexturePort)))|ttice(DeformKeyCtx)?|unch(ImageEditor)?))|a(ssign(Command|InputDevice)|n(notate|im(C(one|urveEditor)|Display|View)|gle(Between)?)|tt(ach(Surface|Curve|DeviceAttr)|r(ibute(Menu|Info|Exists|Query)|NavigationControlGrp|Co(ntrolGrp|lorSliderGrp|mpatibility)|PresetEditWin|EnumOptionMenu(Grp)?|Field(Grp|SliderGrp)))|i(r|mConstraint)|d(d(NewShelfTab|Dynamic|PP|Attr(ibuteEditorNodeHelp)?)|vanceToNextDrivenKey)|uto(Place|Keyframe)|pp(endStringArray|l(y(Take|AttrPreset)|icationName))|ffect(s|edNet)|l(i(as(Attr)?|gn(Surface|C(tx|urve))?)|lViewFit)|r(c(len|Len(DimContext|gthDimension))|t(BuildPaintMenu|Se(tPaintCtx|lectCtx)|3dPaintCtx|UserPaintCtx|PuttyCtx|FluidAttrCtx|Attr(SkinPaintCtx|Ctx|PaintVertexCtx))|rayMapper)|mbientLight|b(s|out))|r(igid(Body|Solver)|o(t(at(ionInterpolation|e))?|otOf |undConstantRadius|w(ColumnLayout|Layout)|ll(Ctx)?)|un(up|TimeCommand)|e(s(olutionNode|et(Tool|AE )|ampleFluid)|hash|n(der(GlobalsNode|Manip|ThumbnailUpdate|Info|er|Partition|QualityNode|Window(SelectContext|Editor)|LayerButton)?|ame(SelectionList |UI|Attr)?)|cord(Device|Attr)|target|order(Deformers)?|do|v(olve|erse(Surface|Curve))|quires|f(ineSubdivSelectionList|erence(Edit|Query)?|resh(AE )?)|loadImage|adTake|root|move(MultiInstance|Joint)|build(Surface|Curve))|a(n(d(state|omizeFollicles )?|geControl)|d(i(o(MenuItemCollection|Button(Grp)?|Collection)|al)|_to_deg)|mpColorPort)|gb_to_hsv)|g(o(toBindPose |al)|e(t(M(odifiers|ayaPanelTypes )|Classification|InputDeviceRange|pid|env|DefaultBrush|Pa(nel|rticleAttr)|F(ileList|luidAttr)|A(ttr|pplicationVersionAsFloat ))|ometryConstraint)|l(Render(Editor)?|obalStitch)|a(uss|mma)|r(id(Layout)?|oup(ObjectsByName )?|a(dientControl(NoAttr)?|ph(SelectContext|TrackCtx|DollyCtx)|vity|bColor))|match)|x(pmPicker|form|bmLangPathList )|m(i(n(imizeApp)?|rrorJoint)|o(del(CurrentTimeCtx|Panel|Editor)|use|v(In|e(IKtoFK |VertexAlongDirection|KeyCtx)?|Out))|u(te|ltiProfileBirailSurface)|e(ssageLine|nu(BarLayout|Item(ToShelf )?|Editor)?|mory)|a(nip(Rotate(Context|LimitsCtx)|Move(Context|LimitsCtx)|Scale(Context|LimitsCtx)|Options)|tch|ke(Roll |SingleSurface|TubeOn |Identity|Paintable|bot|Live)|rker|g|x))|b(in(Membership|d(Skin|Pose))|o(neLattice|undary|x(ZoomCtx|DollyCtx))|u(tton(Manip)?|ild(BookmarkMenu|KeyframeMenu)|fferCurve)|e(ssel|vel(Plus)?)|l(indDataType|end(Shape(Panel|Editor)?|2|TwoAttr))|a(sename(Ex | )|tchRender|ke(Results|Simulation|Clip|PartialHistory|FluidShading )))))\\b' }, + { caseInsensitive: true, + token: 'support.constant.mel', + regex: '\\b(s(h(ellTessellate|a(d(ing(Map|Engine)|erGlow)|pe))|n(ow|apshot(Shape)?)|c(ulpt|aleConstraint|ript)|t(yleCurve|itch(Srf|AsNurbsShell)|u(cco|dioClearCoat)|encil|roke(Globals)?)|i(ngleShadingSwitch|mpleVolumeShader)|o(ftMod(Manip|Handle)?|lidFractal)|u(rface(Sha(der|pe)|Info|EdManip|VarGroup|Luminance)|b(Surface|d(M(odifier(UV|World)?|ap(SewMove|Cut|pingManip))|B(lindData|ase)|iv(ReverseFaces|SurfaceVarGroup|Co(llapse|mponentId)|To(Nurbs|Poly))?|HierBlind|CleanTopology|Tweak(UV)?|P(lanarProj|rojManip)|LayoutUV|A(ddTopology|utoProj))|Curve))|p(BirailSrf|otLight|ring)|e(tRange|lectionListOperator)|k(inCluster|etchPlane)|quareSrf|ampler(Info)?|m(ooth(Curve|TangentSrf)|ear))|h(svToRgb|yper(GraphInfo|View|Layout)|ik(Solver|Handle|Effector)|oldMatrix|eightField|w(Re(nderGlobals|flectionMap)|Shader)|a(ir(System|Constraint|TubeShader)|rd(enPoint|wareRenderGlobals)))|n(o(n(ExtendedLightShapeNode|Linear|AmbientLightShapeNode)|ise|rmalConstraint)|urbs(Surface|Curve|T(oSubdiv(Proc)?|essellate)|DimShape)|e(twork|wtonField))|c(h(o(ice|oser)|ecker|aracter(Map|Offset)?)|o(n(straint|tr(olPoint|ast)|dition)|py(ColorSet|UVSet))|urve(Range|Shape|Normalizer(Linear|Angle)?|In(tersect|fo)|VarGroup|From(Mesh(CoM|Edge)?|Su(rface(Bnd|CoS|Iso)?|bdiv(Edge|Face)?)))|l(ip(Scheduler|Library)|o(se(stPointOnSurface|Surface|Curve)|th|ud)|uster(Handle)?|amp)|amera(View)?|r(eate(BPManip|ColorSet|UVSet)|ater))|t(ime(ToUnitConversion|Function)?|oo(nLineAttributes|lDrawManip)|urbulenceField|ex(BaseDeformManip|ture(BakeSet|2d|ToGeom|3d|Env)|SmudgeUVManip|LatticeDeformManip)|weak|angentConstraint|r(i(pleShadingSwitch|m(WithBoundaries)?)|ansform(Geometry)?))|i(n(s(tancer|ertKnot(Surface|Curve))|tersectSurface)|k(RPsolver|MCsolver|S(ystem|olver|Csolver|plineSolver)|Handle|PASolver|Effector)|m(plicit(Box|Sphere|Cone)|agePlane))|o(cean(Shader)?|pticalFX|ffset(Surface|C(os|urve))|ldBlindDataBase|rient(Constraint|ationMarker)|bject(RenderFilter|MultiFilter|BinFilter|S(criptFilter|et)|NameFilter|TypeFilter|Filter|AttrFilter))|d(yn(Globals|Base)|i(s(tance(Between|DimShape)|pla(yLayer(Manager)?|cementShader)|kCache)|rect(ionalLight|edDisc)|mensionShape)|o(ubleShadingSwitch|f)|pBirailSrf|e(tach(Surface|Curve)|pendNode|f(orm(Bend|S(ine|quash)|Twist|ableShape|F(unc|lare)|Wave)|ault(RenderUtilityList|ShaderList|TextureList|LightList))|lete(Co(lorSet|mponent)|UVSet))|ag(Node|Pose)|r(opoffLocator|agField))|u(seBackground|n(trim|i(t(Conversion|ToTimeConversion)|formField)|known(Transform|Dag)?)|vChooser)|j(iggle|oint(Cluster|Ffd|Lattice)?)|p(sdFileTex|hong(E)?|o(s(tProcessList|itionMarker)|int(MatrixMult|Constraint|On(SurfaceInfo|CurveInfo)|Emitter|Light)|l(y(Reduce|M(irror|o(difier(UV|World)?|ve(UV|Edge|Vertex|Face(tUV)?))|erge(UV|Edge|Vert|Face)|ap(Sew(Move)?|Cut|Del))|B(oolOp|evel|lindData|ase)|S(traightenUVBorder|oftEdge|ubd(Edge|Face)|p(h(ere|Proj)|lit(Ring|Edge|Vert)?)|e(parate|wEdge)|mooth(Proxy|Face)?)|Normal(izeUV|PerVertex)?|C(hipOff|yl(inder|Proj)|o(ne|pyUV|l(orPerVertex|lapse(Edge|F)))|u(t(Manip(Container)?)?|be)|loseBorder|rea(seEdge|t(or|eFace)))|T(o(Subdiv|rus)|weak(UV)?|r(iangulate|ansfer))|OptUvs|D(uplicateEdge|el(Edge|Vertex|Facet))|Unite|P(yramid|oke(Manip)?|lan(e|arProj)|r(i(sm|mitive)|oj))|Extrude(Edge|Vertex|Face)|VertexNormalManip|Quad|Flip(UV|Edge)|WedgeFace|LayoutUV|A(utoProj|ppend(Vertex)?|verageVertex))|eVectorConstraint))|fx(Geometry|Hair|Toon)|l(usMinusAverage|a(n(e|arTrimSurface)|ce(2dTexture|3dTexture)))|a(ssMatrix|irBlend|r(ti(cle(SamplerInfo|C(olorMapper|loud)|TranspMapper|IncandMapper|AgeMapper)?|tion)|ent(Constraint|Tessellate)|amDimension))|r(imitive|o(ject(ion|Curve|Tangent)|xyManager)))|e(n(tity|v(Ball|ironmentFog|S(phere|ky)|C(hrome|ube)|Fog))|x(t(end(Surface|Curve)|rude)|p(lodeNurbsShell|ression)))|v(iewManip|o(lume(Shader|Noise|Fog|Light|AxisField)|rtexField)|e(ctor(RenderGlobals|Product)|rtexBakeSet))|quadShadingSwitch|f(i(tBspline|eld|l(ter(Resample|Simplify|ClosestSample|Euler)?|e|letCurve))|o(urByFourMatrix|llicle)|urPointOn(MeshInfo|Subd)|f(BlendSrf(Obsolete)?|d|FilletSrf)|l(ow|uid(S(hape|liceManip)|Texture(2D|3D)|Emitter)|exorShape)|ra(ctal|meCache))|w(tAddMatrix|ire|ood|eightGeometryFilter|ater|rap)|l(ight(Info|Fog|Li(st|nker))?|o(cator|okAt|d(Group|Thresholds)|ft)|uminance|ea(stSquaresModifier|ther)|a(yered(Shader|Texture)|ttice|mbert))|a(n(notationShape|i(sotropic|m(Blend(InOut)?|C(urve(T(T|U|L|A)|U(T|U|L|A))?|lip)))|gleBetween)|tt(ach(Surface|Curve)|rHierarchyTest)|i(rField|mConstraint)|dd(Matrix|DoubleLinear)|udio|vg(SurfacePoints|NurbsSurfacePoints|Curves)|lign(Manip|Surface|Curve)|r(cLengthDimension|tAttrPaintTest|eaLight|rayMapper)|mbientLight|bstractBase(NurbsConversion|Create))|r(igid(Body|Solver|Constraint)|o(ck|undConstantRadius)|e(s(olution|ultCurve(TimeTo(Time|Unitless|Linear|Angular))?)|nder(Rect|Globals(List)?|Box|Sphere|Cone|Quality|L(ight|ayer(Manager)?))|cord|v(olve(dPrimitive)?|erse(Surface|Curve)?)|f(erence|lect)|map(Hsv|Color|Value)|build(Surface|Curve))|a(dialField|mp(Shader)?)|gbToHsv|bfSrf)|g(uide|eo(Connect(or|able)|metry(Shape|Constraint|VarGroup|Filter))|lobal(Stitch|CacheControl)|ammaCorrect|r(id|oup(Id|Parts)|a(nite|vityField)))|Fur(Globals|Description|Feedback|Attractors)|xformManip|m(o(tionPath|untain|vie)|u(te|lt(Matrix|i(plyDivide|listerLight)|DoubleLinear))|pBirailSrf|e(sh(VarGroup)?|ntalray(Texture|IblShape))|a(terialInfo|ke(Group|Nurb(sSquare|Sphere|C(ylinder|ircle|one|ube)|Torus|Plane)|CircularArc|T(hreePointCircularArc|extCurves|woPointCircularArc))|rble))|b(irailSrf|o(neLattice|olean|undary(Base)?)|u(lge|mp(2d|3d))|evel(Plus)?|l(in(n|dDataTemplate)|end(Shape|Color(s|Sets)|TwoAttr|Device|Weighted)?)|a(se(GeometryVarGroup|ShadingSwitch|Lattice)|keSet)|r(ownian|ush)))\\b' }, + { caseInsensitive: true, + token: 'keyword.control.mel', + regex: '\\b(if|in|else|for|while|break|continue|case|default|do|switch|return|switch|case|source|catch|alias)\\b' }, + { token: 'keyword.other.mel', regex: '\\b(global)\\b' }, + { caseInsensitive: true, + token: 'constant.language.mel', + regex: '\\b(null|undefined)\\b' }, + { token: 'constant.numeric.mel', + regex: '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\b' }, + { token: 'punctuation.definition.string.begin.mel', + regex: '"', + push: + [ { token: 'constant.character.escape.mel', regex: '\\\\.' }, + { token: 'punctuation.definition.string.end.mel', + regex: '"', + next: 'pop' }, + { defaultToken: 'string.quoted.double.mel' } ] }, + + { token: [ 'variable.other.mel', 'punctuation.definition.variable.mel' ], + regex: '(\\$)([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*?\\b)' }, + + { token: 'punctuation.definition.string.begin.mel', + regex: '\'', + push: + [ { token: 'constant.character.escape.mel', regex: '\\\\.' }, + { token: 'punctuation.definition.string.end.mel', + regex: '\'', + next: 'pop' }, + { defaultToken: 'string.quoted.single.mel' } ] }, + + { token: 'constant.language.mel', + regex: '\\b(false|true|yes|no|on|off)\\b' }, + + { token: 'punctuation.definition.comment.mel', + regex: '/\\*', + push: + [ { token: 'punctuation.definition.comment.mel', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.mel' } ] }, + + { token: [ 'comment.line.double-slash.mel', 'punctuation.definition.comment.mel' ], + regex: '(//)(.*$\\n?)' }, + + { caseInsensitive: true, + token: 'keyword.operator.mel', + regex: '\\b(instanceof)\\b' }, + { token: 'keyword.operator.symbolic.mel', + regex: '[-\\!\\%\\&\\*\\+\\=\\/\\?\\:]' }, + + { token: [ 'meta.preprocessor.mel', 'punctuation.definition.preprocessor.mel' ], + regex: '(^[ \\t]*)((?:#)[a-zA-Z]+)' }, + + { token: [ 'meta.function.mel', 'keyword.other.mel', 'storage.type.mel', 'entity.name.function.mel', 'punctuation.section.function.mel' ], + regex: '(global\\s*)?(proc\\s*)(\\w+\\s*\\[?\\]?\\s+|\\s+)([A-Za-z_][A-Za-z0-9_\\.]*)(\\s*\\()', + push: + [ { include: '$self' }, + { token: 'punctuation.section.function.mel', + regex: '\\)', + next: 'pop' }, + { defaultToken: 'meta.function.mel' } ] } + + ] } + + this.normalizeRules(); +}; + +oop.inherits(MELHighlightRules, TextHighlightRules); + +exports.MELHighlightRules = MELHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/mel",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/mel_highlight_rules","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MELHighlightRules = require("./mel_highlight_rules").MELHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = MELHighlightRules; + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/mel"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-mips_assembler.js b/src/libs/ace/mode-mips_assembler.js new file mode 100755 index 0000000..94da6f3 --- /dev/null +++ b/src/libs/ace/mode-mips_assembler.js @@ -0,0 +1,235 @@ +ace.define("ace/mode/mips_assembler_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MIPSAssemblerHighlightRules = function() { + + this.$rules = { start: + [ { token: 'support.function.pseudo.mips', + regex: '\\b(?:mul|abs|div|divu|mulo|mulou|neg|negu|not|rem|remu|rol|ror|li|seq|sge|sgeu|sgt|sgtu|sle|sleu|sne|b|beqz|bge|bgeu|bgt|bgtu|ble|bleu|blt|bltu|bnez|la|ld|ulh|ulhu|ulw|sd|ush|usw|move|mfc1\\.d|l\\.d|l\\.s|s\\.d|s\\.s)\\b', + comment: 'ok actually this are instructions, but one also could call them funtions…' }, + { token: 'support.function.mips', + regex: '\\b(?:abs\\.d|abs\\.s|add|add\\.d|add\\.s|addi|addiu|addu|and|andi|bc1f|bc1t|beq|bgez|bgezal|bgtz|blez|bltz|bltzal|bne|break|c\\.eq\\.d|c\\.eq\\.s|c\\.le\\.d|c\\.le\\.s|c\\.lt\\.d|c\\.lt\\.s|ceil\\.w\\.d|ceil\\.w\\.s|clo|clz|cvt\\.d\\.s|cvt\\.d\\.w|cvt\\.s\\.d|cvt\\.s\\.w|cvt\\.w\\.d|cvt\\.w\\.s|div|div\\.d|div\\.s|divu|eret|floor\\.w\\.d|floor\\.w\\.s|j|jal|jalr|jr|lb|lbu|lh|lhu|ll|lui|lw|lwc1|lwl|lwr|madd|maddu|mfc0|mfc1|mfhi|mflo|mov\\.d|mov\\.s|movf|movf\\.d|movf\\.s|movn|movn\\.d|movn\\.s|movt|movt\\.d|movt\\.s|movz|movz\\.d|movz\\.s|msub|mtc0|mtc1|mthi|mtlo|mul|mul\\.d|mul\\.s|mult|multu|neg\\.d|neg\\.s|nop|nor|or|ori|round\\.w\\.d|round\\.w\\.s|sb|sc|sdc1|sh|sll|sllv|slt|slti|sltiu|sltu|sqrt\\.d|sqrt\\.s|sra|srav|srl|srlv|sub|sub\\.d|sub\\.s|subu|sw|swc1|swl|swr|syscall|teq|teqi|tge|tgei|tgeiu|tgeu|tlt|tlti|tltiu|tltu|trunc\\.w\\.d|trunc\\.w\\.s|xor|xori)\\b' }, + { token: 'storage.type.mips', + regex: '\\.(?:ascii|asciiz|byte|data|double|float|half|kdata|ktext|space|text|word|set\\s*(?:noat|at))\\b' }, + { token: 'storage.modifier.mips', + regex: '\\.(?:align|extern||globl)\\b' }, + { token: + [ 'entity.name.function.label.mips', + 'meta.function.label.mips' ], + regex: '\\b([A-Za-z0-9_]+)(:)' }, + { token: + [ 'punctuation.definition.variable.mips', + 'variable.other.register.usable.by-number.mips' ], + regex: '(\\$)(0|[2-9]|1[0-9]|2[0-5]|2[89]|3[0-1])\\b' }, + { token: + [ 'punctuation.definition.variable.mips', + 'variable.other.register.usable.by-name.mips' ], + regex: '(\\$)(zero|v[01]|a[0-3]|t[0-9]|s[0-7]|gp|sp|fp|ra)\\b' }, + { token: + [ 'punctuation.definition.variable.mips', + 'variable.other.register.reserved.mips' ], + regex: '(\\$)(at|k[01]|1|2[67])\\b' }, + { token: + [ 'punctuation.definition.variable.mips', + 'variable.other.register.usable.floating-point.mips', + 'variable.other.register.usable.floating-point.mips' ], + regex: '(\\$)(f)([0-9]|1[0-9]|2[0-9]|3[0-1])\\b' }, + { token: 'constant.numeric.float.mips', + regex: '\\b\\d+\\.\\d+\\b' }, + { token: 'constant.numeric.integer.mips', + regex: '\\b(?:\\d+|0(?:x|X)[a-fA-F0-9]+)\\b' }, + { token: 'punctuation.definition.string.begin.mips', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.mips', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.mips', + regex: '\\\\[rnt\\\\"]' }, + { defaultToken: 'string.quoted.double.mips' } ] }, + { token: 'punctuation.definition.comment.mips', + regex: '#', + push: + [ { token: 'comment.line.number-sign.mips', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.number-sign.mips' } ] } ] } + + this.normalizeRules(); +}; + +MIPSAssemblerHighlightRules.metaData = { fileTypes: [ 's', 'mips', 'spim', 'asm' ], + keyEquivalent: '^~M', + name: 'MIPS Assembler', + scopeName: 'source.mips' } + + +oop.inherits(MIPSAssemblerHighlightRules, TextHighlightRules); + +exports.MIPSAssemblerHighlightRules = MIPSAssemblerHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/)#(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/mips_assembler",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/mips_assembler_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MIPSAssemblerHighlightRules = require("./mips_assembler_highlight_rules").MIPSAssemblerHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = MIPSAssemblerHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/mips_assembler" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-mipsassembler.js b/src/libs/ace/mode-mipsassembler.js new file mode 100755 index 0000000..42ad657 --- /dev/null +++ b/src/libs/ace/mode-mipsassembler.js @@ -0,0 +1,196 @@ +ace.define("ace/mode/mipsassembler_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var mipsassemblerHighlightRules = function() { + + this.$rules = { + start: [{ + token: "string.start", + regex: '"', + next: "qstring" + }], + qstring: [{ + token: "escape", + regex: /\\./, + }, { + token: "string.end", + regex: '"', + next: "start" + }], + } + + this.normalizeRules(); +}; + +mipsassemblerHighlightRules.metaData = + + +oop.inherits(mipsassemblerHighlightRules, TextHighlightRules); + +exports.mipsassemblerHighlightRules = mipsassemblerHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/)#(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/mipsassembler",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/mipsassembler_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HighlightRules = require("./mipsassembler_highlight_rules").HighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = HighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/mipsassembler" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-mushcode.js b/src/libs/ace/mode-mushcode.js new file mode 100755 index 0000000..5e6b7ea --- /dev/null +++ b/src/libs/ace/mode-mushcode.js @@ -0,0 +1,674 @@ +ace.define("ace/mode/mushcode_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MushCodeRules = function() { + + + var keywords = ( + "@if|"+ + "@ifelse|"+ + "@switch|"+ + "@halt|"+ + "@dolist|"+ + "@create|"+ + "@scent|"+ + "@sound|"+ + "@touch|"+ + "@ataste|"+ + "@osound|"+ + "@ahear|"+ + "@aahear|"+ + "@amhear|"+ + "@otouch|"+ + "@otaste|"+ + "@drop|"+ + "@odrop|"+ + "@adrop|"+ + "@dropfail|"+ + "@odropfail|"+ + "@smell|"+ + "@oemit|"+ + "@emit|"+ + "@pemit|"+ + "@parent|"+ + "@clone|"+ + "@taste|"+ + "whisper|"+ + "page|"+ + "say|"+ + "pose|"+ + "semipose|"+ + "teach|"+ + "touch|"+ + "taste|"+ + "smell|"+ + "listen|"+ + "look|"+ + "move|"+ + "go|"+ + "home|"+ + "follow|"+ + "unfollow|"+ + "desert|"+ + "dismiss|"+ + "@tel" + ); + + var builtinConstants = ( + "=#0" + ); + + var builtinFunctions = ( + "default|"+ + "edefault|"+ + "eval|"+ + "get_eval|"+ + "get|"+ + "grep|"+ + "grepi|"+ + "hasattr|"+ + "hasattrp|"+ + "hasattrval|"+ + "hasattrpval|"+ + "lattr|"+ + "nattr|"+ + "poss|"+ + "udefault|"+ + "ufun|"+ + "u|"+ + "v|"+ + "uldefault|"+ + "xget|"+ + "zfun|"+ + "band|"+ + "bnand|"+ + "bnot|"+ + "bor|"+ + "bxor|"+ + "shl|"+ + "shr|"+ + "and|"+ + "cand|"+ + "cor|"+ + "eq|"+ + "gt|"+ + "gte|"+ + "lt|"+ + "lte|"+ + "nand|"+ + "neq|"+ + "nor|"+ + "not|"+ + "or|"+ + "t|"+ + "xor|"+ + "con|"+ + "entrances|"+ + "exit|"+ + "followers|"+ + "home|"+ + "lcon|"+ + "lexits|"+ + "loc|"+ + "locate|"+ + "lparent|"+ + "lsearch|"+ + "next|"+ + "num|"+ + "owner|"+ + "parent|"+ + "pmatch|"+ + "rloc|"+ + "rnum|"+ + "room|"+ + "where|"+ + "zone|"+ + "worn|"+ + "held|"+ + "carried|"+ + "acos|"+ + "asin|"+ + "atan|"+ + "ceil|"+ + "cos|"+ + "e|"+ + "exp|"+ + "fdiv|"+ + "fmod|"+ + "floor|"+ + "log|"+ + "ln|"+ + "pi|"+ + "power|"+ + "round|"+ + "sin|"+ + "sqrt|"+ + "tan|"+ + "aposs|"+ + "andflags|"+ + "conn|"+ + "commandssent|"+ + "controls|"+ + "doing|"+ + "elock|"+ + "findable|"+ + "flags|"+ + "fullname|"+ + "hasflag|"+ + "haspower|"+ + "hastype|"+ + "hidden|"+ + "idle|"+ + "isbaker|"+ + "lock|"+ + "lstats|"+ + "money|"+ + "who|"+ + "name|"+ + "nearby|"+ + "obj|"+ + "objflags|"+ + "photo|"+ + "poll|"+ + "powers|"+ + "pendingtext|"+ + "receivedtext|"+ + "restarts|"+ + "restarttime|"+ + "subj|"+ + "shortestpath|"+ + "tmoney|"+ + "type|"+ + "visible|"+ + "cat|"+ + "element|"+ + "elements|"+ + "extract|"+ + "filter|"+ + "filterbool|"+ + "first|"+ + "foreach|"+ + "fold|"+ + "grab|"+ + "graball|"+ + "index|"+ + "insert|"+ + "itemize|"+ + "items|"+ + "iter|"+ + "last|"+ + "ldelete|"+ + "map|"+ + "match|"+ + "matchall|"+ + "member|"+ + "mix|"+ + "munge|"+ + "pick|"+ + "remove|"+ + "replace|"+ + "rest|"+ + "revwords|"+ + "setdiff|"+ + "setinter|"+ + "setunion|"+ + "shuffle|"+ + "sort|"+ + "sortby|"+ + "splice|"+ + "step|"+ + "wordpos|"+ + "words|"+ + "add|"+ + "lmath|"+ + "max|"+ + "mean|"+ + "median|"+ + "min|"+ + "mul|"+ + "percent|"+ + "sign|"+ + "stddev|"+ + "sub|"+ + "val|"+ + "bound|"+ + "abs|"+ + "inc|"+ + "dec|"+ + "dist2d|"+ + "dist3d|"+ + "div|"+ + "floordiv|"+ + "mod|"+ + "modulo|"+ + "remainder|"+ + "vadd|"+ + "vdim|"+ + "vdot|"+ + "vmag|"+ + "vmax|"+ + "vmin|"+ + "vmul|"+ + "vsub|"+ + "vunit|"+ + "regedit|"+ + "regeditall|"+ + "regeditalli|"+ + "regediti|"+ + "regmatch|"+ + "regmatchi|"+ + "regrab|"+ + "regraball|"+ + "regraballi|"+ + "regrabi|"+ + "regrep|"+ + "regrepi|"+ + "after|"+ + "alphamin|"+ + "alphamax|"+ + "art|"+ + "before|"+ + "brackets|"+ + "capstr|"+ + "case|"+ + "caseall|"+ + "center|"+ + "containsfansi|"+ + "comp|"+ + "decompose|"+ + "decrypt|"+ + "delete|"+ + "edit|"+ + "encrypt|"+ + "escape|"+ + "if|"+ + "ifelse|"+ + "lcstr|"+ + "left|"+ + "lit|"+ + "ljust|"+ + "merge|"+ + "mid|"+ + "ostrlen|"+ + "pos|"+ + "repeat|"+ + "reverse|"+ + "right|"+ + "rjust|"+ + "scramble|"+ + "secure|"+ + "space|"+ + "spellnum|"+ + "squish|"+ + "strcat|"+ + "strmatch|"+ + "strinsert|"+ + "stripansi|"+ + "stripfansi|"+ + "strlen|"+ + "switch|"+ + "switchall|"+ + "table|"+ + "tr|"+ + "trim|"+ + "ucstr|"+ + "unsafe|"+ + "wrap|"+ + "ctitle|"+ + "cwho|"+ + "channels|"+ + "clock|"+ + "cflags|"+ + "ilev|"+ + "itext|"+ + "inum|"+ + "convsecs|"+ + "convutcsecs|"+ + "convtime|"+ + "ctime|"+ + "etimefmt|"+ + "isdaylight|"+ + "mtime|"+ + "secs|"+ + "msecs|"+ + "starttime|"+ + "time|"+ + "timefmt|"+ + "timestring|"+ + "utctime|"+ + "atrlock|"+ + "clone|"+ + "create|"+ + "cook|"+ + "dig|"+ + "emit|"+ + "lemit|"+ + "link|"+ + "oemit|"+ + "open|"+ + "pemit|"+ + "remit|"+ + "set|"+ + "tel|"+ + "wipe|"+ + "zemit|"+ + "fbcreate|"+ + "fbdestroy|"+ + "fbwrite|"+ + "fbclear|"+ + "fbcopy|"+ + "fbcopyto|"+ + "fbclip|"+ + "fbdump|"+ + "fbflush|"+ + "fbhset|"+ + "fblist|"+ + "fbstats|"+ + "qentries|"+ + "qentry|"+ + "play|"+ + "ansi|"+ + "break|"+ + "c|"+ + "asc|"+ + "die|"+ + "isdbref|"+ + "isint|"+ + "isnum|"+ + "isletters|"+ + "linecoords|"+ + "localize|"+ + "lnum|"+ + "nameshort|"+ + "null|"+ + "objeval|"+ + "r|"+ + "rand|"+ + "s|"+ + "setq|"+ + "setr|"+ + "soundex|"+ + "soundslike|"+ + "valid|"+ + "vchart|"+ + "vchart2|"+ + "vlabel|"+ + "@@|"+ + "bakerdays|"+ + "bodybuild|"+ + "box|"+ + "capall|"+ + "catalog|"+ + "children|"+ + "ctrailer|"+ + "darttime|"+ + "debt|"+ + "detailbar|"+ + "exploredroom|"+ + "fansitoansi|"+ + "fansitoxansi|"+ + "fullbar|"+ + "halfbar|"+ + "isdarted|"+ + "isnewbie|"+ + "isword|"+ + "lambda|"+ + "lobjects|"+ + "lplayers|"+ + "lthings|"+ + "lvexits|"+ + "lvobjects|"+ + "lvplayers|"+ + "lvthings|"+ + "newswrap|"+ + "numsuffix|"+ + "playerson|"+ + "playersthisweek|"+ + "randomad|"+ + "randword|"+ + "realrandword|"+ + "replacechr|"+ + "second|"+ + "splitamount|"+ + "strlenall|"+ + "text|"+ + "third|"+ + "tofansi|"+ + "totalac|"+ + "unique|"+ + "getaddressroom|"+ + "listpropertycomm|"+ + "listpropertyres|"+ + "lotowner|"+ + "lotrating|"+ + "lotratingcount|"+ + "lotvalue|"+ + "boughtproduct|"+ + "companyabb|"+ + "companyicon|"+ + "companylist|"+ + "companyname|"+ + "companyowners|"+ + "companyvalue|"+ + "employees|"+ + "invested|"+ + "productlist|"+ + "productname|"+ + "productowners|"+ + "productrating|"+ + "productratingcount|"+ + "productsoldat|"+ + "producttype|"+ + "ratedproduct|"+ + "soldproduct|"+ + "topproducts|"+ + "totalspentonproduct|"+ + "totalstock|"+ + "transfermoney|"+ + "uniquebuyercount|"+ + "uniqueproductsbought|"+ + "validcompany|"+ + "deletepicture|"+ + "fbsave|"+ + "getpicturesecurity|"+ + "haspicture|"+ + "listpictures|"+ + "picturesize|"+ + "replacecolor|"+ + "rgbtocolor|"+ + "savepicture|"+ + "setpicturesecurity|"+ + "showpicture|"+ + "piechart|"+ + "piechartlabel|"+ + "createmaze|"+ + "drawmaze|"+ + "drawwireframe" + ); + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "keyword": keywords + }, "identifier"); + + var strPre = "(?:r|u|ur|R|U|UR|Ur|uR)?"; + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + this.$rules = { + "start" : [ + { + token : "variable", // mush substitution register + regex : "%[0-9]{1}" + }, + { + token : "variable", // mush substitution register + regex : "%q[0-9A-Za-z]{1}" + }, + { + token : "variable", // mush special character register + regex : "%[a-zA-Z]{1}" + }, + { + token: "variable.language", + regex: "%[a-z0-9-_]+" + }, + { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // long integer + regex : integer + "[lL]\\b" + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|#|%|<<|>>|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+" + } ] + }; +}; + +oop.inherits(MushCodeRules, TextHighlightRules); + +exports.MushCodeRules = MushCodeRules; +}); + +ace.define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(markers) { + this.foldingStartMarker = new RegExp("([\\[{])(?:\\s*)$|(" + markers + ")(?:\\s*)(?:#.*)?$"); +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + if (match[1]) + return this.openingBracketBlock(session, match[1], row, match.index); + if (match[2]) + return this.indentationBlock(session, row, match.index + match[2].length); + return this.indentationBlock(session, row); + } + } + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/mushcode",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/mushcode_highlight_rules","ace/mode/folding/pythonic","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var MushCodeRules = require("./mushcode_highlight_rules").MushCodeRules; +var PythonFoldMode = require("./folding/pythonic").FoldMode; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = MushCodeRules; + this.foldingRules = new PythonFoldMode("\\:"); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + + this.$id = "ace/mode/mushcode"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-mysql.js b/src/libs/ace/mode-mysql.js new file mode 100755 index 0000000..7abe675 --- /dev/null +++ b/src/libs/ace/mode-mysql.js @@ -0,0 +1,160 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/mysql_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var MysqlHighlightRules = function() { + + var mySqlKeywords = /*sql*/ "alter|and|as|asc|between|count|create|delete|desc|distinct|drop|from|having|in|insert|into|is|join|like|not|on|or|order|select|set|table|union|update|values|where" + "|accessible|action|add|after|algorithm|all|analyze|asensitive|at|authors|auto_increment|autocommit|avg|avg_row_length|before|binary|binlog|both|btree|cache|call|cascade|cascaded|case|catalog_name|chain|change|changed|character|check|checkpoint|checksum|class_origin|client_statistics|close|coalesce|code|collate|collation|collations|column|columns|comment|commit|committed|completion|concurrent|condition|connection|consistent|constraint|contains|continue|contributors|convert|cross|current_date|current_time|current_timestamp|current_user|cursor|data|database|databases|day_hour|day_microsecond|day_minute|day_second|deallocate|dec|declare|default|delay_key_write|delayed|delimiter|des_key_file|describe|deterministic|dev_pop|dev_samp|deviance|directory|disable|discard|distinctrow|div|dual|dumpfile|each|elseif|enable|enclosed|end|ends|engine|engines|enum|errors|escape|escaped|even|event|events|every|execute|exists|exit|explain|extended|fast|fetch|field|fields|first|flush|for|force|foreign|found_rows|full|fulltext|function|general|global|grant|grants|group|groupby_concat|handler|hash|help|high_priority|hosts|hour_microsecond|hour_minute|hour_second|if|ignore|ignore_server_ids|import|index|index_statistics|infile|inner|innodb|inout|insensitive|insert_method|install|interval|invoker|isolation|iterate|key|keys|kill|language|last|leading|leave|left|level|limit|linear|lines|list|load|local|localtime|localtimestamp|lock|logs|low_priority|master|master_heartbeat_period|master_ssl_verify_server_cert|masters|match|max|max_rows|maxvalue|message_text|middleint|migrate|min|min_rows|minute_microsecond|minute_second|mod|mode|modifies|modify|mutex|mysql_errno|natural|next|no|no_write_to_binlog|offline|offset|one|online|open|optimize|option|optionally|out|outer|outfile|pack_keys|parser|partition|partitions|password|phase|plugin|plugins|prepare|preserve|prev|primary|privileges|procedure|processlist|profile|profiles|purge|query|quick|range|read|read_write|reads|real|rebuild|recover|references|regexp|relaylog|release|remove|rename|reorganize|repair|repeatable|replace|require|resignal|restrict|resume|return|returns|revoke|right|rlike|rollback|rollup|row|row_format|rtree|savepoint|schedule|schema|schema_name|schemas|second_microsecond|security|sensitive|separator|serializable|server|session|share|show|signal|slave|slow|smallint|snapshot|soname|spatial|specific|sql|sql_big_result|sql_buffer_result|sql_cache|sql_calc_found_rows|sql_no_cache|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|start|starting|starts|status|std|stddev|stddev_pop|stddev_samp|storage|straight_join|subclass_origin|sum|suspend|table_name|table_statistics|tables|tablespace|temporary|terminated|to|trailing|transaction|trigger|triggers|truncate|uncommitted|undo|uninstall|unique|unlock|upgrade|usage|use|use_frm|user|user_resources|user_statistics|using|utc_date|utc_time|utc_timestamp|value|variables|varying|view|views|warnings|when|while|with|work|write|xa|xor|year_month|zerofill|begin|do|then|else|loop|repeat"; + var builtins = "by|bool|boolean|bit|blob|decimal|double|enum|float|long|longblob|longtext|medium|mediumblob|mediumint|mediumtext|time|timestamp|tinyblob|tinyint|tinytext|text|bigint|int|int1|int2|int3|int4|int8|integer|float|float4|float8|double|char|varbinary|varchar|varcharacter|precision|date|datetime|year|unsigned|signed|numeric|ucase|lcase|mid|len|round|rank|now|format|coalesce|ifnull|isnull|nvl" + var variable = "charset|clear|connect|edit|ego|exit|go|help|nopager|notee|nowarning|pager|print|prompt|quit|rehash|source|status|system|tee" + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtins, + "keyword": mySqlKeywords, + "constant": "false|true|null|unknown|date|time|timestamp|ODBCdotTable|zerolessFloat", + "variable.language": variable + }, "identifier", true); + + + function string(rule) { + var start = rule.start; + var escapeSeq = rule.escape; + return { + token: "string.start", + regex: start, + next: [ + {token: "constant.language.escape", regex: escapeSeq}, + {token: "string.end", next: "start", regex: start}, + {defaultToken: "string"} + ] + }; + } + + this.$rules = { + "start" : [ { + token : "comment", regex : "(?:-- |#).*$" + }, + string({start: '"', escape: /\\[0'"bnrtZ\\%_]?/}), + string({start: "'", escape: /\\[0'"bnrtZ\\%_]?/}), + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+|[xX]'[0-9a-fA-F]+'|0[bB][01]+|[bB]'[01]+'/ + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "constant.class", + regex : "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "constant.buildin", + regex : "`[^`]*`" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ], + "comment" : [ + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment"} + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(MysqlHighlightRules, TextHighlightRules); + +exports.MysqlHighlightRules = MysqlHighlightRules; +}); + +ace.define("ace/mode/mysql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/mysql_highlight_rules"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("../mode/text").Mode; +var MysqlHighlightRules = require("./mysql_highlight_rules").MysqlHighlightRules; + +var Mode = function() { + this.HighlightRules = MysqlHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = ["--", "#"]; // todo space + this.blockComment = {start: "/*", end: "*/"}; + + this.$id = "ace/mode/mysql"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-nix.js b/src/libs/ace/mode-nix.js new file mode 100755 index 0000000..3424bea --- /dev/null +++ b/src/libs/ace/mode-nix.js @@ -0,0 +1,631 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/c_cpp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template|char16_t|char32_t" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private|" + + "protected|public|friend|explicit|virtual|export|mutable|typename|" + + "constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE|nullptr" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + var escapeRe = /\\(?:['"?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}U[a-fA-F\d]{8}|.)/.source; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "//$", + next : "start" + }, { + token : "comment", + regex : "//", + next : "singleLineComment" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // character + regex : "'(?:" + escapeRe + "|.)?'" + }, { + token : "string.start", + regex : '"', + stateName: "qqstring", + next: [ + { token: "string", regex: /\\\s*$/, next: "qqstring" }, + { token: "constant.language.escape", regex: escapeRe }, + { token: "constant.language.escape", regex: /%[^'"\\]/ }, + { token: "string.end", regex: '"|$', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "string.start", + regex : 'R"\\(', + stateName: "rawString", + next: [ + { token: "string.end", regex: '\\)"', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "#\\s*(?:endif|if|ifdef|else|elif|ifndef)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*" + }, { + token : "keyword.operator", + regex : /--|\+\+|<<=|>>=|>>>=|<>|&&|\|\||\?:|[*%\/+\-&\^|~!<>=]=?/ + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "singleLineComment" : [ + { + token : "comment", + regex : /\\$/, + next : "singleLineComment" + }, { + token : "comment", + regex : /$/, + next : "start" + }, { + defaultToken: "comment" + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/c_cpp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/c_cpp_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = c_cppHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/c_cpp"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/nix_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { + "use strict"; + + var oop = require("../lib/oop"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + var NixHighlightRules = function() { + + var constantLanguage = "true|false"; + var keywordControl = "with|import|if|else|then|inherit"; + var keywordDeclaration = "let|in|rec"; + + var keywordMapper = this.createKeywordMapper({ + "constant.language.nix": constantLanguage, + "keyword.control.nix": keywordControl, + "keyword.declaration.nix": keywordDeclaration + }, "identifier"); + + this.$rules = { + "start": [{ + token: "comment", + regex: /#.*$/ + }, { + token: "comment", + regex: /\/\*/, + next: "comment" + }, { + token: "constant", + regex: "<[^>]+>" + }, { + regex: "(==|!=|<=?|>=?)", + token: ["keyword.operator.comparison.nix"] + }, { + regex: "((?:[+*/%-]|\\~)=)", + token: ["keyword.operator.assignment.arithmetic.nix"] + }, { + regex: "=", + token: "keyword.operator.assignment.nix" + }, { + token: "string", + regex: "''", + next: "qqdoc" + }, { + token: "string", + regex: "'", + next: "qstring" + }, { + token: "string", + regex: '"', + push: "qqstring" + }, { + token: "constant.numeric", // hex + regex: "0[xX][0-9a-fA-F]+\\b" + }, { + token: "constant.numeric", // float + regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token: keywordMapper, + regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + regex: "}", + token: function(val, start, stack) { + return stack[1] && stack[1].charAt(0) == "q" ? "constant.language.escape" : "text"; + }, + next: "pop" + }], + "comment": [{ + token: "comment", // closing comment + regex: "\\*\\/", + next: "start" + }, { + defaultToken: "comment" + }], + "qqdoc": [ + { + token: "constant.language.escape", + regex: /\$\{/, + push: "start" + }, { + token: "string", + regex: "''", + next: "pop" + }, { + defaultToken: "string" + }], + "qqstring": [ + { + token: "constant.language.escape", + regex: /\$\{/, + push: "start" + }, { + token: "string", + regex: '"', + next: "pop" + }, { + defaultToken: "string" + }], + "qstring": [ + { + token: "constant.language.escape", + regex: /\$\{/, + push: "start" + }, { + token: "string", + regex: "'", + next: "pop" + }, { + defaultToken: "string" + }] + }; + + this.normalizeRules(); + }; + + oop.inherits(NixHighlightRules, TextHighlightRules); + + exports.NixHighlightRules = NixHighlightRules; +}); + +ace.define("ace/mode/nix",["require","exports","module","ace/lib/oop","ace/mode/c_cpp","ace/mode/nix_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var CMode = require("./c_cpp").Mode; +var NixHighlightRules = require("./nix_highlight_rules").NixHighlightRules; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + CMode.call(this); + this.HighlightRules = NixHighlightRules; + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, CMode); + +(function() { + this.lineCommentStart = "#"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/nix"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-nsis.js b/src/libs/ace/mode-nsis.js new file mode 100755 index 0000000..a20aed2 --- /dev/null +++ b/src/libs/ace/mode-nsis.js @@ -0,0 +1,305 @@ +ace.define("ace/mode/nsis_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var NSISHighlightRules = function() { + + this.$rules = { + start: [{ + token: "keyword.compiler.nsis", + regex: /^\s*!(?:include|addincludedir|addplugindir|appendfile|cd|delfile|echo|error|execute|packhdr|finalize|getdllversion|system|tempfile|warning|verbose|define|undef|insertmacro|macro|macroend|makensis|searchparse|searchreplace)\b/, + caseInsensitive: true + }, { + token: "keyword.command.nsis", + regex: /^\s*(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetLabelAddress|GetTempFileName|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|IntCmp|IntCmpU|IntFmt|IntOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegStr|WriteUninstaller|XPStyle)\b/, + caseInsensitive: true + }, { + token: "keyword.control.nsis", + regex: /^\s*!(?:ifdef|ifndef|if|ifmacrodef|ifmacrondef|else|endif)\b/, + caseInsensitive: true + }, { + token: "keyword.plugin.nsis", + regex: /^\s*\w+::\w+/, + caseInsensitive: true + }, { + token: "keyword.operator.comparison.nsis", + regex: /[!<>]?=|<>|<|>/ + }, { + token: "support.function.nsis", + regex: /(?:\b|^\s*)(?:Function|FunctionEnd|Section|SectionEnd|SectionGroup|SectionGroupEnd|PageEx|PageExEnd)\b/, + caseInsensitive: true + }, { + token: "support.library.nsis", + regex: /\${[\w\.:-]+}/ + }, { + token: "constant.nsis", + regex: /\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\b/, + caseInsensitive: true + }, { + token: "constant.library.nsis", + regex: /\${(?:AtLeastServicePack|AtLeastWin7|AtLeastWin8|AtLeastWin10|AtLeastWin95|AtLeastWin98|AtLeastWin2000|AtLeastWin2003|AtLeastWin2008|AtLeastWin2008R2|AtLeastWinME|AtLeastWinNT4|AtLeastWinVista|AtLeastWinXP|AtMostServicePack|AtMostWin7|AtMostWin8|AtMostWin10|AtMostWin95|AtMostWin98|AtMostWin2000|AtMostWin2003|AtMostWin2008|AtMostWin2008R2|AtMostWinME|AtMostWinNT4|AtMostWinVista|AtMostWinXP|IsNT|IsServer|IsServicePack|IsWin7|IsWin8|IsWin10|IsWin95|IsWin98|IsWin2000|IsWin2003|IsWin2008|IsWin2008R2|IsWinME|IsWinNT4|IsWinVista|IsWinXP)}/ + }, { + token: "constant.language.boolean.true.nsis", + regex: /\b(?:true|on)\b/ + }, { + token: "constant.language.boolean.false.nsis", + regex: /\b(?:false|off)\b/ + }, { + token: "constant.language.option.nsis", + regex: /(?:\b|^\s*)(?:(?:un\.)?components|(?:un\.)?custom|(?:un\.)?directory|(?:un\.)?instfiles|(?:un\.)?license|uninstConfirm|admin|all|auto|both|bottom|bzip2|current|force|hide|highest|ifdiff|ifnewer|lastused|leave|left|listonly|lzma|nevershow|none|normal|notset|right|show|silent|silentlog|textonly|top|try|user|Win10|Win7|Win8|WinVista|zlib)\b/, + caseInsensitive: true + }, { + token: "constant.language.slash-option.nsis", + regex: /\b\/(?:a|BRANDING|CENTER|COMPONENTSONLYONCUSTOM|CUSTOMSTRING=|date|e|ENABLECANCEL|FILESONLY|file|FINAL|GLOBAL|gray|ifempty|ifndef|ignorecase|IMGID=|ITALIC|LANG=|NOCUSTOM|noerrors|NONFATAL|nonfatal|oname=|o|REBOOTOK|redef|RESIZETOFIT|r|SHORT|SILENT|SOLID|STRIKE|TRIM|UNDERLINE|utcdate|windows|x)\b/, + caseInsensitive: true + }, { + token: "constant.numeric.nsis", + regex: /\b(?:0(?:x|X)[0-9a-fA-F]+|[0-9]+(?:\.[0-9]+)?)\b/ + }, { + token: "entity.name.function.nsis", + regex: /\$\([\w\.:-]+\)/ + }, { + token: "storage.type.function.nsis", + regex: /\$[\w]+/ + }, { + token: "punctuation.definition.string.begin.nsis", + regex: /`/, + push: [{ + token: "punctuation.definition.string.end.nsis", + regex: /`/, + next: "pop" + }, { + token: "constant.character.escape.nsis", + regex: /\$\\./ + }, { + defaultToken: "string.quoted.back.nsis" + }] + }, { + token: "punctuation.definition.string.begin.nsis", + regex: /"/, + push: [{ + token: "punctuation.definition.string.end.nsis", + regex: /"/, + next: "pop" + }, { + token: "constant.character.escape.nsis", + regex: /\$\\./ + }, { + defaultToken: "string.quoted.double.nsis" + }] + }, { + token: "punctuation.definition.string.begin.nsis", + regex: /'/, + push: [{ + token: "punctuation.definition.string.end.nsis", + regex: /'/, + next: "pop" + }, { + token: "constant.character.escape.nsis", + regex: /\$\\./ + }, { + defaultToken: "string.quoted.single.nsis" + }] + }, { + token: [ + "punctuation.definition.comment.nsis", + "comment.line.nsis" + ], + regex: /(;|#)(.*$)/ + }, { + token: "punctuation.definition.comment.nsis", + regex: /\/\*/, + push: [{ + token: "punctuation.definition.comment.nsis", + regex: /\*\//, + next: "pop" + }, { + defaultToken: "comment.block.nsis" + }] + }, { + token: "text", + regex: /(?:!include|!insertmacro)\b/ + }] + }; + + this.normalizeRules(); +}; + +NSISHighlightRules.metaData = { + comment: "\n\ttodo: - highlight functions\n\t", + fileTypes: ["nsi", "nsh"], + name: "NSIS", + scopeName: "source.nsis" +}; + + +oop.inherits(NSISHighlightRules, TextHighlightRules); + +exports.NSISHighlightRules = NSISHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/nsis",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/nsis_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var NSISHighlightRules = require("./nsis_highlight_rules").NSISHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = NSISHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = [";", "#"]; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/nsis"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-objectivec.js b/src/libs/ace/mode-objectivec.js new file mode 100755 index 0000000..1dd0cb5 --- /dev/null +++ b/src/libs/ace/mode-objectivec.js @@ -0,0 +1,725 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/c_cpp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template|char16_t|char32_t" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private|" + + "protected|public|friend|explicit|virtual|export|mutable|typename|" + + "constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE|nullptr" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + var escapeRe = /\\(?:['"?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}U[a-fA-F\d]{8}|.)/.source; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "//$", + next : "start" + }, { + token : "comment", + regex : "//", + next : "singleLineComment" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // character + regex : "'(?:" + escapeRe + "|.)?'" + }, { + token : "string.start", + regex : '"', + stateName: "qqstring", + next: [ + { token: "string", regex: /\\\s*$/, next: "qqstring" }, + { token: "constant.language.escape", regex: escapeRe }, + { token: "constant.language.escape", regex: /%[^'"\\]/ }, + { token: "string.end", regex: '"|$', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "string.start", + regex : 'R"\\(', + stateName: "rawString", + next: [ + { token: "string.end", regex: '\\)"', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "#\\s*(?:endif|if|ifdef|else|elif|ifndef)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*" + }, { + token : "keyword.operator", + regex : /--|\+\+|<<=|>>=|>>>=|<>|&&|\|\||\?:|[*%\/+\-&\^|~!<>=]=?/ + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "singleLineComment" : [ + { + token : "comment", + regex : /\\$/, + next : "singleLineComment" + }, { + token : "comment", + regex : /$/, + next : "start" + }, { + defaultToken: "comment" + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define("ace/mode/objectivec_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/c_cpp_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var C_Highlight_File = require("./c_cpp_highlight_rules"); +var CHighlightRules = C_Highlight_File.c_cppHighlightRules; + +var ObjectiveCHighlightRules = function() { + + var escapedConstRe = "\\\\(?:[abefnrtv'\"?\\\\]|" + + "[0-3]\\d{1,2}|" + + "[4-7]\\d?|" + + "222|" + + "x[a-zA-Z0-9]+)"; + + var specialVariables = [{ + regex: "\\b_cmd\\b", + token: "variable.other.selector.objc" + }, { + regex: "\\b(?:self|super)\\b", + token: "variable.language.objc" + } + ]; + + var cObj = new CHighlightRules(); + var cRules = cObj.getRules(); + + this.$rules = { + "start": [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, + { + token: [ "storage.type.objc", "punctuation.definition.storage.type.objc", + "entity.name.type.objc", "text", "entity.other.inherited-class.objc" + ], + regex: "(@)(interface|protocol)(?!.+;)(\\s+[A-Za-z_][A-Za-z0-9_]*)(\\s*:\\s*)([A-Za-z]+)" + }, + { + token: [ "storage.type.objc" ], + regex: "(@end)" + }, + { + token: [ "storage.type.objc", "entity.name.type.objc", + "entity.other.inherited-class.objc" + ], + regex: "(@implementation)(\\s+[A-Za-z_][A-Za-z0-9_]*)(\\s*?::\\s*(?:[A-Za-z][A-Za-z0-9]*))?" + }, + { + token: "string.begin.objc", + regex: '@"', + next: "constant_NSString" + }, + { + token: "storage.type.objc", + regex: "\\bid\\s*<", + next: "protocol_list" + }, + { + token: "keyword.control.macro.objc", + regex: "\\bNS_DURING|NS_HANDLER|NS_ENDHANDLER\\b" + }, + { + token: ["punctuation.definition.keyword.objc", "keyword.control.exception.objc"], + regex: "(@)(try|catch|finally|throw)\\b" + }, + { + token: ["punctuation.definition.keyword.objc", "keyword.other.objc"], + regex: "(@)(defs|encode)\\b" + }, + { + token: ["storage.type.id.objc", "text"], + regex: "(\\bid\\b)(\\s|\\n)?" + }, + { + token: "storage.type.objc", + regex: "\\bIBOutlet|IBAction|BOOL|SEL|id|unichar|IMP|Class\\b" + }, + { + token: [ "punctuation.definition.storage.type.objc", "storage.type.objc"], + regex: "(@)(class|protocol)\\b" + }, + { + token: [ "punctuation.definition.storage.type.objc", "punctuation"], + regex: "(@selector)(\\s*\\()", + next: "selectors" + }, + { + token: [ "punctuation.definition.storage.modifier.objc", "storage.modifier.objc"], + regex: "(@)(synchronized|public|private|protected|package)\\b" + }, + { + token: "constant.language.objc", + regex: "\\bYES|NO|Nil|nil\\b" + }, + { + token: "support.variable.foundation", + regex: "\\bNSApp\\b" + }, + { + token: [ "support.function.cocoa.leopard"], + regex: "(?:\\b)(NS(?:Rect(?:ToCGRect|FromCGRect)|MakeCollectable|S(?:tringFromProtocol|ize(?:ToCGSize|FromCGSize))|Draw(?:NinePartImage|ThreePartImage)|P(?:oint(?:ToCGPoint|FromCGPoint)|rotocolFromString)|EventMaskFromType|Value))(?:\\b)" + }, + { + token: ["support.function.cocoa"], + regex: "(?:\\b)(NS(?:R(?:ound(?:DownToMultipleOfPageSize|UpToMultipleOfPageSize)|un(?:CriticalAlertPanel(?:RelativeToWindow)?|InformationalAlertPanel(?:RelativeToWindow)?|AlertPanel(?:RelativeToWindow)?)|e(?:set(?:MapTable|HashTable)|c(?:ycleZone|t(?:Clip(?:List)?|F(?:ill(?:UsingOperation|List(?:UsingOperation|With(?:Grays|Colors(?:UsingOperation)?))?)?|romString))|ordAllocationEvent)|turnAddress|leaseAlertPanel|a(?:dPixel|l(?:MemoryAvailable|locateCollectable))|gisterServicesProvider)|angeFromString)|Get(?:SizeAndAlignment|CriticalAlertPanel|InformationalAlertPanel|UncaughtExceptionHandler|FileType(?:s)?|WindowServerMemory|AlertPanel)|M(?:i(?:n(?:X|Y)|d(?:X|Y))|ouseInRect|a(?:p(?:Remove|Get|Member|Insert(?:IfAbsent|KnownAbsent)?)|ke(?:R(?:ect|ange)|Size|Point)|x(?:Range|X|Y)))|B(?:itsPer(?:SampleFromDepth|PixelFromDepth)|e(?:stDepth|ep|gin(?:CriticalAlertSheet|InformationalAlertSheet|AlertSheet)))|S(?:ho(?:uldRetainWithZone|w(?:sServicesMenuItem|AnimationEffect))|tringFrom(?:R(?:ect|ange)|MapTable|S(?:ize|elector)|HashTable|Class|Point)|izeFromString|e(?:t(?:ShowsServicesMenuItem|ZoneName|UncaughtExceptionHandler|FocusRingStyle)|lectorFromString|archPathForDirectoriesInDomains)|wap(?:Big(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|Short|Host(?:ShortTo(?:Big|Little)|IntTo(?:Big|Little)|DoubleTo(?:Big|Little)|FloatTo(?:Big|Little)|Long(?:To(?:Big|Little)|LongTo(?:Big|Little)))|Int|Double|Float|L(?:ittle(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|ong(?:Long)?)))|H(?:ighlightRect|o(?:stByteOrder|meDirectory(?:ForUser)?)|eight|ash(?:Remove|Get|Insert(?:IfAbsent|KnownAbsent)?)|FSType(?:CodeFromFileType|OfFile))|N(?:umberOfColorComponents|ext(?:MapEnumeratorPair|HashEnumeratorItem))|C(?:o(?:n(?:tainsRect|vert(?:GlyphsToPackedGlyphs|Swapped(?:DoubleToHost|FloatToHost)|Host(?:DoubleToSwapped|FloatToSwapped)))|unt(?:MapTable|HashTable|Frames|Windows(?:ForContext)?)|py(?:M(?:emoryPages|apTableWithZone)|Bits|HashTableWithZone|Object)|lorSpaceFromDepth|mpare(?:MapTables|HashTables))|lassFromString|reate(?:MapTable(?:WithZone)?|HashTable(?:WithZone)?|Zone|File(?:namePboardType|ContentsPboardType)))|TemporaryDirectory|I(?:s(?:ControllerMarker|EmptyRect|FreedObject)|n(?:setRect|crementExtraRefCount|te(?:r(?:sect(?:sRect|ionR(?:ect|ange))|faceStyleForKey)|gralRect)))|Zone(?:Realloc|Malloc|Name|Calloc|Fr(?:omPointer|ee))|O(?:penStepRootDirectory|ffsetRect)|D(?:i(?:sableScreenUpdates|videRect)|ottedFrameRect|e(?:c(?:imal(?:Round|Multiply|S(?:tring|ubtract)|Normalize|Co(?:py|mpa(?:ct|re))|IsNotANumber|Divide|Power|Add)|rementExtraRefCountWasZero)|faultMallocZone|allocate(?:MemoryPages|Object))|raw(?:Gr(?:oove|ayBezel)|B(?:itmap|utton)|ColorTiledRects|TiledRects|DarkBezel|W(?:hiteBezel|indowBackground)|LightBezel))|U(?:serName|n(?:ionR(?:ect|ange)|registerServicesProvider)|pdateDynamicServices)|Java(?:Bundle(?:Setup|Cleanup)|Setup(?:VirtualMachine)?|Needs(?:ToLoadClasses|VirtualMachine)|ClassesF(?:orBundle|romPath)|ObjectNamedInPath|ProvidesClasses)|P(?:oint(?:InRect|FromString)|erformService|lanarFromDepth|ageSize)|E(?:n(?:d(?:MapTableEnumeration|HashTableEnumeration)|umerate(?:MapTable|HashTable)|ableScreenUpdates)|qual(?:R(?:ects|anges)|Sizes|Points)|raseRect|xtraRefCount)|F(?:ileTypeForHFSTypeCode|ullUserName|r(?:ee(?:MapTable|HashTable)|ame(?:Rect(?:WithWidth(?:UsingOperation)?)?|Address)))|Wi(?:ndowList(?:ForContext)?|dth)|Lo(?:cationInRange|g(?:v|PageSize)?)|A(?:ccessibility(?:R(?:oleDescription(?:ForUIElement)?|aiseBadArgumentException)|Unignored(?:Children(?:ForOnlyChild)?|Descendant|Ancestor)|PostNotification|ActionDescription)|pplication(?:Main|Load)|vailableWindowDepths|ll(?:MapTable(?:Values|Keys)|HashTableObjects|ocate(?:MemoryPages|Collectable|Object)))))(?:\\b)" + }, + { + token: ["support.class.cocoa.leopard"], + regex: "(?:\\b)(NS(?:RuleEditor|G(?:arbageCollector|radient)|MapTable|HashTable|Co(?:ndition|llectionView(?:Item)?)|T(?:oolbarItemGroup|extInputClient|r(?:eeNode|ackingArea))|InvocationOperation|Operation(?:Queue)?|D(?:ictionaryController|ockTile)|P(?:ointer(?:Functions|Array)|athC(?:o(?:ntrol(?:Delegate)?|mponentCell)|ell(?:Delegate)?)|r(?:intPanelAccessorizing|edicateEditor(?:RowTemplate)?))|ViewController|FastEnumeration|Animat(?:ionContext|ablePropertyContainer)))(?:\\b)" + }, + { + token: ["support.class.cocoa"], + regex: "(?:\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\b)" + }, + { + token: ["support.type.cocoa.leopard"], + regex: "(?:\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\b)" + }, + { + token: ["support.class.quartz"], + regex: "(?:\\b)(C(?:I(?:Sampler|Co(?:ntext|lor)|Image(?:Accumulator)?|PlugIn(?:Registration)?|Vector|Kernel|Filter(?:Generator|Shape)?)|A(?:Renderer|MediaTiming(?:Function)?|BasicAnimation|ScrollLayer|Constraint(?:LayoutManager)?|T(?:iledLayer|extLayer|rans(?:ition|action))|OpenGLLayer|PropertyAnimation|KeyframeAnimation|Layer|A(?:nimation(?:Group)?|ction))))(?:\\b)" + }, + { + token: ["support.type.quartz"], + regex: "(?:\\b)(C(?:G(?:Float|Point|Size|Rect)|IFormat|AConstraintAttribute))(?:\\b)" + }, + { + token: ["support.type.cocoa"], + regex: "(?:\\b)(NS(?:R(?:ect(?:Edge)?|ange)|G(?:lyph(?:Relation|LayoutMode)?|radientType)|M(?:odalSession|a(?:trixMode|p(?:Table|Enumerator)))|B(?:itmapImageFileType|orderType|uttonType|ezelStyle|ackingStoreType|rowserColumnResizingType)|S(?:cr(?:oll(?:er(?:Part|Arrow)|ArrowPosition)|eenAuxiliaryOpaque)|tringEncoding|ize|ocketNativeHandle|election(?:Granularity|Direction|Affinity)|wapped(?:Double|Float)|aveOperationType)|Ha(?:sh(?:Table|Enumerator)|ndler(?:2)?)|C(?:o(?:ntrol(?:Size|Tint)|mp(?:ositingOperation|arisonResult))|ell(?:State|Type|ImagePosition|Attribute))|T(?:hreadPrivate|ypesetterGlyphInfo|i(?:ckMarkPosition|tlePosition|meInterval)|o(?:ol(?:TipTag|bar(?:SizeMode|DisplayMode))|kenStyle)|IFFCompression|ext(?:TabType|Alignment)|ab(?:State|leViewDropOperation|ViewType)|rackingRectTag)|ImageInterpolation|Zone|OpenGL(?:ContextAuxiliary|PixelFormatAuxiliary)|D(?:ocumentChangeType|atePickerElementFlags|ra(?:werState|gOperation))|UsableScrollerParts|P(?:oint|r(?:intingPageOrder|ogressIndicator(?:Style|Th(?:ickness|readInfo))))|EventType|KeyValueObservingOptions|Fo(?:nt(?:SymbolicTraits|TraitMask|Action)|cusRingType)|W(?:indow(?:OrderingMode|Depth)|orkspace(?:IconCreationOptions|LaunchOptions)|ritingDirection)|L(?:ineBreakMode|ayout(?:Status|Direction))|A(?:nimation(?:Progress|Effect)|ppl(?:ication(?:TerminateReply|DelegateReply|PrintReply)|eEventManagerSuspensionID)|ffineTransformStruct|lertStyle)))(?:\\b)" + }, + { + token: ["support.constant.cocoa"], + regex: "(?:\\b)(NS(?:NotFound|Ordered(?:Ascending|Descending|Same)))(?:\\b)" + }, + { + token: ["support.constant.notification.cocoa.leopard"], + regex: "(?:\\b)(NS(?:MenuDidBeginTracking|ViewDidUpdateTrackingAreas)?Notification)(?:\\b)" + }, + { + token: ["support.constant.notification.cocoa"], + regex: "(?:\\b)(NS(?:Menu(?:Did(?:RemoveItem|SendAction|ChangeItem|EndTracking|AddItem)|WillSendAction)|S(?:ystemColorsDidChange|plitView(?:DidResizeSubviews|WillResizeSubviews))|C(?:o(?:nt(?:extHelpModeDid(?:Deactivate|Activate)|rolT(?:intDidChange|extDid(?:BeginEditing|Change|EndEditing)))|lor(?:PanelColorDidChange|ListDidChange)|mboBox(?:Selection(?:IsChanging|DidChange)|Will(?:Dismiss|PopUp)))|lassDescriptionNeededForClass)|T(?:oolbar(?:DidRemoveItem|WillAddItem)|ext(?:Storage(?:DidProcessEditing|WillProcessEditing)|Did(?:BeginEditing|Change|EndEditing)|View(?:DidChange(?:Selection|TypingAttributes)|WillChangeNotifyingTextView))|ableView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)))|ImageRepRegistryDidChange|OutlineView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)|Item(?:Did(?:Collapse|Expand)|Will(?:Collapse|Expand)))|Drawer(?:Did(?:Close|Open)|Will(?:Close|Open))|PopUpButton(?:CellWillPopUp|WillPopUp)|View(?:GlobalFrameDidChange|BoundsDidChange|F(?:ocusDidChange|rameDidChange))|FontSetChanged|W(?:indow(?:Did(?:Resi(?:ze|gn(?:Main|Key))|M(?:iniaturize|ove)|Become(?:Main|Key)|ChangeScreen(?:|Profile)|Deminiaturize|Update|E(?:ndSheet|xpose))|Will(?:M(?:iniaturize|ove)|BeginSheet|Close))|orkspace(?:SessionDid(?:ResignActive|BecomeActive)|Did(?:Mount|TerminateApplication|Unmount|PerformFileOperation|Wake|LaunchApplication)|Will(?:Sleep|Unmount|PowerOff|LaunchApplication)))|A(?:ntialiasThresholdChanged|ppl(?:ication(?:Did(?:ResignActive|BecomeActive|Hide|ChangeScreenParameters|U(?:nhide|pdate)|FinishLaunching)|Will(?:ResignActive|BecomeActive|Hide|Terminate|U(?:nhide|pdate)|FinishLaunching))|eEventManagerWillProcessFirstEvent)))Notification)(?:\\b)" + }, + { + token: ["support.constant.cocoa.leopard"], + regex: "(?:\\b)(NS(?:RuleEditor(?:RowType(?:Simple|Compound)|NestingMode(?:Si(?:ngle|mple)|Compound|List))|GradientDraws(?:BeforeStartingLocation|AfterEndingLocation)|M(?:inusSetExpressionType|a(?:chPortDeallocate(?:ReceiveRight|SendRight|None)|pTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality)))|B(?:oxCustom|undleExecutableArchitecture(?:X86|I386|PPC(?:64)?)|etweenPredicateOperatorType|ackgroundStyle(?:Raised|Dark|L(?:ight|owered)))|S(?:tring(?:DrawingTruncatesLastVisibleLine|EncodingConversion(?:ExternalRepresentation|AllowLossy))|ubqueryExpressionType|p(?:e(?:ech(?:SentenceBoundary|ImmediateBoundary|WordBoundary)|llingState(?:GrammarFlag|SpellingFlag))|litViewDividerStyleThi(?:n|ck))|e(?:rvice(?:RequestTimedOutError|M(?:iscellaneousError|alformedServiceDictionaryError)|InvalidPasteboardDataError|ErrorM(?:inimum|aximum)|Application(?:NotFoundError|LaunchFailedError))|gmentStyle(?:Round(?:Rect|ed)|SmallSquare|Capsule|Textured(?:Rounded|Square)|Automatic)))|H(?:UDWindowMask|ashTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality))|N(?:oModeColorPanel|etServiceNoAutoRename)|C(?:hangeRedone|o(?:ntainsPredicateOperatorType|l(?:orRenderingIntent(?:RelativeColorimetric|Saturation|Default|Perceptual|AbsoluteColorimetric)|lectorDisabledOption))|ellHit(?:None|ContentArea|TrackableArea|EditableTextArea))|T(?:imeZoneNameStyle(?:S(?:hort(?:Standard|DaylightSaving)|tandard)|DaylightSaving)|extFieldDatePickerStyle|ableViewSelectionHighlightStyle(?:Regular|SourceList)|racking(?:Mouse(?:Moved|EnteredAndExited)|CursorUpdate|InVisibleRect|EnabledDuringMouseDrag|A(?:ssumeInside|ctive(?:In(?:KeyWindow|ActiveApp)|WhenFirstResponder|Always))))|I(?:n(?:tersectSetExpressionType|dexedColorSpaceModel)|mageScale(?:None|Proportionally(?:Down|UpOrDown)|AxesIndependently))|Ope(?:nGLPFAAllowOfflineRenderers|rationQueue(?:DefaultMaxConcurrentOperationCount|Priority(?:High|Normal|Very(?:High|Low)|Low)))|D(?:iacriticInsensitiveSearch|ownloadsDirectory)|U(?:nionSetExpressionType|TF(?:16(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)|32(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)))|P(?:ointerFunctions(?:Ma(?:chVirtualMemory|llocMemory)|Str(?:ongMemory|uctPersonality)|C(?:StringPersonality|opyIn)|IntegerPersonality|ZeroingWeakMemory|O(?:paque(?:Memory|Personality)|bjectP(?:ointerPersonality|ersonality)))|at(?:hStyle(?:Standard|NavigationBar|PopUp)|ternColorSpaceModel)|rintPanelShows(?:Scaling|Copies|Orientation|P(?:a(?:perSize|ge(?:Range|SetupAccessory))|review)))|Executable(?:RuntimeMismatchError|NotLoadableError|ErrorM(?:inimum|aximum)|L(?:inkError|oadError)|ArchitectureMismatchError)|KeyValueObservingOption(?:Initial|Prior)|F(?:i(?:ndPanelSubstringMatchType(?:StartsWith|Contains|EndsWith|FullWord)|leRead(?:TooLargeError|UnknownStringEncodingError))|orcedOrderingSearch)|Wi(?:ndow(?:BackingLocation(?:MainMemory|Default|VideoMemory)|Sharing(?:Read(?:Only|Write)|None)|CollectionBehavior(?:MoveToActiveSpace|CanJoinAllSpaces|Default))|dthInsensitiveSearch)|AggregateExpressionType))(?:\\b)" + }, + { + token: ["support.constant.cocoa"], + regex: "(?:\\b)(NS(?:R(?:GB(?:ModeColorPanel|ColorSpaceModel)|ight(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey)|ound(?:RectBezelStyle|Bankers|ed(?:BezelStyle|TokenStyle|DisclosureBezelStyle)|Down|Up|Plain|Line(?:CapStyle|JoinStyle))|un(?:StoppedResponse|ContinuesResponse|AbortedResponse)|e(?:s(?:izableWindowMask|et(?:CursorRectsRunLoopOrdering|FunctionKey))|ce(?:ssedBezelStyle|iver(?:sCantHandleCommandScriptError|EvaluationScriptError))|turnTextMovement|doFunctionKey|quiredArgumentsMissingScriptError|l(?:evancyLevelIndicatorStyle|ative(?:Before|After))|gular(?:SquareBezelStyle|ControlSize)|moveTraitFontAction)|a(?:n(?:domSubelement|geDateMode)|tingLevelIndicatorStyle|dio(?:ModeMatrix|Button)))|G(?:IFFileType|lyph(?:Below|Inscribe(?:B(?:elow|ase)|Over(?:strike|Below)|Above)|Layout(?:WithPrevious|A(?:tAPoint|gainstAPoint))|A(?:ttribute(?:BidiLevel|Soft|Inscribe|Elastic)|bove))|r(?:ooveBorder|eaterThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|a(?:y(?:ModeColorPanel|ColorSpaceModel)|dient(?:None|Con(?:cave(?:Strong|Weak)|vex(?:Strong|Weak)))|phiteControlTint)))|XML(?:N(?:o(?:tationDeclarationKind|de(?:CompactEmptyElement|IsCDATA|OptionsNone|Use(?:SingleQuotes|DoubleQuotes)|Pre(?:serve(?:NamespaceOrder|C(?:haracterReferences|DATA)|DTD|Prefixes|E(?:ntities|mptyElements)|Quotes|Whitespace|A(?:ttributeOrder|ll))|ttyPrint)|ExpandEmptyElement))|amespaceKind)|CommentKind|TextKind|InvalidKind|D(?:ocument(?:X(?:MLKind|HTMLKind|Include)|HTMLKind|T(?:idy(?:XML|HTML)|extKind)|IncludeContentTypeDeclaration|Validate|Kind)|TDKind)|P(?:arser(?:GTRequiredError|XMLDeclNot(?:StartedError|FinishedError)|Mi(?:splaced(?:XMLDeclarationError|CDATAEndStringError)|xedContentDeclNot(?:StartedError|FinishedError))|S(?:t(?:andaloneValueError|ringNot(?:StartedError|ClosedError))|paceRequiredError|eparatorRequiredError)|N(?:MTOKENRequiredError|o(?:t(?:ationNot(?:StartedError|FinishedError)|WellBalancedError)|DTDError)|amespaceDeclarationError|AMERequiredError)|C(?:haracterRef(?:In(?:DTDError|PrologError|EpilogError)|AtEOFError)|o(?:nditionalSectionNot(?:StartedError|FinishedError)|mment(?:NotFinishedError|ContainsDoubleHyphenError))|DATANotFinishedError)|TagNameMismatchError|In(?:ternalError|valid(?:HexCharacterRefError|C(?:haracter(?:RefError|InEntityError|Error)|onditionalSectionError)|DecimalCharacterRefError|URIError|Encoding(?:NameError|Error)))|OutOfMemoryError|D(?:ocumentStartError|elegateAbortedParseError|OCTYPEDeclNotFinishedError)|U(?:RI(?:RequiredError|FragmentError)|n(?:declaredEntityError|parsedEntityError|knownEncodingError|finishedTagError))|P(?:CDATARequiredError|ublicIdentifierRequiredError|arsedEntityRef(?:MissingSemiError|NoNameError|In(?:Internal(?:SubsetError|Error)|PrologError|EpilogError)|AtEOFError)|r(?:ocessingInstructionNot(?:StartedError|FinishedError)|ematureDocumentEndError))|E(?:n(?:codingNotSupportedError|tity(?:Ref(?:In(?:DTDError|PrologError|EpilogError)|erence(?:MissingSemiError|WithoutNameError)|LoopError|AtEOFError)|BoundaryError|Not(?:StartedError|FinishedError)|Is(?:ParameterError|ExternalError)|ValueRequiredError))|qualExpectedError|lementContentDeclNot(?:StartedError|FinishedError)|xt(?:ernalS(?:tandaloneEntityError|ubsetNotFinishedError)|raContentError)|mptyDocumentError)|L(?:iteralNot(?:StartedError|FinishedError)|T(?:RequiredError|SlashRequiredError)|essThanSymbolInAttributeError)|Attribute(?:RedefinedError|HasNoValueError|Not(?:StartedError|FinishedError)|ListNot(?:StartedError|FinishedError)))|rocessingInstructionKind)|E(?:ntity(?:GeneralKind|DeclarationKind|UnparsedKind|P(?:ar(?:sedKind|ameterKind)|redefined))|lement(?:Declaration(?:MixedKind|UndefinedKind|E(?:lementKind|mptyKind)|Kind|AnyKind)|Kind))|Attribute(?:N(?:MToken(?:sKind|Kind)|otationKind)|CDATAKind|ID(?:Ref(?:sKind|Kind)|Kind)|DeclarationKind|En(?:tit(?:yKind|iesKind)|umerationKind)|Kind))|M(?:i(?:n(?:XEdge|iaturizableWindowMask|YEdge|uteCalendarUnit)|terLineJoinStyle|ddleSubelement|xedState)|o(?:nthCalendarUnit|deSwitchFunctionKey|use(?:Moved(?:Mask)?|E(?:ntered(?:Mask)?|ventSubtype|xited(?:Mask)?))|veToBezierPathElement|mentary(?:ChangeButton|Push(?:Button|InButton)|Light(?:Button)?))|enuFunctionKey|a(?:c(?:intoshInterfaceStyle|OSRomanStringEncoding)|tchesPredicateOperatorType|ppedRead|x(?:XEdge|YEdge))|ACHOperatingSystem)|B(?:MPFileType|o(?:ttomTabsBezelBorder|ldFontMask|rderlessWindowMask|x(?:Se(?:condary|parator)|OldStyle|Primary))|uttLineCapStyle|e(?:zelBorder|velLineJoinStyle|low(?:Bottom|Top)|gin(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|lueControlTint|ack(?:spaceCharacter|tabTextMovement|ingStore(?:Retained|Buffered|Nonretained)|TabCharacter|wardsSearch|groundTab)|r(?:owser(?:NoColumnResizing|UserColumnResizing|AutoColumnResizing)|eakFunctionKey))|S(?:h(?:ift(?:JISStringEncoding|KeyMask)|ow(?:ControlGlyphs|InvisibleGlyphs)|adowlessSquareBezelStyle)|y(?:s(?:ReqFunctionKey|tem(?:D(?:omainMask|efined(?:Mask)?)|FunctionKey))|mbolStringEncoding)|c(?:a(?:nnedOption|le(?:None|ToFit|Proportionally))|r(?:oll(?:er(?:NoPart|Increment(?:Page|Line|Arrow)|Decrement(?:Page|Line|Arrow)|Knob(?:Slot)?|Arrows(?:M(?:inEnd|axEnd)|None|DefaultSetting))|Wheel(?:Mask)?|LockFunctionKey)|eenChangedEventType))|t(?:opFunctionKey|r(?:ingDrawing(?:OneShot|DisableScreenFontSubstitution|Uses(?:DeviceMetrics|FontLeading|LineFragmentOrigin))|eam(?:Status(?:Reading|NotOpen|Closed|Open(?:ing)?|Error|Writing|AtEnd)|Event(?:Has(?:BytesAvailable|SpaceAvailable)|None|OpenCompleted|E(?:ndEncountered|rrorOccurred)))))|i(?:ngle(?:DateMode|UnderlineStyle)|ze(?:DownFontAction|UpFontAction))|olarisOperatingSystem|unOSOperatingSystem|pecialPageOrder|e(?:condCalendarUnit|lect(?:By(?:Character|Paragraph|Word)|i(?:ng(?:Next|Previous)|onAffinity(?:Downstream|Upstream))|edTab|FunctionKey)|gmentSwitchTracking(?:Momentary|Select(?:One|Any)))|quareLineCapStyle|witchButton|ave(?:ToOperation|Op(?:tions(?:Yes|No|Ask)|eration)|AsOperation)|mall(?:SquareBezelStyle|C(?:ontrolSize|apsFontMask)|IconButtonBezelStyle))|H(?:ighlightModeMatrix|SBModeColorPanel|o(?:ur(?:Minute(?:SecondDatePickerElementFlag|DatePickerElementFlag)|CalendarUnit)|rizontalRuler|meFunctionKey)|TTPCookieAcceptPolicy(?:Never|OnlyFromMainDocumentDomain|Always)|e(?:lp(?:ButtonBezelStyle|KeyMask|FunctionKey)|avierFontAction)|PUXOperatingSystem)|Year(?:MonthDa(?:yDatePickerElementFlag|tePickerElementFlag)|CalendarUnit)|N(?:o(?:n(?:StandardCharacterSetFontMask|ZeroWindingRule|activatingPanelMask|LossyASCIIStringEncoding)|Border|t(?:ification(?:SuspensionBehavior(?:Hold|Coalesce|D(?:eliverImmediately|rop))|NoCoalescing|CoalescingOn(?:Sender|Name)|DeliverImmediately|PostToAllSessions)|PredicateType|EqualToPredicateOperatorType)|S(?:cr(?:iptError|ollerParts)|ubelement|pecifierError)|CellMask|T(?:itle|opLevelContainersSpecifierError|abs(?:BezelBorder|NoBorder|LineBorder))|I(?:nterfaceStyle|mage)|UnderlineStyle|FontChangeAction)|u(?:ll(?:Glyph|CellType)|m(?:eric(?:Search|PadKeyMask)|berFormatter(?:Round(?:Half(?:Down|Up|Even)|Ceiling|Down|Up|Floor)|Behavior(?:10|Default)|S(?:cientificStyle|pellOutStyle)|NoStyle|CurrencyStyle|DecimalStyle|P(?:ercentStyle|ad(?:Before(?:Suffix|Prefix)|After(?:Suffix|Prefix))))))|e(?:t(?:Services(?:BadArgumentError|NotFoundError|C(?:ollisionError|ancelledError)|TimeoutError|InvalidError|UnknownError|ActivityInProgress)|workDomainMask)|wlineCharacter|xt(?:StepInterfaceStyle|FunctionKey))|EXTSTEPStringEncoding|a(?:t(?:iveShortGlyphPacking|uralTextAlignment)|rrowFontMask))|C(?:hange(?:ReadOtherContents|GrayCell(?:Mask)?|BackgroundCell(?:Mask)?|Cleared|Done|Undone|Autosaved)|MYK(?:ModeColorPanel|ColorSpaceModel)|ircular(?:BezelStyle|Slider)|o(?:n(?:stantValueExpressionType|t(?:inuousCapacityLevelIndicatorStyle|entsCellMask|ain(?:sComparison|erSpecifierError)|rol(?:Glyph|KeyMask))|densedFontMask)|lor(?:Panel(?:RGBModeMask|GrayModeMask|HSBModeMask|C(?:MYKModeMask|olorListModeMask|ustomPaletteModeMask|rayonModeMask)|WheelModeMask|AllModesMask)|ListModeColorPanel)|reServiceDirectory|m(?:p(?:osite(?:XOR|Source(?:In|O(?:ut|ver)|Atop)|Highlight|C(?:opy|lear)|Destination(?:In|O(?:ut|ver)|Atop)|Plus(?:Darker|Lighter))|ressedFontMask)|mandKeyMask))|u(?:stom(?:SelectorPredicateOperatorType|PaletteModeColorPanel)|r(?:sor(?:Update(?:Mask)?|PointingDevice)|veToBezierPathElement))|e(?:nterT(?:extAlignment|abStopType)|ll(?:State|H(?:ighlighted|as(?:Image(?:Horizontal|OnLeftOrBottom)|OverlappingImage))|ChangesContents|Is(?:Bordered|InsetButton)|Disabled|Editable|LightsBy(?:Gray|Background|Contents)|AllowsMixedState))|l(?:ipPagination|o(?:s(?:ePathBezierPathElement|ableWindowMask)|ckAndCalendarDatePickerStyle)|ear(?:ControlTint|DisplayFunctionKey|LineFunctionKey))|a(?:seInsensitive(?:Search|PredicateOption)|n(?:notCreateScriptCommandError|cel(?:Button|TextMovement))|chesDirectory|lculation(?:NoError|Overflow|DivideByZero|Underflow|LossOfPrecision)|rriageReturnCharacter)|r(?:itical(?:Request|AlertStyle)|ayonModeColorPanel))|T(?:hick(?:SquareBezelStyle|erSquareBezelStyle)|ypesetter(?:Behavior|HorizontalTabAction|ContainerBreakAction|ZeroAdvancementAction|OriginalBehavior|ParagraphBreakAction|WhitespaceAction|L(?:ineBreakAction|atestBehavior))|i(?:ckMark(?:Right|Below|Left|Above)|tledWindowMask|meZoneDatePickerElementFlag)|o(?:olbarItemVisibilityPriority(?:Standard|High|User|Low)|pTabsBezelBorder|ggleButton)|IFF(?:Compression(?:N(?:one|EXT)|CCITTFAX(?:3|4)|OldJPEG|JPEG|PackBits|LZW)|FileType)|e(?:rminate(?:Now|Cancel|Later)|xt(?:Read(?:InapplicableDocumentTypeError|WriteErrorM(?:inimum|aximum))|Block(?:M(?:i(?:nimum(?:Height|Width)|ddleAlignment)|a(?:rgin|ximum(?:Height|Width)))|B(?:o(?:ttomAlignment|rder)|aselineAlignment)|Height|TopAlignment|P(?:ercentageValueType|adding)|Width|AbsoluteValueType)|StorageEdited(?:Characters|Attributes)|CellType|ured(?:RoundedBezelStyle|BackgroundWindowMask|SquareBezelStyle)|Table(?:FixedLayoutAlgorithm|AutomaticLayoutAlgorithm)|Field(?:RoundedBezel|SquareBezel|AndStepperDatePickerStyle)|WriteInapplicableDocumentTypeError|ListPrependEnclosingMarker))|woByteGlyphPacking|ab(?:Character|TextMovement|le(?:tP(?:oint(?:Mask|EventSubtype)?|roximity(?:Mask|EventSubtype)?)|Column(?:NoResizing|UserResizingMask|AutoresizingMask)|View(?:ReverseSequentialColumnAutoresizingStyle|GridNone|S(?:olid(?:HorizontalGridLineMask|VerticalGridLineMask)|equentialColumnAutoresizingStyle)|NoColumnAutoresizing|UniformColumnAutoresizingStyle|FirstColumnOnlyAutoresizingStyle|LastColumnOnlyAutoresizingStyle)))|rackModeMatrix)|I(?:n(?:sert(?:CharFunctionKey|FunctionKey|LineFunctionKey)|t(?:Type|ernalS(?:criptError|pecifierError))|dexSubelement|validIndexSpecifierError|formational(?:Request|AlertStyle)|PredicateOperatorType)|talicFontMask|SO(?:2022JPStringEncoding|Latin(?:1StringEncoding|2StringEncoding))|dentityMappingCharacterCollection|llegalTextMovement|mage(?:R(?:ight|ep(?:MatchesDevice|LoadStatus(?:ReadingHeader|Completed|InvalidData|Un(?:expectedEOF|knownType)|WillNeedAllData)))|Below|C(?:ellType|ache(?:BySize|Never|Default|Always))|Interpolation(?:High|None|Default|Low)|O(?:nly|verlaps)|Frame(?:Gr(?:oove|ayBezel)|Button|None|Photo)|L(?:oadStatus(?:ReadError|C(?:ompleted|ancelled)|InvalidData|UnexpectedEOF)|eft)|A(?:lign(?:Right|Bottom(?:Right|Left)?|Center|Top(?:Right|Left)?|Left)|bove)))|O(?:n(?:State|eByteGlyphPacking|OffButton|lyScrollerArrows)|ther(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|TextMovement)|SF1OperatingSystem|pe(?:n(?:GL(?:GO(?:Re(?:setLibrary|tainRenderers)|ClearFormatCache|FormatCacheSize)|PFA(?:R(?:obust|endererID)|M(?:inimumPolicy|ulti(?:sample|Screen)|PSafe|aximumPolicy)|BackingStore|S(?:creenMask|te(?:ncilSize|reo)|ingleRenderer|upersample|ample(?:s|Buffers|Alpha))|NoRecovery|C(?:o(?:lor(?:Size|Float)|mpliant)|losestPolicy)|OffScreen|D(?:oubleBuffer|epthSize)|PixelBuffer|VirtualScreenCount|FullScreen|Window|A(?:cc(?:umSize|elerated)|ux(?:Buffers|DepthStencil)|l(?:phaSize|lRenderers))))|StepUnicodeReservedBase)|rationNotSupportedForKeyS(?:criptError|pecifierError))|ffState|KButton|rPredicateType|bjC(?:B(?:itfield|oolType)|S(?:hortType|tr(?:ingType|uctType)|electorType)|NoType|CharType|ObjectType|DoubleType|UnionType|PointerType|VoidType|FloatType|Long(?:Type|longType)|ArrayType))|D(?:i(?:s(?:c(?:losureBezelStyle|reteCapacityLevelIndicatorStyle)|playWindowRunLoopOrdering)|acriticInsensitivePredicateOption|rect(?:Selection|PredicateModifier))|o(?:c(?:ModalWindowMask|ument(?:Directory|ationDirectory))|ubleType|wn(?:TextMovement|ArrowFunctionKey))|e(?:s(?:cendingPageOrder|ktopDirectory)|cimalTabStopType|v(?:ice(?:NColorSpaceModel|IndependentModifierFlagsMask)|eloper(?:Directory|ApplicationDirectory))|fault(?:ControlTint|TokenStyle)|lete(?:Char(?:acter|FunctionKey)|FunctionKey|LineFunctionKey)|moApplicationDirectory)|a(?:yCalendarUnit|teFormatter(?:MediumStyle|Behavior(?:10|Default)|ShortStyle|NoStyle|FullStyle|LongStyle))|ra(?:wer(?:Clos(?:ingState|edState)|Open(?:ingState|State))|gOperation(?:Generic|Move|None|Copy|Delete|Private|Every|Link|All)))|U(?:ser(?:CancelledError|D(?:irectory|omainMask)|FunctionKey)|RL(?:Handle(?:NotLoaded|Load(?:Succeeded|InProgress|Failed))|CredentialPersistence(?:None|Permanent|ForSession))|n(?:scaledWindowMask|cachedRead|i(?:codeStringEncoding|talicFontMask|fiedTitleAndToolbarWindowMask)|d(?:o(?:CloseGroupingRunLoopOrdering|FunctionKey)|e(?:finedDateComponent|rline(?:Style(?:Single|None|Thick|Double)|Pattern(?:Solid|D(?:ot|ash(?:Dot(?:Dot)?)?)))))|known(?:ColorSpaceModel|P(?:ointingDevice|ageOrder)|KeyS(?:criptError|pecifierError))|boldFontMask)|tilityWindowMask|TF8StringEncoding|p(?:dateWindowsRunLoopOrdering|TextMovement|ArrowFunctionKey))|J(?:ustifiedTextAlignment|PEG(?:2000FileType|FileType)|apaneseEUC(?:GlyphPacking|StringEncoding))|P(?:o(?:s(?:t(?:Now|erFontMask|WhenIdle|ASAP)|iti(?:on(?:Replace|Be(?:fore|ginning)|End|After)|ve(?:IntType|DoubleType|FloatType)))|pUp(?:NoArrow|ArrowAt(?:Bottom|Center))|werOffEventType|rtraitOrientation)|NGFileType|ush(?:InCell(?:Mask)?|OnPushOffButton)|e(?:n(?:TipMask|UpperSideMask|PointingDevice|LowerSideMask)|riodic(?:Mask)?)|P(?:S(?:caleField|tatus(?:Title|Field)|aveButton)|N(?:ote(?:Title|Field)|ame(?:Title|Field))|CopiesField|TitleField|ImageButton|OptionsButton|P(?:a(?:perFeedButton|ge(?:Range(?:To|From)|ChoiceMatrix))|reviewButton)|LayoutButton)|lainTextTokenStyle|a(?:useFunctionKey|ragraphSeparatorCharacter|ge(?:DownFunctionKey|UpFunctionKey))|r(?:int(?:ing(?:ReplyLater|Success|Cancelled|Failure)|ScreenFunctionKey|erTable(?:NotFound|OK|Error)|FunctionKey)|o(?:p(?:ertyList(?:XMLFormat|MutableContainers(?:AndLeaves)?|BinaryFormat|Immutable|OpenStepFormat)|rietaryStringEncoding)|gressIndicator(?:BarStyle|SpinningStyle|Preferred(?:SmallThickness|Thickness|LargeThickness|AquaThickness)))|e(?:ssedTab|vFunctionKey))|L(?:HeightForm|CancelButton|TitleField|ImageButton|O(?:KButton|rientationMatrix)|UnitsButton|PaperNameButton|WidthForm))|E(?:n(?:terCharacter|d(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|v(?:e(?:nOddWindingRule|rySubelement)|aluatedObjectExpressionType)|qualTo(?:Comparison|PredicateOperatorType)|ra(?:serPointingDevice|CalendarUnit|DatePickerElementFlag)|x(?:clude(?:10|QuickDrawElementsIconCreationOption)|pandedFontMask|ecuteFunctionKey))|V(?:i(?:ew(?:M(?:in(?:XMargin|YMargin)|ax(?:XMargin|YMargin))|HeightSizable|NotSizable|WidthSizable)|aPanelFontAction)|erticalRuler|a(?:lidationErrorM(?:inimum|aximum)|riableExpressionType))|Key(?:SpecifierEvaluationScriptError|Down(?:Mask)?|Up(?:Mask)?|PathExpressionType|Value(?:MinusSetMutation|SetSetMutation|Change(?:Re(?:placement|moval)|Setting|Insertion)|IntersectSetMutation|ObservingOption(?:New|Old)|UnionSetMutation|ValidationError))|QTMovie(?:NormalPlayback|Looping(?:BackAndForthPlayback|Playback))|F(?:1(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|7FunctionKey|i(?:nd(?:PanelAction(?:Replace(?:A(?:ndFind|ll(?:InSelection)?))?|S(?:howFindPanel|e(?:tFindString|lectAll(?:InSelection)?))|Next|Previous)|FunctionKey)|tPagination|le(?:Read(?:No(?:SuchFileError|PermissionError)|CorruptFileError|In(?:validFileNameError|applicableStringEncodingError)|Un(?:supportedSchemeError|knownError))|HandlingPanel(?:CancelButton|OKButton)|NoSuchFileError|ErrorM(?:inimum|aximum)|Write(?:NoPermissionError|In(?:validFileNameError|applicableStringEncodingError)|OutOfSpaceError|Un(?:supportedSchemeError|knownError))|LockingError)|xedPitchFontMask)|2(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|o(?:nt(?:Mo(?:noSpaceTrait|dernSerifsClass)|BoldTrait|S(?:ymbolicClass|criptsClass|labSerifsClass|ansSerifClass)|C(?:o(?:ndensedTrait|llectionApplicationOnlyMask)|larendonSerifsClass)|TransitionalSerifsClass|I(?:ntegerAdvancementsRenderingMode|talicTrait)|O(?:ldStyleSerifsClass|rnamentalsClass)|DefaultRenderingMode|U(?:nknownClass|IOptimizedTrait)|Panel(?:S(?:hadowEffectModeMask|t(?:andardModesMask|rikethroughEffectModeMask)|izeModeMask)|CollectionModeMask|TextColorEffectModeMask|DocumentColorEffectModeMask|UnderlineEffectModeMask|FaceModeMask|All(?:ModesMask|EffectsModeMask))|ExpandedTrait|VerticalTrait|F(?:amilyClassMask|reeformSerifsClass)|Antialiased(?:RenderingMode|IntegerAdvancementsRenderingMode))|cusRing(?:Below|Type(?:None|Default|Exterior)|Only|Above)|urByteGlyphPacking|rm(?:attingError(?:M(?:inimum|aximum))?|FeedCharacter))|8FunctionKey|unction(?:ExpressionType|KeyMask)|3(?:1FunctionKey|2FunctionKey|3FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey)|9FunctionKey|4FunctionKey|P(?:RevertButton|S(?:ize(?:Title|Field)|etButton)|CurrentField|Preview(?:Button|Field))|l(?:oat(?:ingPointSamplesBitmapFormat|Type)|agsChanged(?:Mask)?)|axButton|5FunctionKey|6FunctionKey)|W(?:heelModeColorPanel|indow(?:s(?:NTOperatingSystem|CP125(?:1StringEncoding|2StringEncoding|3StringEncoding|4StringEncoding|0StringEncoding)|95(?:InterfaceStyle|OperatingSystem))|M(?:iniaturizeButton|ovedEventType)|Below|CloseButton|ToolbarButton|ZoomButton|Out|DocumentIconButton|ExposedEventType|Above)|orkspaceLaunch(?:NewInstance|InhibitingBackgroundOnly|Default|PreferringClassic|WithoutA(?:ctivation|ddingToRecents)|A(?:sync|nd(?:Hide(?:Others)?|Print)|llowingClassicStartup))|eek(?:day(?:CalendarUnit|OrdinalCalendarUnit)|CalendarUnit)|a(?:ntsBidiLevels|rningAlertStyle)|r(?:itingDirection(?:RightToLeft|Natural|LeftToRight)|apCalendarComponents))|L(?:i(?:stModeMatrix|ne(?:Moves(?:Right|Down|Up|Left)|B(?:order|reakBy(?:C(?:harWrapping|lipping)|Truncating(?:Middle|Head|Tail)|WordWrapping))|S(?:eparatorCharacter|weep(?:Right|Down|Up|Left))|ToBezierPathElement|DoesntMove|arSlider)|teralSearch|kePredicateOperatorType|ghterFontAction|braryDirectory)|ocalDomainMask|e(?:ssThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|ft(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey))|a(?:yout(?:RightToLeft|NotDone|CantFit|OutOfGlyphs|Done|LeftToRight)|ndscapeOrientation)|ABColorSpaceModel)|A(?:sc(?:iiWithDoubleByteEUCGlyphPacking|endingPageOrder)|n(?:y(?:Type|PredicateModifier|EventMask)|choredSearch|imation(?:Blocking|Nonblocking(?:Threaded)?|E(?:ffect(?:DisappearingItemDefault|Poof)|ase(?:In(?:Out)?|Out))|Linear)|dPredicateType)|t(?:Bottom|tachmentCharacter|omicWrite|Top)|SCIIStringEncoding|d(?:obe(?:GB1CharacterCollection|CNS1CharacterCollection|Japan(?:1CharacterCollection|2CharacterCollection)|Korea1CharacterCollection)|dTraitFontAction|minApplicationDirectory)|uto(?:saveOperation|Pagination)|pp(?:lication(?:SupportDirectory|D(?:irectory|e(?:fined(?:Mask)?|legateReply(?:Success|Cancel|Failure)|activatedEventType))|ActivatedEventType)|KitDefined(?:Mask)?)|l(?:ternateKeyMask|pha(?:ShiftKeyMask|NonpremultipliedBitmapFormat|FirstBitmapFormat)|ert(?:SecondButtonReturn|ThirdButtonReturn|OtherReturn|DefaultReturn|ErrorReturn|FirstButtonReturn|AlternateReturn)|l(?:ScrollerParts|DomainsMask|PredicateModifier|LibrariesDirectory|ApplicationsDirectory))|rgument(?:sWrongScriptError|EvaluationScriptError)|bove(?:Bottom|Top)|WTEventType)))(?:\\b)" + }, + { + token: "support.function.C99.c", + regex: C_Highlight_File.cFunctions + }, + { + token : cObj.getKeywords(), + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token: "punctuation.section.scope.begin.objc", + regex: "\\[", + next: "bracketed_content" + }, + { + token: "meta.function.objc", + regex: "^(?:-|\\+)\\s*" + } + ], + "constant_NSString": [ + { + token: "constant.character.escape.objc", + regex: escapedConstRe + }, + { + token: "invalid.illegal.unknown-escape.objc", + regex: "\\\\." + }, + { + token: "string", + regex: '[^"\\\\]+' + }, + { + token: "punctuation.definition.string.end", + regex: "\"", + next: "start" + } + ], + "protocol_list": [ + { + token: "punctuation.section.scope.end.objc", + regex: ">", + next: "start" + }, + { + token: "support.other.protocol.objc", + regex: "\bNS(?:GlyphStorage|M(?:utableCopying|enuItem)|C(?:hangeSpelling|o(?:ding|pying|lorPicking(?:Custom|Default)))|T(?:oolbarItemValidations|ext(?:Input|AttachmentCell))|I(?:nputServ(?:iceProvider|erMouseTracker)|gnoreMisspelledWords)|Obj(?:CTypeSerializationCallBack|ect)|D(?:ecimalNumberBehaviors|raggingInfo)|U(?:serInterfaceValidations|RL(?:HandleClient|DownloadDelegate|ProtocolClient|AuthenticationChallengeSender))|Validated(?:ToobarItem|UserInterfaceItem)|Locking)\b" + } + ], + "selectors": [ + { + token: "support.function.any-method.name-of-parameter.objc", + regex: "\\b(?:[a-zA-Z_:][\\w]*)+" + }, + { + token: "punctuation", + regex: "\\)", + next: "start" + } + ], + "bracketed_content": [ + { + token: "punctuation.section.scope.end.objc", + regex: "]", + next: "start" + }, + { + token: ["support.function.any-method.objc"], + regex: "(?:predicateWithFormat:| NSPredicate predicateWithFormat:)", + next: "start" + }, + { + token: "support.function.any-method.objc", + regex: "\\w+(?::|(?=]))", + next: "start" + } + ], + "bracketed_strings": [ + { + token: "punctuation.section.scope.end.objc", + regex: "]", + next: "start" + }, + { + token: "keyword.operator.logical.predicate.cocoa", + regex: "\\b(?:AND|OR|NOT|IN)\\b" + }, + { + token: ["invalid.illegal.unknown-method.objc", "punctuation.separator.arguments.objc"], + regex: "\\b(\\w+)(:)" + }, + { + regex: "\\b(?:ALL|ANY|SOME|NONE)\\b", + token: "constant.language.predicate.cocoa" + }, + { + regex: "\\b(?:NULL|NIL|SELF|TRUE|YES|FALSE|NO|FIRST|LAST|SIZE)\\b", + token: "constant.language.predicate.cocoa" + }, + { + regex: "\\b(?:MATCHES|CONTAINS|BEGINSWITH|ENDSWITH|BETWEEN)\\b", + token: "keyword.operator.comparison.predicate.cocoa" + }, + { + regex: "\\bC(?:ASEINSENSITIVE|I)\\b", + token: "keyword.other.modifier.predicate.cocoa" + }, + { + regex: "\\b(?:ANYKEY|SUBQUERY|CAST|TRUEPREDICATE|FALSEPREDICATE)\\b", + token: "keyword.other.predicate.cocoa" + }, + { + regex: escapedConstRe, + token: "constant.character.escape.objc" + }, + { + regex: "\\\\.", + token: "invalid.illegal.unknown-escape.objc" + }, + { + token: "string", + regex: '[^"\\\\]' + }, + { + token: "punctuation.definition.string.end.objc", + regex: "\"", + next: "predicates" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "methods" : [ + { + token : "meta.function.objc", + regex : "(?=\\{|#)|;", + next : "start" + } + ] +} + for (var r in cRules) { + if (this.$rules[r]) { + if (this.$rules[r].push) + this.$rules[r].push.apply(this.$rules[r], cRules[r]); + } else { + this.$rules[r] = cRules[r]; + } + } + + this.$rules.bracketed_content = this.$rules.bracketed_content.concat( + this.$rules.start, specialVariables + ); + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(ObjectiveCHighlightRules, CHighlightRules); + +exports.ObjectiveCHighlightRules = ObjectiveCHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/objectivec",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/objectivec_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ObjectiveCHighlightRules = require("./objectivec_highlight_rules").ObjectiveCHighlightRules; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = ObjectiveCHighlightRules; + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/objectivec"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-ocaml.js b/src/libs/ace/mode-ocaml.js new file mode 100755 index 0000000..29f26cc --- /dev/null +++ b/src/libs/ace/mode-ocaml.js @@ -0,0 +1,414 @@ +ace.define("ace/mode/ocaml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var OcamlHighlightRules = function() { + + var keywords = ( + "and|as|assert|begin|class|constraint|do|done|downto|else|end|" + + "exception|external|for|fun|function|functor|if|in|include|" + + "inherit|initializer|lazy|let|match|method|module|mutable|new|" + + "object|of|open|or|private|rec|sig|struct|then|to|try|type|val|" + + "virtual|when|while|with" + ); + + var builtinConstants = ("true|false"); + + var builtinFunctions = ( + "abs|abs_big_int|abs_float|abs_num|abstract_tag|accept|access|acos|add|" + + "add_available_units|add_big_int|add_buffer|add_channel|add_char|" + + "add_initializer|add_int_big_int|add_interfaces|add_num|add_string|" + + "add_substitute|add_substring|alarm|allocated_bytes|allow_only|" + + "allow_unsafe_modules|always|append|appname_get|appname_set|" + + "approx_num_exp|approx_num_fix|arg|argv|arith_status|array|" + + "array1_of_genarray|array2_of_genarray|array3_of_genarray|asin|asr|" + + "assoc|assq|at_exit|atan|atan2|auto_synchronize|background|basename|" + + "beginning_of_input|big_int_of_int|big_int_of_num|big_int_of_string|bind|" + + "bind_class|bind_tag|bits|bits_of_float|black|blit|blit_image|blue|bool|" + + "bool_of_string|bounded_full_split|bounded_split|bounded_split_delim|" + + "bprintf|break|broadcast|bscanf|button_down|c_layout|capitalize|cardinal|" + + "cardinal|catch|catch_break|ceil|ceiling_num|channel|char|char_of_int|" + + "chdir|check|check_suffix|chmod|choose|chop_extension|chop_suffix|chown|" + + "chown|chr|chroot|classify_float|clear|clear_available_units|" + + "clear_close_on_exec|clear_graph|clear_nonblock|clear_parser|" + + "close|close|closeTk|close_box|close_graph|close_in|close_in_noerr|" + + "close_out|close_out_noerr|close_process|close_process|" + + "close_process_full|close_process_in|close_process_out|close_subwindow|" + + "close_tag|close_tbox|closedir|closedir|closure_tag|code|combine|" + + "combine|combine|command|compact|compare|compare_big_int|compare_num|" + + "complex32|complex64|concat|conj|connect|contains|contains_from|contents|" + + "copy|cos|cosh|count|count|counters|create|create_alarm|create_image|" + + "create_matrix|create_matrix|create_matrix|create_object|" + + "create_object_and_run_initializers|create_object_opt|create_process|" + + "create_process|create_process_env|create_process_env|create_table|" + + "current|current_dir_name|current_point|current_x|current_y|curveto|" + + "custom_tag|cyan|data_size|decr|decr_num|default_available_units|delay|" + + "delete_alarm|descr_of_in_channel|descr_of_out_channel|destroy|diff|dim|" + + "dim1|dim2|dim3|dims|dirname|display_mode|div|div_big_int|div_num|" + + "double_array_tag|double_tag|draw_arc|draw_char|draw_circle|draw_ellipse|" + + "draw_image|draw_poly|draw_poly_line|draw_rect|draw_segments|draw_string|" + + "dummy_pos|dummy_table|dump_image|dup|dup2|elements|empty|end_of_input|" + + "environment|eprintf|epsilon_float|eq_big_int|eq_num|equal|err_formatter|" + + "error_message|escaped|establish_server|executable_name|execv|execve|execvp|" + + "execvpe|exists|exists2|exit|exp|failwith|fast_sort|fchmod|fchown|field|" + + "file|file_exists|fill|fill_arc|fill_circle|fill_ellipse|fill_poly|fill_rect|" + + "filter|final_tag|finalise|find|find_all|first_chars|firstkey|flatten|" + + "float|float32|float64|float_of_big_int|float_of_bits|float_of_int|" + + "float_of_num|float_of_string|floor|floor_num|flush|flush_all|flush_input|" + + "flush_str_formatter|fold|fold_left|fold_left2|fold_right|fold_right2|" + + "for_all|for_all2|force|force_newline|force_val|foreground|fork|" + + "format_of_string|formatter_of_buffer|formatter_of_out_channel|" + + "fortran_layout|forward_tag|fprintf|frexp|from|from_channel|from_file|" + + "from_file_bin|from_function|from_string|fscanf|fst|fstat|ftruncate|" + + "full_init|full_major|full_split|gcd_big_int|ge_big_int|ge_num|" + + "genarray_of_array1|genarray_of_array2|genarray_of_array3|get|" + + "get_all_formatter_output_functions|get_approx_printing|get_copy|" + + "get_ellipsis_text|get_error_when_null_denominator|get_floating_precision|" + + "get_formatter_output_functions|get_formatter_tag_functions|get_image|" + + "get_margin|get_mark_tags|get_max_boxes|get_max_indent|get_method|" + + "get_method_label|get_normalize_ratio|get_normalize_ratio_when_printing|" + + "get_print_tags|get_state|get_variable|getcwd|getegid|getegid|getenv|" + + "getenv|getenv|geteuid|geteuid|getgid|getgid|getgrgid|getgrgid|getgrnam|" + + "getgrnam|getgroups|gethostbyaddr|gethostbyname|gethostname|getitimer|" + + "getlogin|getpeername|getpid|getppid|getprotobyname|getprotobynumber|" + + "getpwnam|getpwuid|getservbyname|getservbyport|getsockname|getsockopt|" + + "getsockopt_float|getsockopt_int|getsockopt_optint|gettimeofday|getuid|" + + "global_replace|global_substitute|gmtime|green|grid|group_beginning|" + + "group_end|gt_big_int|gt_num|guard|handle_unix_error|hash|hash_param|" + + "hd|header_size|i|id|ignore|in_channel_length|in_channel_of_descr|incr|" + + "incr_num|index|index_from|inet_addr_any|inet_addr_of_string|infinity|" + + "infix_tag|init|init_class|input|input_binary_int|input_byte|input_char|" + + "input_line|input_value|int|int16_signed|int16_unsigned|int32|int64|" + + "int8_signed|int8_unsigned|int_of_big_int|int_of_char|int_of_float|" + + "int_of_num|int_of_string|integer_num|inter|interactive|inv|invalid_arg|" + + "is_block|is_empty|is_implicit|is_int|is_int_big_int|is_integer_num|" + + "is_relative|iter|iter2|iteri|join|junk|key_pressed|kill|kind|kprintf|" + + "kscanf|land|last_chars|layout|lazy_from_fun|lazy_from_val|lazy_is_val|" + + "lazy_tag|ldexp|le_big_int|le_num|length|lexeme|lexeme_char|lexeme_end|" + + "lexeme_end_p|lexeme_start|lexeme_start_p|lineto|link|list|listen|lnot|" + + "loadfile|loadfile_private|localtime|lock|lockf|log|log10|logand|lognot|" + + "logor|logxor|lor|lower_window|lowercase|lseek|lsl|lsr|lstat|lt_big_int|" + + "lt_num|lxor|magenta|magic|mainLoop|major|major_slice|make|make_formatter|" + + "make_image|make_lexer|make_matrix|make_self_init|map|map2|map_file|mapi|" + + "marshal|match_beginning|match_end|matched_group|matched_string|max|" + + "max_array_length|max_big_int|max_elt|max_float|max_int|max_num|" + + "max_string_length|mem|mem_assoc|mem_assq|memq|merge|min|min_big_int|" + + "min_elt|min_float|min_int|min_num|minor|minus_big_int|minus_num|" + + "minus_one|mkdir|mkfifo|mktime|mod|mod_big_int|mod_float|mod_num|modf|" + + "mouse_pos|moveto|mul|mult_big_int|mult_int_big_int|mult_num|nan|narrow|" + + "nat_of_num|nativeint|neg|neg_infinity|new_block|new_channel|new_method|" + + "new_variable|next|nextkey|nice|nice|no_scan_tag|norm|norm2|not|npeek|" + + "nth|nth_dim|num_digits_big_int|num_dims|num_of_big_int|num_of_int|" + + "num_of_nat|num_of_ratio|num_of_string|O|obj|object_tag|ocaml_version|" + + "of_array|of_channel|of_float|of_int|of_int32|of_list|of_nativeint|" + + "of_string|one|openTk|open_box|open_connection|open_graph|open_hbox|" + + "open_hovbox|open_hvbox|open_in|open_in_bin|open_in_gen|open_out|" + + "open_out_bin|open_out_gen|open_process|open_process_full|open_process_in|" + + "open_process_out|open_subwindow|open_tag|open_tbox|open_temp_file|" + + "open_vbox|opendbm|opendir|openfile|or|os_type|out_channel_length|" + + "out_channel_of_descr|output|output_binary_int|output_buffer|output_byte|" + + "output_char|output_string|output_value|over_max_boxes|pack|params|" + + "parent_dir_name|parse|parse_argv|partition|pause|peek|pipe|pixels|" + + "place|plot|plots|point_color|polar|poll|pop|pos_in|pos_out|pow|" + + "power_big_int_positive_big_int|power_big_int_positive_int|" + + "power_int_positive_big_int|power_int_positive_int|power_num|" + + "pp_close_box|pp_close_tag|pp_close_tbox|pp_force_newline|" + + "pp_get_all_formatter_output_functions|pp_get_ellipsis_text|" + + "pp_get_formatter_output_functions|pp_get_formatter_tag_functions|" + + "pp_get_margin|pp_get_mark_tags|pp_get_max_boxes|pp_get_max_indent|" + + "pp_get_print_tags|pp_open_box|pp_open_hbox|pp_open_hovbox|pp_open_hvbox|" + + "pp_open_tag|pp_open_tbox|pp_open_vbox|pp_over_max_boxes|pp_print_as|" + + "pp_print_bool|pp_print_break|pp_print_char|pp_print_cut|pp_print_float|" + + "pp_print_flush|pp_print_if_newline|pp_print_int|pp_print_newline|" + + "pp_print_space|pp_print_string|pp_print_tab|pp_print_tbreak|" + + "pp_set_all_formatter_output_functions|pp_set_ellipsis_text|" + + "pp_set_formatter_out_channel|pp_set_formatter_output_functions|" + + "pp_set_formatter_tag_functions|pp_set_margin|pp_set_mark_tags|" + + "pp_set_max_boxes|pp_set_max_indent|pp_set_print_tags|pp_set_tab|" + + "pp_set_tags|pred|pred_big_int|pred_num|prerr_char|prerr_endline|" + + "prerr_float|prerr_int|prerr_newline|prerr_string|print|print_as|" + + "print_bool|print_break|print_char|print_cut|print_endline|print_float|" + + "print_flush|print_if_newline|print_int|print_newline|print_space|" + + "print_stat|print_string|print_tab|print_tbreak|printf|prohibit|" + + "public_method_label|push|putenv|quo_num|quomod_big_int|quote|raise|" + + "raise_window|ratio_of_num|rcontains_from|read|read_float|read_int|" + + "read_key|read_line|readdir|readdir|readlink|really_input|receive|recv|" + + "recvfrom|red|ref|regexp|regexp_case_fold|regexp_string|" + + "regexp_string_case_fold|register|register_exception|rem|remember_mode|" + + "remove|remove_assoc|remove_assq|rename|replace|replace_first|" + + "replace_matched|repr|reset|reshape|reshape_1|reshape_2|reshape_3|rev|" + + "rev_append|rev_map|rev_map2|rewinddir|rgb|rhs_end|rhs_end_pos|rhs_start|" + + "rhs_start_pos|rindex|rindex_from|rlineto|rmdir|rmoveto|round_num|" + + "run_initializers|run_initializers_opt|scanf|search_backward|" + + "search_forward|seek_in|seek_out|select|self|self_init|send|sendto|set|" + + "set_all_formatter_output_functions|set_approx_printing|" + + "set_binary_mode_in|set_binary_mode_out|set_close_on_exec|" + + "set_close_on_exec|set_color|set_ellipsis_text|" + + "set_error_when_null_denominator|set_field|set_floating_precision|" + + "set_font|set_formatter_out_channel|set_formatter_output_functions|" + + "set_formatter_tag_functions|set_line_width|set_margin|set_mark_tags|" + + "set_max_boxes|set_max_indent|set_method|set_nonblock|set_nonblock|" + + "set_normalize_ratio|set_normalize_ratio_when_printing|set_print_tags|" + + "set_signal|set_state|set_tab|set_tag|set_tags|set_text_size|" + + "set_window_title|setgid|setgid|setitimer|setitimer|setsid|setsid|" + + "setsockopt|setsockopt|setsockopt_float|setsockopt_float|setsockopt_int|" + + "setsockopt_int|setsockopt_optint|setsockopt_optint|setuid|setuid|" + + "shift_left|shift_left|shift_left|shift_right|shift_right|shift_right|" + + "shift_right_logical|shift_right_logical|shift_right_logical|show_buckets|" + + "shutdown|shutdown|shutdown_connection|shutdown_connection|sigabrt|" + + "sigalrm|sigchld|sigcont|sigfpe|sighup|sigill|sigint|sigkill|sign_big_int|" + + "sign_num|signal|signal|sigpending|sigpending|sigpipe|sigprocmask|" + + "sigprocmask|sigprof|sigquit|sigsegv|sigstop|sigsuspend|sigsuspend|" + + "sigterm|sigtstp|sigttin|sigttou|sigusr1|sigusr2|sigvtalrm|sin|singleton|" + + "sinh|size|size|size_x|size_y|sleep|sleep|sleep|slice_left|slice_left|" + + "slice_left_1|slice_left_2|slice_right|slice_right|slice_right_1|" + + "slice_right_2|snd|socket|socket|socket|socketpair|socketpair|sort|sound|" + + "split|split_delim|sprintf|sprintf|sqrt|sqrt|sqrt_big_int|square_big_int|" + + "square_num|sscanf|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|" + + "stable_sort|stat|stat|stat|stat|stat|stats|stats|std_formatter|stdbuf|" + + "stderr|stderr|stderr|stdib|stdin|stdin|stdin|stdout|stdout|stdout|" + + "str_formatter|string|string_after|string_before|string_match|" + + "string_of_big_int|string_of_bool|string_of_float|string_of_format|" + + "string_of_inet_addr|string_of_inet_addr|string_of_int|string_of_num|" + + "string_partial_match|string_tag|sub|sub|sub_big_int|sub_left|sub_num|" + + "sub_right|subset|subset|substitute_first|substring|succ|succ|" + + "succ|succ|succ_big_int|succ_num|symbol_end|symbol_end_pos|symbol_start|" + + "symbol_start_pos|symlink|symlink|sync|synchronize|system|system|system|" + + "tag|take|tan|tanh|tcdrain|tcdrain|tcflow|tcflow|tcflush|tcflush|" + + "tcgetattr|tcgetattr|tcsendbreak|tcsendbreak|tcsetattr|tcsetattr|" + + "temp_file|text_size|time|time|time|timed_read|timed_write|times|times|" + + "tl|tl|tl|to_buffer|to_channel|to_float|to_hex|to_int|to_int32|to_list|" + + "to_list|to_list|to_nativeint|to_string|to_string|to_string|to_string|" + + "to_string|top|top|total_size|transfer|transp|truncate|truncate|truncate|" + + "truncate|truncate|truncate|try_lock|umask|umask|uncapitalize|uncapitalize|" + + "uncapitalize|union|union|unit_big_int|unlink|unlink|unlock|unmarshal|" + + "unsafe_blit|unsafe_fill|unsafe_get|unsafe_get|unsafe_set|unsafe_set|" + + "update|uppercase|uppercase|uppercase|uppercase|usage|utimes|utimes|wait|" + + "wait|wait|wait|wait_next_event|wait_pid|wait_read|wait_signal|" + + "wait_timed_read|wait_timed_write|wait_write|waitpid|white|" + + "widen|window_id|word_size|wrap|wrap_abort|write|yellow|yield|zero|zero_big_int|" + + + "Arg|Arith_status|Array|Array1|Array2|Array3|ArrayLabels|Big_int|Bigarray|" + + "Buffer|Callback|CamlinternalOO|Char|Complex|Condition|Dbm|Digest|Dynlink|" + + "Event|Filename|Format|Gc|Genarray|Genlex|Graphics|GraphicsX11|Hashtbl|" + + "Int32|Int64|LargeFile|Lazy|Lexing|List|ListLabels|Make|Map|Marshal|" + + "MoreLabels|Mutex|Nativeint|Num|Obj|Oo|Parsing|Pervasives|Printexc|" + + "Printf|Queue|Random|Scanf|Scanning|Set|Sort|Stack|State|StdLabels|Str|" + + "Stream|String|StringLabels|Sys|Thread|ThreadUnix|Tk|Unix|UnixLabels|Weak" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": builtinConstants, + "support.function": builtinFunctions + }, "identifier"); + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : '\\(\\*.*?\\*\\)\\s*?$' + }, + { + token : "comment", + regex : '\\(\\*.*', + next : "comment" + }, + { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, + { + token : "string", // single char + regex : "'.'" + }, + { + token : "string", // " string + regex : '"', + next : "qstring" + }, + { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, + { + token : "constant.numeric", // float + regex : floatNumber + }, + { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, + { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, + { + token : "keyword.operator", + regex : "\\+\\.|\\-\\.|\\*\\.|\\/\\.|#|;;|\\+|\\-|\\*|\\*\\*\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|<-|=" + }, + { + token : "paren.lparen", + regex : "[[({]" + }, + { + token : "paren.rparen", + regex : "[\\])}]" + }, + { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\)", + next : "start" + }, + { + defaultToken : "comment" + } + ], + + "qstring" : [ + { + token : "string", + regex : '"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; +}; + +oop.inherits(OcamlHighlightRules, TextHighlightRules); + +exports.OcamlHighlightRules = OcamlHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/ocaml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ocaml_highlight_rules","ace/mode/matching_brace_outdent","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var OcamlHighlightRules = require("./ocaml_highlight_rules").OcamlHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = OcamlHighlightRules; + this.$behaviour = this.$defaultBehaviour; + + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, TextMode); + +var indenter = /(?:[({[=:]|[-=]>|\b(?:else|try|with))\s*$/; + +(function() { + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var i, line; + var outdent = true; + var re = /^\s*\(\*(.*)\*\)/; + + for (i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + var range = new Range(0, 0, 0, 0); + for (i=startRow; i<= endRow; i++) { + line = doc.getLine(i); + range.start.row = i; + range.end.row = i; + range.end.column = line.length; + + doc.replace(range, outdent ? line.match(re)[1] : "(*" + line + "*)"); + } + }; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + + if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') && + state === 'start' && indenter.test(line)) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/ocaml"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-pascal.js b/src/libs/ace/mode-pascal.js new file mode 100755 index 0000000..9ccd1ed --- /dev/null +++ b/src/libs/ace/mode-pascal.js @@ -0,0 +1,198 @@ +ace.define("ace/mode/pascal_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PascalHighlightRules = function() { + + this.$rules = { start: + [ { caseInsensitive: true, + token: 'keyword.control.pascal', + regex: '\\b(?:(absolute|abstract|all|and|and_then|array|as|asm|attribute|begin|bindable|case|class|const|constructor|destructor|div|do|do|else|end|except|export|exports|external|far|file|finalization|finally|for|forward|goto|if|implementation|import|in|inherited|initialization|interface|interrupt|is|label|library|mod|module|name|near|nil|not|object|of|only|operator|or|or_else|otherwise|packed|pow|private|program|property|protected|public|published|qualified|record|repeat|resident|restricted|segment|set|shl|shr|then|to|try|type|unit|until|uses|value|var|view|virtual|while|with|xor))\\b' }, + { caseInsensitive: true, + token: + [ 'variable.pascal', "text", + 'storage.type.prototype.pascal', + 'entity.name.function.prototype.pascal' ], + regex: '\\b(function|procedure)(\\s+)(\\w+)(\\.\\w+)?(?=(?:\\(.*?\\))?;\\s*(?:attribute|forward|external))' }, + { caseInsensitive: true, + token: + [ 'variable.pascal', "text", + 'storage.type.function.pascal', + 'entity.name.function.pascal' ], + regex: '\\b(function|procedure)(\\s+)(\\w+)(\\.\\w+)?' }, + { token: 'constant.numeric.pascal', + regex: '\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b' }, + { token: 'punctuation.definition.comment.pascal', + regex: '--.*$', + push_: + [ { token: 'comment.line.double-dash.pascal.one', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-dash.pascal.one' } ] }, + { token: 'punctuation.definition.comment.pascal', + regex: '//.*$', + push_: + [ { token: 'comment.line.double-slash.pascal.two', + regex: '$', + next: 'pop' }, + { defaultToken: 'comment.line.double-slash.pascal.two' } ] }, + { token: 'punctuation.definition.comment.pascal', + regex: '\\(\\*', + push: + [ { token: 'punctuation.definition.comment.pascal', + regex: '\\*\\)', + next: 'pop' }, + { defaultToken: 'comment.block.pascal.one' } ] }, + { token: 'punctuation.definition.comment.pascal', + regex: '\\{', + push: + [ { token: 'punctuation.definition.comment.pascal', + regex: '\\}', + next: 'pop' }, + { defaultToken: 'comment.block.pascal.two' } ] }, + { token: 'punctuation.definition.string.begin.pascal', + regex: '"', + push: + [ { token: 'constant.character.escape.pascal', regex: '\\\\.' }, + { token: 'punctuation.definition.string.end.pascal', + regex: '"', + next: 'pop' }, + { defaultToken: 'string.quoted.double.pascal' } ] + }, + { token: 'punctuation.definition.string.begin.pascal', + regex: '\'', + push: + [ { token: 'constant.character.escape.apostrophe.pascal', + regex: '\'\'' }, + { token: 'punctuation.definition.string.end.pascal', + regex: '\'', + next: 'pop' }, + { defaultToken: 'string.quoted.single.pascal' } ] }, + { token: 'keyword.operator', + regex: '[+\\-;,/*%]|:=|=' } ] } + + this.normalizeRules(); +}; + +oop.inherits(PascalHighlightRules, TextHighlightRules); + +exports.PascalHighlightRules = PascalHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/pascal",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/pascal_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PascalHighlightRules = require("./pascal_highlight_rules").PascalHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = PascalHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ["--", "//"]; + this.blockComment = [ + {start: "(*", end: "*)"}, + {start: "{", end: "}"} + ]; + + this.$id = "ace/mode/pascal"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-perl.js b/src/libs/ace/mode-perl.js new file mode 100755 index 0000000..768c538 --- /dev/null +++ b/src/libs/ace/mode-perl.js @@ -0,0 +1,373 @@ +ace.define("ace/mode/perl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PerlHighlightRules = function() { + + var keywords = ( + "base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|" + + "no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars" + ); + + var buildinConstants = ("ARGV|ENV|INC|SIG"); + + var builtinFunctions = ( + "getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|" + + "gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|" + + "getpeername|setpriority|getprotoent|setprotoent|getpriority|" + + "endprotoent|getservent|setservent|endservent|sethostent|socketpair|" + + "getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|" + + "localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|" + + "closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|" + + "shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|" + + "dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|" + + "setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|" + + "lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|" + + "waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|" + + "chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|" + + "unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|" + + "length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|" + + "undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|" + + "sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|" + + "BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|" + + "join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|" + + "keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|" + + "eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|" + + "map|die|uc|lc|do" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": builtinFunctions + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment.doc", + regex : "^=(?:begin|item)\\b", + next : "block_comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0x[0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "%#|\\$#|\\.\\.\\.|\\|\\|=|>>=|<<=|<=>|&&=|=>|!~|\\^=|&=|\\|=|\\.=|x=|%=|\\/=|\\*=|\\-=|\\+=|=~|\\*\\*|\\-\\-|\\.\\.|\\|\\||&&|\\+\\+|\\->|!=|==|>=|<=|>>|<<|,|=|\\?\\:|\\^|\\||x|%|\\/|\\*|<|&|\\\\|~|!|>|\\.|\\-|\\+|\\-C|\\-b|\\-S|\\-u|\\-t|\\-p|\\-l|\\-d|\\-f|\\-g|\\-s|\\-z|\\-k|\\-e|\\-O|\\-T|\\-B|\\-M|\\-A|\\-X|\\-W|\\-c|\\-R|\\-o|\\-x|\\-w|\\-r|\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)" + }, { + token : "comment", + regex : "#.*$" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "block_comment": [ + { + token: "comment.doc", + regex: "^=cut\\b", + next: "start" + }, + { + defaultToken: "comment.doc" + } + ] + }; +}; + +oop.inherits(PerlHighlightRules, TextHighlightRules); + +exports.PerlHighlightRules = PerlHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/perl",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/perl_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PerlHighlightRules = require("./perl_highlight_rules").PerlHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = PerlHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new CStyleFoldMode({start: "^=(begin|item)\\b", end: "^=(cut)\\b"}); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + this.blockComment = [ + {start: "=begin", end: "=cut", lineStartOnly: true}, + {start: "=item", end: "=cut", lineStartOnly: true} + ]; + + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/perl"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-pgsql.js b/src/libs/ace/mode-pgsql.js new file mode 100755 index 0000000..189f17a --- /dev/null +++ b/src/libs/ace/mode-pgsql.js @@ -0,0 +1,1500 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/perl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PerlHighlightRules = function() { + + var keywords = ( + "base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|" + + "no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars" + ); + + var buildinConstants = ("ARGV|ENV|INC|SIG"); + + var builtinFunctions = ( + "getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|" + + "gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|" + + "getpeername|setpriority|getprotoent|setprotoent|getpriority|" + + "endprotoent|getservent|setservent|endservent|sethostent|socketpair|" + + "getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|" + + "localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|" + + "closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|" + + "shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|" + + "dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|" + + "setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|" + + "lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|" + + "waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|" + + "chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|" + + "unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|" + + "length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|" + + "undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|" + + "sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|" + + "BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|" + + "join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|" + + "keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|" + + "eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|" + + "map|die|uc|lc|do" + ); + + var keywordMapper = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": builtinFunctions + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment.doc", + regex : "^=(?:begin|item)\\b", + next : "block_comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0x[0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "%#|\\$#|\\.\\.\\.|\\|\\|=|>>=|<<=|<=>|&&=|=>|!~|\\^=|&=|\\|=|\\.=|x=|%=|\\/=|\\*=|\\-=|\\+=|=~|\\*\\*|\\-\\-|\\.\\.|\\|\\||&&|\\+\\+|\\->|!=|==|>=|<=|>>|<<|,|=|\\?\\:|\\^|\\||x|%|\\/|\\*|<|&|\\\\|~|!|>|\\.|\\-|\\+|\\-C|\\-b|\\-S|\\-u|\\-t|\\-p|\\-l|\\-d|\\-f|\\-g|\\-s|\\-z|\\-k|\\-e|\\-O|\\-T|\\-B|\\-M|\\-A|\\-X|\\-W|\\-c|\\-R|\\-o|\\-x|\\-w|\\-r|\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)" + }, { + token : "comment", + regex : "#.*$" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "block_comment": [ + { + token: "comment.doc", + regex: "^=cut\\b", + next: "start" + }, + { + defaultToken: "comment.doc" + } + ] + }; +}; + +oop.inherits(PerlHighlightRules, TextHighlightRules); + +exports.PerlHighlightRules = PerlHighlightRules; +}); + +ace.define("ace/mode/python_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PythonHighlightRules = function() { + + var keywords = ( + "and|as|assert|break|class|continue|def|del|elif|else|except|exec|" + + "finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|" + + "raise|return|try|while|with|yield" + ); + + var builtinConstants = ( + "True|False|None|NotImplemented|Ellipsis|__debug__" + ); + + var builtinFunctions = ( + "abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|" + + "eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|" + + "binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|" + + "float|list|raw_input|unichr|callable|format|locals|reduce|unicode|" + + "chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|" + + "cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|" + + "__import__|complex|hash|min|set|apply|delattr|help|next|setattr|" + + "buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern" + ); + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "keyword": keywords + }, "identifier"); + + var strPre = "(?:r|u|ur|R|U|UR|Ur|uR)?"; + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})"; + + this.$rules = { + "start" : [ { + token : "comment", + regex : "#.*$" + }, { + token : "string", // multi line """ string start + regex : strPre + '"{3}', + next : "qqstring3" + }, { + token : "string", // " string + regex : strPre + '"(?=.)', + next : "qqstring" + }, { + token : "string", // multi line ''' string start + regex : strPre + "'{3}", + next : "qstring3" + }, { + token : "string", // ' string + regex : strPre + "'(?=.)", + next : "qstring" + }, { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // long integer + regex : integer + "[lL]\\b" + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+" + } ], + "qqstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line """ string end + regex : '"{3}', + next : "start" + }, { + defaultToken : "string" + } ], + "qstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line ''' string end + regex : "'{3}", + next : "start" + }, { + defaultToken : "string" + } ], + "qqstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken: "string" + }], + "qstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "start" + }, { + defaultToken: "string" + }] + }; +}; + +oop.inherits(PythonHighlightRules, TextHighlightRules); + +exports.PythonHighlightRules = PythonHighlightRules; +}); + +ace.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var JsonHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "variable", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)' + }, { + token : "string", // single line + regex : '"', + next : "string" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : "text", // single quoted strings are not allowed + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "comment", // comments are not allowed, but who cares? + regex : "\\/\\/.*$" + }, { + token : "comment.start", // comments are not allowed, but who cares? + regex : "\\/\\*", + next : "comment" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "string" : [ + { + token : "constant.language.escape", + regex : /\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/ + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken : "string" + } + ], + "comment" : [ + { + token : "comment.end", // comments are not allowed, but who cares? + regex : "\\*\\/", + next : "start" + }, { + defaultToken: "comment" + } + ] + }; + +}; + +oop.inherits(JsonHighlightRules, TextHighlightRules); + +exports.JsonHighlightRules = JsonHighlightRules; +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/pgsql_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules","ace/mode/perl_highlight_rules","ace/mode/python_highlight_rules","ace/mode/json_highlight_rules","ace/mode/javascript_highlight_rules"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var PerlHighlightRules = require("./perl_highlight_rules").PerlHighlightRules; +var PythonHighlightRules = require("./python_highlight_rules").PythonHighlightRules; +var JsonHighlightRules = require("./json_highlight_rules").JsonHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +var PgsqlHighlightRules = function() { + var keywords = ( + "abort|absolute|abstime|access|aclitem|action|add|admin|after|aggregate|all|also|alter|always|" + + "analyse|analyze|and|any|anyarray|anyelement|anyenum|anynonarray|anyrange|array|as|asc|" + + "assertion|assignment|asymmetric|at|attribute|authorization|backward|before|begin|between|" + + "bigint|binary|bit|bool|boolean|both|box|bpchar|by|bytea|cache|called|cascade|cascaded|case|cast|" + + "catalog|chain|char|character|characteristics|check|checkpoint|cid|cidr|circle|class|close|" + + "cluster|coalesce|collate|collation|column|comment|comments|commit|committed|concurrently|" + + "configuration|connection|constraint|constraints|content|continue|conversion|copy|cost|" + + "create|cross|cstring|csv|current|current_catalog|current_date|current_role|" + + "current_schema|current_time|current_timestamp|current_user|cursor|cycle|data|database|" + + "date|daterange|day|deallocate|dec|decimal|declare|default|defaults|deferrable|deferred|" + + "definer|delete|delimiter|delimiters|desc|dictionary|disable|discard|distinct|do|document|" + + "domain|double|drop|each|else|enable|encoding|encrypted|end|enum|escape|event|event_trigger|" + + "except|exclude|excluding|exclusive|execute|exists|explain|extension|external|extract|false|" + + "family|fdw_handler|fetch|first|float|float4|float8|following|for|force|foreign|forward|" + + "freeze|from|full|function|functions|global|grant|granted|greatest|group|gtsvector|handler|" + + "having|header|hold|hour|identity|if|ilike|immediate|immutable|implicit|in|including|" + + "increment|index|indexes|inet|inherit|inherits|initially|inline|inner|inout|input|" + + "insensitive|insert|instead|int|int2|int2vector|int4|int4range|int8|int8range|integer|" + + "internal|intersect|interval|into|invoker|is|isnull|isolation|join|json|key|label|language|" + + "language_handler|large|last|lateral|lc_collate|lc_ctype|leading|leakproof|least|left|level|" + + "like|limit|line|listen|load|local|localtime|localtimestamp|location|lock|lseg|macaddr|" + + "mapping|match|materialized|maxvalue|minute|minvalue|mode|money|month|move|name|names|" + + "national|natural|nchar|next|no|none|not|nothing|notify|notnull|nowait|null|nullif|nulls|" + + "numeric|numrange|object|of|off|offset|oid|oids|oidvector|on|only|opaque|operator|option|" + + "options|or|order|out|outer|over|overlaps|overlay|owned|owner|parser|partial|partition|passing|" + + "password|path|pg_attribute|pg_auth_members|pg_authid|pg_class|pg_database|pg_node_tree|" + + "pg_proc|pg_type|placing|plans|point|polygon|position|preceding|precision|prepare|prepared|" + + "preserve|primary|prior|privileges|procedural|procedure|program|quote|range|read|real|" + + "reassign|recheck|record|recursive|ref|refcursor|references|refresh|regclass|regconfig|" + + "regdictionary|regoper|regoperator|regproc|regprocedure|regtype|reindex|relative|release|" + + "reltime|rename|repeatable|replace|replica|reset|restart|restrict|returning|returns|revoke|" + + "right|role|rollback|row|rows|rule|savepoint|schema|scroll|search|second|security|select|" + + "sequence|sequences|serializable|server|session|session_user|set|setof|share|show|similar|" + + "simple|smallint|smgr|snapshot|some|stable|standalone|start|statement|statistics|stdin|" + + "stdout|storage|strict|strip|substring|symmetric|sysid|system|table|tables|tablespace|temp|" + + "template|temporary|text|then|tid|time|timestamp|timestamptz|timetz|tinterval|to|trailing|" + + "transaction|treat|trigger|trim|true|truncate|trusted|tsquery|tsrange|tstzrange|tsvector|" + + "txid_snapshot|type|types|unbounded|uncommitted|unencrypted|union|unique|unknown|unlisten|" + + "unlogged|until|update|user|using|uuid|vacuum|valid|validate|validator|value|values|varbit|" + + "varchar|variadic|varying|verbose|version|view|void|volatile|when|where|whitespace|window|" + + "with|without|work|wrapper|write|xid|xml|xmlattributes|xmlconcat|xmlelement|xmlexists|" + + "xmlforest|xmlparse|xmlpi|xmlroot|xmlserialize|year|yes|zone" + ); + + + var builtinFunctions = ( + "RI_FKey_cascade_del|RI_FKey_cascade_upd|RI_FKey_check_ins|RI_FKey_check_upd|" + + "RI_FKey_noaction_del|RI_FKey_noaction_upd|RI_FKey_restrict_del|RI_FKey_restrict_upd|" + + "RI_FKey_setdefault_del|RI_FKey_setdefault_upd|RI_FKey_setnull_del|" + + "RI_FKey_setnull_upd|abbrev|abs|abstime|abstimeeq|abstimege|abstimegt|abstimein|abstimele|" + + "abstimelt|abstimene|abstimeout|abstimerecv|abstimesend|aclcontains|acldefault|" + + "aclexplode|aclinsert|aclitemeq|aclitemin|aclitemout|aclremove|acos|age|any_in|any_out|" + + "anyarray_in|anyarray_out|anyarray_recv|anyarray_send|anyelement_in|anyelement_out|" + + "anyenum_in|anyenum_out|anynonarray_in|anynonarray_out|anyrange_in|anyrange_out|" + + "anytextcat|area|areajoinsel|areasel|array_agg|array_agg_finalfn|array_agg_transfn|" + + "array_append|array_cat|array_dims|array_eq|array_fill|array_ge|array_gt|array_in|" + + "array_larger|array_le|array_length|array_lower|array_lt|array_ndims|array_ne|array_out|" + + "array_prepend|array_recv|array_remove|array_replace|array_send|array_smaller|" + + "array_to_json|array_to_string|array_typanalyze|array_upper|arraycontained|" + + "arraycontains|arraycontjoinsel|arraycontsel|arrayoverlap|ascii|ascii_to_mic|" + + "ascii_to_utf8|asin|atan|atan2|avg|big5_to_euc_tw|big5_to_mic|big5_to_utf8|bit_and|bit_in|" + + "bit_length|bit_or|bit_out|bit_recv|bit_send|bitand|bitcat|bitcmp|biteq|bitge|bitgt|bitle|" + + "bitlt|bitne|bitnot|bitor|bitshiftleft|bitshiftright|bittypmodin|bittypmodout|bitxor|bool|" + + "bool_and|bool_or|booland_statefunc|booleq|boolge|boolgt|boolin|boolle|boollt|boolne|" + + "boolor_statefunc|boolout|boolrecv|boolsend|box|box_above|box_above_eq|box_add|box_below|" + + "box_below_eq|box_center|box_contain|box_contain_pt|box_contained|box_distance|box_div|" + + "box_eq|box_ge|box_gt|box_in|box_intersect|box_le|box_left|box_lt|box_mul|box_out|" + + "box_overabove|box_overbelow|box_overlap|box_overleft|box_overright|box_recv|box_right|" + + "box_same|box_send|box_sub|bpchar_larger|bpchar_pattern_ge|bpchar_pattern_gt|" + + "bpchar_pattern_le|bpchar_pattern_lt|bpchar_smaller|bpcharcmp|bpchareq|bpcharge|" + + "bpchargt|bpchariclike|bpcharicnlike|bpcharicregexeq|bpcharicregexne|bpcharin|bpcharle|" + + "bpcharlike|bpcharlt|bpcharne|bpcharnlike|bpcharout|bpcharrecv|bpcharregexeq|" + + "bpcharregexne|bpcharsend|bpchartypmodin|bpchartypmodout|broadcast|btabstimecmp|" + + "btarraycmp|btbeginscan|btboolcmp|btbpchar_pattern_cmp|btbuild|btbuildempty|" + + "btbulkdelete|btcanreturn|btcharcmp|btcostestimate|btendscan|btfloat48cmp|btfloat4cmp|" + + "btfloat4sortsupport|btfloat84cmp|btfloat8cmp|btfloat8sortsupport|btgetbitmap|" + + "btgettuple|btinsert|btint24cmp|btint28cmp|btint2cmp|btint2sortsupport|btint42cmp|" + + "btint48cmp|btint4cmp|btint4sortsupport|btint82cmp|btint84cmp|btint8cmp|" + + "btint8sortsupport|btmarkpos|btnamecmp|btnamesortsupport|btoidcmp|btoidsortsupport|" + + "btoidvectorcmp|btoptions|btrecordcmp|btreltimecmp|btrescan|btrestrpos|btrim|" + + "bttext_pattern_cmp|bttextcmp|bttidcmp|bttintervalcmp|btvacuumcleanup|" + + "bytea_string_agg_finalfn|bytea_string_agg_transfn|byteacat|byteacmp|byteaeq|byteage|" + + "byteagt|byteain|byteale|bytealike|bytealt|byteane|byteanlike|byteaout|bytearecv|byteasend|" + + "cash_cmp|cash_div_cash|cash_div_flt4|cash_div_flt8|cash_div_int2|cash_div_int4|cash_eq|" + + "cash_ge|cash_gt|cash_in|cash_le|cash_lt|cash_mi|cash_mul_flt4|cash_mul_flt8|" + + "cash_mul_int2|cash_mul_int4|cash_ne|cash_out|cash_pl|cash_recv|cash_send|cash_words|" + + "cashlarger|cashsmaller|cbrt|ceil|ceiling|center|char|char_length|character_length|chareq|" + + "charge|chargt|charin|charle|charlt|charne|charout|charrecv|charsend|chr|cideq|cidin|cidout|" + + "cidr|cidr_in|cidr_out|cidr_recv|cidr_send|cidrecv|cidsend|circle|circle_above|" + + "circle_add_pt|circle_below|circle_center|circle_contain|circle_contain_pt|" + + "circle_contained|circle_distance|circle_div_pt|circle_eq|circle_ge|circle_gt|circle_in|" + + "circle_le|circle_left|circle_lt|circle_mul_pt|circle_ne|circle_out|circle_overabove|" + + "circle_overbelow|circle_overlap|circle_overleft|circle_overright|circle_recv|" + + "circle_right|circle_same|circle_send|circle_sub_pt|clock_timestamp|close_lb|close_ls|" + + "close_lseg|close_pb|close_pl|close_ps|close_sb|close_sl|col_description|concat|concat_ws|" + + "contjoinsel|contsel|convert|convert_from|convert_to|corr|cos|cot|count|covar_pop|" + + "covar_samp|cstring_in|cstring_out|cstring_recv|cstring_send|cume_dist|current_database|" + + "current_query|current_schema|current_schemas|current_setting|current_user|currtid|" + + "currtid2|currval|cursor_to_xml|cursor_to_xmlschema|database_to_xml|" + + "database_to_xml_and_xmlschema|database_to_xmlschema|date|date_cmp|date_cmp_timestamp|" + + "date_cmp_timestamptz|date_eq|date_eq_timestamp|date_eq_timestamptz|date_ge|" + + "date_ge_timestamp|date_ge_timestamptz|date_gt|date_gt_timestamp|date_gt_timestamptz|" + + "date_in|date_larger|date_le|date_le_timestamp|date_le_timestamptz|date_lt|" + + "date_lt_timestamp|date_lt_timestamptz|date_mi|date_mi_interval|date_mii|date_ne|" + + "date_ne_timestamp|date_ne_timestamptz|date_out|date_part|date_pl_interval|date_pli|" + + "date_recv|date_send|date_smaller|date_sortsupport|date_trunc|daterange|" + + "daterange_canonical|daterange_subdiff|datetime_pl|datetimetz_pl|dcbrt|decode|degrees|" + + "dense_rank|dexp|diagonal|diameter|dispell_init|dispell_lexize|dist_cpoly|dist_lb|dist_pb|" + + "dist_pc|dist_pl|dist_ppath|dist_ps|dist_sb|dist_sl|div|dlog1|dlog10|domain_in|domain_recv|" + + "dpow|dround|dsimple_init|dsimple_lexize|dsnowball_init|dsnowball_lexize|dsqrt|" + + "dsynonym_init|dsynonym_lexize|dtrunc|elem_contained_by_range|encode|enum_cmp|enum_eq|" + + "enum_first|enum_ge|enum_gt|enum_in|enum_larger|enum_last|enum_le|enum_lt|enum_ne|enum_out|" + + "enum_range|enum_recv|enum_send|enum_smaller|eqjoinsel|eqsel|euc_cn_to_mic|" + + "euc_cn_to_utf8|euc_jis_2004_to_shift_jis_2004|euc_jis_2004_to_utf8|euc_jp_to_mic|" + + "euc_jp_to_sjis|euc_jp_to_utf8|euc_kr_to_mic|euc_kr_to_utf8|euc_tw_to_big5|" + + "euc_tw_to_mic|euc_tw_to_utf8|event_trigger_in|event_trigger_out|every|exp|factorial|" + + "family|fdw_handler_in|fdw_handler_out|first_value|float4|float48div|float48eq|float48ge|" + + "float48gt|float48le|float48lt|float48mi|float48mul|float48ne|float48pl|float4_accum|" + + "float4abs|float4div|float4eq|float4ge|float4gt|float4in|float4larger|float4le|float4lt|" + + "float4mi|float4mul|float4ne|float4out|float4pl|float4recv|float4send|float4smaller|" + + "float4um|float4up|float8|float84div|float84eq|float84ge|float84gt|float84le|float84lt|" + + "float84mi|float84mul|float84ne|float84pl|float8_accum|float8_avg|float8_corr|" + + "float8_covar_pop|float8_covar_samp|float8_regr_accum|float8_regr_avgx|" + + "float8_regr_avgy|float8_regr_intercept|float8_regr_r2|float8_regr_slope|" + + "float8_regr_sxx|float8_regr_sxy|float8_regr_syy|float8_stddev_pop|float8_stddev_samp|" + + "float8_var_pop|float8_var_samp|float8abs|float8div|float8eq|float8ge|float8gt|float8in|" + + "float8larger|float8le|float8lt|float8mi|float8mul|float8ne|float8out|float8pl|float8recv|" + + "float8send|float8smaller|float8um|float8up|floor|flt4_mul_cash|flt8_mul_cash|" + + "fmgr_c_validator|fmgr_internal_validator|fmgr_sql_validator|format|format_type|" + + "gb18030_to_utf8|gbk_to_utf8|generate_series|generate_subscripts|get_bit|get_byte|" + + "get_current_ts_config|getdatabaseencoding|getpgusername|gin_cmp_prefix|" + + "gin_cmp_tslexeme|gin_extract_tsquery|gin_extract_tsvector|gin_tsquery_consistent|" + + "ginarrayconsistent|ginarrayextract|ginbeginscan|ginbuild|ginbuildempty|ginbulkdelete|" + + "gincostestimate|ginendscan|gingetbitmap|gininsert|ginmarkpos|ginoptions|" + + "ginqueryarrayextract|ginrescan|ginrestrpos|ginvacuumcleanup|gist_box_compress|" + + "gist_box_consistent|gist_box_decompress|gist_box_penalty|gist_box_picksplit|" + + "gist_box_same|gist_box_union|gist_circle_compress|gist_circle_consistent|" + + "gist_point_compress|gist_point_consistent|gist_point_distance|gist_poly_compress|" + + "gist_poly_consistent|gistbeginscan|gistbuild|gistbuildempty|gistbulkdelete|" + + "gistcostestimate|gistendscan|gistgetbitmap|gistgettuple|gistinsert|gistmarkpos|" + + "gistoptions|gistrescan|gistrestrpos|gistvacuumcleanup|gtsquery_compress|" + + "gtsquery_consistent|gtsquery_decompress|gtsquery_penalty|gtsquery_picksplit|" + + "gtsquery_same|gtsquery_union|gtsvector_compress|gtsvector_consistent|" + + "gtsvector_decompress|gtsvector_penalty|gtsvector_picksplit|gtsvector_same|" + + "gtsvector_union|gtsvectorin|gtsvectorout|has_any_column_privilege|" + + "has_column_privilege|has_database_privilege|has_foreign_data_wrapper_privilege|" + + "has_function_privilege|has_language_privilege|has_schema_privilege|" + + "has_sequence_privilege|has_server_privilege|has_table_privilege|" + + "has_tablespace_privilege|has_type_privilege|hash_aclitem|hash_array|hash_numeric|" + + "hash_range|hashbeginscan|hashbpchar|hashbuild|hashbuildempty|hashbulkdelete|hashchar|" + + "hashcostestimate|hashendscan|hashenum|hashfloat4|hashfloat8|hashgetbitmap|hashgettuple|" + + "hashinet|hashinsert|hashint2|hashint2vector|hashint4|hashint8|hashmacaddr|hashmarkpos|" + + "hashname|hashoid|hashoidvector|hashoptions|hashrescan|hashrestrpos|hashtext|" + + "hashvacuumcleanup|hashvarlena|height|host|hostmask|iclikejoinsel|iclikesel|" + + "icnlikejoinsel|icnlikesel|icregexeqjoinsel|icregexeqsel|icregexnejoinsel|icregexnesel|" + + "inet_client_addr|inet_client_port|inet_in|inet_out|inet_recv|inet_send|" + + "inet_server_addr|inet_server_port|inetand|inetmi|inetmi_int8|inetnot|inetor|inetpl|" + + "initcap|int2|int24div|int24eq|int24ge|int24gt|int24le|int24lt|int24mi|int24mul|int24ne|" + + "int24pl|int28div|int28eq|int28ge|int28gt|int28le|int28lt|int28mi|int28mul|int28ne|int28pl|" + + "int2_accum|int2_avg_accum|int2_mul_cash|int2_sum|int2abs|int2and|int2div|int2eq|int2ge|" + + "int2gt|int2in|int2larger|int2le|int2lt|int2mi|int2mod|int2mul|int2ne|int2not|int2or|int2out|" + + "int2pl|int2recv|int2send|int2shl|int2shr|int2smaller|int2um|int2up|int2vectoreq|" + + "int2vectorin|int2vectorout|int2vectorrecv|int2vectorsend|int2xor|int4|int42div|int42eq|" + + "int42ge|int42gt|int42le|int42lt|int42mi|int42mul|int42ne|int42pl|int48div|int48eq|int48ge|" + + "int48gt|int48le|int48lt|int48mi|int48mul|int48ne|int48pl|int4_accum|int4_avg_accum|" + + "int4_mul_cash|int4_sum|int4abs|int4and|int4div|int4eq|int4ge|int4gt|int4in|int4inc|" + + "int4larger|int4le|int4lt|int4mi|int4mod|int4mul|int4ne|int4not|int4or|int4out|int4pl|" + + "int4range|int4range_canonical|int4range_subdiff|int4recv|int4send|int4shl|int4shr|" + + "int4smaller|int4um|int4up|int4xor|int8|int82div|int82eq|int82ge|int82gt|int82le|int82lt|" + + "int82mi|int82mul|int82ne|int82pl|int84div|int84eq|int84ge|int84gt|int84le|int84lt|int84mi|" + + "int84mul|int84ne|int84pl|int8_accum|int8_avg|int8_avg_accum|int8_sum|int8abs|int8and|" + + "int8div|int8eq|int8ge|int8gt|int8in|int8inc|int8inc_any|int8inc_float8_float8|int8larger|" + + "int8le|int8lt|int8mi|int8mod|int8mul|int8ne|int8not|int8or|int8out|int8pl|int8pl_inet|" + + "int8range|int8range_canonical|int8range_subdiff|int8recv|int8send|int8shl|int8shr|" + + "int8smaller|int8um|int8up|int8xor|integer_pl_date|inter_lb|inter_sb|inter_sl|internal_in|" + + "internal_out|interval_accum|interval_avg|interval_cmp|interval_div|interval_eq|" + + "interval_ge|interval_gt|interval_hash|interval_in|interval_larger|interval_le|" + + "interval_lt|interval_mi|interval_mul|interval_ne|interval_out|interval_pl|" + + "interval_pl_date|interval_pl_time|interval_pl_timestamp|interval_pl_timestamptz|" + + "interval_pl_timetz|interval_recv|interval_send|interval_smaller|interval_transform|" + + "interval_um|intervaltypmodin|intervaltypmodout|intinterval|isclosed|isempty|isfinite|" + + "ishorizontal|iso8859_1_to_utf8|iso8859_to_utf8|iso_to_koi8r|iso_to_mic|iso_to_win1251|" + + "iso_to_win866|isopen|isparallel|isperp|isvertical|johab_to_utf8|json_agg|" + + "json_agg_finalfn|json_agg_transfn|json_array_element|json_array_element_text|" + + "json_array_elements|json_array_length|json_each|json_each_text|json_extract_path|" + + "json_extract_path_op|json_extract_path_text|json_extract_path_text_op|json_in|" + + "json_object_field|json_object_field_text|json_object_keys|json_out|" + + "json_populate_record|json_populate_recordset|json_recv|json_send|justify_days|" + + "justify_hours|justify_interval|koi8r_to_iso|koi8r_to_mic|koi8r_to_utf8|" + + "koi8r_to_win1251|koi8r_to_win866|koi8u_to_utf8|lag|language_handler_in|" + + "language_handler_out|last_value|lastval|latin1_to_mic|latin2_to_mic|latin2_to_win1250|" + + "latin3_to_mic|latin4_to_mic|lead|left|length|like|like_escape|likejoinsel|likesel|line|" + + "line_distance|line_eq|line_horizontal|line_in|line_interpt|line_intersect|line_out|" + + "line_parallel|line_perp|line_recv|line_send|line_vertical|ln|lo_close|lo_creat|lo_create|" + + "lo_export|lo_import|lo_lseek|lo_lseek64|lo_open|lo_tell|lo_tell64|lo_truncate|" + + "lo_truncate64|lo_unlink|log|loread|lower|lower_inc|lower_inf|lowrite|lpad|lseg|lseg_center|" + + "lseg_distance|lseg_eq|lseg_ge|lseg_gt|lseg_horizontal|lseg_in|lseg_interpt|" + + "lseg_intersect|lseg_le|lseg_length|lseg_lt|lseg_ne|lseg_out|lseg_parallel|lseg_perp|" + + "lseg_recv|lseg_send|lseg_vertical|ltrim|macaddr_and|macaddr_cmp|macaddr_eq|macaddr_ge|" + + "macaddr_gt|macaddr_in|macaddr_le|macaddr_lt|macaddr_ne|macaddr_not|macaddr_or|" + + "macaddr_out|macaddr_recv|macaddr_send|makeaclitem|masklen|max|md5|mic_to_ascii|" + + "mic_to_big5|mic_to_euc_cn|mic_to_euc_jp|mic_to_euc_kr|mic_to_euc_tw|mic_to_iso|" + + "mic_to_koi8r|mic_to_latin1|mic_to_latin2|mic_to_latin3|mic_to_latin4|mic_to_sjis|" + + "mic_to_win1250|mic_to_win1251|mic_to_win866|min|mktinterval|mod|money|mul_d_interval|" + + "name|nameeq|namege|namegt|nameiclike|nameicnlike|nameicregexeq|nameicregexne|namein|" + + "namele|namelike|namelt|namene|namenlike|nameout|namerecv|nameregexeq|nameregexne|namesend|" + + "neqjoinsel|neqsel|netmask|network|network_cmp|network_eq|network_ge|network_gt|" + + "network_le|network_lt|network_ne|network_sub|network_subeq|network_sup|network_supeq|" + + "nextval|nlikejoinsel|nlikesel|notlike|now|npoints|nth_value|ntile|numeric_abs|" + + "numeric_accum|numeric_add|numeric_avg|numeric_avg_accum|numeric_cmp|numeric_div|" + + "numeric_div_trunc|numeric_eq|numeric_exp|numeric_fac|numeric_ge|numeric_gt|numeric_in|" + + "numeric_inc|numeric_larger|numeric_le|numeric_ln|numeric_log|numeric_lt|numeric_mod|" + + "numeric_mul|numeric_ne|numeric_out|numeric_power|numeric_recv|numeric_send|" + + "numeric_smaller|numeric_sqrt|numeric_stddev_pop|numeric_stddev_samp|numeric_sub|" + + "numeric_transform|numeric_uminus|numeric_uplus|numeric_var_pop|numeric_var_samp|" + + "numerictypmodin|numerictypmodout|numnode|numrange|numrange_subdiff|obj_description|" + + "octet_length|oid|oideq|oidge|oidgt|oidin|oidlarger|oidle|oidlt|oidne|oidout|oidrecv|oidsend|" + + "oidsmaller|oidvectoreq|oidvectorge|oidvectorgt|oidvectorin|oidvectorle|oidvectorlt|" + + "oidvectorne|oidvectorout|oidvectorrecv|oidvectorsend|oidvectortypes|on_pb|on_pl|" + + "on_ppath|on_ps|on_sb|on_sl|opaque_in|opaque_out|overlaps|overlay|path|path_add|path_add_pt|" + + "path_center|path_contain_pt|path_distance|path_div_pt|path_in|path_inter|path_length|" + + "path_mul_pt|path_n_eq|path_n_ge|path_n_gt|path_n_le|path_n_lt|path_npoints|path_out|" + + "path_recv|path_send|path_sub_pt|pclose|percent_rank|pg_advisory_lock|" + + "pg_advisory_lock_shared|pg_advisory_unlock|pg_advisory_unlock_all|" + + "pg_advisory_unlock_shared|pg_advisory_xact_lock|pg_advisory_xact_lock_shared|" + + "pg_available_extension_versions|pg_available_extensions|pg_backend_pid|" + + "pg_backup_start_time|pg_cancel_backend|pg_char_to_encoding|pg_client_encoding|" + + "pg_collation_for|pg_collation_is_visible|pg_column_is_updatable|pg_column_size|" + + "pg_conf_load_time|pg_conversion_is_visible|pg_create_restore_point|" + + "pg_current_xlog_insert_location|pg_current_xlog_location|pg_cursor|pg_database_size|" + + "pg_describe_object|pg_encoding_max_length|pg_encoding_to_char|" + + "pg_event_trigger_dropped_objects|pg_export_snapshot|pg_extension_config_dump|" + + "pg_extension_update_paths|pg_function_is_visible|pg_get_constraintdef|pg_get_expr|" + + "pg_get_function_arguments|pg_get_function_identity_arguments|" + + "pg_get_function_result|pg_get_functiondef|pg_get_indexdef|pg_get_keywords|" + + "pg_get_multixact_members|pg_get_ruledef|pg_get_serial_sequence|pg_get_triggerdef|" + + "pg_get_userbyid|pg_get_viewdef|pg_has_role|pg_identify_object|pg_indexes_size|" + + "pg_is_in_backup|pg_is_in_recovery|pg_is_other_temp_schema|pg_is_xlog_replay_paused|" + + "pg_last_xact_replay_timestamp|pg_last_xlog_receive_location|" + + "pg_last_xlog_replay_location|pg_listening_channels|pg_lock_status|pg_ls_dir|" + + "pg_my_temp_schema|pg_node_tree_in|pg_node_tree_out|pg_node_tree_recv|" + + "pg_node_tree_send|pg_notify|pg_opclass_is_visible|pg_operator_is_visible|" + + "pg_opfamily_is_visible|pg_options_to_table|pg_postmaster_start_time|" + + "pg_prepared_statement|pg_prepared_xact|pg_read_binary_file|pg_read_file|" + + "pg_relation_filenode|pg_relation_filepath|pg_relation_is_updatable|pg_relation_size|" + + "pg_reload_conf|pg_rotate_logfile|pg_sequence_parameters|pg_show_all_settings|" + + "pg_size_pretty|pg_sleep|pg_start_backup|pg_stat_clear_snapshot|pg_stat_file|" + + "pg_stat_get_activity|pg_stat_get_analyze_count|pg_stat_get_autoanalyze_count|" + + "pg_stat_get_autovacuum_count|pg_stat_get_backend_activity|" + + "pg_stat_get_backend_activity_start|pg_stat_get_backend_client_addr|" + + "pg_stat_get_backend_client_port|pg_stat_get_backend_dbid|pg_stat_get_backend_idset|" + + "pg_stat_get_backend_pid|pg_stat_get_backend_start|pg_stat_get_backend_userid|" + + "pg_stat_get_backend_waiting|pg_stat_get_backend_xact_start|" + + "pg_stat_get_bgwriter_buf_written_checkpoints|" + + "pg_stat_get_bgwriter_buf_written_clean|pg_stat_get_bgwriter_maxwritten_clean|" + + "pg_stat_get_bgwriter_requested_checkpoints|pg_stat_get_bgwriter_stat_reset_time|" + + "pg_stat_get_bgwriter_timed_checkpoints|pg_stat_get_blocks_fetched|" + + "pg_stat_get_blocks_hit|pg_stat_get_buf_alloc|pg_stat_get_buf_fsync_backend|" + + "pg_stat_get_buf_written_backend|pg_stat_get_checkpoint_sync_time|" + + "pg_stat_get_checkpoint_write_time|pg_stat_get_db_blk_read_time|" + + "pg_stat_get_db_blk_write_time|pg_stat_get_db_blocks_fetched|" + + "pg_stat_get_db_blocks_hit|pg_stat_get_db_conflict_all|" + + "pg_stat_get_db_conflict_bufferpin|pg_stat_get_db_conflict_lock|" + + "pg_stat_get_db_conflict_snapshot|pg_stat_get_db_conflict_startup_deadlock|" + + "pg_stat_get_db_conflict_tablespace|pg_stat_get_db_deadlocks|" + + "pg_stat_get_db_numbackends|pg_stat_get_db_stat_reset_time|" + + "pg_stat_get_db_temp_bytes|pg_stat_get_db_temp_files|pg_stat_get_db_tuples_deleted|" + + "pg_stat_get_db_tuples_fetched|pg_stat_get_db_tuples_inserted|" + + "pg_stat_get_db_tuples_returned|pg_stat_get_db_tuples_updated|" + + "pg_stat_get_db_xact_commit|pg_stat_get_db_xact_rollback|pg_stat_get_dead_tuples|" + + "pg_stat_get_function_calls|pg_stat_get_function_self_time|" + + "pg_stat_get_function_total_time|pg_stat_get_last_analyze_time|" + + "pg_stat_get_last_autoanalyze_time|pg_stat_get_last_autovacuum_time|" + + "pg_stat_get_last_vacuum_time|pg_stat_get_live_tuples|pg_stat_get_numscans|" + + "pg_stat_get_tuples_deleted|pg_stat_get_tuples_fetched|" + + "pg_stat_get_tuples_hot_updated|pg_stat_get_tuples_inserted|" + + "pg_stat_get_tuples_returned|pg_stat_get_tuples_updated|pg_stat_get_vacuum_count|" + + "pg_stat_get_wal_senders|pg_stat_get_xact_blocks_fetched|" + + "pg_stat_get_xact_blocks_hit|pg_stat_get_xact_function_calls|" + + "pg_stat_get_xact_function_self_time|pg_stat_get_xact_function_total_time|" + + "pg_stat_get_xact_numscans|pg_stat_get_xact_tuples_deleted|" + + "pg_stat_get_xact_tuples_fetched|pg_stat_get_xact_tuples_hot_updated|" + + "pg_stat_get_xact_tuples_inserted|pg_stat_get_xact_tuples_returned|" + + "pg_stat_get_xact_tuples_updated|pg_stat_reset|pg_stat_reset_shared|" + + "pg_stat_reset_single_function_counters|pg_stat_reset_single_table_counters|" + + "pg_stop_backup|pg_switch_xlog|pg_table_is_visible|pg_table_size|" + + "pg_tablespace_databases|pg_tablespace_location|pg_tablespace_size|" + + "pg_terminate_backend|pg_timezone_abbrevs|pg_timezone_names|pg_total_relation_size|" + + "pg_trigger_depth|pg_try_advisory_lock|pg_try_advisory_lock_shared|" + + "pg_try_advisory_xact_lock|pg_try_advisory_xact_lock_shared|pg_ts_config_is_visible|" + + "pg_ts_dict_is_visible|pg_ts_parser_is_visible|pg_ts_template_is_visible|" + + "pg_type_is_visible|pg_typeof|pg_xlog_location_diff|pg_xlog_replay_pause|" + + "pg_xlog_replay_resume|pg_xlogfile_name|pg_xlogfile_name_offset|pi|plainto_tsquery|" + + "plpgsql_call_handler|plpgsql_inline_handler|plpgsql_validator|point|point_above|" + + "point_add|point_below|point_distance|point_div|point_eq|point_horiz|point_in|point_left|" + + "point_mul|point_ne|point_out|point_recv|point_right|point_send|point_sub|point_vert|" + + "poly_above|poly_below|poly_center|poly_contain|poly_contain_pt|poly_contained|" + + "poly_distance|poly_in|poly_left|poly_npoints|poly_out|poly_overabove|poly_overbelow|" + + "poly_overlap|poly_overleft|poly_overright|poly_recv|poly_right|poly_same|poly_send|" + + "polygon|popen|position|positionjoinsel|positionsel|postgresql_fdw_validator|pow|power|" + + "prsd_end|prsd_headline|prsd_lextype|prsd_nexttoken|prsd_start|pt_contained_circle|" + + "pt_contained_poly|query_to_xml|query_to_xml_and_xmlschema|query_to_xmlschema|" + + "querytree|quote_ident|quote_literal|quote_nullable|radians|radius|random|range_adjacent|" + + "range_after|range_before|range_cmp|range_contained_by|range_contains|" + + "range_contains_elem|range_eq|range_ge|range_gist_compress|range_gist_consistent|" + + "range_gist_decompress|range_gist_penalty|range_gist_picksplit|range_gist_same|" + + "range_gist_union|range_gt|range_in|range_intersect|range_le|range_lt|range_minus|" + + "range_ne|range_out|range_overlaps|range_overleft|range_overright|range_recv|range_send|" + + "range_typanalyze|range_union|rangesel|rank|record_eq|record_ge|record_gt|record_in|" + + "record_le|record_lt|record_ne|record_out|record_recv|record_send|regclass|regclassin|" + + "regclassout|regclassrecv|regclasssend|regconfigin|regconfigout|regconfigrecv|" + + "regconfigsend|regdictionaryin|regdictionaryout|regdictionaryrecv|regdictionarysend|" + + "regexeqjoinsel|regexeqsel|regexnejoinsel|regexnesel|regexp_matches|regexp_replace|" + + "regexp_split_to_array|regexp_split_to_table|regoperatorin|regoperatorout|" + + "regoperatorrecv|regoperatorsend|regoperin|regoperout|regoperrecv|regopersend|" + + "regprocedurein|regprocedureout|regprocedurerecv|regproceduresend|regprocin|regprocout|" + + "regprocrecv|regprocsend|regr_avgx|regr_avgy|regr_count|regr_intercept|regr_r2|" + + "regr_slope|regr_sxx|regr_sxy|regr_syy|regtypein|regtypeout|regtyperecv|regtypesend|" + + "reltime|reltimeeq|reltimege|reltimegt|reltimein|reltimele|reltimelt|reltimene|reltimeout|" + + "reltimerecv|reltimesend|repeat|replace|reverse|right|round|row_number|row_to_json|rpad|" + + "rtrim|scalargtjoinsel|scalargtsel|scalarltjoinsel|scalarltsel|schema_to_xml|" + + "schema_to_xml_and_xmlschema|schema_to_xmlschema|session_user|set_bit|set_byte|" + + "set_config|set_masklen|setseed|setval|setweight|shell_in|shell_out|" + + "shift_jis_2004_to_euc_jis_2004|shift_jis_2004_to_utf8|shobj_description|sign|" + + "similar_escape|sin|sjis_to_euc_jp|sjis_to_mic|sjis_to_utf8|slope|smgreq|smgrin|smgrne|" + + "smgrout|spg_kd_choose|spg_kd_config|spg_kd_inner_consistent|spg_kd_picksplit|" + + "spg_quad_choose|spg_quad_config|spg_quad_inner_consistent|spg_quad_leaf_consistent|" + + "spg_quad_picksplit|spg_range_quad_choose|spg_range_quad_config|" + + "spg_range_quad_inner_consistent|spg_range_quad_leaf_consistent|" + + "spg_range_quad_picksplit|spg_text_choose|spg_text_config|spg_text_inner_consistent|" + + "spg_text_leaf_consistent|spg_text_picksplit|spgbeginscan|spgbuild|spgbuildempty|" + + "spgbulkdelete|spgcanreturn|spgcostestimate|spgendscan|spggetbitmap|spggettuple|" + + "spginsert|spgmarkpos|spgoptions|spgrescan|spgrestrpos|spgvacuumcleanup|split_part|sqrt|" + + "statement_timestamp|stddev|stddev_pop|stddev_samp|string_agg|string_agg_finalfn|" + + "string_agg_transfn|string_to_array|strip|strpos|substr|substring|sum|" + + "suppress_redundant_updates_trigger|table_to_xml|table_to_xml_and_xmlschema|" + + "table_to_xmlschema|tan|text|text_ge|text_gt|text_larger|text_le|text_lt|text_pattern_ge|" + + "text_pattern_gt|text_pattern_le|text_pattern_lt|text_smaller|textanycat|textcat|texteq|" + + "texticlike|texticnlike|texticregexeq|texticregexne|textin|textlen|textlike|textne|" + + "textnlike|textout|textrecv|textregexeq|textregexne|textsend|thesaurus_init|" + + "thesaurus_lexize|tideq|tidge|tidgt|tidin|tidlarger|tidle|tidlt|tidne|tidout|tidrecv|tidsend|" + + "tidsmaller|time_cmp|time_eq|time_ge|time_gt|time_hash|time_in|time_larger|time_le|time_lt|" + + "time_mi_interval|time_mi_time|time_ne|time_out|time_pl_interval|time_recv|time_send|" + + "time_smaller|time_transform|timedate_pl|timemi|timenow|timeofday|timepl|timestamp_cmp|" + + "timestamp_cmp_date|timestamp_cmp_timestamptz|timestamp_eq|timestamp_eq_date|" + + "timestamp_eq_timestamptz|timestamp_ge|timestamp_ge_date|timestamp_ge_timestamptz|" + + "timestamp_gt|timestamp_gt_date|timestamp_gt_timestamptz|timestamp_hash|timestamp_in|" + + "timestamp_larger|timestamp_le|timestamp_le_date|timestamp_le_timestamptz|" + + "timestamp_lt|timestamp_lt_date|timestamp_lt_timestamptz|timestamp_mi|" + + "timestamp_mi_interval|timestamp_ne|timestamp_ne_date|timestamp_ne_timestamptz|" + + "timestamp_out|timestamp_pl_interval|timestamp_recv|timestamp_send|timestamp_smaller|" + + "timestamp_sortsupport|timestamp_transform|timestamptypmodin|timestamptypmodout|" + + "timestamptz_cmp|timestamptz_cmp_date|timestamptz_cmp_timestamp|timestamptz_eq|" + + "timestamptz_eq_date|timestamptz_eq_timestamp|timestamptz_ge|timestamptz_ge_date|" + + "timestamptz_ge_timestamp|timestamptz_gt|timestamptz_gt_date|" + + "timestamptz_gt_timestamp|timestamptz_in|timestamptz_larger|timestamptz_le|" + + "timestamptz_le_date|timestamptz_le_timestamp|timestamptz_lt|timestamptz_lt_date|" + + "timestamptz_lt_timestamp|timestamptz_mi|timestamptz_mi_interval|timestamptz_ne|" + + "timestamptz_ne_date|timestamptz_ne_timestamp|timestamptz_out|" + + "timestamptz_pl_interval|timestamptz_recv|timestamptz_send|timestamptz_smaller|" + + "timestamptztypmodin|timestamptztypmodout|timetypmodin|timetypmodout|timetz_cmp|" + + "timetz_eq|timetz_ge|timetz_gt|timetz_hash|timetz_in|timetz_larger|timetz_le|timetz_lt|" + + "timetz_mi_interval|timetz_ne|timetz_out|timetz_pl_interval|timetz_recv|timetz_send|" + + "timetz_smaller|timetzdate_pl|timetztypmodin|timetztypmodout|timezone|tinterval|" + + "tintervalct|tintervalend|tintervaleq|tintervalge|tintervalgt|tintervalin|tintervalle|" + + "tintervalleneq|tintervallenge|tintervallengt|tintervallenle|tintervallenlt|" + + "tintervallenne|tintervallt|tintervalne|tintervalout|tintervalov|tintervalrecv|" + + "tintervalrel|tintervalsame|tintervalsend|tintervalstart|to_ascii|to_char|to_date|to_hex|" + + "to_json|to_number|to_timestamp|to_tsquery|to_tsvector|transaction_timestamp|translate|" + + "trigger_in|trigger_out|trunc|ts_debug|ts_headline|ts_lexize|ts_match_qv|ts_match_tq|" + + "ts_match_tt|ts_match_vq|ts_parse|ts_rank|ts_rank_cd|ts_rewrite|ts_stat|ts_token_type|" + + "ts_typanalyze|tsmatchjoinsel|tsmatchsel|tsq_mcontained|tsq_mcontains|tsquery_and|" + + "tsquery_cmp|tsquery_eq|tsquery_ge|tsquery_gt|tsquery_le|tsquery_lt|tsquery_ne|" + + "tsquery_not|tsquery_or|tsqueryin|tsqueryout|tsqueryrecv|tsquerysend|tsrange|" + + "tsrange_subdiff|tstzrange|tstzrange_subdiff|tsvector_cmp|tsvector_concat|tsvector_eq|" + + "tsvector_ge|tsvector_gt|tsvector_le|tsvector_lt|tsvector_ne|tsvector_update_trigger|" + + "tsvector_update_trigger_column|tsvectorin|tsvectorout|tsvectorrecv|tsvectorsend|" + + "txid_current|txid_current_snapshot|txid_snapshot_in|txid_snapshot_out|" + + "txid_snapshot_recv|txid_snapshot_send|txid_snapshot_xip|txid_snapshot_xmax|" + + "txid_snapshot_xmin|txid_visible_in_snapshot|uhc_to_utf8|unique_key_recheck|unknownin|" + + "unknownout|unknownrecv|unknownsend|unnest|upper|upper_inc|upper_inf|utf8_to_ascii|" + + "utf8_to_big5|utf8_to_euc_cn|utf8_to_euc_jis_2004|utf8_to_euc_jp|utf8_to_euc_kr|" + + "utf8_to_euc_tw|utf8_to_gb18030|utf8_to_gbk|utf8_to_iso8859|utf8_to_iso8859_1|" + + "utf8_to_johab|utf8_to_koi8r|utf8_to_koi8u|utf8_to_shift_jis_2004|utf8_to_sjis|" + + "utf8_to_uhc|utf8_to_win|uuid_cmp|uuid_eq|uuid_ge|uuid_gt|uuid_hash|uuid_in|uuid_le|" + + "uuid_lt|uuid_ne|uuid_out|uuid_recv|uuid_send|var_pop|var_samp|varbit_in|varbit_out|" + + "varbit_recv|varbit_send|varbit_transform|varbitcmp|varbiteq|varbitge|varbitgt|varbitle|" + + "varbitlt|varbitne|varbittypmodin|varbittypmodout|varchar_transform|varcharin|" + + "varcharout|varcharrecv|varcharsend|varchartypmodin|varchartypmodout|variance|version|" + + "void_in|void_out|void_recv|void_send|width|width_bucket|win1250_to_latin2|" + + "win1250_to_mic|win1251_to_iso|win1251_to_koi8r|win1251_to_mic|win1251_to_win866|" + + "win866_to_iso|win866_to_koi8r|win866_to_mic|win866_to_win1251|win_to_utf8|xideq|" + + "xideqint4|xidin|xidout|xidrecv|xidsend|xml|xml_in|xml_is_well_formed|" + + "xml_is_well_formed_content|xml_is_well_formed_document|xml_out|xml_recv|xml_send|" + + "xmlagg|xmlcomment|xmlconcat2|xmlexists|xmlvalidate|xpath|xpath_exists" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords + }, "identifier", true); + + + var sqlRules = [{ + token : "string", // single line string -- assume dollar strings if multi-line for now + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "variable.language", // pg identifier + regex : '".*?"' + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_][a-zA-Z0-9_$]*\\b" // TODO - Unicode in identifiers + }, { + token : "keyword.operator", + regex : "!|!!|!~|!~\\*|!~~|!~~\\*|#|##|#<|#<=|#<>|#=|#>|#>=|%|\\&|\\&\\&|\\&<|\\&<\\||\\&>|\\*|\\+|" + + "\\-|/|<|<#>|<\\->|<<|<<=|<<\\||<=|<>|<\\?>|<@|<\\^|=|>|>=|>>|>>=|>\\^|\\?#|\\?\\-|\\?\\-\\||" + + "\\?\\||\\?\\|\\||@|@\\-@|@>|@@|@@@|\\^|\\||\\|\\&>|\\|/|\\|>>|\\|\\||\\|\\|/|~|~\\*|~<=~|~<~|" + + "~=|~>=~|~>~|~~|~~\\*" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } + ]; + + + this.$rules = { + "start" : [{ + token : "comment", + regex : "--.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi-line comment + regex : "\\/\\*", + next : "comment" + },{ + token : "keyword.statementBegin", + regex : "^[a-zA-Z]+", // Could enumerate starting keywords but this allows things to work when new statements are added. + next : "statement" + },{ + token : "support.buildin", // psql directive + regex : "^\\\\[\\S]+.*$" + } + ], + + "statement" : [{ + token : "comment", + regex : "--.*$" + }, { + token : "comment", // multi-line comment + regex : "\\/\\*", + next : "commentStatement" + }, { + token : "statementEnd", + regex : ";", + next : "start" + }, { + token : "string", + regex : "\\$perl\\$", + next : "perl-start" + }, { + token : "string", + regex : "\\$python\\$", + next : "python-start" + }, { + token : "string", + regex : "\\$json\\$", + next : "json-start" + }, { + token : "string", + regex : "\\$(js|javascript)\\$", + next : "javascript-start" + }, { + token : "string", + regex : "\\$[\\w_0-9]*\\$$", // dollar quote at the end of a line + next : "dollarSql" + }, { + token : "string", + regex : "\\$[\\w_0-9]*\\$", + next : "dollarStatementString" + } + ].concat(sqlRules), + + "dollarSql" : [{ + token : "comment", + regex : "--.*$" + }, { + token : "comment", // multi-line comment + regex : "\\/\\*", + next : "commentDollarSql" + }, { + token : "string", // end quoting with dollar at the start of a line + regex : "^\\$[\\w_0-9]*\\$", + next : "statement" + }, { + token : "string", + regex : "\\$[\\w_0-9]*\\$", + next : "dollarSqlString" + } + ].concat(sqlRules), + + "comment" : [{ + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + + "commentStatement" : [{ + token : "comment", // closing comment + regex : "\\*\\/", + next : "statement" + }, { + defaultToken : "comment" + } + ], + + "commentDollarSql" : [{ + token : "comment", // closing comment + regex : "\\*\\/", + next : "dollarSql" + }, { + defaultToken : "comment" + } + ], + + "dollarStatementString" : [{ + token : "string", // closing dollarstring + regex : ".*?\\$[\\w_0-9]*\\$", + next : "statement" + }, { + token : "string", // dollarstring spanning whole line + regex : ".+" + } + ], + + "dollarSqlString" : [{ + token : "string", // closing dollarstring + regex : ".*?\\$[\\w_0-9]*\\$", + next : "dollarSql" + }, { + token : "string", // dollarstring spanning whole line + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", [ DocCommentHighlightRules.getEndRule("start") ]); + this.embedRules(PerlHighlightRules, "perl-", [{token : "string", regex : "\\$perl\\$", next : "statement"}]); + this.embedRules(PythonHighlightRules, "python-", [{token : "string", regex : "\\$python\\$", next : "statement"}]); + this.embedRules(JsonHighlightRules, "json-", [{token : "string", regex : "\\$json\\$", next : "statement"}]); + this.embedRules(JavaScriptHighlightRules, "javascript-", [{token : "string", regex : "\\$(js|javascript)\\$", next : "statement"}]); +}; + +oop.inherits(PgsqlHighlightRules, TextHighlightRules); + +exports.PgsqlHighlightRules = PgsqlHighlightRules; +}); + +ace.define("ace/mode/pgsql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/pgsql_highlight_rules"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var TextMode = require("../mode/text").Mode; +var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules; + +var Mode = function() { + this.HighlightRules = PgsqlHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + if (state == "start" || state == "keyword.statementEnd") { + return ""; + } else { + return this.$getIndent(line); // Keep whatever indent the previous line has + } + }; + + this.$id = "ace/mode/pgsql"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-php.js b/src/libs/ace/mode-php.js new file mode 100755 index 0000000..b4d55de --- /dev/null +++ b/src/libs/ace/mode-php.js @@ -0,0 +1,12856 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/php_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + +var PhpLangHighlightRules = function() { + var docComment = DocCommentHighlightRules; + var builtinFunctions = lang.arrayToMap( + ('abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|' + + 'aggregate_properties|aggregate_properties_by_list|aggregate_properties_by_regexp|aggregation_info|amqpconnection|amqpexchange|amqpqueue|' + + 'apache_child_terminate|apache_get_modules|apache_get_version|apache_getenv|apache_lookup_uri|apache_note|apache_request_headers|' + + 'apache_reset_timeout|apache_response_headers|apache_setenv|apc_add|apc_bin_dump|apc_bin_dumpfile|apc_bin_load|apc_bin_loadfile|' + + 'apc_cache_info|apc_cas|apc_clear_cache|apc_compile_file|apc_dec|apc_define_constants|apc_delete|apc_delete_file|apc_exists|apc_fetch|' + + 'apc_inc|apc_load_constants|apc_sma_info|apc_store|apciterator|apd_breakpoint|apd_callstack|apd_clunk|apd_continue|apd_croak|' + + 'apd_dump_function_table|apd_dump_persistent_resources|apd_dump_regular_resources|apd_echo|apd_get_active_symbols|apd_set_pprof_trace|' + + 'apd_set_session|apd_set_session_trace|apd_set_session_trace_socket|appenditerator|array|array_change_key_case|array_chunk|array_combine|' + + 'array_count_values|array_diff|array_diff_assoc|array_diff_key|array_diff_uassoc|array_diff_ukey|array_fill|array_fill_keys|array_filter|' + + 'array_flip|array_intersect|array_intersect_assoc|array_intersect_key|array_intersect_uassoc|array_intersect_ukey|array_key_exists|' + + 'array_keys|array_map|array_merge|array_merge_recursive|array_multisort|array_pad|array_pop|array_product|array_push|array_rand|' + + 'array_reduce|array_replace|array_replace_recursive|array_reverse|array_search|array_shift|array_slice|array_splice|array_sum|array_udiff|' + + 'array_udiff_assoc|array_udiff_uassoc|array_uintersect|array_uintersect_assoc|array_uintersect_uassoc|array_unique|array_unshift|' + + 'array_values|array_walk|array_walk_recursive|arrayaccess|arrayiterator|arrayobject|arsort|asin|asinh|asort|assert|assert_options|atan|' + + 'atan2|atanh|audioproperties|badfunctioncallexception|badmethodcallexception|base64_decode|base64_encode|base_convert|basename|' + + 'bbcode_add_element|bbcode_add_smiley|bbcode_create|bbcode_destroy|bbcode_parse|bbcode_set_arg_parser|bbcode_set_flags|bcadd|bccomp|bcdiv|' + + 'bcmod|bcmul|bcompiler_load|bcompiler_load_exe|bcompiler_parse_class|bcompiler_read|bcompiler_write_class|bcompiler_write_constant|' + + 'bcompiler_write_exe_footer|bcompiler_write_file|bcompiler_write_footer|bcompiler_write_function|bcompiler_write_functions_from_file|' + + 'bcompiler_write_header|bcompiler_write_included_filename|bcpow|bcpowmod|bcscale|bcsqrt|bcsub|bin2hex|bind_textdomain_codeset|bindec|' + + 'bindtextdomain|bson_decode|bson_encode|bumpValue|bzclose|bzcompress|bzdecompress|bzerrno|bzerror|bzerrstr|bzflush|bzopen|bzread|bzwrite|' + + 'cachingiterator|cairo|cairo_create|cairo_font_face_get_type|cairo_font_face_status|cairo_font_options_create|cairo_font_options_equal|' + + 'cairo_font_options_get_antialias|cairo_font_options_get_hint_metrics|cairo_font_options_get_hint_style|' + + 'cairo_font_options_get_subpixel_order|cairo_font_options_hash|cairo_font_options_merge|cairo_font_options_set_antialias|' + + 'cairo_font_options_set_hint_metrics|cairo_font_options_set_hint_style|cairo_font_options_set_subpixel_order|cairo_font_options_status|' + + 'cairo_format_stride_for_width|cairo_image_surface_create|cairo_image_surface_create_for_data|cairo_image_surface_create_from_png|' + + 'cairo_image_surface_get_data|cairo_image_surface_get_format|cairo_image_surface_get_height|cairo_image_surface_get_stride|' + + 'cairo_image_surface_get_width|cairo_matrix_create_scale|cairo_matrix_create_translate|cairo_matrix_invert|cairo_matrix_multiply|' + + 'cairo_matrix_rotate|cairo_matrix_transform_distance|cairo_matrix_transform_point|cairo_matrix_translate|cairo_pattern_add_color_stop_rgb|' + + 'cairo_pattern_add_color_stop_rgba|cairo_pattern_create_for_surface|cairo_pattern_create_linear|cairo_pattern_create_radial|' + + 'cairo_pattern_create_rgb|cairo_pattern_create_rgba|cairo_pattern_get_color_stop_count|cairo_pattern_get_color_stop_rgba|' + + 'cairo_pattern_get_extend|cairo_pattern_get_filter|cairo_pattern_get_linear_points|cairo_pattern_get_matrix|' + + 'cairo_pattern_get_radial_circles|cairo_pattern_get_rgba|cairo_pattern_get_surface|cairo_pattern_get_type|cairo_pattern_set_extend|' + + 'cairo_pattern_set_filter|cairo_pattern_set_matrix|cairo_pattern_status|cairo_pdf_surface_create|cairo_pdf_surface_set_size|' + + 'cairo_ps_get_levels|cairo_ps_level_to_string|cairo_ps_surface_create|cairo_ps_surface_dsc_begin_page_setup|' + + 'cairo_ps_surface_dsc_begin_setup|cairo_ps_surface_dsc_comment|cairo_ps_surface_get_eps|cairo_ps_surface_restrict_to_level|' + + 'cairo_ps_surface_set_eps|cairo_ps_surface_set_size|cairo_scaled_font_create|cairo_scaled_font_extents|cairo_scaled_font_get_ctm|' + + 'cairo_scaled_font_get_font_face|cairo_scaled_font_get_font_matrix|cairo_scaled_font_get_font_options|cairo_scaled_font_get_scale_matrix|' + + 'cairo_scaled_font_get_type|cairo_scaled_font_glyph_extents|cairo_scaled_font_status|cairo_scaled_font_text_extents|' + + 'cairo_surface_copy_page|cairo_surface_create_similar|cairo_surface_finish|cairo_surface_flush|cairo_surface_get_content|' + + 'cairo_surface_get_device_offset|cairo_surface_get_font_options|cairo_surface_get_type|cairo_surface_mark_dirty|' + + 'cairo_surface_mark_dirty_rectangle|cairo_surface_set_device_offset|cairo_surface_set_fallback_resolution|cairo_surface_show_page|' + + 'cairo_surface_status|cairo_surface_write_to_png|cairo_svg_surface_create|cairo_svg_surface_restrict_to_version|' + + 'cairo_svg_version_to_string|cairoantialias|cairocontent|cairocontext|cairoexception|cairoextend|cairofillrule|cairofilter|cairofontface|' + + 'cairofontoptions|cairofontslant|cairofonttype|cairofontweight|cairoformat|cairogradientpattern|cairohintmetrics|cairohintstyle|' + + 'cairoimagesurface|cairolineargradient|cairolinecap|cairolinejoin|cairomatrix|cairooperator|cairopath|cairopattern|cairopatterntype|' + + 'cairopdfsurface|cairopslevel|cairopssurface|cairoradialgradient|cairoscaledfont|cairosolidpattern|cairostatus|cairosubpixelorder|' + + 'cairosurface|cairosurfacepattern|cairosurfacetype|cairosvgsurface|cairosvgversion|cairotoyfontface|cal_days_in_month|cal_from_jd|cal_info|' + + 'cal_to_jd|calcul_hmac|calculhmac|call_user_func|call_user_func_array|call_user_method|call_user_method_array|callbackfilteriterator|ceil|' + + 'chdb|chdb_create|chdir|checkdate|checkdnsrr|chgrp|chmod|chop|chown|chr|chroot|chunk_split|class_alias|class_exists|class_implements|' + + 'class_parents|class_uses|classkit_import|classkit_method_add|classkit_method_copy|classkit_method_redefine|classkit_method_remove|' + + 'classkit_method_rename|clearstatcache|clone|closedir|closelog|collator|com|com_addref|com_create_guid|com_event_sink|com_get|' + + 'com_get_active_object|com_invoke|com_isenum|com_load|com_load_typelib|com_message_pump|com_print_typeinfo|com_propget|com_propput|' + + 'com_propset|com_release|com_set|compact|connection_aborted|connection_status|connection_timeout|constant|construct|construct|construct|' + + 'convert_cyr_string|convert_uudecode|convert_uuencode|copy|cos|cosh|count|count_chars|countable|counter_bump|counter_bump_value|' + + 'counter_create|counter_get|counter_get_meta|counter_get_named|counter_get_value|counter_reset|counter_reset_value|crack_check|' + + 'crack_closedict|crack_getlastmessage|crack_opendict|crc32|create_function|crypt|ctype_alnum|ctype_alpha|ctype_cntrl|ctype_digit|' + + 'ctype_graph|ctype_lower|ctype_print|ctype_punct|ctype_space|ctype_upper|ctype_xdigit|cubrid_affected_rows|cubrid_bind|' + + 'cubrid_client_encoding|cubrid_close|cubrid_close_prepare|cubrid_close_request|cubrid_col_get|cubrid_col_size|cubrid_column_names|' + + 'cubrid_column_types|cubrid_commit|cubrid_connect|cubrid_connect_with_url|cubrid_current_oid|cubrid_data_seek|cubrid_db_name|' + + 'cubrid_disconnect|cubrid_drop|cubrid_errno|cubrid_error|cubrid_error_code|cubrid_error_code_facility|cubrid_error_msg|cubrid_execute|' + + 'cubrid_fetch|cubrid_fetch_array|cubrid_fetch_assoc|cubrid_fetch_field|cubrid_fetch_lengths|cubrid_fetch_object|cubrid_fetch_row|' + + 'cubrid_field_flags|cubrid_field_len|cubrid_field_name|cubrid_field_seek|cubrid_field_table|cubrid_field_type|cubrid_free_result|' + + 'cubrid_get|cubrid_get_autocommit|cubrid_get_charset|cubrid_get_class_name|cubrid_get_client_info|cubrid_get_db_parameter|' + + 'cubrid_get_server_info|cubrid_insert_id|cubrid_is_instance|cubrid_list_dbs|cubrid_load_from_glo|cubrid_lob_close|cubrid_lob_export|' + + 'cubrid_lob_get|cubrid_lob_send|cubrid_lob_size|cubrid_lock_read|cubrid_lock_write|cubrid_move_cursor|cubrid_new_glo|cubrid_next_result|' + + 'cubrid_num_cols|cubrid_num_fields|cubrid_num_rows|cubrid_ping|cubrid_prepare|cubrid_put|cubrid_query|cubrid_real_escape_string|' + + 'cubrid_result|cubrid_rollback|cubrid_save_to_glo|cubrid_schema|cubrid_send_glo|cubrid_seq_drop|cubrid_seq_insert|cubrid_seq_put|' + + 'cubrid_set_add|cubrid_set_autocommit|cubrid_set_db_parameter|cubrid_set_drop|cubrid_unbuffered_query|cubrid_version|curl_close|' + + 'curl_copy_handle|curl_errno|curl_error|curl_exec|curl_getinfo|curl_init|curl_multi_add_handle|curl_multi_close|curl_multi_exec|' + + 'curl_multi_getcontent|curl_multi_info_read|curl_multi_init|curl_multi_remove_handle|curl_multi_select|curl_setopt|curl_setopt_array|' + + 'curl_version|current|cyrus_authenticate|cyrus_bind|cyrus_close|cyrus_connect|cyrus_query|cyrus_unbind|date|date_add|date_create|' + + 'date_create_from_format|date_date_set|date_default_timezone_get|date_default_timezone_set|date_diff|date_format|date_get_last_errors|' + + 'date_interval_create_from_date_string|date_interval_format|date_isodate_set|date_modify|date_offset_get|date_parse|date_parse_from_format|' + + 'date_sub|date_sun_info|date_sunrise|date_sunset|date_time_set|date_timestamp_get|date_timestamp_set|date_timezone_get|date_timezone_set|' + + 'dateinterval|dateperiod|datetime|datetimezone|db2_autocommit|db2_bind_param|db2_client_info|db2_close|db2_column_privileges|db2_columns|' + + 'db2_commit|db2_conn_error|db2_conn_errormsg|db2_connect|db2_cursor_type|db2_escape_string|db2_exec|db2_execute|db2_fetch_array|' + + 'db2_fetch_assoc|db2_fetch_both|db2_fetch_object|db2_fetch_row|db2_field_display_size|db2_field_name|db2_field_num|db2_field_precision|' + + 'db2_field_scale|db2_field_type|db2_field_width|db2_foreign_keys|db2_free_result|db2_free_stmt|db2_get_option|db2_last_insert_id|' + + 'db2_lob_read|db2_next_result|db2_num_fields|db2_num_rows|db2_pclose|db2_pconnect|db2_prepare|db2_primary_keys|db2_procedure_columns|' + + 'db2_procedures|db2_result|db2_rollback|db2_server_info|db2_set_option|db2_special_columns|db2_statistics|db2_stmt_error|db2_stmt_errormsg|' + + 'db2_table_privileges|db2_tables|dba_close|dba_delete|dba_exists|dba_fetch|dba_firstkey|dba_handlers|dba_insert|dba_key_split|dba_list|' + + 'dba_nextkey|dba_open|dba_optimize|dba_popen|dba_replace|dba_sync|dbase_add_record|dbase_close|dbase_create|dbase_delete_record|' + + 'dbase_get_header_info|dbase_get_record|dbase_get_record_with_names|dbase_numfields|dbase_numrecords|dbase_open|dbase_pack|' + + 'dbase_replace_record|dbplus_add|dbplus_aql|dbplus_chdir|dbplus_close|dbplus_curr|dbplus_errcode|dbplus_errno|dbplus_find|dbplus_first|' + + 'dbplus_flush|dbplus_freealllocks|dbplus_freelock|dbplus_freerlocks|dbplus_getlock|dbplus_getunique|dbplus_info|dbplus_last|dbplus_lockrel|' + + 'dbplus_next|dbplus_open|dbplus_prev|dbplus_rchperm|dbplus_rcreate|dbplus_rcrtexact|dbplus_rcrtlike|dbplus_resolve|dbplus_restorepos|' + + 'dbplus_rkeys|dbplus_ropen|dbplus_rquery|dbplus_rrename|dbplus_rsecindex|dbplus_runlink|dbplus_rzap|dbplus_savepos|dbplus_setindex|' + + 'dbplus_setindexbynumber|dbplus_sql|dbplus_tcl|dbplus_tremove|dbplus_undo|dbplus_undoprepare|dbplus_unlockrel|dbplus_unselect|' + + 'dbplus_update|dbplus_xlockrel|dbplus_xunlockrel|dbx_close|dbx_compare|dbx_connect|dbx_error|dbx_escape_string|dbx_fetch_row|dbx_query|' + + 'dbx_sort|dcgettext|dcngettext|deaggregate|debug_backtrace|debug_print_backtrace|debug_zval_dump|decbin|dechex|decoct|define|' + + 'define_syslog_variables|defined|deg2rad|delete|dgettext|die|dio_close|dio_fcntl|dio_open|dio_read|dio_seek|dio_stat|dio_tcsetattr|' + + 'dio_truncate|dio_write|dir|directoryiterator|dirname|disk_free_space|disk_total_space|diskfreespace|dl|dngettext|dns_check_record|' + + 'dns_get_mx|dns_get_record|dom_import_simplexml|domainexception|domattr|domattribute_name|domattribute_set_value|domattribute_specified|' + + 'domattribute_value|domcharacterdata|domcomment|domdocument|domdocument_add_root|domdocument_create_attribute|' + + 'domdocument_create_cdata_section|domdocument_create_comment|domdocument_create_element|domdocument_create_element_ns|' + + 'domdocument_create_entity_reference|domdocument_create_processing_instruction|domdocument_create_text_node|domdocument_doctype|' + + 'domdocument_document_element|domdocument_dump_file|domdocument_dump_mem|domdocument_get_element_by_id|domdocument_get_elements_by_tagname|' + + 'domdocument_html_dump_mem|domdocument_xinclude|domdocumentfragment|domdocumenttype|domdocumenttype_entities|' + + 'domdocumenttype_internal_subset|domdocumenttype_name|domdocumenttype_notations|domdocumenttype_public_id|domdocumenttype_system_id|' + + 'domelement|domelement_get_attribute|domelement_get_attribute_node|domelement_get_elements_by_tagname|domelement_has_attribute|' + + 'domelement_remove_attribute|domelement_set_attribute|domelement_set_attribute_node|domelement_tagname|domentity|domentityreference|' + + 'domexception|domimplementation|domnamednodemap|domnode|domnode_add_namespace|domnode_append_child|domnode_append_sibling|' + + 'domnode_attributes|domnode_child_nodes|domnode_clone_node|domnode_dump_node|domnode_first_child|domnode_get_content|' + + 'domnode_has_attributes|domnode_has_child_nodes|domnode_insert_before|domnode_is_blank_node|domnode_last_child|domnode_next_sibling|' + + 'domnode_node_name|domnode_node_type|domnode_node_value|domnode_owner_document|domnode_parent_node|domnode_prefix|domnode_previous_sibling|' + + 'domnode_remove_child|domnode_replace_child|domnode_replace_node|domnode_set_content|domnode_set_name|domnode_set_namespace|' + + 'domnode_unlink_node|domnodelist|domnotation|domprocessinginstruction|domprocessinginstruction_data|domprocessinginstruction_target|' + + 'domtext|domxml_new_doc|domxml_open_file|domxml_open_mem|domxml_version|domxml_xmltree|domxml_xslt_stylesheet|domxml_xslt_stylesheet_doc|' + + 'domxml_xslt_stylesheet_file|domxml_xslt_version|domxpath|domxsltstylesheet_process|domxsltstylesheet_result_dump_file|' + + 'domxsltstylesheet_result_dump_mem|dotnet|dotnet_load|doubleval|each|easter_date|easter_days|echo|empty|emptyiterator|' + + 'enchant_broker_describe|enchant_broker_dict_exists|enchant_broker_free|enchant_broker_free_dict|enchant_broker_get_error|' + + 'enchant_broker_init|enchant_broker_list_dicts|enchant_broker_request_dict|enchant_broker_request_pwl_dict|enchant_broker_set_ordering|' + + 'enchant_dict_add_to_personal|enchant_dict_add_to_session|enchant_dict_check|enchant_dict_describe|enchant_dict_get_error|' + + 'enchant_dict_is_in_session|enchant_dict_quick_check|enchant_dict_store_replacement|enchant_dict_suggest|end|ereg|ereg_replace|eregi|' + + 'eregi_replace|error_get_last|error_log|error_reporting|errorexception|escapeshellarg|escapeshellcmd|eval|event_add|event_base_free|' + + 'event_base_loop|event_base_loopbreak|event_base_loopexit|event_base_new|event_base_priority_init|event_base_set|event_buffer_base_set|' + + 'event_buffer_disable|event_buffer_enable|event_buffer_fd_set|event_buffer_free|event_buffer_new|event_buffer_priority_set|' + + 'event_buffer_read|event_buffer_set_callback|event_buffer_timeout_set|event_buffer_watermark_set|event_buffer_write|event_del|event_free|' + + 'event_new|event_set|exception|exec|exif_imagetype|exif_read_data|exif_tagname|exif_thumbnail|exit|exp|expect_expectl|expect_popen|explode|' + + 'expm1|export|export|extension_loaded|extract|ezmlm_hash|fam_cancel_monitor|fam_close|fam_monitor_collection|fam_monitor_directory|' + + 'fam_monitor_file|fam_next_event|fam_open|fam_pending|fam_resume_monitor|fam_suspend_monitor|fbsql_affected_rows|fbsql_autocommit|' + + 'fbsql_blob_size|fbsql_change_user|fbsql_clob_size|fbsql_close|fbsql_commit|fbsql_connect|fbsql_create_blob|fbsql_create_clob|' + + 'fbsql_create_db|fbsql_data_seek|fbsql_database|fbsql_database_password|fbsql_db_query|fbsql_db_status|fbsql_drop_db|fbsql_errno|' + + 'fbsql_error|fbsql_fetch_array|fbsql_fetch_assoc|fbsql_fetch_field|fbsql_fetch_lengths|fbsql_fetch_object|fbsql_fetch_row|' + + 'fbsql_field_flags|fbsql_field_len|fbsql_field_name|fbsql_field_seek|fbsql_field_table|fbsql_field_type|fbsql_free_result|' + + 'fbsql_get_autostart_info|fbsql_hostname|fbsql_insert_id|fbsql_list_dbs|fbsql_list_fields|fbsql_list_tables|fbsql_next_result|' + + 'fbsql_num_fields|fbsql_num_rows|fbsql_password|fbsql_pconnect|fbsql_query|fbsql_read_blob|fbsql_read_clob|fbsql_result|fbsql_rollback|' + + 'fbsql_rows_fetched|fbsql_select_db|fbsql_set_characterset|fbsql_set_lob_mode|fbsql_set_password|fbsql_set_transaction|fbsql_start_db|' + + 'fbsql_stop_db|fbsql_table_name|fbsql_tablename|fbsql_username|fbsql_warnings|fclose|fdf_add_doc_javascript|fdf_add_template|fdf_close|' + + 'fdf_create|fdf_enum_values|fdf_errno|fdf_error|fdf_get_ap|fdf_get_attachment|fdf_get_encoding|fdf_get_file|fdf_get_flags|fdf_get_opt|' + + 'fdf_get_status|fdf_get_value|fdf_get_version|fdf_header|fdf_next_field_name|fdf_open|fdf_open_string|fdf_remove_item|fdf_save|' + + 'fdf_save_string|fdf_set_ap|fdf_set_encoding|fdf_set_file|fdf_set_flags|fdf_set_javascript_action|fdf_set_on_import_javascript|fdf_set_opt|' + + 'fdf_set_status|fdf_set_submit_form_action|fdf_set_target_frame|fdf_set_value|fdf_set_version|feof|fflush|fgetc|fgetcsv|fgets|fgetss|file|' + + 'file_exists|file_get_contents|file_put_contents|fileatime|filectime|filegroup|fileinode|filemtime|fileowner|fileperms|filepro|' + + 'filepro_fieldcount|filepro_fieldname|filepro_fieldtype|filepro_fieldwidth|filepro_retrieve|filepro_rowcount|filesize|filesystemiterator|' + + 'filetype|filter_has_var|filter_id|filter_input|filter_input_array|filter_list|filter_var|filter_var_array|filteriterator|finfo_buffer|' + + 'finfo_close|finfo_file|finfo_open|finfo_set_flags|floatval|flock|floor|flush|fmod|fnmatch|fopen|forward_static_call|' + + 'forward_static_call_array|fpassthru|fprintf|fputcsv|fputs|fread|frenchtojd|fribidi_log2vis|fscanf|fseek|fsockopen|fstat|ftell|ftok|' + + 'ftp_alloc|ftp_cdup|ftp_chdir|ftp_chmod|ftp_close|ftp_connect|ftp_delete|ftp_exec|ftp_fget|ftp_fput|ftp_get|ftp_get_option|ftp_login|' + + 'ftp_mdtm|ftp_mkdir|ftp_nb_continue|ftp_nb_fget|ftp_nb_fput|ftp_nb_get|ftp_nb_put|ftp_nlist|ftp_pasv|ftp_put|ftp_pwd|ftp_quit|ftp_raw|' + + 'ftp_rawlist|ftp_rename|ftp_rmdir|ftp_set_option|ftp_site|ftp_size|ftp_ssl_connect|ftp_systype|ftruncate|func_get_arg|func_get_args|' + + 'func_num_args|function_exists|fwrite|gc_collect_cycles|gc_disable|gc_enable|gc_enabled|gd_info|gearmanclient|gearmanjob|gearmantask|' + + 'gearmanworker|geoip_continent_code_by_name|geoip_country_code3_by_name|geoip_country_code_by_name|geoip_country_name_by_name|' + + 'geoip_database_info|geoip_db_avail|geoip_db_filename|geoip_db_get_all_info|geoip_id_by_name|geoip_isp_by_name|geoip_org_by_name|' + + 'geoip_record_by_name|geoip_region_by_name|geoip_region_name_by_code|geoip_time_zone_by_country_and_region|getMeta|getNamed|getValue|' + + 'get_browser|get_called_class|get_cfg_var|get_class|get_class_methods|get_class_vars|get_current_user|get_declared_classes|' + + 'get_declared_interfaces|get_declared_traits|get_defined_constants|get_defined_functions|get_defined_vars|get_extension_funcs|get_headers|' + + 'get_html_translation_table|get_include_path|get_included_files|get_loaded_extensions|get_magic_quotes_gpc|get_magic_quotes_runtime|' + + 'get_meta_tags|get_object_vars|get_parent_class|get_required_files|get_resource_type|getallheaders|getconstant|getconstants|getconstructor|' + + 'getcwd|getdate|getdefaultproperties|getdoccomment|getendline|getenv|getextension|getextensionname|getfilename|gethostbyaddr|gethostbyname|' + + 'gethostbynamel|gethostname|getimagesize|getinterfacenames|getinterfaces|getlastmod|getmethod|getmethods|getmodifiers|getmxrr|getmygid|' + + 'getmyinode|getmypid|getmyuid|getname|getnamespacename|getopt|getparentclass|getproperties|getproperty|getprotobyname|getprotobynumber|' + + 'getrandmax|getrusage|getservbyname|getservbyport|getshortname|getstartline|getstaticproperties|getstaticpropertyvalue|gettext|' + + 'gettimeofday|gettype|glob|globiterator|gmagick|gmagickdraw|gmagickpixel|gmdate|gmmktime|gmp_abs|gmp_add|gmp_and|gmp_clrbit|gmp_cmp|' + + 'gmp_com|gmp_div|gmp_div_q|gmp_div_qr|gmp_div_r|gmp_divexact|gmp_fact|gmp_gcd|gmp_gcdext|gmp_hamdist|gmp_init|gmp_intval|gmp_invert|' + + 'gmp_jacobi|gmp_legendre|gmp_mod|gmp_mul|gmp_neg|gmp_nextprime|gmp_or|gmp_perfect_square|gmp_popcount|gmp_pow|gmp_powm|gmp_prob_prime|' + + 'gmp_random|gmp_scan0|gmp_scan1|gmp_setbit|gmp_sign|gmp_sqrt|gmp_sqrtrem|gmp_strval|gmp_sub|gmp_testbit|gmp_xor|gmstrftime|' + + 'gnupg_adddecryptkey|gnupg_addencryptkey|gnupg_addsignkey|gnupg_cleardecryptkeys|gnupg_clearencryptkeys|gnupg_clearsignkeys|gnupg_decrypt|' + + 'gnupg_decryptverify|gnupg_encrypt|gnupg_encryptsign|gnupg_export|gnupg_geterror|gnupg_getprotocol|gnupg_import|gnupg_init|gnupg_keyinfo|' + + 'gnupg_setarmor|gnupg_seterrormode|gnupg_setsignmode|gnupg_sign|gnupg_verify|gopher_parsedir|grapheme_extract|grapheme_stripos|' + + 'grapheme_stristr|grapheme_strlen|grapheme_strpos|grapheme_strripos|grapheme_strrpos|grapheme_strstr|grapheme_substr|gregoriantojd|' + + 'gupnp_context_get_host_ip|gupnp_context_get_port|gupnp_context_get_subscription_timeout|gupnp_context_host_path|gupnp_context_new|' + + 'gupnp_context_set_subscription_timeout|gupnp_context_timeout_add|gupnp_context_unhost_path|gupnp_control_point_browse_start|' + + 'gupnp_control_point_browse_stop|gupnp_control_point_callback_set|gupnp_control_point_new|gupnp_device_action_callback_set|' + + 'gupnp_device_info_get|gupnp_device_info_get_service|gupnp_root_device_get_available|gupnp_root_device_get_relative_location|' + + 'gupnp_root_device_new|gupnp_root_device_set_available|gupnp_root_device_start|gupnp_root_device_stop|gupnp_service_action_get|' + + 'gupnp_service_action_return|gupnp_service_action_return_error|gupnp_service_action_set|gupnp_service_freeze_notify|gupnp_service_info_get|' + + 'gupnp_service_info_get_introspection|gupnp_service_introspection_get_state_variable|gupnp_service_notify|gupnp_service_proxy_action_get|' + + 'gupnp_service_proxy_action_set|gupnp_service_proxy_add_notify|gupnp_service_proxy_callback_set|gupnp_service_proxy_get_subscribed|' + + 'gupnp_service_proxy_remove_notify|gupnp_service_proxy_set_subscribed|gupnp_service_thaw_notify|gzclose|gzcompress|gzdecode|gzdeflate|' + + 'gzencode|gzeof|gzfile|gzgetc|gzgets|gzgetss|gzinflate|gzopen|gzpassthru|gzputs|gzread|gzrewind|gzseek|gztell|gzuncompress|gzwrite|' + + 'halt_compiler|haruannotation|haruannotation_setborderstyle|haruannotation_sethighlightmode|haruannotation_seticon|' + + 'haruannotation_setopened|harudestination|harudestination_setfit|harudestination_setfitb|harudestination_setfitbh|harudestination_setfitbv|' + + 'harudestination_setfith|harudestination_setfitr|harudestination_setfitv|harudestination_setxyz|harudoc|harudoc_addpage|' + + 'harudoc_addpagelabel|harudoc_construct|harudoc_createoutline|harudoc_getcurrentencoder|harudoc_getcurrentpage|harudoc_getencoder|' + + 'harudoc_getfont|harudoc_getinfoattr|harudoc_getpagelayout|harudoc_getpagemode|harudoc_getstreamsize|harudoc_insertpage|harudoc_loadjpeg|' + + 'harudoc_loadpng|harudoc_loadraw|harudoc_loadttc|harudoc_loadttf|harudoc_loadtype1|harudoc_output|harudoc_readfromstream|' + + 'harudoc_reseterror|harudoc_resetstream|harudoc_save|harudoc_savetostream|harudoc_setcompressionmode|harudoc_setcurrentencoder|' + + 'harudoc_setencryptionmode|harudoc_setinfoattr|harudoc_setinfodateattr|harudoc_setopenaction|harudoc_setpagelayout|harudoc_setpagemode|' + + 'harudoc_setpagesconfiguration|harudoc_setpassword|harudoc_setpermission|harudoc_usecnsencodings|harudoc_usecnsfonts|' + + 'harudoc_usecntencodings|harudoc_usecntfonts|harudoc_usejpencodings|harudoc_usejpfonts|harudoc_usekrencodings|harudoc_usekrfonts|' + + 'haruencoder|haruencoder_getbytetype|haruencoder_gettype|haruencoder_getunicode|haruencoder_getwritingmode|haruexception|harufont|' + + 'harufont_getascent|harufont_getcapheight|harufont_getdescent|harufont_getencodingname|harufont_getfontname|harufont_gettextwidth|' + + 'harufont_getunicodewidth|harufont_getxheight|harufont_measuretext|haruimage|haruimage_getbitspercomponent|haruimage_getcolorspace|' + + 'haruimage_getheight|haruimage_getsize|haruimage_getwidth|haruimage_setcolormask|haruimage_setmaskimage|haruoutline|' + + 'haruoutline_setdestination|haruoutline_setopened|harupage|harupage_arc|harupage_begintext|harupage_circle|harupage_closepath|' + + 'harupage_concat|harupage_createdestination|harupage_createlinkannotation|harupage_createtextannotation|harupage_createurlannotation|' + + 'harupage_curveto|harupage_curveto2|harupage_curveto3|harupage_drawimage|harupage_ellipse|harupage_endpath|harupage_endtext|' + + 'harupage_eofill|harupage_eofillstroke|harupage_fill|harupage_fillstroke|harupage_getcharspace|harupage_getcmykfill|harupage_getcmykstroke|' + + 'harupage_getcurrentfont|harupage_getcurrentfontsize|harupage_getcurrentpos|harupage_getcurrenttextpos|harupage_getdash|' + + 'harupage_getfillingcolorspace|harupage_getflatness|harupage_getgmode|harupage_getgrayfill|harupage_getgraystroke|harupage_getheight|' + + 'harupage_gethorizontalscaling|harupage_getlinecap|harupage_getlinejoin|harupage_getlinewidth|harupage_getmiterlimit|harupage_getrgbfill|' + + 'harupage_getrgbstroke|harupage_getstrokingcolorspace|harupage_gettextleading|harupage_gettextmatrix|harupage_gettextrenderingmode|' + + 'harupage_gettextrise|harupage_gettextwidth|harupage_gettransmatrix|harupage_getwidth|harupage_getwordspace|harupage_lineto|' + + 'harupage_measuretext|harupage_movetextpos|harupage_moveto|harupage_movetonextline|harupage_rectangle|harupage_setcharspace|' + + 'harupage_setcmykfill|harupage_setcmykstroke|harupage_setdash|harupage_setflatness|harupage_setfontandsize|harupage_setgrayfill|' + + 'harupage_setgraystroke|harupage_setheight|harupage_sethorizontalscaling|harupage_setlinecap|harupage_setlinejoin|harupage_setlinewidth|' + + 'harupage_setmiterlimit|harupage_setrgbfill|harupage_setrgbstroke|harupage_setrotate|harupage_setsize|harupage_setslideshow|' + + 'harupage_settextleading|harupage_settextmatrix|harupage_settextrenderingmode|harupage_settextrise|harupage_setwidth|harupage_setwordspace|' + + 'harupage_showtext|harupage_showtextnextline|harupage_stroke|harupage_textout|harupage_textrect|hasconstant|hash|hash_algos|hash_copy|' + + 'hash_file|hash_final|hash_hmac|hash_hmac_file|hash_init|hash_update|hash_update_file|hash_update_stream|hasmethod|hasproperty|header|' + + 'header_register_callback|header_remove|headers_list|headers_sent|hebrev|hebrevc|hex2bin|hexdec|highlight_file|highlight_string|' + + 'html_entity_decode|htmlentities|htmlspecialchars|htmlspecialchars_decode|http_build_cookie|http_build_query|http_build_str|http_build_url|' + + 'http_cache_etag|http_cache_last_modified|http_chunked_decode|http_date|http_deflate|http_get|http_get_request_body|' + + 'http_get_request_body_stream|http_get_request_headers|http_head|http_inflate|http_match_etag|http_match_modified|' + + 'http_match_request_header|http_negotiate_charset|http_negotiate_content_type|http_negotiate_language|http_parse_cookie|http_parse_headers|' + + 'http_parse_message|http_parse_params|http_persistent_handles_clean|http_persistent_handles_count|http_persistent_handles_ident|' + + 'http_post_data|http_post_fields|http_put_data|http_put_file|http_put_stream|http_redirect|http_request|http_request_body_encode|' + + 'http_request_method_exists|http_request_method_name|http_request_method_register|http_request_method_unregister|http_response_code|' + + 'http_send_content_disposition|http_send_content_type|http_send_data|http_send_file|http_send_last_modified|http_send_status|' + + 'http_send_stream|http_support|http_throttle|httpdeflatestream|httpdeflatestream_construct|httpdeflatestream_factory|' + + 'httpdeflatestream_finish|httpdeflatestream_flush|httpdeflatestream_update|httpinflatestream|httpinflatestream_construct|' + + 'httpinflatestream_factory|httpinflatestream_finish|httpinflatestream_flush|httpinflatestream_update|httpmessage|httpmessage_addheaders|' + + 'httpmessage_construct|httpmessage_detach|httpmessage_factory|httpmessage_fromenv|httpmessage_fromstring|httpmessage_getbody|' + + 'httpmessage_getheader|httpmessage_getheaders|httpmessage_gethttpversion|httpmessage_getparentmessage|httpmessage_getrequestmethod|' + + 'httpmessage_getrequesturl|httpmessage_getresponsecode|httpmessage_getresponsestatus|httpmessage_gettype|httpmessage_guesscontenttype|' + + 'httpmessage_prepend|httpmessage_reverse|httpmessage_send|httpmessage_setbody|httpmessage_setheaders|httpmessage_sethttpversion|' + + 'httpmessage_setrequestmethod|httpmessage_setrequesturl|httpmessage_setresponsecode|httpmessage_setresponsestatus|httpmessage_settype|' + + 'httpmessage_tomessagetypeobject|httpmessage_tostring|httpquerystring|httpquerystring_construct|httpquerystring_get|httpquerystring_mod|' + + 'httpquerystring_set|httpquerystring_singleton|httpquerystring_toarray|httpquerystring_tostring|httpquerystring_xlate|httprequest|' + + 'httprequest_addcookies|httprequest_addheaders|httprequest_addpostfields|httprequest_addpostfile|httprequest_addputdata|' + + 'httprequest_addquerydata|httprequest_addrawpostdata|httprequest_addssloptions|httprequest_clearhistory|httprequest_construct|' + + 'httprequest_enablecookies|httprequest_getcontenttype|httprequest_getcookies|httprequest_getheaders|httprequest_gethistory|' + + 'httprequest_getmethod|httprequest_getoptions|httprequest_getpostfields|httprequest_getpostfiles|httprequest_getputdata|' + + 'httprequest_getputfile|httprequest_getquerydata|httprequest_getrawpostdata|httprequest_getrawrequestmessage|' + + 'httprequest_getrawresponsemessage|httprequest_getrequestmessage|httprequest_getresponsebody|httprequest_getresponsecode|' + + 'httprequest_getresponsecookies|httprequest_getresponsedata|httprequest_getresponseheader|httprequest_getresponseinfo|' + + 'httprequest_getresponsemessage|httprequest_getresponsestatus|httprequest_getssloptions|httprequest_geturl|httprequest_resetcookies|' + + 'httprequest_send|httprequest_setcontenttype|httprequest_setcookies|httprequest_setheaders|httprequest_setmethod|httprequest_setoptions|' + + 'httprequest_setpostfields|httprequest_setpostfiles|httprequest_setputdata|httprequest_setputfile|httprequest_setquerydata|' + + 'httprequest_setrawpostdata|httprequest_setssloptions|httprequest_seturl|httprequestpool|httprequestpool_attach|httprequestpool_construct|' + + 'httprequestpool_destruct|httprequestpool_detach|httprequestpool_getattachedrequests|httprequestpool_getfinishedrequests|' + + 'httprequestpool_reset|httprequestpool_send|httprequestpool_socketperform|httprequestpool_socketselect|httpresponse|httpresponse_capture|' + + 'httpresponse_getbuffersize|httpresponse_getcache|httpresponse_getcachecontrol|httpresponse_getcontentdisposition|' + + 'httpresponse_getcontenttype|httpresponse_getdata|httpresponse_getetag|httpresponse_getfile|httpresponse_getgzip|httpresponse_getheader|' + + 'httpresponse_getlastmodified|httpresponse_getrequestbody|httpresponse_getrequestbodystream|httpresponse_getrequestheaders|' + + 'httpresponse_getstream|httpresponse_getthrottledelay|httpresponse_guesscontenttype|httpresponse_redirect|httpresponse_send|' + + 'httpresponse_setbuffersize|httpresponse_setcache|httpresponse_setcachecontrol|httpresponse_setcontentdisposition|' + + 'httpresponse_setcontenttype|httpresponse_setdata|httpresponse_setetag|httpresponse_setfile|httpresponse_setgzip|httpresponse_setheader|' + + 'httpresponse_setlastmodified|httpresponse_setstream|httpresponse_setthrottledelay|httpresponse_status|hw_array2objrec|hw_changeobject|' + + 'hw_children|hw_childrenobj|hw_close|hw_connect|hw_connection_info|hw_cp|hw_deleteobject|hw_docbyanchor|hw_docbyanchorobj|' + + 'hw_document_attributes|hw_document_bodytag|hw_document_content|hw_document_setcontent|hw_document_size|hw_dummy|hw_edittext|hw_error|' + + 'hw_errormsg|hw_free_document|hw_getanchors|hw_getanchorsobj|hw_getandlock|hw_getchildcoll|hw_getchildcollobj|hw_getchilddoccoll|' + + 'hw_getchilddoccollobj|hw_getobject|hw_getobjectbyquery|hw_getobjectbyquerycoll|hw_getobjectbyquerycollobj|hw_getobjectbyqueryobj|' + + 'hw_getparents|hw_getparentsobj|hw_getrellink|hw_getremote|hw_getremotechildren|hw_getsrcbydestobj|hw_gettext|hw_getusername|hw_identify|' + + 'hw_incollections|hw_info|hw_inscoll|hw_insdoc|hw_insertanchors|hw_insertdocument|hw_insertobject|hw_mapid|hw_modifyobject|hw_mv|' + + 'hw_new_document|hw_objrec2array|hw_output_document|hw_pconnect|hw_pipedocument|hw_root|hw_setlinkroot|hw_stat|hw_unlock|hw_who|' + + 'hwapi_attribute|hwapi_attribute_key|hwapi_attribute_langdepvalue|hwapi_attribute_value|hwapi_attribute_values|hwapi_checkin|' + + 'hwapi_checkout|hwapi_children|hwapi_content|hwapi_content_mimetype|hwapi_content_read|hwapi_copy|hwapi_dbstat|hwapi_dcstat|' + + 'hwapi_dstanchors|hwapi_dstofsrcanchor|hwapi_error_count|hwapi_error_reason|hwapi_find|hwapi_ftstat|hwapi_hgcsp|hwapi_hwstat|' + + 'hwapi_identify|hwapi_info|hwapi_insert|hwapi_insertanchor|hwapi_insertcollection|hwapi_insertdocument|hwapi_link|hwapi_lock|hwapi_move|' + + 'hwapi_new_content|hwapi_object|hwapi_object_assign|hwapi_object_attreditable|hwapi_object_count|hwapi_object_insert|hwapi_object_new|' + + 'hwapi_object_remove|hwapi_object_title|hwapi_object_value|hwapi_objectbyanchor|hwapi_parents|hwapi_reason_description|hwapi_reason_type|' + + 'hwapi_remove|hwapi_replace|hwapi_setcommittedversion|hwapi_srcanchors|hwapi_srcsofdst|hwapi_unlock|hwapi_user|hwapi_userlist|hypot|' + + 'ibase_add_user|ibase_affected_rows|ibase_backup|ibase_blob_add|ibase_blob_cancel|ibase_blob_close|ibase_blob_create|ibase_blob_echo|' + + 'ibase_blob_get|ibase_blob_import|ibase_blob_info|ibase_blob_open|ibase_close|ibase_commit|ibase_commit_ret|ibase_connect|ibase_db_info|' + + 'ibase_delete_user|ibase_drop_db|ibase_errcode|ibase_errmsg|ibase_execute|ibase_fetch_assoc|ibase_fetch_object|ibase_fetch_row|' + + 'ibase_field_info|ibase_free_event_handler|ibase_free_query|ibase_free_result|ibase_gen_id|ibase_maintain_db|ibase_modify_user|' + + 'ibase_name_result|ibase_num_fields|ibase_num_params|ibase_param_info|ibase_pconnect|ibase_prepare|ibase_query|ibase_restore|' + + 'ibase_rollback|ibase_rollback_ret|ibase_server_info|ibase_service_attach|ibase_service_detach|ibase_set_event_handler|ibase_timefmt|' + + 'ibase_trans|ibase_wait_event|iconv|iconv_get_encoding|iconv_mime_decode|iconv_mime_decode_headers|iconv_mime_encode|iconv_set_encoding|' + + 'iconv_strlen|iconv_strpos|iconv_strrpos|iconv_substr|id3_get_frame_long_name|id3_get_frame_short_name|id3_get_genre_id|id3_get_genre_list|' + + 'id3_get_genre_name|id3_get_tag|id3_get_version|id3_remove_tag|id3_set_tag|id3v2attachedpictureframe|id3v2frame|id3v2tag|idate|' + + 'idn_to_ascii|idn_to_unicode|idn_to_utf8|ifx_affected_rows|ifx_blobinfile_mode|ifx_byteasvarchar|ifx_close|ifx_connect|ifx_copy_blob|' + + 'ifx_create_blob|ifx_create_char|ifx_do|ifx_error|ifx_errormsg|ifx_fetch_row|ifx_fieldproperties|ifx_fieldtypes|ifx_free_blob|' + + 'ifx_free_char|ifx_free_result|ifx_get_blob|ifx_get_char|ifx_getsqlca|ifx_htmltbl_result|ifx_nullformat|ifx_num_fields|ifx_num_rows|' + + 'ifx_pconnect|ifx_prepare|ifx_query|ifx_textasvarchar|ifx_update_blob|ifx_update_char|ifxus_close_slob|ifxus_create_slob|ifxus_free_slob|' + + 'ifxus_open_slob|ifxus_read_slob|ifxus_seek_slob|ifxus_tell_slob|ifxus_write_slob|ignore_user_abort|iis_add_server|iis_get_dir_security|' + + 'iis_get_script_map|iis_get_server_by_comment|iis_get_server_by_path|iis_get_server_rights|iis_get_service_state|iis_remove_server|' + + 'iis_set_app_settings|iis_set_dir_security|iis_set_script_map|iis_set_server_rights|iis_start_server|iis_start_service|iis_stop_server|' + + 'iis_stop_service|image2wbmp|image_type_to_extension|image_type_to_mime_type|imagealphablending|imageantialias|imagearc|imagechar|' + + 'imagecharup|imagecolorallocate|imagecolorallocatealpha|imagecolorat|imagecolorclosest|imagecolorclosestalpha|imagecolorclosesthwb|' + + 'imagecolordeallocate|imagecolorexact|imagecolorexactalpha|imagecolormatch|imagecolorresolve|imagecolorresolvealpha|imagecolorset|' + + 'imagecolorsforindex|imagecolorstotal|imagecolortransparent|imageconvolution|imagecopy|imagecopymerge|imagecopymergegray|' + + 'imagecopyresampled|imagecopyresized|imagecreate|imagecreatefromgd|imagecreatefromgd2|imagecreatefromgd2part|imagecreatefromgif|' + + 'imagecreatefromjpeg|imagecreatefrompng|imagecreatefromstring|imagecreatefromwbmp|imagecreatefromxbm|imagecreatefromxpm|' + + 'imagecreatetruecolor|imagedashedline|imagedestroy|imageellipse|imagefill|imagefilledarc|imagefilledellipse|imagefilledpolygon|' + + 'imagefilledrectangle|imagefilltoborder|imagefilter|imagefontheight|imagefontwidth|imageftbbox|imagefttext|imagegammacorrect|imagegd|' + + 'imagegd2|imagegif|imagegrabscreen|imagegrabwindow|imageinterlace|imageistruecolor|imagejpeg|imagelayereffect|imageline|imageloadfont|' + + 'imagepalettecopy|imagepng|imagepolygon|imagepsbbox|imagepsencodefont|imagepsextendfont|imagepsfreefont|imagepsloadfont|imagepsslantfont|' + + 'imagepstext|imagerectangle|imagerotate|imagesavealpha|imagesetbrush|imagesetpixel|imagesetstyle|imagesetthickness|imagesettile|' + + 'imagestring|imagestringup|imagesx|imagesy|imagetruecolortopalette|imagettfbbox|imagettftext|imagetypes|imagewbmp|imagexbm|imagick|' + + 'imagick_adaptiveblurimage|imagick_adaptiveresizeimage|imagick_adaptivesharpenimage|imagick_adaptivethresholdimage|imagick_addimage|' + + 'imagick_addnoiseimage|imagick_affinetransformimage|imagick_animateimages|imagick_annotateimage|imagick_appendimages|imagick_averageimages|' + + 'imagick_blackthresholdimage|imagick_blurimage|imagick_borderimage|imagick_charcoalimage|imagick_chopimage|imagick_clear|imagick_clipimage|' + + 'imagick_clippathimage|imagick_clone|imagick_clutimage|imagick_coalesceimages|imagick_colorfloodfillimage|imagick_colorizeimage|' + + 'imagick_combineimages|imagick_commentimage|imagick_compareimagechannels|imagick_compareimagelayers|imagick_compareimages|' + + 'imagick_compositeimage|imagick_construct|imagick_contrastimage|imagick_contraststretchimage|imagick_convolveimage|imagick_cropimage|' + + 'imagick_cropthumbnailimage|imagick_current|imagick_cyclecolormapimage|imagick_decipherimage|imagick_deconstructimages|' + + 'imagick_deleteimageartifact|imagick_despeckleimage|imagick_destroy|imagick_displayimage|imagick_displayimages|imagick_distortimage|' + + 'imagick_drawimage|imagick_edgeimage|imagick_embossimage|imagick_encipherimage|imagick_enhanceimage|imagick_equalizeimage|' + + 'imagick_evaluateimage|imagick_extentimage|imagick_flattenimages|imagick_flipimage|imagick_floodfillpaintimage|imagick_flopimage|' + + 'imagick_frameimage|imagick_fximage|imagick_gammaimage|imagick_gaussianblurimage|imagick_getcolorspace|imagick_getcompression|' + + 'imagick_getcompressionquality|imagick_getcopyright|imagick_getfilename|imagick_getfont|imagick_getformat|imagick_getgravity|' + + 'imagick_gethomeurl|imagick_getimage|imagick_getimagealphachannel|imagick_getimageartifact|imagick_getimagebackgroundcolor|' + + 'imagick_getimageblob|imagick_getimageblueprimary|imagick_getimagebordercolor|imagick_getimagechanneldepth|' + + 'imagick_getimagechanneldistortion|imagick_getimagechanneldistortions|imagick_getimagechannelextrema|imagick_getimagechannelmean|' + + 'imagick_getimagechannelrange|imagick_getimagechannelstatistics|imagick_getimageclipmask|imagick_getimagecolormapcolor|' + + 'imagick_getimagecolors|imagick_getimagecolorspace|imagick_getimagecompose|imagick_getimagecompression|imagick_getimagecompressionquality|' + + 'imagick_getimagedelay|imagick_getimagedepth|imagick_getimagedispose|imagick_getimagedistortion|imagick_getimageextrema|' + + 'imagick_getimagefilename|imagick_getimageformat|imagick_getimagegamma|imagick_getimagegeometry|imagick_getimagegravity|' + + 'imagick_getimagegreenprimary|imagick_getimageheight|imagick_getimagehistogram|imagick_getimageindex|imagick_getimageinterlacescheme|' + + 'imagick_getimageinterpolatemethod|imagick_getimageiterations|imagick_getimagelength|imagick_getimagemagicklicense|imagick_getimagematte|' + + 'imagick_getimagemattecolor|imagick_getimageorientation|imagick_getimagepage|imagick_getimagepixelcolor|imagick_getimageprofile|' + + 'imagick_getimageprofiles|imagick_getimageproperties|imagick_getimageproperty|imagick_getimageredprimary|imagick_getimageregion|' + + 'imagick_getimagerenderingintent|imagick_getimageresolution|imagick_getimagesblob|imagick_getimagescene|imagick_getimagesignature|' + + 'imagick_getimagesize|imagick_getimagetickspersecond|imagick_getimagetotalinkdensity|imagick_getimagetype|imagick_getimageunits|' + + 'imagick_getimagevirtualpixelmethod|imagick_getimagewhitepoint|imagick_getimagewidth|imagick_getinterlacescheme|imagick_getiteratorindex|' + + 'imagick_getnumberimages|imagick_getoption|imagick_getpackagename|imagick_getpage|imagick_getpixeliterator|imagick_getpixelregioniterator|' + + 'imagick_getpointsize|imagick_getquantumdepth|imagick_getquantumrange|imagick_getreleasedate|imagick_getresource|imagick_getresourcelimit|' + + 'imagick_getsamplingfactors|imagick_getsize|imagick_getsizeoffset|imagick_getversion|imagick_hasnextimage|imagick_haspreviousimage|' + + 'imagick_identifyimage|imagick_implodeimage|imagick_labelimage|imagick_levelimage|imagick_linearstretchimage|imagick_liquidrescaleimage|' + + 'imagick_magnifyimage|imagick_mapimage|imagick_mattefloodfillimage|imagick_medianfilterimage|imagick_mergeimagelayers|imagick_minifyimage|' + + 'imagick_modulateimage|imagick_montageimage|imagick_morphimages|imagick_mosaicimages|imagick_motionblurimage|imagick_negateimage|' + + 'imagick_newimage|imagick_newpseudoimage|imagick_nextimage|imagick_normalizeimage|imagick_oilpaintimage|imagick_opaquepaintimage|' + + 'imagick_optimizeimagelayers|imagick_orderedposterizeimage|imagick_paintfloodfillimage|imagick_paintopaqueimage|' + + 'imagick_painttransparentimage|imagick_pingimage|imagick_pingimageblob|imagick_pingimagefile|imagick_polaroidimage|imagick_posterizeimage|' + + 'imagick_previewimages|imagick_previousimage|imagick_profileimage|imagick_quantizeimage|imagick_quantizeimages|imagick_queryfontmetrics|' + + 'imagick_queryfonts|imagick_queryformats|imagick_radialblurimage|imagick_raiseimage|imagick_randomthresholdimage|imagick_readimage|' + + 'imagick_readimageblob|imagick_readimagefile|imagick_recolorimage|imagick_reducenoiseimage|imagick_removeimage|imagick_removeimageprofile|' + + 'imagick_render|imagick_resampleimage|imagick_resetimagepage|imagick_resizeimage|imagick_rollimage|imagick_rotateimage|' + + 'imagick_roundcorners|imagick_sampleimage|imagick_scaleimage|imagick_separateimagechannel|imagick_sepiatoneimage|' + + 'imagick_setbackgroundcolor|imagick_setcolorspace|imagick_setcompression|imagick_setcompressionquality|imagick_setfilename|' + + 'imagick_setfirstiterator|imagick_setfont|imagick_setformat|imagick_setgravity|imagick_setimage|imagick_setimagealphachannel|' + + 'imagick_setimageartifact|imagick_setimagebackgroundcolor|imagick_setimagebias|imagick_setimageblueprimary|imagick_setimagebordercolor|' + + 'imagick_setimagechanneldepth|imagick_setimageclipmask|imagick_setimagecolormapcolor|imagick_setimagecolorspace|imagick_setimagecompose|' + + 'imagick_setimagecompression|imagick_setimagecompressionquality|imagick_setimagedelay|imagick_setimagedepth|imagick_setimagedispose|' + + 'imagick_setimageextent|imagick_setimagefilename|imagick_setimageformat|imagick_setimagegamma|imagick_setimagegravity|' + + 'imagick_setimagegreenprimary|imagick_setimageindex|imagick_setimageinterlacescheme|imagick_setimageinterpolatemethod|' + + 'imagick_setimageiterations|imagick_setimagematte|imagick_setimagemattecolor|imagick_setimageopacity|imagick_setimageorientation|' + + 'imagick_setimagepage|imagick_setimageprofile|imagick_setimageproperty|imagick_setimageredprimary|imagick_setimagerenderingintent|' + + 'imagick_setimageresolution|imagick_setimagescene|imagick_setimagetickspersecond|imagick_setimagetype|imagick_setimageunits|' + + 'imagick_setimagevirtualpixelmethod|imagick_setimagewhitepoint|imagick_setinterlacescheme|imagick_setiteratorindex|imagick_setlastiterator|' + + 'imagick_setoption|imagick_setpage|imagick_setpointsize|imagick_setresolution|imagick_setresourcelimit|imagick_setsamplingfactors|' + + 'imagick_setsize|imagick_setsizeoffset|imagick_settype|imagick_shadeimage|imagick_shadowimage|imagick_sharpenimage|imagick_shaveimage|' + + 'imagick_shearimage|imagick_sigmoidalcontrastimage|imagick_sketchimage|imagick_solarizeimage|imagick_spliceimage|imagick_spreadimage|' + + 'imagick_steganoimage|imagick_stereoimage|imagick_stripimage|imagick_swirlimage|imagick_textureimage|imagick_thresholdimage|' + + 'imagick_thumbnailimage|imagick_tintimage|imagick_transformimage|imagick_transparentpaintimage|imagick_transposeimage|' + + 'imagick_transverseimage|imagick_trimimage|imagick_uniqueimagecolors|imagick_unsharpmaskimage|imagick_valid|imagick_vignetteimage|' + + 'imagick_waveimage|imagick_whitethresholdimage|imagick_writeimage|imagick_writeimagefile|imagick_writeimages|imagick_writeimagesfile|' + + 'imagickdraw|imagickdraw_affine|imagickdraw_annotation|imagickdraw_arc|imagickdraw_bezier|imagickdraw_circle|imagickdraw_clear|' + + 'imagickdraw_clone|imagickdraw_color|imagickdraw_comment|imagickdraw_composite|imagickdraw_construct|imagickdraw_destroy|' + + 'imagickdraw_ellipse|imagickdraw_getclippath|imagickdraw_getcliprule|imagickdraw_getclipunits|imagickdraw_getfillcolor|' + + 'imagickdraw_getfillopacity|imagickdraw_getfillrule|imagickdraw_getfont|imagickdraw_getfontfamily|imagickdraw_getfontsize|' + + 'imagickdraw_getfontstyle|imagickdraw_getfontweight|imagickdraw_getgravity|imagickdraw_getstrokeantialias|imagickdraw_getstrokecolor|' + + 'imagickdraw_getstrokedasharray|imagickdraw_getstrokedashoffset|imagickdraw_getstrokelinecap|imagickdraw_getstrokelinejoin|' + + 'imagickdraw_getstrokemiterlimit|imagickdraw_getstrokeopacity|imagickdraw_getstrokewidth|imagickdraw_gettextalignment|' + + 'imagickdraw_gettextantialias|imagickdraw_gettextdecoration|imagickdraw_gettextencoding|imagickdraw_gettextundercolor|' + + 'imagickdraw_getvectorgraphics|imagickdraw_line|imagickdraw_matte|imagickdraw_pathclose|imagickdraw_pathcurvetoabsolute|' + + 'imagickdraw_pathcurvetoquadraticbezierabsolute|imagickdraw_pathcurvetoquadraticbezierrelative|' + + 'imagickdraw_pathcurvetoquadraticbeziersmoothabsolute|imagickdraw_pathcurvetoquadraticbeziersmoothrelative|imagickdraw_pathcurvetorelative|' + + 'imagickdraw_pathcurvetosmoothabsolute|imagickdraw_pathcurvetosmoothrelative|imagickdraw_pathellipticarcabsolute|' + + 'imagickdraw_pathellipticarcrelative|imagickdraw_pathfinish|imagickdraw_pathlinetoabsolute|imagickdraw_pathlinetohorizontalabsolute|' + + 'imagickdraw_pathlinetohorizontalrelative|imagickdraw_pathlinetorelative|imagickdraw_pathlinetoverticalabsolute|' + + 'imagickdraw_pathlinetoverticalrelative|imagickdraw_pathmovetoabsolute|imagickdraw_pathmovetorelative|imagickdraw_pathstart|' + + 'imagickdraw_point|imagickdraw_polygon|imagickdraw_polyline|imagickdraw_pop|imagickdraw_popclippath|imagickdraw_popdefs|' + + 'imagickdraw_poppattern|imagickdraw_push|imagickdraw_pushclippath|imagickdraw_pushdefs|imagickdraw_pushpattern|imagickdraw_rectangle|' + + 'imagickdraw_render|imagickdraw_rotate|imagickdraw_roundrectangle|imagickdraw_scale|imagickdraw_setclippath|imagickdraw_setcliprule|' + + 'imagickdraw_setclipunits|imagickdraw_setfillalpha|imagickdraw_setfillcolor|imagickdraw_setfillopacity|imagickdraw_setfillpatternurl|' + + 'imagickdraw_setfillrule|imagickdraw_setfont|imagickdraw_setfontfamily|imagickdraw_setfontsize|imagickdraw_setfontstretch|' + + 'imagickdraw_setfontstyle|imagickdraw_setfontweight|imagickdraw_setgravity|imagickdraw_setstrokealpha|imagickdraw_setstrokeantialias|' + + 'imagickdraw_setstrokecolor|imagickdraw_setstrokedasharray|imagickdraw_setstrokedashoffset|imagickdraw_setstrokelinecap|' + + 'imagickdraw_setstrokelinejoin|imagickdraw_setstrokemiterlimit|imagickdraw_setstrokeopacity|imagickdraw_setstrokepatternurl|' + + 'imagickdraw_setstrokewidth|imagickdraw_settextalignment|imagickdraw_settextantialias|imagickdraw_settextdecoration|' + + 'imagickdraw_settextencoding|imagickdraw_settextundercolor|imagickdraw_setvectorgraphics|imagickdraw_setviewbox|imagickdraw_skewx|' + + 'imagickdraw_skewy|imagickdraw_translate|imagickpixel|imagickpixel_clear|imagickpixel_construct|imagickpixel_destroy|imagickpixel_getcolor|' + + 'imagickpixel_getcolorasstring|imagickpixel_getcolorcount|imagickpixel_getcolorvalue|imagickpixel_gethsl|imagickpixel_issimilar|' + + 'imagickpixel_setcolor|imagickpixel_setcolorvalue|imagickpixel_sethsl|imagickpixeliterator|imagickpixeliterator_clear|' + + 'imagickpixeliterator_construct|imagickpixeliterator_destroy|imagickpixeliterator_getcurrentiteratorrow|' + + 'imagickpixeliterator_getiteratorrow|imagickpixeliterator_getnextiteratorrow|imagickpixeliterator_getpreviousiteratorrow|' + + 'imagickpixeliterator_newpixeliterator|imagickpixeliterator_newpixelregioniterator|imagickpixeliterator_resetiterator|' + + 'imagickpixeliterator_setiteratorfirstrow|imagickpixeliterator_setiteratorlastrow|imagickpixeliterator_setiteratorrow|' + + 'imagickpixeliterator_synciterator|imap_8bit|imap_alerts|imap_append|imap_base64|imap_binary|imap_body|imap_bodystruct|imap_check|' + + 'imap_clearflag_full|imap_close|imap_create|imap_createmailbox|imap_delete|imap_deletemailbox|imap_errors|imap_expunge|imap_fetch_overview|' + + 'imap_fetchbody|imap_fetchheader|imap_fetchmime|imap_fetchstructure|imap_fetchtext|imap_gc|imap_get_quota|imap_get_quotaroot|imap_getacl|' + + 'imap_getmailboxes|imap_getsubscribed|imap_header|imap_headerinfo|imap_headers|imap_last_error|imap_list|imap_listmailbox|imap_listscan|' + + 'imap_listsubscribed|imap_lsub|imap_mail|imap_mail_compose|imap_mail_copy|imap_mail_move|imap_mailboxmsginfo|imap_mime_header_decode|' + + 'imap_msgno|imap_num_msg|imap_num_recent|imap_open|imap_ping|imap_qprint|imap_rename|imap_renamemailbox|imap_reopen|' + + 'imap_rfc822_parse_adrlist|imap_rfc822_parse_headers|imap_rfc822_write_address|imap_savebody|imap_scan|imap_scanmailbox|imap_search|' + + 'imap_set_quota|imap_setacl|imap_setflag_full|imap_sort|imap_status|imap_subscribe|imap_thread|imap_timeout|imap_uid|imap_undelete|' + + 'imap_unsubscribe|imap_utf7_decode|imap_utf7_encode|imap_utf8|implementsinterface|implode|import_request_variables|in_array|include|' + + 'include_once|inclued_get_data|inet_ntop|inet_pton|infiniteiterator|ingres_autocommit|ingres_autocommit_state|ingres_charset|ingres_close|' + + 'ingres_commit|ingres_connect|ingres_cursor|ingres_errno|ingres_error|ingres_errsqlstate|ingres_escape_string|ingres_execute|' + + 'ingres_fetch_array|ingres_fetch_assoc|ingres_fetch_object|ingres_fetch_proc_return|ingres_fetch_row|ingres_field_length|ingres_field_name|' + + 'ingres_field_nullable|ingres_field_precision|ingres_field_scale|ingres_field_type|ingres_free_result|ingres_next_error|ingres_num_fields|' + + 'ingres_num_rows|ingres_pconnect|ingres_prepare|ingres_query|ingres_result_seek|ingres_rollback|ingres_set_environment|' + + 'ingres_unbuffered_query|ini_alter|ini_get|ini_get_all|ini_restore|ini_set|innamespace|inotify_add_watch|inotify_init|inotify_queue_len|' + + 'inotify_read|inotify_rm_watch|interface_exists|intl_error_name|intl_get_error_code|intl_get_error_message|intl_is_failure|' + + 'intldateformatter|intval|invalidargumentexception|invoke|invokeargs|ip2long|iptcembed|iptcparse|is_a|is_array|is_bool|is_callable|is_dir|' + + 'is_double|is_executable|is_file|is_finite|is_float|is_infinite|is_int|is_integer|is_link|is_long|is_nan|is_null|is_numeric|is_object|' + + 'is_readable|is_real|is_resource|is_scalar|is_soap_fault|is_string|is_subclass_of|is_uploaded_file|is_writable|is_writeable|isabstract|' + + 'iscloneable|isdisabled|isfinal|isinstance|isinstantiable|isinterface|isinternal|isiterateable|isset|issubclassof|isuserdefined|iterator|' + + 'iterator_apply|iterator_count|iterator_to_array|iteratoraggregate|iteratoriterator|java_last_exception_clear|java_last_exception_get|' + + 'jddayofweek|jdmonthname|jdtofrench|jdtogregorian|jdtojewish|jdtojulian|jdtounix|jewishtojd|join|jpeg2wbmp|json_decode|json_encode|' + + 'json_last_error|jsonserializable|judy|judy_type|judy_version|juliantojd|kadm5_chpass_principal|kadm5_create_principal|' + + 'kadm5_delete_principal|kadm5_destroy|kadm5_flush|kadm5_get_policies|kadm5_get_principal|kadm5_get_principals|kadm5_init_with_password|' + + 'kadm5_modify_principal|key|krsort|ksort|lcfirst|lcg_value|lchgrp|lchown|ldap_8859_to_t61|ldap_add|ldap_bind|ldap_close|ldap_compare|' + + 'ldap_connect|ldap_count_entries|ldap_delete|ldap_dn2ufn|ldap_err2str|ldap_errno|ldap_error|ldap_explode_dn|ldap_first_attribute|' + + 'ldap_first_entry|ldap_first_reference|ldap_free_result|ldap_get_attributes|ldap_get_dn|ldap_get_entries|ldap_get_option|ldap_get_values|' + + 'ldap_get_values_len|ldap_list|ldap_mod_add|ldap_mod_del|ldap_mod_replace|ldap_modify|ldap_next_attribute|ldap_next_entry|' + + 'ldap_next_reference|ldap_parse_reference|ldap_parse_result|ldap_read|ldap_rename|ldap_sasl_bind|ldap_search|ldap_set_option|' + + 'ldap_set_rebind_proc|ldap_sort|ldap_start_tls|ldap_t61_to_8859|ldap_unbind|lengthexception|levenshtein|libxml_clear_errors|' + + 'libxml_disable_entity_loader|libxml_get_errors|libxml_get_last_error|libxml_set_streams_context|libxml_use_internal_errors|libxmlerror|' + + 'limititerator|link|linkinfo|list|locale|localeconv|localtime|log|log10|log1p|logicexception|long2ip|lstat|ltrim|lzf_compress|' + + 'lzf_decompress|lzf_optimized_for|m_checkstatus|m_completeauthorizations|m_connect|m_connectionerror|m_deletetrans|m_destroyconn|' + + 'm_destroyengine|m_getcell|m_getcellbynum|m_getcommadelimited|m_getheader|m_initconn|m_initengine|m_iscommadelimited|m_maxconntimeout|' + + 'm_monitor|m_numcolumns|m_numrows|m_parsecommadelimited|m_responsekeys|m_responseparam|m_returnstatus|m_setblocking|m_setdropfile|m_setip|' + + 'm_setssl|m_setssl_cafile|m_setssl_files|m_settimeout|m_sslcert_gen_hash|m_transactionssent|m_transinqueue|m_transkeyval|m_transnew|' + + 'm_transsend|m_uwait|m_validateidentifier|m_verifyconnection|m_verifysslcert|magic_quotes_runtime|mail|' + + 'mailparse_determine_best_xfer_encoding|mailparse_msg_create|mailparse_msg_extract_part|mailparse_msg_extract_part_file|' + + 'mailparse_msg_extract_whole_part_file|mailparse_msg_free|mailparse_msg_get_part|mailparse_msg_get_part_data|mailparse_msg_get_structure|' + + 'mailparse_msg_parse|mailparse_msg_parse_file|mailparse_rfc822_parse_addresses|mailparse_stream_encode|mailparse_uudecode_all|main|max|' + + 'maxdb_affected_rows|maxdb_autocommit|maxdb_bind_param|maxdb_bind_result|maxdb_change_user|maxdb_character_set_name|maxdb_client_encoding|' + + 'maxdb_close|maxdb_close_long_data|maxdb_commit|maxdb_connect|maxdb_connect_errno|maxdb_connect_error|maxdb_data_seek|maxdb_debug|' + + 'maxdb_disable_reads_from_master|maxdb_disable_rpl_parse|maxdb_dump_debug_info|maxdb_embedded_connect|maxdb_enable_reads_from_master|' + + 'maxdb_enable_rpl_parse|maxdb_errno|maxdb_error|maxdb_escape_string|maxdb_execute|maxdb_fetch|maxdb_fetch_array|maxdb_fetch_assoc|' + + 'maxdb_fetch_field|maxdb_fetch_field_direct|maxdb_fetch_fields|maxdb_fetch_lengths|maxdb_fetch_object|maxdb_fetch_row|maxdb_field_count|' + + 'maxdb_field_seek|maxdb_field_tell|maxdb_free_result|maxdb_get_client_info|maxdb_get_client_version|maxdb_get_host_info|maxdb_get_metadata|' + + 'maxdb_get_proto_info|maxdb_get_server_info|maxdb_get_server_version|maxdb_info|maxdb_init|maxdb_insert_id|maxdb_kill|maxdb_master_query|' + + 'maxdb_more_results|maxdb_multi_query|maxdb_next_result|maxdb_num_fields|maxdb_num_rows|maxdb_options|maxdb_param_count|maxdb_ping|' + + 'maxdb_prepare|maxdb_query|maxdb_real_connect|maxdb_real_escape_string|maxdb_real_query|maxdb_report|maxdb_rollback|' + + 'maxdb_rpl_parse_enabled|maxdb_rpl_probe|maxdb_rpl_query_type|maxdb_select_db|maxdb_send_long_data|maxdb_send_query|maxdb_server_end|' + + 'maxdb_server_init|maxdb_set_opt|maxdb_sqlstate|maxdb_ssl_set|maxdb_stat|maxdb_stmt_affected_rows|maxdb_stmt_bind_param|' + + 'maxdb_stmt_bind_result|maxdb_stmt_close|maxdb_stmt_close_long_data|maxdb_stmt_data_seek|maxdb_stmt_errno|maxdb_stmt_error|' + + 'maxdb_stmt_execute|maxdb_stmt_fetch|maxdb_stmt_free_result|maxdb_stmt_init|maxdb_stmt_num_rows|maxdb_stmt_param_count|maxdb_stmt_prepare|' + + 'maxdb_stmt_reset|maxdb_stmt_result_metadata|maxdb_stmt_send_long_data|maxdb_stmt_sqlstate|maxdb_stmt_store_result|maxdb_store_result|' + + 'maxdb_thread_id|maxdb_thread_safe|maxdb_use_result|maxdb_warning_count|mb_check_encoding|mb_convert_case|mb_convert_encoding|' + + 'mb_convert_kana|mb_convert_variables|mb_decode_mimeheader|mb_decode_numericentity|mb_detect_encoding|mb_detect_order|mb_encode_mimeheader|' + + 'mb_encode_numericentity|mb_encoding_aliases|mb_ereg|mb_ereg_match|mb_ereg_replace|mb_ereg_search|mb_ereg_search_getpos|' + + 'mb_ereg_search_getregs|mb_ereg_search_init|mb_ereg_search_pos|mb_ereg_search_regs|mb_ereg_search_setpos|mb_eregi|mb_eregi_replace|' + + 'mb_get_info|mb_http_input|mb_http_output|mb_internal_encoding|mb_language|mb_list_encodings|mb_output_handler|mb_parse_str|' + + 'mb_preferred_mime_name|mb_regex_encoding|mb_regex_set_options|mb_send_mail|mb_split|mb_strcut|mb_strimwidth|mb_stripos|mb_stristr|' + + 'mb_strlen|mb_strpos|mb_strrchr|mb_strrichr|mb_strripos|mb_strrpos|mb_strstr|mb_strtolower|mb_strtoupper|mb_strwidth|' + + 'mb_substitute_character|mb_substr|mb_substr_count|mcrypt_cbc|mcrypt_cfb|mcrypt_create_iv|mcrypt_decrypt|mcrypt_ecb|' + + 'mcrypt_enc_get_algorithms_name|mcrypt_enc_get_block_size|mcrypt_enc_get_iv_size|mcrypt_enc_get_key_size|mcrypt_enc_get_modes_name|' + + 'mcrypt_enc_get_supported_key_sizes|mcrypt_enc_is_block_algorithm|mcrypt_enc_is_block_algorithm_mode|mcrypt_enc_is_block_mode|' + + 'mcrypt_enc_self_test|mcrypt_encrypt|mcrypt_generic|mcrypt_generic_deinit|mcrypt_generic_end|mcrypt_generic_init|mcrypt_get_block_size|' + + 'mcrypt_get_cipher_name|mcrypt_get_iv_size|mcrypt_get_key_size|mcrypt_list_algorithms|mcrypt_list_modes|mcrypt_module_close|' + + 'mcrypt_module_get_algo_block_size|mcrypt_module_get_algo_key_size|mcrypt_module_get_supported_key_sizes|mcrypt_module_is_block_algorithm|' + + 'mcrypt_module_is_block_algorithm_mode|mcrypt_module_is_block_mode|mcrypt_module_open|mcrypt_module_self_test|mcrypt_ofb|md5|md5_file|' + + 'mdecrypt_generic|memcache|memcache_debug|memcached|memory_get_peak_usage|memory_get_usage|messageformatter|metaphone|method_exists|mhash|' + + 'mhash_count|mhash_get_block_size|mhash_get_hash_name|mhash_keygen_s2k|microtime|mime_content_type|min|ming_keypress|' + + 'ming_setcubicthreshold|ming_setscale|ming_setswfcompression|ming_useconstants|ming_useswfversion|mkdir|mktime|money_format|mongo|' + + 'mongobindata|mongocode|mongocollection|mongoconnectionexception|mongocursor|mongocursorexception|mongocursortimeoutexception|mongodate|' + + 'mongodb|mongodbref|mongoexception|mongogridfs|mongogridfscursor|mongogridfsexception|mongogridfsfile|mongoid|mongoint32|mongoint64|' + + 'mongomaxkey|mongominkey|mongoregex|mongotimestamp|move_uploaded_file|mpegfile|mqseries_back|mqseries_begin|mqseries_close|mqseries_cmit|' + + 'mqseries_conn|mqseries_connx|mqseries_disc|mqseries_get|mqseries_inq|mqseries_open|mqseries_put|mqseries_put1|mqseries_set|' + + 'mqseries_strerror|msession_connect|msession_count|msession_create|msession_destroy|msession_disconnect|msession_find|msession_get|' + + 'msession_get_array|msession_get_data|msession_inc|msession_list|msession_listvar|msession_lock|msession_plugin|msession_randstr|' + + 'msession_set|msession_set_array|msession_set_data|msession_timeout|msession_uniq|msession_unlock|msg_get_queue|msg_queue_exists|' + + 'msg_receive|msg_remove_queue|msg_send|msg_set_queue|msg_stat_queue|msql|msql_affected_rows|msql_close|msql_connect|msql_create_db|' + + 'msql_createdb|msql_data_seek|msql_db_query|msql_dbname|msql_drop_db|msql_error|msql_fetch_array|msql_fetch_field|msql_fetch_object|' + + 'msql_fetch_row|msql_field_flags|msql_field_len|msql_field_name|msql_field_seek|msql_field_table|msql_field_type|msql_fieldflags|' + + 'msql_fieldlen|msql_fieldname|msql_fieldtable|msql_fieldtype|msql_free_result|msql_list_dbs|msql_list_fields|msql_list_tables|' + + 'msql_num_fields|msql_num_rows|msql_numfields|msql_numrows|msql_pconnect|msql_query|msql_regcase|msql_result|msql_select_db|msql_tablename|' + + 'mssql_bind|mssql_close|mssql_connect|mssql_data_seek|mssql_execute|mssql_fetch_array|mssql_fetch_assoc|mssql_fetch_batch|' + + 'mssql_fetch_field|mssql_fetch_object|mssql_fetch_row|mssql_field_length|mssql_field_name|mssql_field_seek|mssql_field_type|' + + 'mssql_free_result|mssql_free_statement|mssql_get_last_message|mssql_guid_string|mssql_init|mssql_min_error_severity|' + + 'mssql_min_message_severity|mssql_next_result|mssql_num_fields|mssql_num_rows|mssql_pconnect|mssql_query|mssql_result|mssql_rows_affected|' + + 'mssql_select_db|mt_getrandmax|mt_rand|mt_srand|multipleiterator|mysql_affected_rows|mysql_client_encoding|mysql_close|mysql_connect|' + + 'mysql_create_db|mysql_data_seek|mysql_db_name|mysql_db_query|mysql_drop_db|mysql_errno|mysql_error|mysql_escape_string|mysql_fetch_array|' + + 'mysql_fetch_assoc|mysql_fetch_field|mysql_fetch_lengths|mysql_fetch_object|mysql_fetch_row|mysql_field_flags|mysql_field_len|' + + 'mysql_field_name|mysql_field_seek|mysql_field_table|mysql_field_type|mysql_free_result|mysql_get_client_info|mysql_get_host_info|' + + 'mysql_get_proto_info|mysql_get_server_info|mysql_info|mysql_insert_id|mysql_list_dbs|mysql_list_fields|mysql_list_processes|' + + 'mysql_list_tables|mysql_num_fields|mysql_num_rows|mysql_pconnect|mysql_ping|mysql_query|mysql_real_escape_string|mysql_result|' + + 'mysql_select_db|mysql_set_charset|mysql_stat|mysql_tablename|mysql_thread_id|mysql_unbuffered_query|mysqli|mysqli_affected_rows|' + + 'mysqli_autocommit|mysqli_bind_param|mysqli_bind_result|mysqli_cache_stats|mysqli_change_user|mysqli_character_set_name|' + + 'mysqli_client_encoding|mysqli_close|mysqli_commit|mysqli_connect|mysqli_connect_errno|mysqli_connect_error|mysqli_data_seek|' + + 'mysqli_debug|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_driver|mysqli_dump_debug_info|mysqli_embedded_server_end|' + + 'mysqli_embedded_server_start|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_errno|mysqli_error|mysqli_escape_string|' + + 'mysqli_execute|mysqli_fetch|mysqli_fetch_all|mysqli_fetch_array|mysqli_fetch_assoc|mysqli_fetch_field|mysqli_fetch_field_direct|' + + 'mysqli_fetch_fields|mysqli_fetch_lengths|mysqli_fetch_object|mysqli_fetch_row|mysqli_field_count|mysqli_field_seek|mysqli_field_tell|' + + 'mysqli_free_result|mysqli_get_charset|mysqli_get_client_info|mysqli_get_client_stats|mysqli_get_client_version|mysqli_get_connection_stats|' + + 'mysqli_get_host_info|mysqli_get_metadata|mysqli_get_proto_info|mysqli_get_server_info|mysqli_get_server_version|mysqli_get_warnings|' + + 'mysqli_info|mysqli_init|mysqli_insert_id|mysqli_kill|mysqli_link_construct|mysqli_master_query|mysqli_more_results|mysqli_multi_query|' + + 'mysqli_next_result|mysqli_num_fields|mysqli_num_rows|mysqli_options|mysqli_param_count|mysqli_ping|mysqli_poll|mysqli_prepare|' + + 'mysqli_query|mysqli_real_connect|mysqli_real_escape_string|mysqli_real_query|mysqli_reap_async_query|mysqli_refresh|mysqli_report|' + + 'mysqli_result|mysqli_rollback|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|mysqli_select_db|mysqli_send_long_data|' + + 'mysqli_send_query|mysqli_set_charset|mysqli_set_local_infile_default|mysqli_set_local_infile_handler|mysqli_set_opt|mysqli_slave_query|' + + 'mysqli_sqlstate|mysqli_ssl_set|mysqli_stat|mysqli_stmt|mysqli_stmt_affected_rows|mysqli_stmt_attr_get|mysqli_stmt_attr_set|' + + 'mysqli_stmt_bind_param|mysqli_stmt_bind_result|mysqli_stmt_close|mysqli_stmt_data_seek|mysqli_stmt_errno|mysqli_stmt_error|' + + 'mysqli_stmt_execute|mysqli_stmt_fetch|mysqli_stmt_field_count|mysqli_stmt_free_result|mysqli_stmt_get_result|mysqli_stmt_get_warnings|' + + 'mysqli_stmt_init|mysqli_stmt_insert_id|mysqli_stmt_next_result|mysqli_stmt_num_rows|mysqli_stmt_param_count|mysqli_stmt_prepare|' + + 'mysqli_stmt_reset|mysqli_stmt_result_metadata|mysqli_stmt_send_long_data|mysqli_stmt_sqlstate|mysqli_stmt_store_result|mysqli_store_result|' + + 'mysqli_thread_id|mysqli_thread_safe|mysqli_use_result|mysqli_warning|mysqli_warning_count|mysqlnd_ms_get_stats|' + + 'mysqlnd_ms_query_is_select|mysqlnd_ms_set_user_pick_server|mysqlnd_qc_change_handler|mysqlnd_qc_clear_cache|mysqlnd_qc_get_cache_info|' + + 'mysqlnd_qc_get_core_stats|mysqlnd_qc_get_handler|mysqlnd_qc_get_query_trace_log|mysqlnd_qc_set_user_handlers|natcasesort|natsort|' + + 'ncurses_addch|ncurses_addchnstr|ncurses_addchstr|ncurses_addnstr|ncurses_addstr|ncurses_assume_default_colors|ncurses_attroff|' + + 'ncurses_attron|ncurses_attrset|ncurses_baudrate|ncurses_beep|ncurses_bkgd|ncurses_bkgdset|ncurses_border|ncurses_bottom_panel|' + + 'ncurses_can_change_color|ncurses_cbreak|ncurses_clear|ncurses_clrtobot|ncurses_clrtoeol|ncurses_color_content|ncurses_color_set|' + + 'ncurses_curs_set|ncurses_def_prog_mode|ncurses_def_shell_mode|ncurses_define_key|ncurses_del_panel|ncurses_delay_output|ncurses_delch|' + + 'ncurses_deleteln|ncurses_delwin|ncurses_doupdate|ncurses_echo|ncurses_echochar|ncurses_end|ncurses_erase|ncurses_erasechar|ncurses_filter|' + + 'ncurses_flash|ncurses_flushinp|ncurses_getch|ncurses_getmaxyx|ncurses_getmouse|ncurses_getyx|ncurses_halfdelay|ncurses_has_colors|' + + 'ncurses_has_ic|ncurses_has_il|ncurses_has_key|ncurses_hide_panel|ncurses_hline|ncurses_inch|ncurses_init|ncurses_init_color|' + + 'ncurses_init_pair|ncurses_insch|ncurses_insdelln|ncurses_insertln|ncurses_insstr|ncurses_instr|ncurses_isendwin|ncurses_keyok|' + + 'ncurses_keypad|ncurses_killchar|ncurses_longname|ncurses_meta|ncurses_mouse_trafo|ncurses_mouseinterval|ncurses_mousemask|ncurses_move|' + + 'ncurses_move_panel|ncurses_mvaddch|ncurses_mvaddchnstr|ncurses_mvaddchstr|ncurses_mvaddnstr|ncurses_mvaddstr|ncurses_mvcur|' + + 'ncurses_mvdelch|ncurses_mvgetch|ncurses_mvhline|ncurses_mvinch|ncurses_mvvline|ncurses_mvwaddstr|ncurses_napms|ncurses_new_panel|' + + 'ncurses_newpad|ncurses_newwin|ncurses_nl|ncurses_nocbreak|ncurses_noecho|ncurses_nonl|ncurses_noqiflush|ncurses_noraw|' + + 'ncurses_pair_content|ncurses_panel_above|ncurses_panel_below|ncurses_panel_window|ncurses_pnoutrefresh|ncurses_prefresh|ncurses_putp|' + + 'ncurses_qiflush|ncurses_raw|ncurses_refresh|ncurses_replace_panel|ncurses_reset_prog_mode|ncurses_reset_shell_mode|ncurses_resetty|' + + 'ncurses_savetty|ncurses_scr_dump|ncurses_scr_init|ncurses_scr_restore|ncurses_scr_set|ncurses_scrl|ncurses_show_panel|ncurses_slk_attr|' + + 'ncurses_slk_attroff|ncurses_slk_attron|ncurses_slk_attrset|ncurses_slk_clear|ncurses_slk_color|ncurses_slk_init|ncurses_slk_noutrefresh|' + + 'ncurses_slk_refresh|ncurses_slk_restore|ncurses_slk_set|ncurses_slk_touch|ncurses_standend|ncurses_standout|ncurses_start_color|' + + 'ncurses_termattrs|ncurses_termname|ncurses_timeout|ncurses_top_panel|ncurses_typeahead|ncurses_ungetch|ncurses_ungetmouse|' + + 'ncurses_update_panels|ncurses_use_default_colors|ncurses_use_env|ncurses_use_extended_names|ncurses_vidattr|ncurses_vline|ncurses_waddch|' + + 'ncurses_waddstr|ncurses_wattroff|ncurses_wattron|ncurses_wattrset|ncurses_wborder|ncurses_wclear|ncurses_wcolor_set|ncurses_werase|' + + 'ncurses_wgetch|ncurses_whline|ncurses_wmouse_trafo|ncurses_wmove|ncurses_wnoutrefresh|ncurses_wrefresh|ncurses_wstandend|' + + 'ncurses_wstandout|ncurses_wvline|newinstance|newinstanceargs|newt_bell|newt_button|newt_button_bar|newt_centered_window|newt_checkbox|' + + 'newt_checkbox_get_value|newt_checkbox_set_flags|newt_checkbox_set_value|newt_checkbox_tree|newt_checkbox_tree_add_item|' + + 'newt_checkbox_tree_find_item|newt_checkbox_tree_get_current|newt_checkbox_tree_get_entry_value|newt_checkbox_tree_get_multi_selection|' + + 'newt_checkbox_tree_get_selection|newt_checkbox_tree_multi|newt_checkbox_tree_set_current|newt_checkbox_tree_set_entry|' + + 'newt_checkbox_tree_set_entry_value|newt_checkbox_tree_set_width|newt_clear_key_buffer|newt_cls|newt_compact_button|' + + 'newt_component_add_callback|newt_component_takes_focus|newt_create_grid|newt_cursor_off|newt_cursor_on|newt_delay|newt_draw_form|' + + 'newt_draw_root_text|newt_entry|newt_entry_get_value|newt_entry_set|newt_entry_set_filter|newt_entry_set_flags|newt_finished|newt_form|' + + 'newt_form_add_component|newt_form_add_components|newt_form_add_hot_key|newt_form_destroy|newt_form_get_current|newt_form_run|' + + 'newt_form_set_background|newt_form_set_height|newt_form_set_size|newt_form_set_timer|newt_form_set_width|newt_form_watch_fd|' + + 'newt_get_screen_size|newt_grid_add_components_to_form|newt_grid_basic_window|newt_grid_free|newt_grid_get_size|newt_grid_h_close_stacked|' + + 'newt_grid_h_stacked|newt_grid_place|newt_grid_set_field|newt_grid_simple_window|newt_grid_v_close_stacked|newt_grid_v_stacked|' + + 'newt_grid_wrapped_window|newt_grid_wrapped_window_at|newt_init|newt_label|newt_label_set_text|newt_listbox|newt_listbox_append_entry|' + + 'newt_listbox_clear|newt_listbox_clear_selection|newt_listbox_delete_entry|newt_listbox_get_current|newt_listbox_get_selection|' + + 'newt_listbox_insert_entry|newt_listbox_item_count|newt_listbox_select_item|newt_listbox_set_current|newt_listbox_set_current_by_key|' + + 'newt_listbox_set_data|newt_listbox_set_entry|newt_listbox_set_width|newt_listitem|newt_listitem_get_data|newt_listitem_set|' + + 'newt_open_window|newt_pop_help_line|newt_pop_window|newt_push_help_line|newt_radio_get_current|newt_radiobutton|newt_redraw_help_line|' + + 'newt_reflow_text|newt_refresh|newt_resize_screen|newt_resume|newt_run_form|newt_scale|newt_scale_set|newt_scrollbar_set|' + + 'newt_set_help_callback|newt_set_suspend_callback|newt_suspend|newt_textbox|newt_textbox_get_num_lines|newt_textbox_reflowed|' + + 'newt_textbox_set_height|newt_textbox_set_text|newt_vertical_scrollbar|newt_wait_for_key|newt_win_choice|newt_win_entries|newt_win_menu|' + + 'newt_win_message|newt_win_messagev|newt_win_ternary|next|ngettext|nl2br|nl_langinfo|norewinditerator|normalizer|notes_body|notes_copy_db|' + + 'notes_create_db|notes_create_note|notes_drop_db|notes_find_note|notes_header_info|notes_list_msgs|notes_mark_read|notes_mark_unread|' + + 'notes_nav_create|notes_search|notes_unread|notes_version|nsapi_request_headers|nsapi_response_headers|nsapi_virtual|nthmac|number_format|' + + 'numberformatter|oauth|oauth_get_sbs|oauth_urlencode|oauthexception|oauthprovider|ob_clean|ob_deflatehandler|ob_end_clean|ob_end_flush|' + + 'ob_etaghandler|ob_flush|ob_get_clean|ob_get_contents|ob_get_flush|ob_get_length|ob_get_level|ob_get_status|ob_gzhandler|ob_iconv_handler|' + + 'ob_implicit_flush|ob_inflatehandler|ob_list_handlers|ob_start|ob_tidyhandler|oci_bind_array_by_name|oci_bind_by_name|oci_cancel|' + + 'oci_client_version|oci_close|oci_collection_append|oci_collection_assign|oci_collection_element_assign|oci_collection_element_get|' + + 'oci_collection_free|oci_collection_max|oci_collection_size|oci_collection_trim|oci_commit|oci_connect|oci_define_by_name|oci_error|' + + 'oci_execute|oci_fetch|oci_fetch_all|oci_fetch_array|oci_fetch_assoc|oci_fetch_object|oci_fetch_row|oci_field_is_null|oci_field_name|' + + 'oci_field_precision|oci_field_scale|oci_field_size|oci_field_type|oci_field_type_raw|oci_free_statement|oci_internal_debug|oci_lob_append|' + + 'oci_lob_close|oci_lob_copy|oci_lob_eof|oci_lob_erase|oci_lob_export|oci_lob_flush|oci_lob_free|oci_lob_getbuffering|oci_lob_import|' + + 'oci_lob_is_equal|oci_lob_load|oci_lob_read|oci_lob_rewind|oci_lob_save|oci_lob_savefile|oci_lob_seek|oci_lob_setbuffering|oci_lob_size|' + + 'oci_lob_tell|oci_lob_truncate|oci_lob_write|oci_lob_writetemporary|oci_lob_writetofile|oci_new_collection|oci_new_connect|oci_new_cursor|' + + 'oci_new_descriptor|oci_num_fields|oci_num_rows|oci_parse|oci_password_change|oci_pconnect|oci_result|oci_rollback|oci_server_version|' + + 'oci_set_action|oci_set_client_identifier|oci_set_client_info|oci_set_edition|oci_set_module_name|oci_set_prefetch|oci_statement_type|' + + 'ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|' + + 'ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|' + + 'ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|' + + 'ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|' + + 'ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|' + + 'octdec|odbc_autocommit|odbc_binmode|odbc_close|odbc_close_all|odbc_columnprivileges|odbc_columns|odbc_commit|odbc_connect|odbc_cursor|' + + 'odbc_data_source|odbc_do|odbc_error|odbc_errormsg|odbc_exec|odbc_execute|odbc_fetch_array|odbc_fetch_into|odbc_fetch_object|' + + 'odbc_fetch_row|odbc_field_len|odbc_field_name|odbc_field_num|odbc_field_precision|odbc_field_scale|odbc_field_type|odbc_foreignkeys|' + + 'odbc_free_result|odbc_gettypeinfo|odbc_longreadlen|odbc_next_result|odbc_num_fields|odbc_num_rows|odbc_pconnect|odbc_prepare|' + + 'odbc_primarykeys|odbc_procedurecolumns|odbc_procedures|odbc_result|odbc_result_all|odbc_rollback|odbc_setoption|odbc_specialcolumns|' + + 'odbc_statistics|odbc_tableprivileges|odbc_tables|openal_buffer_create|openal_buffer_data|openal_buffer_destroy|openal_buffer_get|' + + 'openal_buffer_loadwav|openal_context_create|openal_context_current|openal_context_destroy|openal_context_process|openal_context_suspend|' + + 'openal_device_close|openal_device_open|openal_listener_get|openal_listener_set|openal_source_create|openal_source_destroy|' + + 'openal_source_get|openal_source_pause|openal_source_play|openal_source_rewind|openal_source_set|openal_source_stop|openal_stream|opendir|' + + 'openlog|openssl_cipher_iv_length|openssl_csr_export|openssl_csr_export_to_file|openssl_csr_get_public_key|openssl_csr_get_subject|' + + 'openssl_csr_new|openssl_csr_sign|openssl_decrypt|openssl_dh_compute_key|openssl_digest|openssl_encrypt|openssl_error_string|' + + 'openssl_free_key|openssl_get_cipher_methods|openssl_get_md_methods|openssl_get_privatekey|openssl_get_publickey|openssl_open|' + + 'openssl_pkcs12_export|openssl_pkcs12_export_to_file|openssl_pkcs12_read|openssl_pkcs7_decrypt|openssl_pkcs7_encrypt|openssl_pkcs7_sign|' + + 'openssl_pkcs7_verify|openssl_pkey_export|openssl_pkey_export_to_file|openssl_pkey_free|openssl_pkey_get_details|openssl_pkey_get_private|' + + 'openssl_pkey_get_public|openssl_pkey_new|openssl_private_decrypt|openssl_private_encrypt|openssl_public_decrypt|openssl_public_encrypt|' + + 'openssl_random_pseudo_bytes|openssl_seal|openssl_sign|openssl_verify|openssl_x509_check_private_key|openssl_x509_checkpurpose|' + + 'openssl_x509_export|openssl_x509_export_to_file|openssl_x509_free|openssl_x509_parse|openssl_x509_read|ord|outeriterator|' + + 'outofboundsexception|outofrangeexception|output_add_rewrite_var|output_reset_rewrite_vars|overflowexception|overload|override_function|' + + 'ovrimos_close|ovrimos_commit|ovrimos_connect|ovrimos_cursor|ovrimos_exec|ovrimos_execute|ovrimos_fetch_into|ovrimos_fetch_row|' + + 'ovrimos_field_len|ovrimos_field_name|ovrimos_field_num|ovrimos_field_type|ovrimos_free_result|ovrimos_longreadlen|ovrimos_num_fields|' + + 'ovrimos_num_rows|ovrimos_prepare|ovrimos_result|ovrimos_result_all|ovrimos_rollback|pack|parentiterator|parse_ini_file|parse_ini_string|' + + 'parse_str|parse_url|parsekit_compile_file|parsekit_compile_string|parsekit_func_arginfo|passthru|pathinfo|pclose|pcntl_alarm|pcntl_exec|' + + 'pcntl_fork|pcntl_getpriority|pcntl_setpriority|pcntl_signal|pcntl_signal_dispatch|pcntl_sigprocmask|pcntl_sigtimedwait|pcntl_sigwaitinfo|' + + 'pcntl_wait|pcntl_waitpid|pcntl_wexitstatus|pcntl_wifexited|pcntl_wifsignaled|pcntl_wifstopped|pcntl_wstopsig|pcntl_wtermsig|' + + 'pdf_activate_item|pdf_add_annotation|pdf_add_bookmark|pdf_add_launchlink|pdf_add_locallink|pdf_add_nameddest|pdf_add_note|pdf_add_outline|' + + 'pdf_add_pdflink|pdf_add_table_cell|pdf_add_textflow|pdf_add_thumbnail|pdf_add_weblink|pdf_arc|pdf_arcn|pdf_attach_file|pdf_begin_document|' + + 'pdf_begin_font|pdf_begin_glyph|pdf_begin_item|pdf_begin_layer|pdf_begin_page|pdf_begin_page_ext|pdf_begin_pattern|pdf_begin_template|' + + 'pdf_begin_template_ext|pdf_circle|pdf_clip|pdf_close|pdf_close_image|pdf_close_pdi|pdf_close_pdi_page|pdf_closepath|' + + 'pdf_closepath_fill_stroke|pdf_closepath_stroke|pdf_concat|pdf_continue_text|pdf_create_3dview|pdf_create_action|pdf_create_annotation|' + + 'pdf_create_bookmark|pdf_create_field|pdf_create_fieldgroup|pdf_create_gstate|pdf_create_pvf|pdf_create_textflow|pdf_curveto|' + + 'pdf_define_layer|pdf_delete|pdf_delete_pvf|pdf_delete_table|pdf_delete_textflow|pdf_encoding_set_char|pdf_end_document|pdf_end_font|' + + 'pdf_end_glyph|pdf_end_item|pdf_end_layer|pdf_end_page|pdf_end_page_ext|pdf_end_pattern|pdf_end_template|pdf_endpath|pdf_fill|' + + 'pdf_fill_imageblock|pdf_fill_pdfblock|pdf_fill_stroke|pdf_fill_textblock|pdf_findfont|pdf_fit_image|pdf_fit_pdi_page|pdf_fit_table|' + + 'pdf_fit_textflow|pdf_fit_textline|pdf_get_apiname|pdf_get_buffer|pdf_get_errmsg|pdf_get_errnum|pdf_get_font|pdf_get_fontname|' + + 'pdf_get_fontsize|pdf_get_image_height|pdf_get_image_width|pdf_get_majorversion|pdf_get_minorversion|pdf_get_parameter|' + + 'pdf_get_pdi_parameter|pdf_get_pdi_value|pdf_get_value|pdf_info_font|pdf_info_matchbox|pdf_info_table|pdf_info_textflow|pdf_info_textline|' + + 'pdf_initgraphics|pdf_lineto|pdf_load_3ddata|pdf_load_font|pdf_load_iccprofile|pdf_load_image|pdf_makespotcolor|pdf_moveto|pdf_new|' + + 'pdf_open_ccitt|pdf_open_file|pdf_open_gif|pdf_open_image|pdf_open_image_file|pdf_open_jpeg|pdf_open_memory_image|pdf_open_pdi|' + + 'pdf_open_pdi_document|pdf_open_pdi_page|pdf_open_tiff|pdf_pcos_get_number|pdf_pcos_get_stream|pdf_pcos_get_string|pdf_place_image|' + + 'pdf_place_pdi_page|pdf_process_pdi|pdf_rect|pdf_restore|pdf_resume_page|pdf_rotate|pdf_save|pdf_scale|pdf_set_border_color|' + + 'pdf_set_border_dash|pdf_set_border_style|pdf_set_char_spacing|pdf_set_duration|pdf_set_gstate|pdf_set_horiz_scaling|pdf_set_info|' + + 'pdf_set_info_author|pdf_set_info_creator|pdf_set_info_keywords|pdf_set_info_subject|pdf_set_info_title|pdf_set_layer_dependency|' + + 'pdf_set_leading|pdf_set_parameter|pdf_set_text_matrix|pdf_set_text_pos|pdf_set_text_rendering|pdf_set_text_rise|pdf_set_value|' + + 'pdf_set_word_spacing|pdf_setcolor|pdf_setdash|pdf_setdashpattern|pdf_setflat|pdf_setfont|pdf_setgray|pdf_setgray_fill|pdf_setgray_stroke|' + + 'pdf_setlinecap|pdf_setlinejoin|pdf_setlinewidth|pdf_setmatrix|pdf_setmiterlimit|pdf_setpolydash|pdf_setrgbcolor|pdf_setrgbcolor_fill|' + + 'pdf_setrgbcolor_stroke|pdf_shading|pdf_shading_pattern|pdf_shfill|pdf_show|pdf_show_boxed|pdf_show_xy|pdf_skew|pdf_stringwidth|pdf_stroke|' + + 'pdf_suspend_page|pdf_translate|pdf_utf16_to_utf8|pdf_utf32_to_utf16|pdf_utf8_to_utf16|pdo|pdo_cubrid_schema|pdo_pgsqllobcreate|' + + 'pdo_pgsqllobopen|pdo_pgsqllobunlink|pdo_sqlitecreateaggregate|pdo_sqlitecreatefunction|pdoexception|pdostatement|pfsockopen|' + + 'pg_affected_rows|pg_cancel_query|pg_client_encoding|pg_close|pg_connect|pg_connection_busy|pg_connection_reset|pg_connection_status|' + + 'pg_convert|pg_copy_from|pg_copy_to|pg_dbname|pg_delete|pg_end_copy|pg_escape_bytea|pg_escape_string|pg_execute|pg_fetch_all|' + + 'pg_fetch_all_columns|pg_fetch_array|pg_fetch_assoc|pg_fetch_object|pg_fetch_result|pg_fetch_row|pg_field_is_null|pg_field_name|' + + 'pg_field_num|pg_field_prtlen|pg_field_size|pg_field_table|pg_field_type|pg_field_type_oid|pg_free_result|pg_get_notify|pg_get_pid|' + + 'pg_get_result|pg_host|pg_insert|pg_last_error|pg_last_notice|pg_last_oid|pg_lo_close|pg_lo_create|pg_lo_export|pg_lo_import|pg_lo_open|' + + 'pg_lo_read|pg_lo_read_all|pg_lo_seek|pg_lo_tell|pg_lo_unlink|pg_lo_write|pg_meta_data|pg_num_fields|pg_num_rows|pg_options|' + + 'pg_parameter_status|pg_pconnect|pg_ping|pg_port|pg_prepare|pg_put_line|pg_query|pg_query_params|pg_result_error|pg_result_error_field|' + + 'pg_result_seek|pg_result_status|pg_select|pg_send_execute|pg_send_prepare|pg_send_query|pg_send_query_params|pg_set_client_encoding|' + + 'pg_set_error_verbosity|pg_trace|pg_transaction_status|pg_tty|pg_unescape_bytea|pg_untrace|pg_update|pg_version|php_check_syntax|' + + 'php_ini_loaded_file|php_ini_scanned_files|php_logo_guid|php_sapi_name|php_strip_whitespace|php_uname|phpcredits|phpinfo|phpversion|pi|' + + 'png2wbmp|popen|pos|posix_access|posix_ctermid|posix_errno|posix_get_last_error|posix_getcwd|posix_getegid|posix_geteuid|posix_getgid|' + + 'posix_getgrgid|posix_getgrnam|posix_getgroups|posix_getlogin|posix_getpgid|posix_getpgrp|posix_getpid|posix_getppid|posix_getpwnam|' + + 'posix_getpwuid|posix_getrlimit|posix_getsid|posix_getuid|posix_initgroups|posix_isatty|posix_kill|posix_mkfifo|posix_mknod|posix_setegid|' + + 'posix_seteuid|posix_setgid|posix_setpgid|posix_setsid|posix_setuid|posix_strerror|posix_times|posix_ttyname|posix_uname|pow|preg_filter|' + + 'preg_grep|preg_last_error|preg_match|preg_match_all|preg_quote|preg_replace|preg_replace_callback|preg_split|prev|print|print_r|' + + 'printer_abort|printer_close|printer_create_brush|printer_create_dc|printer_create_font|printer_create_pen|printer_delete_brush|' + + 'printer_delete_dc|printer_delete_font|printer_delete_pen|printer_draw_bmp|printer_draw_chord|printer_draw_elipse|printer_draw_line|' + + 'printer_draw_pie|printer_draw_rectangle|printer_draw_roundrect|printer_draw_text|printer_end_doc|printer_end_page|printer_get_option|' + + 'printer_list|printer_logical_fontheight|printer_open|printer_select_brush|printer_select_font|printer_select_pen|printer_set_option|' + + 'printer_start_doc|printer_start_page|printer_write|printf|proc_close|proc_get_status|proc_nice|proc_open|proc_terminate|property_exists|' + + 'ps_add_bookmark|ps_add_launchlink|ps_add_locallink|ps_add_note|ps_add_pdflink|ps_add_weblink|ps_arc|ps_arcn|ps_begin_page|' + + 'ps_begin_pattern|ps_begin_template|ps_circle|ps_clip|ps_close|ps_close_image|ps_closepath|ps_closepath_stroke|ps_continue_text|ps_curveto|' + + 'ps_delete|ps_end_page|ps_end_pattern|ps_end_template|ps_fill|ps_fill_stroke|ps_findfont|ps_get_buffer|ps_get_parameter|ps_get_value|' + + 'ps_hyphenate|ps_include_file|ps_lineto|ps_makespotcolor|ps_moveto|ps_new|ps_open_file|ps_open_image|ps_open_image_file|' + + 'ps_open_memory_image|ps_place_image|ps_rect|ps_restore|ps_rotate|ps_save|ps_scale|ps_set_border_color|ps_set_border_dash|' + + 'ps_set_border_style|ps_set_info|ps_set_parameter|ps_set_text_pos|ps_set_value|ps_setcolor|ps_setdash|ps_setflat|ps_setfont|ps_setgray|' + + 'ps_setlinecap|ps_setlinejoin|ps_setlinewidth|ps_setmiterlimit|ps_setoverprintmode|ps_setpolydash|ps_shading|ps_shading_pattern|ps_shfill|' + + 'ps_show|ps_show2|ps_show_boxed|ps_show_xy|ps_show_xy2|ps_string_geometry|ps_stringwidth|ps_stroke|ps_symbol|ps_symbol_name|' + + 'ps_symbol_width|ps_translate|pspell_add_to_personal|pspell_add_to_session|pspell_check|pspell_clear_session|pspell_config_create|' + + 'pspell_config_data_dir|pspell_config_dict_dir|pspell_config_ignore|pspell_config_mode|pspell_config_personal|pspell_config_repl|' + + 'pspell_config_runtogether|pspell_config_save_repl|pspell_new|pspell_new_config|pspell_new_personal|pspell_save_wordlist|' + + 'pspell_store_replacement|pspell_suggest|putenv|px_close|px_create_fp|px_date2string|px_delete|px_delete_record|px_get_field|px_get_info|' + + 'px_get_parameter|px_get_record|px_get_schema|px_get_value|px_insert_record|px_new|px_numfields|px_numrecords|px_open_fp|px_put_record|' + + 'px_retrieve_record|px_set_blob_file|px_set_parameter|px_set_tablename|px_set_targetencoding|px_set_value|px_timestamp2string|' + + 'px_update_record|qdom_error|qdom_tree|quoted_printable_decode|quoted_printable_encode|quotemeta|rad2deg|radius_acct_open|' + + 'radius_add_server|radius_auth_open|radius_close|radius_config|radius_create_request|radius_cvt_addr|radius_cvt_int|radius_cvt_string|' + + 'radius_demangle|radius_demangle_mppe_key|radius_get_attr|radius_get_vendor_attr|radius_put_addr|radius_put_attr|radius_put_int|' + + 'radius_put_string|radius_put_vendor_addr|radius_put_vendor_attr|radius_put_vendor_int|radius_put_vendor_string|' + + 'radius_request_authenticator|radius_send_request|radius_server_secret|radius_strerror|rand|range|rangeexception|rar_wrapper_cache_stats|' + + 'rararchive|rarentry|rarexception|rawurldecode|rawurlencode|read_exif_data|readdir|readfile|readgzfile|readline|readline_add_history|' + + 'readline_callback_handler_install|readline_callback_handler_remove|readline_callback_read_char|readline_clear_history|' + + 'readline_completion_function|readline_info|readline_list_history|readline_on_new_line|readline_read_history|readline_redisplay|' + + 'readline_write_history|readlink|realpath|realpath_cache_get|realpath_cache_size|recode|recode_file|recode_string|recursivearrayiterator|' + + 'recursivecachingiterator|recursivecallbackfilteriterator|recursivedirectoryiterator|recursivefilteriterator|recursiveiterator|' + + 'recursiveiteratoriterator|recursiveregexiterator|recursivetreeiterator|reflection|reflectionclass|reflectionexception|reflectionextension|' + + 'reflectionfunction|reflectionfunctionabstract|reflectionmethod|reflectionobject|reflectionparameter|reflectionproperty|reflector|' + + 'regexiterator|register_shutdown_function|register_tick_function|rename|rename_function|require|require_once|reset|resetValue|' + + 'resourcebundle|restore_error_handler|restore_exception_handler|restore_include_path|return|rewind|rewinddir|rmdir|round|rpm_close|' + + 'rpm_get_tag|rpm_is_valid|rpm_open|rpm_version|rrd_create|rrd_error|rrd_fetch|rrd_first|rrd_graph|rrd_info|rrd_last|rrd_lastupdate|' + + 'rrd_restore|rrd_tune|rrd_update|rrd_xport|rrdcreator|rrdgraph|rrdupdater|rsort|rtrim|runkit_class_adopt|runkit_class_emancipate|' + + 'runkit_constant_add|runkit_constant_redefine|runkit_constant_remove|runkit_function_add|runkit_function_copy|runkit_function_redefine|' + + 'runkit_function_remove|runkit_function_rename|runkit_import|runkit_lint|runkit_lint_file|runkit_method_add|runkit_method_copy|' + + 'runkit_method_redefine|runkit_method_remove|runkit_method_rename|runkit_return_value_used|runkit_sandbox_output_handler|' + + 'runkit_superglobals|runtimeexception|samconnection_commit|samconnection_connect|samconnection_constructor|samconnection_disconnect|' + + 'samconnection_errno|samconnection_error|samconnection_isconnected|samconnection_peek|samconnection_peekall|samconnection_receive|' + + 'samconnection_remove|samconnection_rollback|samconnection_send|samconnection_setDebug|samconnection_subscribe|samconnection_unsubscribe|' + + 'sammessage_body|sammessage_constructor|sammessage_header|sca_createdataobject|sca_getservice|sca_localproxy_createdataobject|' + + 'sca_soapproxy_createdataobject|scandir|sdo_das_changesummary_beginlogging|sdo_das_changesummary_endlogging|' + + 'sdo_das_changesummary_getchangeddataobjects|sdo_das_changesummary_getchangetype|sdo_das_changesummary_getoldcontainer|' + + 'sdo_das_changesummary_getoldvalues|sdo_das_changesummary_islogging|sdo_das_datafactory_addpropertytotype|sdo_das_datafactory_addtype|' + + 'sdo_das_datafactory_getdatafactory|sdo_das_dataobject_getchangesummary|sdo_das_relational_applychanges|sdo_das_relational_construct|' + + 'sdo_das_relational_createrootdataobject|sdo_das_relational_executepreparedquery|sdo_das_relational_executequery|' + + 'sdo_das_setting_getlistindex|sdo_das_setting_getpropertyindex|sdo_das_setting_getpropertyname|sdo_das_setting_getvalue|' + + 'sdo_das_setting_isset|sdo_das_xml_addtypes|sdo_das_xml_create|sdo_das_xml_createdataobject|sdo_das_xml_createdocument|' + + 'sdo_das_xml_document_getrootdataobject|sdo_das_xml_document_getrootelementname|sdo_das_xml_document_getrootelementuri|' + + 'sdo_das_xml_document_setencoding|sdo_das_xml_document_setxmldeclaration|sdo_das_xml_document_setxmlversion|sdo_das_xml_loadfile|' + + 'sdo_das_xml_loadstring|sdo_das_xml_savefile|sdo_das_xml_savestring|sdo_datafactory_create|sdo_dataobject_clear|' + + 'sdo_dataobject_createdataobject|sdo_dataobject_getcontainer|sdo_dataobject_getsequence|sdo_dataobject_gettypename|' + + 'sdo_dataobject_gettypenamespaceuri|sdo_exception_getcause|sdo_list_insert|sdo_model_property_getcontainingtype|' + + 'sdo_model_property_getdefault|sdo_model_property_getname|sdo_model_property_gettype|sdo_model_property_iscontainment|' + + 'sdo_model_property_ismany|sdo_model_reflectiondataobject_construct|sdo_model_reflectiondataobject_export|' + + 'sdo_model_reflectiondataobject_getcontainmentproperty|sdo_model_reflectiondataobject_getinstanceproperties|' + + 'sdo_model_reflectiondataobject_gettype|sdo_model_type_getbasetype|sdo_model_type_getname|sdo_model_type_getnamespaceuri|' + + 'sdo_model_type_getproperties|sdo_model_type_getproperty|sdo_model_type_isabstracttype|sdo_model_type_isdatatype|sdo_model_type_isinstance|' + + 'sdo_model_type_isopentype|sdo_model_type_issequencedtype|sdo_sequence_getproperty|sdo_sequence_insert|sdo_sequence_move|seekableiterator|' + + 'sem_acquire|sem_get|sem_release|sem_remove|serializable|serialize|session_cache_expire|session_cache_limiter|session_commit|' + + 'session_decode|session_destroy|session_encode|session_get_cookie_params|session_id|session_is_registered|session_module_name|session_name|' + + 'session_pgsql_add_error|session_pgsql_get_error|session_pgsql_get_field|session_pgsql_reset|session_pgsql_set_field|session_pgsql_status|' + + 'session_regenerate_id|session_register|session_save_path|session_set_cookie_params|session_set_save_handler|session_start|' + + 'session_unregister|session_unset|session_write_close|setCounterClass|set_error_handler|set_exception_handler|set_file_buffer|' + + 'set_include_path|set_magic_quotes_runtime|set_socket_blocking|set_time_limit|setcookie|setlocale|setproctitle|setrawcookie|' + + 'setstaticpropertyvalue|setthreadtitle|settype|sha1|sha1_file|shell_exec|shm_attach|shm_detach|shm_get_var|shm_has_var|shm_put_var|' + + 'shm_remove|shm_remove_var|shmop_close|shmop_delete|shmop_open|shmop_read|shmop_size|shmop_write|show_source|shuffle|signeurlpaiement|' + + 'similar_text|simplexml_import_dom|simplexml_load_file|simplexml_load_string|simplexmlelement|simplexmliterator|sin|sinh|sizeof|sleep|snmp|' + + 'snmp2_get|snmp2_getnext|snmp2_real_walk|snmp2_set|snmp2_walk|snmp3_get|snmp3_getnext|snmp3_real_walk|snmp3_set|snmp3_walk|' + + 'snmp_get_quick_print|snmp_get_valueretrieval|snmp_read_mib|snmp_set_enum_print|snmp_set_oid_numeric_print|snmp_set_oid_output_format|' + + 'snmp_set_quick_print|snmp_set_valueretrieval|snmpget|snmpgetnext|snmprealwalk|snmpset|snmpwalk|snmpwalkoid|soapclient|soapfault|' + + 'soapheader|soapparam|soapserver|soapvar|socket_accept|socket_bind|socket_clear_error|socket_close|socket_connect|socket_create|' + + 'socket_create_listen|socket_create_pair|socket_get_option|socket_get_status|socket_getpeername|socket_getsockname|socket_last_error|' + + 'socket_listen|socket_read|socket_recv|socket_recvfrom|socket_select|socket_send|socket_sendto|socket_set_block|socket_set_blocking|' + + 'socket_set_nonblock|socket_set_option|socket_set_timeout|socket_shutdown|socket_strerror|socket_write|solr_get_version|solrclient|' + + 'solrclientexception|solrdocument|solrdocumentfield|solrexception|solrgenericresponse|solrillegalargumentexception|' + + 'solrillegaloperationexception|solrinputdocument|solrmodifiableparams|solrobject|solrparams|solrpingresponse|solrquery|solrqueryresponse|' + + 'solrresponse|solrupdateresponse|solrutils|sort|soundex|sphinxclient|spl_autoload|spl_autoload_call|spl_autoload_extensions|' + + 'spl_autoload_functions|spl_autoload_register|spl_autoload_unregister|spl_classes|spl_object_hash|splbool|spldoublylinkedlist|splenum|' + + 'splfileinfo|splfileobject|splfixedarray|splfloat|splheap|splint|split|spliti|splmaxheap|splminheap|splobjectstorage|splobserver|' + + 'splpriorityqueue|splqueue|splstack|splstring|splsubject|spltempfileobject|spoofchecker|sprintf|sql_regcase|sqlite3|sqlite3result|' + + 'sqlite3stmt|sqlite_array_query|sqlite_busy_timeout|sqlite_changes|sqlite_close|sqlite_column|sqlite_create_aggregate|' + + 'sqlite_create_function|sqlite_current|sqlite_error_string|sqlite_escape_string|sqlite_exec|sqlite_factory|sqlite_fetch_all|' + + 'sqlite_fetch_array|sqlite_fetch_column_types|sqlite_fetch_object|sqlite_fetch_single|sqlite_fetch_string|sqlite_field_name|' + + 'sqlite_has_more|sqlite_has_prev|sqlite_key|sqlite_last_error|sqlite_last_insert_rowid|sqlite_libencoding|sqlite_libversion|sqlite_next|' + + 'sqlite_num_fields|sqlite_num_rows|sqlite_open|sqlite_popen|sqlite_prev|sqlite_query|sqlite_rewind|sqlite_seek|sqlite_single_query|' + + 'sqlite_udf_decode_binary|sqlite_udf_encode_binary|sqlite_unbuffered_query|sqlite_valid|sqrt|srand|sscanf|ssdeep_fuzzy_compare|' + + 'ssdeep_fuzzy_hash|ssdeep_fuzzy_hash_filename|ssh2_auth_hostbased_file|ssh2_auth_none|ssh2_auth_password|ssh2_auth_pubkey_file|' + + 'ssh2_connect|ssh2_exec|ssh2_fetch_stream|ssh2_fingerprint|ssh2_methods_negotiated|ssh2_publickey_add|ssh2_publickey_init|' + + 'ssh2_publickey_list|ssh2_publickey_remove|ssh2_scp_recv|ssh2_scp_send|ssh2_sftp|ssh2_sftp_lstat|ssh2_sftp_mkdir|ssh2_sftp_readlink|' + + 'ssh2_sftp_realpath|ssh2_sftp_rename|ssh2_sftp_rmdir|ssh2_sftp_stat|ssh2_sftp_symlink|ssh2_sftp_unlink|ssh2_shell|ssh2_tunnel|stat|' + + 'stats_absolute_deviation|stats_cdf_beta|stats_cdf_binomial|stats_cdf_cauchy|stats_cdf_chisquare|stats_cdf_exponential|stats_cdf_f|' + + 'stats_cdf_gamma|stats_cdf_laplace|stats_cdf_logistic|stats_cdf_negative_binomial|stats_cdf_noncentral_chisquare|stats_cdf_noncentral_f|' + + 'stats_cdf_poisson|stats_cdf_t|stats_cdf_uniform|stats_cdf_weibull|stats_covariance|stats_den_uniform|stats_dens_beta|stats_dens_cauchy|' + + 'stats_dens_chisquare|stats_dens_exponential|stats_dens_f|stats_dens_gamma|stats_dens_laplace|stats_dens_logistic|' + + 'stats_dens_negative_binomial|stats_dens_normal|stats_dens_pmf_binomial|stats_dens_pmf_hypergeometric|stats_dens_pmf_poisson|stats_dens_t|' + + 'stats_dens_weibull|stats_harmonic_mean|stats_kurtosis|stats_rand_gen_beta|stats_rand_gen_chisquare|stats_rand_gen_exponential|' + + 'stats_rand_gen_f|stats_rand_gen_funiform|stats_rand_gen_gamma|stats_rand_gen_ibinomial|stats_rand_gen_ibinomial_negative|' + + 'stats_rand_gen_int|stats_rand_gen_ipoisson|stats_rand_gen_iuniform|stats_rand_gen_noncenral_chisquare|stats_rand_gen_noncentral_f|' + + 'stats_rand_gen_noncentral_t|stats_rand_gen_normal|stats_rand_gen_t|stats_rand_get_seeds|stats_rand_phrase_to_seeds|stats_rand_ranf|' + + 'stats_rand_setall|stats_skew|stats_standard_deviation|stats_stat_binomial_coef|stats_stat_correlation|stats_stat_gennch|' + + 'stats_stat_independent_t|stats_stat_innerproduct|stats_stat_noncentral_t|stats_stat_paired_t|stats_stat_percentile|stats_stat_powersum|' + + 'stats_variance|stomp|stomp_connect_error|stomp_version|stompexception|stompframe|str_getcsv|str_ireplace|str_pad|str_repeat|str_replace|' + + 'str_rot13|str_shuffle|str_split|str_word_count|strcasecmp|strchr|strcmp|strcoll|strcspn|stream_bucket_append|stream_bucket_make_writeable|' + + 'stream_bucket_new|stream_bucket_prepend|stream_context_create|stream_context_get_default|stream_context_get_options|' + + 'stream_context_get_params|stream_context_set_default|stream_context_set_option|stream_context_set_params|stream_copy_to_stream|' + + 'stream_encoding|stream_filter_append|stream_filter_prepend|stream_filter_register|stream_filter_remove|stream_get_contents|' + + 'stream_get_filters|stream_get_line|stream_get_meta_data|stream_get_transports|stream_get_wrappers|stream_is_local|' + + 'stream_notification_callback|stream_register_wrapper|stream_resolve_include_path|stream_select|stream_set_blocking|stream_set_read_buffer|' + + 'stream_set_timeout|stream_set_write_buffer|stream_socket_accept|stream_socket_client|stream_socket_enable_crypto|stream_socket_get_name|' + + 'stream_socket_pair|stream_socket_recvfrom|stream_socket_sendto|stream_socket_server|stream_socket_shutdown|stream_supports_lock|' + + 'stream_wrapper_register|stream_wrapper_restore|stream_wrapper_unregister|streamwrapper|strftime|strip_tags|stripcslashes|stripos|' + + 'stripslashes|stristr|strlen|strnatcasecmp|strnatcmp|strncasecmp|strncmp|strpbrk|strpos|strptime|strrchr|strrev|strripos|strrpos|strspn|' + + 'strstr|strtok|strtolower|strtotime|strtoupper|strtr|strval|substr|substr_compare|substr_count|substr_replace|svm|svmmodel|svn_add|' + + 'svn_auth_get_parameter|svn_auth_set_parameter|svn_blame|svn_cat|svn_checkout|svn_cleanup|svn_client_version|svn_commit|svn_delete|' + + 'svn_diff|svn_export|svn_fs_abort_txn|svn_fs_apply_text|svn_fs_begin_txn2|svn_fs_change_node_prop|svn_fs_check_path|' + + 'svn_fs_contents_changed|svn_fs_copy|svn_fs_delete|svn_fs_dir_entries|svn_fs_file_contents|svn_fs_file_length|svn_fs_is_dir|svn_fs_is_file|' + + 'svn_fs_make_dir|svn_fs_make_file|svn_fs_node_created_rev|svn_fs_node_prop|svn_fs_props_changed|svn_fs_revision_prop|svn_fs_revision_root|' + + 'svn_fs_txn_root|svn_fs_youngest_rev|svn_import|svn_log|svn_ls|svn_mkdir|svn_repos_create|svn_repos_fs|svn_repos_fs_begin_txn_for_commit|' + + 'svn_repos_fs_commit_txn|svn_repos_hotcopy|svn_repos_open|svn_repos_recover|svn_revert|svn_status|svn_update|swf_actiongeturl|' + + 'swf_actiongotoframe|swf_actiongotolabel|swf_actionnextframe|swf_actionplay|swf_actionprevframe|swf_actionsettarget|swf_actionstop|' + + 'swf_actiontogglequality|swf_actionwaitforframe|swf_addbuttonrecord|swf_addcolor|swf_closefile|swf_definebitmap|swf_definefont|' + + 'swf_defineline|swf_definepoly|swf_definerect|swf_definetext|swf_endbutton|swf_enddoaction|swf_endshape|swf_endsymbol|swf_fontsize|' + + 'swf_fontslant|swf_fonttracking|swf_getbitmapinfo|swf_getfontinfo|swf_getframe|swf_labelframe|swf_lookat|swf_modifyobject|swf_mulcolor|' + + 'swf_nextid|swf_oncondition|swf_openfile|swf_ortho|swf_ortho2|swf_perspective|swf_placeobject|swf_polarview|swf_popmatrix|swf_posround|' + + 'swf_pushmatrix|swf_removeobject|swf_rotate|swf_scale|swf_setfont|swf_setframe|swf_shapearc|swf_shapecurveto|swf_shapecurveto3|' + + 'swf_shapefillbitmapclip|swf_shapefillbitmaptile|swf_shapefilloff|swf_shapefillsolid|swf_shapelinesolid|swf_shapelineto|swf_shapemoveto|' + + 'swf_showframe|swf_startbutton|swf_startdoaction|swf_startshape|swf_startsymbol|swf_textwidth|swf_translate|swf_viewport|swfaction|' + + 'swfbitmap|swfbutton|swfdisplayitem|swffill|swffont|swffontchar|swfgradient|swfmorph|swfmovie|swfprebuiltclip|swfshape|swfsound|' + + 'swfsoundinstance|swfsprite|swftext|swftextfield|swfvideostream|swish_construct|swish_getmetalist|swish_getpropertylist|swish_prepare|' + + 'swish_query|swishresult_getmetalist|swishresult_stem|swishresults_getparsedwords|swishresults_getremovedstopwords|swishresults_nextresult|' + + 'swishresults_seekresult|swishsearch_execute|swishsearch_resetlimit|swishsearch_setlimit|swishsearch_setphrasedelimiter|' + + 'swishsearch_setsort|swishsearch_setstructure|sybase_affected_rows|sybase_close|sybase_connect|sybase_data_seek|' + + 'sybase_deadlock_retry_count|sybase_fetch_array|sybase_fetch_assoc|sybase_fetch_field|sybase_fetch_object|sybase_fetch_row|' + + 'sybase_field_seek|sybase_free_result|sybase_get_last_message|sybase_min_client_severity|sybase_min_error_severity|' + + 'sybase_min_message_severity|sybase_min_server_severity|sybase_num_fields|sybase_num_rows|sybase_pconnect|sybase_query|sybase_result|' + + 'sybase_select_db|sybase_set_message_handler|sybase_unbuffered_query|symlink|sys_get_temp_dir|sys_getloadavg|syslog|system|tag|tan|tanh|' + + 'tcpwrap_check|tempnam|textdomain|tidy|tidy_access_count|tidy_config_count|tidy_diagnose|tidy_error_count|tidy_get_error_buffer|' + + 'tidy_get_output|tidy_load_config|tidy_reset_config|tidy_save_config|tidy_set_encoding|tidy_setopt|tidy_warning_count|tidynode|time|' + + 'time_nanosleep|time_sleep_until|timezone_abbreviations_list|timezone_identifiers_list|timezone_location_get|timezone_name_from_abbr|' + + 'timezone_name_get|timezone_offset_get|timezone_open|timezone_transitions_get|timezone_version_get|tmpfile|token_get_all|token_name|' + + 'tokyotyrant|tokyotyrantquery|tokyotyranttable|tostring|tostring|touch|trait_exists|transliterator|traversable|trigger_error|trim|uasort|ucfirst|' + + 'ucwords|udm_add_search_limit|udm_alloc_agent|udm_alloc_agent_array|udm_api_version|udm_cat_list|udm_cat_path|udm_check_charset|' + + 'udm_check_stored|udm_clear_search_limits|udm_close_stored|udm_crc32|udm_errno|udm_error|udm_find|udm_free_agent|udm_free_ispell_data|' + + 'udm_free_res|udm_get_doc_count|udm_get_res_field|udm_get_res_param|udm_hash32|udm_load_ispell_data|udm_open_stored|udm_set_agent_param|' + + 'uksort|umask|underflowexception|unexpectedvalueexception|uniqid|unixtojd|unlink|unpack|unregister_tick_function|unserialize|unset|' + + 'urldecode|urlencode|use_soap_error_handler|user_error|usleep|usort|utf8_decode|utf8_encode|v8js|v8jsexception|var_dump|var_export|variant|' + + 'variant_abs|variant_add|variant_and|variant_cast|variant_cat|variant_cmp|variant_date_from_timestamp|variant_date_to_timestamp|' + + 'variant_div|variant_eqv|variant_fix|variant_get_type|variant_idiv|variant_imp|variant_int|variant_mod|variant_mul|variant_neg|variant_not|' + + 'variant_or|variant_pow|variant_round|variant_set|variant_set_type|variant_sub|variant_xor|version_compare|vfprintf|virtual|' + + 'vpopmail_add_alias_domain|vpopmail_add_alias_domain_ex|vpopmail_add_domain|vpopmail_add_domain_ex|vpopmail_add_user|vpopmail_alias_add|' + + 'vpopmail_alias_del|vpopmail_alias_del_domain|vpopmail_alias_get|vpopmail_alias_get_all|vpopmail_auth_user|vpopmail_del_domain|' + + 'vpopmail_del_domain_ex|vpopmail_del_user|vpopmail_error|vpopmail_passwd|vpopmail_set_user_quota|vprintf|vsprintf|w32api_deftype|' + + 'w32api_init_dtype|w32api_invoke_function|w32api_register_function|w32api_set_call_method|wddx_add_vars|wddx_deserialize|wddx_packet_end|' + + 'wddx_packet_start|wddx_serialize_value|wddx_serialize_vars|win32_continue_service|win32_create_service|win32_delete_service|' + + 'win32_get_last_control_message|win32_pause_service|win32_ps_list_procs|win32_ps_stat_mem|win32_ps_stat_proc|win32_query_service_status|' + + 'win32_set_service_status|win32_start_service|win32_start_service_ctrl_dispatcher|win32_stop_service|wincache_fcache_fileinfo|' + + 'wincache_fcache_meminfo|wincache_lock|wincache_ocache_fileinfo|wincache_ocache_meminfo|wincache_refresh_if_changed|' + + 'wincache_rplist_fileinfo|wincache_rplist_meminfo|wincache_scache_info|wincache_scache_meminfo|wincache_ucache_add|wincache_ucache_cas|' + + 'wincache_ucache_clear|wincache_ucache_dec|wincache_ucache_delete|wincache_ucache_exists|wincache_ucache_get|wincache_ucache_inc|' + + 'wincache_ucache_info|wincache_ucache_meminfo|wincache_ucache_set|wincache_unlock|wordwrap|xattr_get|xattr_list|xattr_remove|xattr_set|' + + 'xattr_supported|xdiff_file_bdiff|xdiff_file_bdiff_size|xdiff_file_bpatch|xdiff_file_diff|xdiff_file_diff_binary|xdiff_file_merge3|' + + 'xdiff_file_patch|xdiff_file_patch_binary|xdiff_file_rabdiff|xdiff_string_bdiff|xdiff_string_bdiff_size|xdiff_string_bpatch|' + + 'xdiff_string_diff|xdiff_string_diff_binary|xdiff_string_merge3|xdiff_string_patch|xdiff_string_patch_binary|xdiff_string_rabdiff|' + + 'xhprof_disable|xhprof_enable|xhprof_sample_disable|xhprof_sample_enable|xml_error_string|xml_get_current_byte_index|' + + 'xml_get_current_column_number|xml_get_current_line_number|xml_get_error_code|xml_parse|xml_parse_into_struct|xml_parser_create|' + + 'xml_parser_create_ns|xml_parser_free|xml_parser_get_option|xml_parser_set_option|xml_set_character_data_handler|xml_set_default_handler|' + + 'xml_set_element_handler|xml_set_end_namespace_decl_handler|xml_set_external_entity_ref_handler|xml_set_notation_decl_handler|' + + 'xml_set_object|xml_set_processing_instruction_handler|xml_set_start_namespace_decl_handler|xml_set_unparsed_entity_decl_handler|xmlreader|' + + 'xmlrpc_decode|xmlrpc_decode_request|xmlrpc_encode|xmlrpc_encode_request|xmlrpc_get_type|xmlrpc_is_fault|xmlrpc_parse_method_descriptions|' + + 'xmlrpc_server_add_introspection_data|xmlrpc_server_call_method|xmlrpc_server_create|xmlrpc_server_destroy|' + + 'xmlrpc_server_register_introspection_callback|xmlrpc_server_register_method|xmlrpc_set_type|xmlwriter_end_attribute|xmlwriter_end_cdata|' + + 'xmlwriter_end_comment|xmlwriter_end_document|xmlwriter_end_dtd|xmlwriter_end_dtd_attlist|xmlwriter_end_dtd_element|' + + 'xmlwriter_end_dtd_entity|xmlwriter_end_element|xmlwriter_end_pi|xmlwriter_flush|xmlwriter_full_end_element|xmlwriter_open_memory|' + + 'xmlwriter_open_uri|xmlwriter_output_memory|xmlwriter_set_indent|xmlwriter_set_indent_string|xmlwriter_start_attribute|' + + 'xmlwriter_start_attribute_ns|xmlwriter_start_cdata|xmlwriter_start_comment|xmlwriter_start_document|xmlwriter_start_dtd|' + + 'xmlwriter_start_dtd_attlist|xmlwriter_start_dtd_element|xmlwriter_start_dtd_entity|xmlwriter_start_element|xmlwriter_start_element_ns|' + + 'xmlwriter_start_pi|xmlwriter_text|xmlwriter_write_attribute|xmlwriter_write_attribute_ns|xmlwriter_write_cdata|xmlwriter_write_comment|' + + 'xmlwriter_write_dtd|xmlwriter_write_dtd_attlist|xmlwriter_write_dtd_element|xmlwriter_write_dtd_entity|xmlwriter_write_element|' + + 'xmlwriter_write_element_ns|xmlwriter_write_pi|xmlwriter_write_raw|xpath_eval|xpath_eval_expression|xpath_new_context|xpath_register_ns|' + + 'xpath_register_ns_auto|xptr_eval|xptr_new_context|xslt_backend_info|xslt_backend_name|xslt_backend_version|xslt_create|xslt_errno|' + + 'xslt_error|xslt_free|xslt_getopt|xslt_process|xslt_set_base|xslt_set_encoding|xslt_set_error_handler|xslt_set_log|xslt_set_object|' + + 'xslt_set_sax_handler|xslt_set_sax_handlers|xslt_set_scheme_handler|xslt_set_scheme_handlers|xslt_setopt|xsltprocessor|yaml_emit|' + + 'yaml_emit_file|yaml_parse|yaml_parse_file|yaml_parse_url|yaz_addinfo|yaz_ccl_conf|yaz_ccl_parse|yaz_close|yaz_connect|yaz_database|' + + 'yaz_element|yaz_errno|yaz_error|yaz_es|yaz_es_result|yaz_get_option|yaz_hits|yaz_itemorder|yaz_present|yaz_range|yaz_record|yaz_scan|' + + 'yaz_scan_result|yaz_schema|yaz_search|yaz_set_option|yaz_sort|yaz_syntax|yaz_wait|yp_all|yp_cat|yp_err_string|yp_errno|yp_first|' + + 'yp_get_default_domain|yp_master|yp_match|yp_next|yp_order|zend_logo_guid|zend_thread_id|zend_version|zip_close|zip_entry_close|' + + 'zip_entry_compressedsize|zip_entry_compressionmethod|zip_entry_filesize|zip_entry_name|zip_entry_open|zip_entry_read|zip_open|zip_read|' + + 'ziparchive|ziparchive_addemptydir|ziparchive_addfile|ziparchive_addfromstring|ziparchive_close|ziparchive_deleteindex|' + + 'ziparchive_deletename|ziparchive_extractto|ziparchive_getarchivecomment|ziparchive_getcommentindex|ziparchive_getcommentname|' + + 'ziparchive_getfromindex|ziparchive_getfromname|ziparchive_getnameindex|ziparchive_getstatusstring|ziparchive_getstream|' + + 'ziparchive_locatename|ziparchive_open|ziparchive_renameindex|ziparchive_renamename|ziparchive_setCommentName|ziparchive_setarchivecomment|' + + 'ziparchive_setcommentindex|ziparchive_statindex|ziparchive_statname|ziparchive_unchangeall|ziparchive_unchangearchive|' + + 'ziparchive_unchangeindex|ziparchive_unchangename|zlib_get_coding_type').split('|') + ); + var keywords = lang.arrayToMap( + ('abstract|and|array|as|break|case|catch|class|clone|const|continue|declare|default|do|else|elseif|enddeclare|endfor|endforeach|endif|' + + 'endswitch|endwhile|extends|final|for|foreach|function|global|goto|if|implements|interface|instanceof|namespace|new|or|private|protected|' + + 'public|static|switch|throw|trait|try|use|var|while|xor').split('|') + ); + var languageConstructs = lang.arrayToMap( + ('die|echo|empty|exit|eval|include|include_once|isset|list|require|require_once|return|print|unset').split('|') + ); + + var builtinConstants = lang.arrayToMap( + ('true|TRUE|false|FALSE|null|NULL|__CLASS__|__DIR__|__FILE__|__LINE__|__METHOD__|__FUNCTION__|__NAMESPACE__').split('|') + ); + + var builtinVariables = lang.arrayToMap( + ('$GLOBALS|$_SERVER|$_GET|$_POST|$_FILES|$_REQUEST|$_SESSION|$_ENV|$_COOKIE|$php_errormsg|$HTTP_RAW_POST_DATA|' + + '$http_response_header|$argc|$argv').split('|') + ); + var builtinFunctionsDeprecated = lang.arrayToMap( + ('key_exists|cairo_matrix_create_scale|cairo_matrix_create_translate|call_user_method|call_user_method_array|com_addref|com_get|' + + 'com_invoke|com_isenum|com_load|com_release|com_set|connection_timeout|cubrid_load_from_glo|cubrid_new_glo|cubrid_save_to_glo|' + + 'cubrid_send_glo|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|hw_documentattributes|hw_documentbodytag|' + + 'hw_documentsize|hw_outputdocument|imagedashedline|maxdb_bind_param|maxdb_bind_result|maxdb_client_encoding|maxdb_close_long_data|' + + 'maxdb_execute|maxdb_fetch|maxdb_get_metadata|maxdb_param_count|maxdb_send_long_data|mcrypt_ecb|mcrypt_generic_end|mime_content_type|' + + 'mysql_createdb|mysql_dbname|mysql_db_query|mysql_drop_db|mysql_dropdb|mysql_escape_string|mysql_fieldflags|mysql_fieldflags|' + + 'mysql_fieldname|mysql_fieldtable|mysql_fieldtype|mysql_freeresult|mysql_listdbs|mysql_list_fields|mysql_listfields|mysql_list_tables|' + + 'mysql_listtables|mysql_numfields|mysql_numrows|mysql_selectdb|mysql_tablename|mysqli_bind_param|mysqli_bind_result|' + + 'mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_execute|' + + 'mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|' + + 'mysqli_send_long_data|mysqli_send_query|mysqli_slave_query|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|' + + 'ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|' + + 'ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|' + + 'ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|' + + 'ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|' + + 'ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|' + + 'PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|' + + 'PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|' + + 'PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|' + + 'PDF_open_gif|PDF_open_image_file|PDF_open_image|PDF_open_jpeg|PDF_open_pdi|PDF_open_tiff|PDF_place_image|PDF_place_pdi_page|' + + 'PDF_set_border_color|PDF_set_border_dash|PDF_set_border_style|PDF_set_char_spacing|PDF_set_duration|PDF_set_horiz_scaling|' + + 'PDF_set_info_author|PDF_set_info_creator|PDF_set_info_keywords|PDF_set_info_subject|PDF_set_info_title|PDF_set_leading|' + + 'PDF_set_text_matrix|PDF_set_text_rendering|PDF_set_text_rise|PDF_set_word_spacing|PDF_setgray_fill|PDF_setgray_stroke|PDF_setgray|' + + 'PDF_setpolydash|PDF_setrgbcolor_fill|PDF_setrgbcolor_stroke|PDF_setrgbcolor|PDF_show_boxed|php_check_syntax|px_set_tablename|' + + 'px_set_targetencoding|runkit_sandbox_output_handler|session_is_registered|session_register|session_unregister' + + 'set_magic_quotes_runtime|magic_quotes_runtime|set_socket_blocking|socket_set_blocking|set_socket_timeout|socket_set_timeout|split|spliti|' + + 'sql_regcase').split('|') + ); + + var keywordsDeprecated = lang.arrayToMap( + ('cfunction|old_function').split('|') + ); + + var futureReserved = lang.arrayToMap([]); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : /(?:#|\/\/)(?:[^?]|\?[^>])*/ + }, + docComment.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/][gimy]*\\s*(?=[).,;]|$)" + }, { + token : "string", // " string start + regex : '"', + next : "qqstring" + }, { + token : "string", // ' string start + regex : "'", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language", // constants + regex : "\\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|" + + "ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|" + + "HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|" + + "L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|" + + "VERSION))|__COMPILER_HALT_OFFSET__)\\b" + }, { + token : ["keyword", "text", "support.class"], + regex : "\\b(new)(\\s+)(\\w+)" + }, { + token : ["support.class", "keyword.operator"], + regex : "\\b(\\w+)(::)" + }, { + token : "constant.language", // constants + regex : "\\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|" + + "SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|" + + "O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|" + + "R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|" + + "YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|" + + "ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|" + + "T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|" + + "HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|" + + "I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|" + + "O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|" + + "L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|" + + "M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|" + + "OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|" + + "P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|" + + "RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|" + + "T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR)|STD(?:IN|OUT|ERR))\\b" + }, { + token : function(value) { + if (keywords.hasOwnProperty(value)) + return "keyword"; + else if (builtinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (builtinVariables.hasOwnProperty(value)) + return "variable.language"; + else if (futureReserved.hasOwnProperty(value)) + return "invalid.illegal"; + else if (builtinFunctions.hasOwnProperty(value)) + return "support.function"; + else if (value == "debugger") + return "invalid.deprecated"; + else + if(value.match(/^(\$[a-zA-Z_\x7f-\uffff][a-zA-Z0-9_\x7f-\uffff]*|self|parent)$/)) + return "variable"; + return "identifier"; + }, + regex : /[a-zA-Z_$\x7f-\uffff][a-zA-Z0-9_\x7f-\uffff]*/ + }, { + onMatch : function(value, currentSate, state) { + value = value.substr(3); + if (value[0] == "'" || value[0] == '"') + value = value.slice(1, -1); + state.unshift(this.next, value); + return "markup.list"; + }, + regex : /<<<(?:\w+|'\w+'|"\w+")$/, + next: "heredoc" + }, { + token : "keyword.operator", + regex : "::|!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|!=|!==|<=|>=|=>|<<=|>>=|>>>=|<>|<|>|=|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "heredoc" : [ + { + onMatch : function(value, currentSate, stack) { + if (stack[1] != value) + return "string"; + stack.shift(); + stack.shift(); + return "markup.list"; + }, + regex : "^\\w+(?=;?$)", + next: "start" + }, { + token: "string", + regex : ".*" + } + ], + "comment" : [ + { + token : "comment", + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : '\\\\(?:[nrtvef\\\\"$]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})' + }, { + token : "variable", + regex : /\$[\w]+(?:\[[\w\]+]|[=\-]>\w+)?/ + }, { + token : "variable", + regex : /\$\{[^"\}]+\}?/ // this is wrong but ok for now + }, + {token : "string", regex : '"', next : "start"}, + {defaultToken : "string"} + ], + "qstring" : [ + {token : "constant.language.escape", regex : /\\['\\]/}, + {token : "string", regex : "'", next : "start"}, + {defaultToken : "string"} + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(PhpLangHighlightRules, TextHighlightRules); + + +var PhpHighlightRules = function() { + HtmlHighlightRules.call(this); + + var startRules = [ + { + token : "support.php_tag", // php open tag + regex : "<\\?(?:php|=)?", + push : "php-start" + } + ]; + + var endRules = [ + { + token : "support.php_tag", // php close tag + regex : "\\?>", + next : "pop" + } + ]; + + for (var key in this.$rules) + this.$rules[key].unshift.apply(this.$rules[key], startRules); + + this.embedRules(PhpLangHighlightRules, "php-", endRules, ["start"]); + + this.normalizeRules(); +}; + +oop.inherits(PhpHighlightRules, HtmlHighlightRules); + +exports.PhpHighlightRules = PhpHighlightRules; +exports.PhpLangHighlightRules = PhpLangHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/php_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var functionMap = { + "abs": [ + "int abs(int number)", + "Return the absolute value of the number" + ], + "acos": [ + "float acos(float number)", + "Return the arc cosine of the number in radians" + ], + "acosh": [ + "float acosh(float number)", + "Returns the inverse hyperbolic cosine of the number, i.e. the value whose hyperbolic cosine is number" + ], + "addGlob": [ + "bool addGlob(string pattern[,int flags [, array options]])", + "Add files matching the glob pattern. See php's glob for the pattern syntax." + ], + "addPattern": [ + "bool addPattern(string pattern[, string path [, array options]])", + "Add files matching the pcre pattern. See php's pcre for the pattern syntax." + ], + "addcslashes": [ + "string addcslashes(string str, string charlist)", + "Escapes all chars mentioned in charlist with backslash. It creates octal representations if asked to backslash characters with 8th bit set or with ASCII<32 (except '\\n', '\\r', '\\t' etc...)" + ], + "addslashes": [ + "string addslashes(string str)", + "Escapes single quote, double quotes and backslash characters in a string with backslashes" + ], + "apache_child_terminate": [ + "bool apache_child_terminate(void)", + "Terminate apache process after this request" + ], + "apache_get_modules": [ + "array apache_get_modules(void)", + "Get a list of loaded Apache modules" + ], + "apache_get_version": [ + "string apache_get_version(void)", + "Fetch Apache version" + ], + "apache_getenv": [ + "bool apache_getenv(string variable [, bool walk_to_top])", + "Get an Apache subprocess_env variable" + ], + "apache_lookup_uri": [ + "object apache_lookup_uri(string URI)", + "Perform a partial request of the given URI to obtain information about it" + ], + "apache_note": [ + "string apache_note(string note_name [, string note_value])", + "Get and set Apache request notes" + ], + "apache_request_auth_name": [ + "string apache_request_auth_name()", + "" + ], + "apache_request_auth_type": [ + "string apache_request_auth_type()", + "" + ], + "apache_request_discard_request_body": [ + "long apache_request_discard_request_body()", + "" + ], + "apache_request_err_headers_out": [ + "array apache_request_err_headers_out([{string name|array list} [, string value [, bool replace = false]]])", + "* fetch all headers that go out in case of an error or a subrequest" + ], + "apache_request_headers": [ + "array apache_request_headers(void)", + "Fetch all HTTP request headers" + ], + "apache_request_headers_in": [ + "array apache_request_headers_in()", + "* fetch all incoming request headers" + ], + "apache_request_headers_out": [ + "array apache_request_headers_out([{string name|array list} [, string value [, bool replace = false]]])", + "* fetch all outgoing request headers" + ], + "apache_request_is_initial_req": [ + "bool apache_request_is_initial_req()", + "" + ], + "apache_request_log_error": [ + "boolean apache_request_log_error(string message, [long facility])", + "" + ], + "apache_request_meets_conditions": [ + "long apache_request_meets_conditions()", + "" + ], + "apache_request_remote_host": [ + "int apache_request_remote_host([int type])", + "" + ], + "apache_request_run": [ + "long apache_request_run()", + "This is a wrapper for ap_sub_run_req and ap_destory_sub_req. It takes sub_request, runs it, destroys it, and returns it's status." + ], + "apache_request_satisfies": [ + "long apache_request_satisfies()", + "" + ], + "apache_request_server_port": [ + "int apache_request_server_port()", + "" + ], + "apache_request_set_etag": [ + "void apache_request_set_etag()", + "" + ], + "apache_request_set_last_modified": [ + "void apache_request_set_last_modified()", + "" + ], + "apache_request_some_auth_required": [ + "bool apache_request_some_auth_required()", + "" + ], + "apache_request_sub_req_lookup_file": [ + "object apache_request_sub_req_lookup_file(string file)", + "Returns sub-request for the specified file. You would need to run it yourself with run()." + ], + "apache_request_sub_req_lookup_uri": [ + "object apache_request_sub_req_lookup_uri(string uri)", + "Returns sub-request for the specified uri. You would need to run it yourself with run()" + ], + "apache_request_sub_req_method_uri": [ + "object apache_request_sub_req_method_uri(string method, string uri)", + "Returns sub-request for the specified file. You would need to run it yourself with run()." + ], + "apache_request_update_mtime": [ + "long apache_request_update_mtime([int dependency_mtime])", + "" + ], + "apache_reset_timeout": [ + "bool apache_reset_timeout(void)", + "Reset the Apache write timer" + ], + "apache_response_headers": [ + "array apache_response_headers(void)", + "Fetch all HTTP response headers" + ], + "apache_setenv": [ + "bool apache_setenv(string variable, string value [, bool walk_to_top])", + "Set an Apache subprocess_env variable" + ], + "array_change_key_case": [ + "array array_change_key_case(array input [, int case=CASE_LOWER])", + "Retuns an array with all string keys lowercased [or uppercased]" + ], + "array_chunk": [ + "array array_chunk(array input, int size [, bool preserve_keys])", + "Split array into chunks" + ], + "array_combine": [ + "array array_combine(array keys, array values)", + "Creates an array by using the elements of the first parameter as keys and the elements of the second as the corresponding values" + ], + "array_count_values": [ + "array array_count_values(array input)", + "Return the value as key and the frequency of that value in input as value" + ], + "array_diff": [ + "array array_diff(array arr1, array arr2 [, array ...])", + "Returns the entries of arr1 that have values which are not present in any of the others arguments." + ], + "array_diff_assoc": [ + "array array_diff_assoc(array arr1, array arr2 [, array ...])", + "Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal" + ], + "array_diff_key": [ + "array array_diff_key(array arr1, array arr2 [, array ...])", + "Returns the entries of arr1 that have keys which are not present in any of the others arguments. This function is like array_diff() but works on the keys instead of the values. The associativity is preserved." + ], + "array_diff_uassoc": [ + "array array_diff_uassoc(array arr1, array arr2 [, array ...], callback data_comp_func)", + "Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Elements are compared by user supplied function." + ], + "array_diff_ukey": [ + "array array_diff_ukey(array arr1, array arr2 [, array ...], callback key_comp_func)", + "Returns the entries of arr1 that have keys which are not present in any of the others arguments. User supplied function is used for comparing the keys. This function is like array_udiff() but works on the keys instead of the values. The associativity is preserved." + ], + "array_fill": [ + "array array_fill(int start_key, int num, mixed val)", + "Create an array containing num elements starting with index start_key each initialized to val" + ], + "array_fill_keys": [ + "array array_fill_keys(array keys, mixed val)", + "Create an array using the elements of the first parameter as keys each initialized to val" + ], + "array_filter": [ + "array array_filter(array input [, mixed callback])", + "Filters elements from the array via the callback." + ], + "array_flip": [ + "array array_flip(array input)", + "Return array with key <-> value flipped" + ], + "array_intersect": [ + "array array_intersect(array arr1, array arr2 [, array ...])", + "Returns the entries of arr1 that have values which are present in all the other arguments" + ], + "array_intersect_assoc": [ + "array array_intersect_assoc(array arr1, array arr2 [, array ...])", + "Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check" + ], + "array_intersect_key": [ + "array array_intersect_key(array arr1, array arr2 [, array ...])", + "Returns the entries of arr1 that have keys which are present in all the other arguments. Kind of equivalent to array_diff(array_keys($arr1), array_keys($arr2)[,array_keys(...)]). Equivalent of array_intersect_assoc() but does not do compare of the data." + ], + "array_intersect_uassoc": [ + "array array_intersect_uassoc(array arr1, array arr2 [, array ...], callback key_compare_func)", + "Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check and they are compared by using an user-supplied callback." + ], + "array_intersect_ukey": [ + "array array_intersect_ukey(array arr1, array arr2 [, array ...], callback key_compare_func)", + "Returns the entries of arr1 that have keys which are present in all the other arguments. Kind of equivalent to array_diff(array_keys($arr1), array_keys($arr2)[,array_keys(...)]). The comparison of the keys is performed by a user supplied function. Equivalent of array_intersect_uassoc() but does not do compare of the data." + ], + "array_key_exists": [ + "bool array_key_exists(mixed key, array search)", + "Checks if the given key or index exists in the array" + ], + "array_keys": [ + "array array_keys(array input [, mixed search_value[, bool strict]])", + "Return just the keys from the input array, optionally only for the specified search_value" + ], + "array_map": [ + "array array_map(mixed callback, array input1 [, array input2 ,...])", + "Applies the callback to the elements in given arrays." + ], + "array_merge": [ + "array array_merge(array arr1, array arr2 [, array ...])", + "Merges elements from passed arrays into one array" + ], + "array_merge_recursive": [ + "array array_merge_recursive(array arr1, array arr2 [, array ...])", + "Recursively merges elements from passed arrays into one array" + ], + "array_multisort": [ + "bool array_multisort(array ar1 [, SORT_ASC|SORT_DESC [, SORT_REGULAR|SORT_NUMERIC|SORT_STRING]] [, array ar2 [, SORT_ASC|SORT_DESC [, SORT_REGULAR|SORT_NUMERIC|SORT_STRING]], ...])", + "Sort multiple arrays at once similar to how ORDER BY clause works in SQL" + ], + "array_pad": [ + "array array_pad(array input, int pad_size, mixed pad_value)", + "Returns a copy of input array padded with pad_value to size pad_size" + ], + "array_pop": [ + "mixed array_pop(array stack)", + "Pops an element off the end of the array" + ], + "array_product": [ + "mixed array_product(array input)", + "Returns the product of the array entries" + ], + "array_push": [ + "int array_push(array stack, mixed var [, mixed ...])", + "Pushes elements onto the end of the array" + ], + "array_rand": [ + "mixed array_rand(array input [, int num_req])", + "Return key/keys for random entry/entries in the array" + ], + "array_reduce": [ + "mixed array_reduce(array input, mixed callback [, mixed initial])", + "Iteratively reduce the array to a single value via the callback." + ], + "array_replace": [ + "array array_replace(array arr1, array arr2 [, array ...])", + "Replaces elements from passed arrays into one array" + ], + "array_replace_recursive": [ + "array array_replace_recursive(array arr1, array arr2 [, array ...])", + "Recursively replaces elements from passed arrays into one array" + ], + "array_reverse": [ + "array array_reverse(array input [, bool preserve keys])", + "Return input as a new array with the order of the entries reversed" + ], + "array_search": [ + "mixed array_search(mixed needle, array haystack [, bool strict])", + "Searches the array for a given value and returns the corresponding key if successful" + ], + "array_shift": [ + "mixed array_shift(array stack)", + "Pops an element off the beginning of the array" + ], + "array_slice": [ + "array array_slice(array input, int offset [, int length [, bool preserve_keys]])", + "Returns elements specified by offset and length" + ], + "array_splice": [ + "array array_splice(array input, int offset [, int length [, array replacement]])", + "Removes the elements designated by offset and length and replace them with supplied array" + ], + "array_sum": [ + "mixed array_sum(array input)", + "Returns the sum of the array entries" + ], + "array_udiff": [ + "array array_udiff(array arr1, array arr2 [, array ...], callback data_comp_func)", + "Returns the entries of arr1 that have values which are not present in any of the others arguments. Elements are compared by user supplied function." + ], + "array_udiff_assoc": [ + "array array_udiff_assoc(array arr1, array arr2 [, array ...], callback key_comp_func)", + "Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Keys are compared by user supplied function." + ], + "array_udiff_uassoc": [ + "array array_udiff_uassoc(array arr1, array arr2 [, array ...], callback data_comp_func, callback key_comp_func)", + "Returns the entries of arr1 that have values which are not present in any of the others arguments but do additional checks whether the keys are equal. Keys and elements are compared by user supplied functions." + ], + "array_uintersect": [ + "array array_uintersect(array arr1, array arr2 [, array ...], callback data_compare_func)", + "Returns the entries of arr1 that have values which are present in all the other arguments. Data is compared by using an user-supplied callback." + ], + "array_uintersect_assoc": [ + "array array_uintersect_assoc(array arr1, array arr2 [, array ...], callback data_compare_func)", + "Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check. Data is compared by using an user-supplied callback." + ], + "array_uintersect_uassoc": [ + "array array_uintersect_uassoc(array arr1, array arr2 [, array ...], callback data_compare_func, callback key_compare_func)", + "Returns the entries of arr1 that have values which are present in all the other arguments. Keys are used to do more restrictive check. Both data and keys are compared by using user-supplied callbacks." + ], + "array_unique": [ + "array array_unique(array input [, int sort_flags])", + "Removes duplicate values from array" + ], + "array_unshift": [ + "int array_unshift(array stack, mixed var [, mixed ...])", + "Pushes elements onto the beginning of the array" + ], + "array_values": [ + "array array_values(array input)", + "Return just the values from the input array" + ], + "array_walk": [ + "bool array_walk(array input, string funcname [, mixed userdata])", + "Apply a user function to every member of an array" + ], + "array_walk_recursive": [ + "bool array_walk_recursive(array input, string funcname [, mixed userdata])", + "Apply a user function recursively to every member of an array" + ], + "arsort": [ + "bool arsort(array &array_arg [, int sort_flags])", + "Sort an array in reverse order and maintain index association" + ], + "asin": [ + "float asin(float number)", + "Returns the arc sine of the number in radians" + ], + "asinh": [ + "float asinh(float number)", + "Returns the inverse hyperbolic sine of the number, i.e. the value whose hyperbolic sine is number" + ], + "asort": [ + "bool asort(array &array_arg [, int sort_flags])", + "Sort an array and maintain index association" + ], + "assert": [ + "int assert(string|bool assertion)", + "Checks if assertion is false" + ], + "assert_options": [ + "mixed assert_options(int what [, mixed value])", + "Set/get the various assert flags" + ], + "atan": [ + "float atan(float number)", + "Returns the arc tangent of the number in radians" + ], + "atan2": [ + "float atan2(float y, float x)", + "Returns the arc tangent of y/x, with the resulting quadrant determined by the signs of y and x" + ], + "atanh": [ + "float atanh(float number)", + "Returns the inverse hyperbolic tangent of the number, i.e. the value whose hyperbolic tangent is number" + ], + "attachIterator": [ + "void attachIterator(Iterator iterator[, mixed info])", + "Attach a new iterator" + ], + "base64_decode": [ + "string base64_decode(string str[, bool strict])", + "Decodes string using MIME base64 algorithm" + ], + "base64_encode": [ + "string base64_encode(string str)", + "Encodes string using MIME base64 algorithm" + ], + "base_convert": [ + "string base_convert(string number, int frombase, int tobase)", + "Converts a number in a string from any base <= 36 to any base <= 36" + ], + "basename": [ + "string basename(string path [, string suffix])", + "Returns the filename component of the path" + ], + "bcadd": [ + "string bcadd(string left_operand, string right_operand [, int scale])", + "Returns the sum of two arbitrary precision numbers" + ], + "bccomp": [ + "int bccomp(string left_operand, string right_operand [, int scale])", + "Compares two arbitrary precision numbers" + ], + "bcdiv": [ + "string bcdiv(string left_operand, string right_operand [, int scale])", + "Returns the quotient of two arbitrary precision numbers (division)" + ], + "bcmod": [ + "string bcmod(string left_operand, string right_operand)", + "Returns the modulus of the two arbitrary precision operands" + ], + "bcmul": [ + "string bcmul(string left_operand, string right_operand [, int scale])", + "Returns the multiplication of two arbitrary precision numbers" + ], + "bcpow": [ + "string bcpow(string x, string y [, int scale])", + "Returns the value of an arbitrary precision number raised to the power of another" + ], + "bcpowmod": [ + "string bcpowmod(string x, string y, string mod [, int scale])", + "Returns the value of an arbitrary precision number raised to the power of another reduced by a modulous" + ], + "bcscale": [ + "bool bcscale(int scale)", + "Sets default scale parameter for all bc math functions" + ], + "bcsqrt": [ + "string bcsqrt(string operand [, int scale])", + "Returns the square root of an arbitray precision number" + ], + "bcsub": [ + "string bcsub(string left_operand, string right_operand [, int scale])", + "Returns the difference between two arbitrary precision numbers" + ], + "bin2hex": [ + "string bin2hex(string data)", + "Converts the binary representation of data to hex" + ], + "bind_textdomain_codeset": [ + "string bind_textdomain_codeset (string domain, string codeset)", + "Specify the character encoding in which the messages from the DOMAIN message catalog will be returned." + ], + "bindec": [ + "int bindec(string binary_number)", + "Returns the decimal equivalent of the binary number" + ], + "bindtextdomain": [ + "string bindtextdomain(string domain_name, string dir)", + "Bind to the text domain domain_name, looking for translations in dir. Returns the current domain" + ], + "birdstep_autocommit": [ + "bool birdstep_autocommit(int index)", + "" + ], + "birdstep_close": [ + "bool birdstep_close(int id)", + "" + ], + "birdstep_commit": [ + "bool birdstep_commit(int index)", + "" + ], + "birdstep_connect": [ + "int birdstep_connect(string server, string user, string pass)", + "" + ], + "birdstep_exec": [ + "int birdstep_exec(int index, string exec_str)", + "" + ], + "birdstep_fetch": [ + "bool birdstep_fetch(int index)", + "" + ], + "birdstep_fieldname": [ + "string birdstep_fieldname(int index, int col)", + "" + ], + "birdstep_fieldnum": [ + "int birdstep_fieldnum(int index)", + "" + ], + "birdstep_freeresult": [ + "bool birdstep_freeresult(int index)", + "" + ], + "birdstep_off_autocommit": [ + "bool birdstep_off_autocommit(int index)", + "" + ], + "birdstep_result": [ + "mixed birdstep_result(int index, mixed col)", + "" + ], + "birdstep_rollback": [ + "bool birdstep_rollback(int index)", + "" + ], + "bzcompress": [ + "string bzcompress(string source [, int blocksize100k [, int workfactor]])", + "Compresses a string into BZip2 encoded data" + ], + "bzdecompress": [ + "string bzdecompress(string source [, int small])", + "Decompresses BZip2 compressed data" + ], + "bzerrno": [ + "int bzerrno(resource bz)", + "Returns the error number" + ], + "bzerror": [ + "array bzerror(resource bz)", + "Returns the error number and error string in an associative array" + ], + "bzerrstr": [ + "string bzerrstr(resource bz)", + "Returns the error string" + ], + "bzopen": [ + "resource bzopen(string|int file|fp, string mode)", + "Opens a new BZip2 stream" + ], + "bzread": [ + "string bzread(resource bz[, int length])", + "Reads up to length bytes from a BZip2 stream, or 1024 bytes if length is not specified" + ], + "cal_days_in_month": [ + "int cal_days_in_month(int calendar, int month, int year)", + "Returns the number of days in a month for a given year and calendar" + ], + "cal_from_jd": [ + "array cal_from_jd(int jd, int calendar)", + "Converts from Julian Day Count to a supported calendar and return extended information" + ], + "cal_info": [ + "array cal_info([int calendar])", + "Returns information about a particular calendar" + ], + "cal_to_jd": [ + "int cal_to_jd(int calendar, int month, int day, int year)", + "Converts from a supported calendar to Julian Day Count" + ], + "call_user_func": [ + "mixed call_user_func(mixed function_name [, mixed parmeter] [, mixed ...])", + "Call a user function which is the first parameter" + ], + "call_user_func_array": [ + "mixed call_user_func_array(string function_name, array parameters)", + "Call a user function which is the first parameter with the arguments contained in array" + ], + "call_user_method": [ + "mixed call_user_method(string method_name, mixed object [, mixed parameter] [, mixed ...])", + "Call a user method on a specific object or class" + ], + "call_user_method_array": [ + "mixed call_user_method_array(string method_name, mixed object, array params)", + "Call a user method on a specific object or class using a parameter array" + ], + "ceil": [ + "float ceil(float number)", + "Returns the next highest integer value of the number" + ], + "chdir": [ + "bool chdir(string directory)", + "Change the current directory" + ], + "checkdate": [ + "bool checkdate(int month, int day, int year)", + "Returns true(1) if it is a valid date in gregorian calendar" + ], + "chgrp": [ + "bool chgrp(string filename, mixed group)", + "Change file group" + ], + "chmod": [ + "bool chmod(string filename, int mode)", + "Change file mode" + ], + "chown": [ + "bool chown (string filename, mixed user)", + "Change file owner" + ], + "chr": [ + "string chr(int ascii)", + "Converts ASCII code to a character" + ], + "chroot": [ + "bool chroot(string directory)", + "Change root directory" + ], + "chunk_split": [ + "string chunk_split(string str [, int chunklen [, string ending]])", + "Returns split line" + ], + "class_alias": [ + "bool class_alias(string user_class_name , string alias_name [, bool autoload])", + "Creates an alias for user defined class" + ], + "class_exists": [ + "bool class_exists(string classname [, bool autoload])", + "Checks if the class exists" + ], + "class_implements": [ + "array class_implements(mixed what [, bool autoload ])", + "Return all classes and interfaces implemented by SPL" + ], + "class_parents": [ + "array class_parents(object instance [, boolean autoload = true])", + "Return an array containing the names of all parent classes" + ], + "clearstatcache": [ + "void clearstatcache([bool clear_realpath_cache[, string filename]])", + "Clear file stat cache" + ], + "closedir": [ + "void closedir([resource dir_handle])", + "Close directory connection identified by the dir_handle" + ], + "closelog": [ + "bool closelog(void)", + "Close connection to system logger" + ], + "collator_asort": [ + "bool collator_asort( Collator $coll, array(string) $arr )", + "* Sort array using specified collator, maintaining index association." + ], + "collator_compare": [ + "int collator_compare( Collator $coll, string $str1, string $str2 )", + "* Compare two strings." + ], + "collator_create": [ + "Collator collator_create( string $locale )", + "* Create collator." + ], + "collator_get_attribute": [ + "int collator_get_attribute( Collator $coll, int $attr )", + "* Get collation attribute value." + ], + "collator_get_error_code": [ + "int collator_get_error_code( Collator $coll )", + "* Get collator's last error code." + ], + "collator_get_error_message": [ + "string collator_get_error_message( Collator $coll )", + "* Get text description for collator's last error code." + ], + "collator_get_locale": [ + "string collator_get_locale( Collator $coll, int $type )", + "* Gets the locale name of the collator." + ], + "collator_get_sort_key": [ + "bool collator_get_sort_key( Collator $coll, string $str )", + "* Get a sort key for a string from a Collator. }}}" + ], + "collator_get_strength": [ + "int collator_get_strength(Collator coll)", + "* Returns the current collation strength." + ], + "collator_set_attribute": [ + "bool collator_set_attribute( Collator $coll, int $attr, int $val )", + "* Set collation attribute." + ], + "collator_set_strength": [ + "bool collator_set_strength(Collator coll, int strength)", + "* Set the collation strength." + ], + "collator_sort": [ + "bool collator_sort( Collator $coll, array(string) $arr [, int $sort_flags] )", + "* Sort array using specified collator." + ], + "collator_sort_with_sort_keys": [ + "bool collator_sort_with_sort_keys( Collator $coll, array(string) $arr )", + "* Equivalent to standard PHP sort using Collator. * Uses ICU ucol_getSortKey for performance." + ], + "com_create_guid": [ + "string com_create_guid()", + "Generate a globally unique identifier (GUID)" + ], + "com_event_sink": [ + "bool com_event_sink(object comobject, object sinkobject [, mixed sinkinterface])", + "Connect events from a COM object to a PHP object" + ], + "com_get_active_object": [ + "object com_get_active_object(string progid [, int code_page ])", + "Returns a handle to an already running instance of a COM object" + ], + "com_load_typelib": [ + "bool com_load_typelib(string typelib_name [, int case_insensitive])", + "Loads a Typelibrary and registers its constants" + ], + "com_message_pump": [ + "bool com_message_pump([int timeoutms])", + "Process COM messages, sleeping for up to timeoutms milliseconds" + ], + "com_print_typeinfo": [ + "bool com_print_typeinfo(object comobject | string typelib, string dispinterface, bool wantsink)", + "Print out a PHP class definition for a dispatchable interface" + ], + "compact": [ + "array compact(mixed var_names [, mixed ...])", + "Creates a hash containing variables and their values" + ], + "compose_locale": [ + "static string compose_locale($array)", + "* Creates a locale by combining the parts of locale-ID passed * }}}" + ], + "confirm_extname_compiled": [ + "string confirm_extname_compiled(string arg)", + "Return a string to confirm that the module is compiled in" + ], + "connection_aborted": [ + "int connection_aborted(void)", + "Returns true if client disconnected" + ], + "connection_status": [ + "int connection_status(void)", + "Returns the connection status bitfield" + ], + "constant": [ + "mixed constant(string const_name)", + "Given the name of a constant this function will return the constant's associated value" + ], + "convert_cyr_string": [ + "string convert_cyr_string(string str, string from, string to)", + "Convert from one Cyrillic character set to another" + ], + "convert_uudecode": [ + "string convert_uudecode(string data)", + "decode a uuencoded string" + ], + "convert_uuencode": [ + "string convert_uuencode(string data)", + "uuencode a string" + ], + "copy": [ + "bool copy(string source_file, string destination_file [, resource context])", + "Copy a file" + ], + "cos": [ + "float cos(float number)", + "Returns the cosine of the number in radians" + ], + "cosh": [ + "float cosh(float number)", + "Returns the hyperbolic cosine of the number, defined as (exp(number) + exp(-number))/2" + ], + "count": [ + "int count(mixed var [, int mode])", + "Count the number of elements in a variable (usually an array)" + ], + "count_chars": [ + "mixed count_chars(string input [, int mode])", + "Returns info about what characters are used in input" + ], + "crc32": [ + "string crc32(string str)", + "Calculate the crc32 polynomial of a string" + ], + "create_function": [ + "string create_function(string args, string code)", + "Creates an anonymous function, and returns its name (funny, eh?)" + ], + "crypt": [ + "string crypt(string str [, string salt])", + "Hash a string" + ], + "ctype_alnum": [ + "bool ctype_alnum(mixed c)", + "Checks for alphanumeric character(s)" + ], + "ctype_alpha": [ + "bool ctype_alpha(mixed c)", + "Checks for alphabetic character(s)" + ], + "ctype_cntrl": [ + "bool ctype_cntrl(mixed c)", + "Checks for control character(s)" + ], + "ctype_digit": [ + "bool ctype_digit(mixed c)", + "Checks for numeric character(s)" + ], + "ctype_graph": [ + "bool ctype_graph(mixed c)", + "Checks for any printable character(s) except space" + ], + "ctype_lower": [ + "bool ctype_lower(mixed c)", + "Checks for lowercase character(s)" + ], + "ctype_print": [ + "bool ctype_print(mixed c)", + "Checks for printable character(s)" + ], + "ctype_punct": [ + "bool ctype_punct(mixed c)", + "Checks for any printable character which is not whitespace or an alphanumeric character" + ], + "ctype_space": [ + "bool ctype_space(mixed c)", + "Checks for whitespace character(s)" + ], + "ctype_upper": [ + "bool ctype_upper(mixed c)", + "Checks for uppercase character(s)" + ], + "ctype_xdigit": [ + "bool ctype_xdigit(mixed c)", + "Checks for character(s) representing a hexadecimal digit" + ], + "curl_close": [ + "void curl_close(resource ch)", + "Close a cURL session" + ], + "curl_copy_handle": [ + "resource curl_copy_handle(resource ch)", + "Copy a cURL handle along with all of it's preferences" + ], + "curl_errno": [ + "int curl_errno(resource ch)", + "Return an integer containing the last error number" + ], + "curl_error": [ + "string curl_error(resource ch)", + "Return a string contain the last error for the current session" + ], + "curl_exec": [ + "bool curl_exec(resource ch)", + "Perform a cURL session" + ], + "curl_getinfo": [ + "mixed curl_getinfo(resource ch [, int option])", + "Get information regarding a specific transfer" + ], + "curl_init": [ + "resource curl_init([string url])", + "Initialize a cURL session" + ], + "curl_multi_add_handle": [ + "int curl_multi_add_handle(resource mh, resource ch)", + "Add a normal cURL handle to a cURL multi handle" + ], + "curl_multi_close": [ + "void curl_multi_close(resource mh)", + "Close a set of cURL handles" + ], + "curl_multi_exec": [ + "int curl_multi_exec(resource mh, int &still_running)", + "Run the sub-connections of the current cURL handle" + ], + "curl_multi_getcontent": [ + "string curl_multi_getcontent(resource ch)", + "Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set" + ], + "curl_multi_info_read": [ + "array curl_multi_info_read(resource mh [, long msgs_in_queue])", + "Get information about the current transfers" + ], + "curl_multi_init": [ + "resource curl_multi_init(void)", + "Returns a new cURL multi handle" + ], + "curl_multi_remove_handle": [ + "int curl_multi_remove_handle(resource mh, resource ch)", + "Remove a multi handle from a set of cURL handles" + ], + "curl_multi_select": [ + "int curl_multi_select(resource mh[, double timeout])", + "Get all the sockets associated with the cURL extension, which can then be \"selected\"" + ], + "curl_setopt": [ + "bool curl_setopt(resource ch, int option, mixed value)", + "Set an option for a cURL transfer" + ], + "curl_setopt_array": [ + "bool curl_setopt_array(resource ch, array options)", + "Set an array of option for a cURL transfer" + ], + "curl_version": [ + "array curl_version([int version])", + "Return cURL version information." + ], + "current": [ + "mixed current(array array_arg)", + "Return the element currently pointed to by the internal array pointer" + ], + "date": [ + "string date(string format [, long timestamp])", + "Format a local date/time" + ], + "date_add": [ + "DateTime date_add(DateTime object, DateInterval interval)", + "Adds an interval to the current date in object." + ], + "date_create": [ + "DateTime date_create([string time[, DateTimeZone object]])", + "Returns new DateTime object" + ], + "date_create_from_format": [ + "DateTime date_create_from_format(string format, string time[, DateTimeZone object])", + "Returns new DateTime object formatted according to the specified format" + ], + "date_date_set": [ + "DateTime date_date_set(DateTime object, long year, long month, long day)", + "Sets the date." + ], + "date_default_timezone_get": [ + "string date_default_timezone_get()", + "Gets the default timezone used by all date/time functions in a script" + ], + "date_default_timezone_set": [ + "bool date_default_timezone_set(string timezone_identifier)", + "Sets the default timezone used by all date/time functions in a script" + ], + "date_diff": [ + "DateInterval date_diff(DateTime object [, bool absolute])", + "Returns the difference between two DateTime objects." + ], + "date_format": [ + "string date_format(DateTime object, string format)", + "Returns date formatted according to given format" + ], + "date_get_last_errors": [ + "array date_get_last_errors()", + "Returns the warnings and errors found while parsing a date/time string." + ], + "date_interval_create_from_date_string": [ + "DateInterval date_interval_create_from_date_string(string time)", + "Uses the normal date parsers and sets up a DateInterval from the relative parts of the parsed string" + ], + "date_interval_format": [ + "string date_interval_format(DateInterval object, string format)", + "Formats the interval." + ], + "date_isodate_set": [ + "DateTime date_isodate_set(DateTime object, long year, long week[, long day])", + "Sets the ISO date." + ], + "date_modify": [ + "DateTime date_modify(DateTime object, string modify)", + "Alters the timestamp." + ], + "date_offset_get": [ + "long date_offset_get(DateTime object)", + "Returns the DST offset." + ], + "date_parse": [ + "array date_parse(string date)", + "Returns associative array with detailed info about given date" + ], + "date_parse_from_format": [ + "array date_parse_from_format(string format, string date)", + "Returns associative array with detailed info about given date" + ], + "date_sub": [ + "DateTime date_sub(DateTime object, DateInterval interval)", + "Subtracts an interval to the current date in object." + ], + "date_sun_info": [ + "array date_sun_info(long time, float latitude, float longitude)", + "Returns an array with information about sun set/rise and twilight begin/end" + ], + "date_sunrise": [ + "mixed date_sunrise(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])", + "Returns time of sunrise for a given day and location" + ], + "date_sunset": [ + "mixed date_sunset(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])", + "Returns time of sunset for a given day and location" + ], + "date_time_set": [ + "DateTime date_time_set(DateTime object, long hour, long minute[, long second])", + "Sets the time." + ], + "date_timestamp_get": [ + "long date_timestamp_get(DateTime object)", + "Gets the Unix timestamp." + ], + "date_timestamp_set": [ + "DateTime date_timestamp_set(DateTime object, long unixTimestamp)", + "Sets the date and time based on an Unix timestamp." + ], + "date_timezone_get": [ + "DateTimeZone date_timezone_get(DateTime object)", + "Return new DateTimeZone object relative to give DateTime" + ], + "date_timezone_set": [ + "DateTime date_timezone_set(DateTime object, DateTimeZone object)", + "Sets the timezone for the DateTime object." + ], + "datefmt_create": [ + "IntlDateFormatter datefmt_create(string $locale, long date_type, long time_type[, string $timezone_str, long $calendar, string $pattern] )", + "* Create formatter." + ], + "datefmt_format": [ + "string datefmt_format( [mixed]int $args or array $args )", + "* Format the time value as a string. }}}" + ], + "datefmt_get_calendar": [ + "string datefmt_get_calendar( IntlDateFormatter $mf )", + "* Get formatter calendar." + ], + "datefmt_get_datetype": [ + "string datefmt_get_datetype( IntlDateFormatter $mf )", + "* Get formatter datetype." + ], + "datefmt_get_error_code": [ + "int datefmt_get_error_code( IntlDateFormatter $nf )", + "* Get formatter's last error code." + ], + "datefmt_get_error_message": [ + "string datefmt_get_error_message( IntlDateFormatter $coll )", + "* Get text description for formatter's last error code." + ], + "datefmt_get_locale": [ + "string datefmt_get_locale(IntlDateFormatter $mf)", + "* Get formatter locale." + ], + "datefmt_get_pattern": [ + "string datefmt_get_pattern( IntlDateFormatter $mf )", + "* Get formatter pattern." + ], + "datefmt_get_timetype": [ + "string datefmt_get_timetype( IntlDateFormatter $mf )", + "* Get formatter timetype." + ], + "datefmt_get_timezone_id": [ + "string datefmt_get_timezone_id( IntlDateFormatter $mf )", + "* Get formatter timezone_id." + ], + "datefmt_isLenient": [ + "string datefmt_isLenient(IntlDateFormatter $mf)", + "* Get formatter locale." + ], + "datefmt_localtime": [ + "integer datefmt_localtime( IntlDateFormatter $fmt, string $text_to_parse[, int $parse_pos ])", + "* Parse the string $value to a localtime array }}}" + ], + "datefmt_parse": [ + "integer datefmt_parse( IntlDateFormatter $fmt, string $text_to_parse [, int $parse_pos] )", + "* Parse the string $value starting at parse_pos to a Unix timestamp -int }}}" + ], + "datefmt_setLenient": [ + "string datefmt_setLenient(IntlDateFormatter $mf)", + "* Set formatter lenient." + ], + "datefmt_set_calendar": [ + "bool datefmt_set_calendar( IntlDateFormatter $mf, int $calendar )", + "* Set formatter calendar." + ], + "datefmt_set_pattern": [ + "bool datefmt_set_pattern( IntlDateFormatter $mf, string $pattern )", + "* Set formatter pattern." + ], + "datefmt_set_timezone_id": [ + "boolean datefmt_set_timezone_id( IntlDateFormatter $mf,$timezone_id)", + "* Set formatter timezone_id." + ], + "dba_close": [ + "void dba_close(resource handle)", + "Closes database" + ], + "dba_delete": [ + "bool dba_delete(string key, resource handle)", + "Deletes the entry associated with key If inifile: remove all other key lines" + ], + "dba_exists": [ + "bool dba_exists(string key, resource handle)", + "Checks, if the specified key exists" + ], + "dba_fetch": [ + "string dba_fetch(string key, [int skip ,] resource handle)", + "Fetches the data associated with key" + ], + "dba_firstkey": [ + "string dba_firstkey(resource handle)", + "Resets the internal key pointer and returns the first key" + ], + "dba_handlers": [ + "array dba_handlers([bool full_info])", + "List configured database handlers" + ], + "dba_insert": [ + "bool dba_insert(string key, string value, resource handle)", + "If not inifile: Insert value as key, return false, if key exists already If inifile: Add vakue as key (next instance of key)" + ], + "dba_key_split": [ + "array|false dba_key_split(string key)", + "Splits an inifile key into an array of the form array(0=>group,1=>value_name) but returns false if input is false or null" + ], + "dba_list": [ + "array dba_list()", + "List opened databases" + ], + "dba_nextkey": [ + "string dba_nextkey(resource handle)", + "Returns the next key" + ], + "dba_open": [ + "resource dba_open(string path, string mode [, string handlername, string ...])", + "Opens path using the specified handler in mode" + ], + "dba_optimize": [ + "bool dba_optimize(resource handle)", + "Optimizes (e.g. clean up, vacuum) database" + ], + "dba_popen": [ + "resource dba_popen(string path, string mode [, string handlername, string ...])", + "Opens path using the specified handler in mode persistently" + ], + "dba_replace": [ + "bool dba_replace(string key, string value, resource handle)", + "Inserts value as key, replaces key, if key exists already If inifile: remove all other key lines" + ], + "dba_sync": [ + "bool dba_sync(resource handle)", + "Synchronizes database" + ], + "dcgettext": [ + "string dcgettext(string domain_name, string msgid, long category)", + "Return the translation of msgid for domain_name and category, or msgid unaltered if a translation does not exist" + ], + "dcngettext": [ + "string dcngettext (string domain, string msgid1, string msgid2, int n, int category)", + "Plural version of dcgettext()" + ], + "debug_backtrace": [ + "array debug_backtrace([bool provide_object])", + "Return backtrace as array" + ], + "debug_print_backtrace": [ + "void debug_print_backtrace(void) */", + "ZEND_FUNCTION(debug_print_backtrace) { zend_execute_data *ptr, *skip; int lineno; char *function_name; char *filename; char *class_name = NULL; char *call_type; char *include_filename = NULL; zval *arg_array = NULL; int indent = 0; if (zend_parse_parameters_none() == FAILURE) { return; } ptr = EG(current_execute_data);", + "PHP_FUNCTION(dom_document_relaxNG_validate_file) { _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE); } /* }}} end dom_document_relaxNG_validate_file" + ], + "dom_document_relaxNG_validate_xml": [ + "boolean dom_document_relaxNG_validate_xml(string source); */", + "PHP_FUNCTION(dom_document_relaxNG_validate_xml) { _dom_document_relaxNG_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING); } /* }}} end dom_document_relaxNG_validate_xml" + ], + "dom_document_rename_node": [ + "DOMNode dom_document_rename_node(node n, string namespaceURI, string qualifiedName);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Document3-renameNode Since: DOM Level 3" + ], + "dom_document_save": [ + "int dom_document_save(string file);", + "Convenience method to save to file" + ], + "dom_document_save_html": [ + "string dom_document_save_html();", + "Convenience method to output as html" + ], + "dom_document_save_html_file": [ + "int dom_document_save_html_file(string file);", + "Convenience method to save to file as html" + ], + "dom_document_savexml": [ + "string dom_document_savexml([node n]);", + "URL: http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-DocumentLS-saveXML Since: DOM Level 3" + ], + "dom_document_schema_validate": [ + "boolean dom_document_schema_validate(string source); */", + "PHP_FUNCTION(dom_document_schema_validate_xml) { _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_STRING); } /* }}} end dom_document_schema_validate" + ], + "dom_document_schema_validate_file": [ + "boolean dom_document_schema_validate_file(string filename); */", + "PHP_FUNCTION(dom_document_schema_validate_file) { _dom_document_schema_validate(INTERNAL_FUNCTION_PARAM_PASSTHRU, DOM_LOAD_FILE); } /* }}} end dom_document_schema_validate_file" + ], + "dom_document_validate": [ + "boolean dom_document_validate();", + "Since: DOM extended" + ], + "dom_document_xinclude": [ + "int dom_document_xinclude([int options])", + "Substitutues xincludes in a DomDocument" + ], + "dom_domconfiguration_can_set_parameter": [ + "boolean dom_domconfiguration_can_set_parameter(string name, domuserdata value);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-canSetParameter Since:" + ], + "dom_domconfiguration_get_parameter": [ + "domdomuserdata dom_domconfiguration_get_parameter(string name);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-getParameter Since:" + ], + "dom_domconfiguration_set_parameter": [ + "dom_void dom_domconfiguration_set_parameter(string name, domuserdata value);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMConfiguration-property Since:" + ], + "dom_domerrorhandler_handle_error": [ + "dom_boolean dom_domerrorhandler_handle_error(domerror error);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-ERRORS-DOMErrorHandler-handleError Since:" + ], + "dom_domimplementation_create_document": [ + "DOMDocument dom_domimplementation_create_document(string namespaceURI, string qualifiedName, DOMDocumentType doctype);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocument Since: DOM Level 2" + ], + "dom_domimplementation_create_document_type": [ + "DOMDocumentType dom_domimplementation_create_document_type(string qualifiedName, string publicId, string systemId);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Level-2-Core-DOM-createDocType Since: DOM Level 2" + ], + "dom_domimplementation_get_feature": [ + "DOMNode dom_domimplementation_get_feature(string feature, string version);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementation3-getFeature Since: DOM Level 3" + ], + "dom_domimplementation_has_feature": [ + "boolean dom_domimplementation_has_feature(string feature, string version);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-5CED94D7 Since:" + ], + "dom_domimplementationlist_item": [ + "domdomimplementation dom_domimplementationlist_item(int index);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMImplementationList-item Since:" + ], + "dom_domimplementationsource_get_domimplementation": [ + "domdomimplementation dom_domimplementationsource_get_domimplementation(string features);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-getDOMImpl Since:" + ], + "dom_domimplementationsource_get_domimplementations": [ + "domimplementationlist dom_domimplementationsource_get_domimplementations(string features);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-getDOMImpls Since:" + ], + "dom_domstringlist_item": [ + "domstring dom_domstringlist_item(int index);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#DOMStringList-item Since:" + ], + "dom_element_get_attribute": [ + "string dom_element_get_attribute(string name);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-666EE0F9 Since:" + ], + "dom_element_get_attribute_node": [ + "DOMAttr dom_element_get_attribute_node(string name);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-217A91B8 Since:" + ], + "dom_element_get_attribute_node_ns": [ + "DOMAttr dom_element_get_attribute_node_ns(string namespaceURI, string localName);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAtNodeNS Since: DOM Level 2" + ], + "dom_element_get_attribute_ns": [ + "string dom_element_get_attribute_ns(string namespaceURI, string localName);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElGetAttrNS Since: DOM Level 2" + ], + "dom_element_get_elements_by_tag_name": [ + "DOMNodeList dom_element_get_elements_by_tag_name(string name);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1938918D Since:" + ], + "dom_element_get_elements_by_tag_name_ns": [ + "DOMNodeList dom_element_get_elements_by_tag_name_ns(string namespaceURI, string localName);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-A6C90942 Since: DOM Level 2" + ], + "dom_element_has_attribute": [ + "boolean dom_element_has_attribute(string name);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttr Since: DOM Level 2" + ], + "dom_element_has_attribute_ns": [ + "boolean dom_element_has_attribute_ns(string namespaceURI, string localName);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElHasAttrNS Since: DOM Level 2" + ], + "dom_element_remove_attribute": [ + "void dom_element_remove_attribute(string name);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6D6AC0F9 Since:" + ], + "dom_element_remove_attribute_node": [ + "DOMAttr dom_element_remove_attribute_node(DOMAttr oldAttr);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D589198 Since:" + ], + "dom_element_remove_attribute_ns": [ + "void dom_element_remove_attribute_ns(string namespaceURI, string localName);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElRemAtNS Since: DOM Level 2" + ], + "dom_element_set_attribute": [ + "void dom_element_set_attribute(string name, string value);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-F68F082 Since:" + ], + "dom_element_set_attribute_node": [ + "DOMAttr dom_element_set_attribute_node(DOMAttr newAttr);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-887236154 Since:" + ], + "dom_element_set_attribute_node_ns": [ + "DOMAttr dom_element_set_attribute_node_ns(DOMAttr newAttr);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAtNodeNS Since: DOM Level 2" + ], + "dom_element_set_attribute_ns": [ + "void dom_element_set_attribute_ns(string namespaceURI, string qualifiedName, string value);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetAttrNS Since: DOM Level 2" + ], + "dom_element_set_id_attribute": [ + "void dom_element_set_id_attribute(string name, boolean isId);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttr Since: DOM Level 3" + ], + "dom_element_set_id_attribute_node": [ + "void dom_element_set_id_attribute_node(attr idAttr, boolean isId);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNode Since: DOM Level 3" + ], + "dom_element_set_id_attribute_ns": [ + "void dom_element_set_id_attribute_ns(string namespaceURI, string localName, boolean isId);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-ElSetIdAttrNS Since: DOM Level 3" + ], + "dom_import_simplexml": [ + "somNode dom_import_simplexml(sxeobject node)", + "Get a simplexml_element object from dom to allow for processing" + ], + "dom_namednodemap_get_named_item": [ + "DOMNode dom_namednodemap_get_named_item(string name);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1074577549 Since:" + ], + "dom_namednodemap_get_named_item_ns": [ + "DOMNode dom_namednodemap_get_named_item_ns(string namespaceURI, string localName);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-getNamedItemNS Since: DOM Level 2" + ], + "dom_namednodemap_item": [ + "DOMNode dom_namednodemap_item(int index);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-349467F9 Since:" + ], + "dom_namednodemap_remove_named_item": [ + "DOMNode dom_namednodemap_remove_named_item(string name);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-D58B193 Since:" + ], + "dom_namednodemap_remove_named_item_ns": [ + "DOMNode dom_namednodemap_remove_named_item_ns(string namespaceURI, string localName);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-removeNamedItemNS Since: DOM Level 2" + ], + "dom_namednodemap_set_named_item": [ + "DOMNode dom_namednodemap_set_named_item(DOMNode arg);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1025163788 Since:" + ], + "dom_namednodemap_set_named_item_ns": [ + "DOMNode dom_namednodemap_set_named_item_ns(DOMNode arg);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-setNamedItemNS Since: DOM Level 2" + ], + "dom_namelist_get_name": [ + "string dom_namelist_get_name(int index);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-getName Since:" + ], + "dom_namelist_get_namespace_uri": [ + "string dom_namelist_get_namespace_uri(int index);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#NameList-getNamespaceURI Since:" + ], + "dom_node_append_child": [ + "DomNode dom_node_append_child(DomNode newChild);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-184E7107 Since:" + ], + "dom_node_clone_node": [ + "DomNode dom_node_clone_node(boolean deep);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-3A0ED0A4 Since:" + ], + "dom_node_compare_document_position": [ + "short dom_node_compare_document_position(DomNode other);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-compareDocumentPosition Since: DOM Level 3" + ], + "dom_node_get_feature": [ + "DomNode dom_node_get_feature(string feature, string version);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getFeature Since: DOM Level 3" + ], + "dom_node_get_user_data": [ + "mixed dom_node_get_user_data(string key);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-getUserData Since: DOM Level 3" + ], + "dom_node_has_attributes": [ + "boolean dom_node_has_attributes();", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-NodeHasAttrs Since: DOM Level 2" + ], + "dom_node_has_child_nodes": [ + "boolean dom_node_has_child_nodes();", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-810594187 Since:" + ], + "dom_node_insert_before": [ + "domnode dom_node_insert_before(DomNode newChild, DomNode refChild);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727 Since:" + ], + "dom_node_is_default_namespace": [ + "boolean dom_node_is_default_namespace(string namespaceURI);", + "URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-isDefaultNamespace Since: DOM Level 3" + ], + "dom_node_is_equal_node": [ + "boolean dom_node_is_equal_node(DomNode arg);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isEqualNode Since: DOM Level 3" + ], + "dom_node_is_same_node": [ + "boolean dom_node_is_same_node(DomNode other);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-isSameNode Since: DOM Level 3" + ], + "dom_node_is_supported": [ + "boolean dom_node_is_supported(string feature, string version);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Level-2-Core-Node-supports Since: DOM Level 2" + ], + "dom_node_lookup_namespace_uri": [ + "string dom_node_lookup_namespace_uri(string prefix);", + "URL: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI Since: DOM Level 3" + ], + "dom_node_lookup_prefix": [ + "string dom_node_lookup_prefix(string namespaceURI);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-lookupNamespacePrefix Since: DOM Level 3" + ], + "dom_node_normalize": [ + "void dom_node_normalize();", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-normalize Since:" + ], + "dom_node_remove_child": [ + "DomNode dom_node_remove_child(DomNode oldChild);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-1734834066 Since:" + ], + "dom_node_replace_child": [ + "DomNode dom_node_replace_child(DomNode newChild, DomNode oldChild);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-785887307 Since:" + ], + "dom_node_set_user_data": [ + "mixed dom_node_set_user_data(string key, mixed data, userdatahandler handler);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#Node3-setUserData Since: DOM Level 3" + ], + "dom_nodelist_item": [ + "DOMNode dom_nodelist_item(int index);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-844377136 Since:" + ], + "dom_string_extend_find_offset16": [ + "int dom_string_extend_find_offset16(int offset32);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend-findOffset16 Since:" + ], + "dom_string_extend_find_offset32": [ + "int dom_string_extend_find_offset32(int offset16);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#i18n-methods-StringExtend-findOffset32 Since:" + ], + "dom_text_is_whitespace_in_element_content": [ + "boolean dom_text_is_whitespace_in_element_content();", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Text3-isWhitespaceInElementContent Since: DOM Level 3" + ], + "dom_text_replace_whole_text": [ + "DOMText dom_text_replace_whole_text(string content);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-Text3-replaceWholeText Since: DOM Level 3" + ], + "dom_text_split_text": [ + "DOMText dom_text_split_text(int offset);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-38853C1D Since:" + ], + "dom_userdatahandler_handle": [ + "dom_void dom_userdatahandler_handle(short operation, string key, domobject data, node src, node dst);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-handleUserDataEvent Since:" + ], + "dom_xpath_evaluate": [ + "mixed dom_xpath_evaluate(string expr [,DOMNode context]); */", + "PHP_FUNCTION(dom_xpath_evaluate) { php_xpath_eval(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_DOM_XPATH_EVALUATE); } /* }}} end dom_xpath_evaluate" + ], + "dom_xpath_query": [ + "DOMNodeList dom_xpath_query(string expr [,DOMNode context]); */", + "PHP_FUNCTION(dom_xpath_query) { php_xpath_eval(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_DOM_XPATH_QUERY); } /* }}} end dom_xpath_query" + ], + "dom_xpath_register_ns": [ + "boolean dom_xpath_register_ns(string prefix, string uri); */", + "PHP_FUNCTION(dom_xpath_register_ns) { zval *id; xmlXPathContextPtr ctxp; int prefix_len, ns_uri_len; dom_xpath_object *intern; unsigned char *prefix, *ns_uri; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), \"Oss\", &id, dom_xpath_class_entry, &prefix, &prefix_len, &ns_uri, &ns_uri_len) == FAILURE) { return; } intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC); ctxp = (xmlXPathContextPtr) intern->ptr; if (ctxp == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, \"Invalid XPath Context\"); RETURN_FALSE; } if (xmlXPathRegisterNs(ctxp, prefix, ns_uri) != 0) { RETURN_FALSE } RETURN_TRUE; } /* }}}" + ], + "dom_xpath_register_php_functions": [ + "void dom_xpath_register_php_functions() */", + "PHP_FUNCTION(dom_xpath_register_php_functions) { zval *id; dom_xpath_object *intern; zval *array_value, **entry, *new_string; int name_len = 0; char *name; DOM_GET_THIS(id); if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, \"a\", &array_value) == SUCCESS) { intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC); zend_hash_internal_pointer_reset(Z_ARRVAL_P(array_value)); while (zend_hash_get_current_data(Z_ARRVAL_P(array_value), (void **)&entry) == SUCCESS) { SEPARATE_ZVAL(entry); convert_to_string_ex(entry); MAKE_STD_ZVAL(new_string); ZVAL_LONG(new_string,1); zend_hash_update(intern->registered_phpfunctions, Z_STRVAL_PP(entry), Z_STRLEN_PP(entry) + 1, &new_string, sizeof(zval*), NULL); zend_hash_move_forward(Z_ARRVAL_P(array_value)); } intern->registerPhpFunctions = 2; RETURN_TRUE; } else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, \"s\", &name, &name_len) == SUCCESS) { intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC); MAKE_STD_ZVAL(new_string); ZVAL_LONG(new_string,1); zend_hash_update(intern->registered_phpfunctions, name, name_len + 1, &new_string, sizeof(zval*), NULL); intern->registerPhpFunctions = 2; } else { intern = (dom_xpath_object *)zend_object_store_get_object(id TSRMLS_CC); intern->registerPhpFunctions = 1; } } /* }}} end dom_xpath_register_php_functions" + ], + "each": [ + "array each(array arr)", + "Return the currently pointed key..value pair in the passed array, and advance the pointer to the next element" + ], + "easter_date": [ + "int easter_date([int year])", + "Return the timestamp of midnight on Easter of a given year (defaults to current year)" + ], + "easter_days": [ + "int easter_days([int year, [int method]])", + "Return the number of days after March 21 that Easter falls on for a given year (defaults to current year)" + ], + "echo": [ + "void echo(string arg1 [, string ...])", + "Output one or more strings" + ], + "empty": [ + "bool empty( mixed var )", + "Determine whether a variable is empty" + ], + "enchant_broker_describe": [ + "array enchant_broker_describe(resource broker)", + "Enumerates the Enchant providers and tells you some rudimentary information about them. The same info is provided through phpinfo()" + ], + "enchant_broker_dict_exists": [ + "bool enchant_broker_dict_exists(resource broker, string tag)", + "Wether a dictionary exists or not. Using non-empty tag" + ], + "enchant_broker_free": [ + "boolean enchant_broker_free(resource broker)", + "Destroys the broker object and its dictionnaries" + ], + "enchant_broker_free_dict": [ + "resource enchant_broker_free_dict(resource dict)", + "Free the dictionary resource" + ], + "enchant_broker_get_dict_path": [ + "string enchant_broker_get_dict_path(resource broker, int dict_type)", + "Get the directory path for a given backend, works with ispell and myspell" + ], + "enchant_broker_get_error": [ + "string enchant_broker_get_error(resource broker)", + "Returns the last error of the broker" + ], + "enchant_broker_init": [ + "resource enchant_broker_init()", + "create a new broker object capable of requesting" + ], + "enchant_broker_list_dicts": [ + "string enchant_broker_list_dicts(resource broker)", + "Lists the dictionaries available for the given broker" + ], + "enchant_broker_request_dict": [ + "resource enchant_broker_request_dict(resource broker, string tag)", + "create a new dictionary using tag, the non-empty language tag you wish to request a dictionary for (\"en_US\", \"de_DE\", ...)" + ], + "enchant_broker_request_pwl_dict": [ + "resource enchant_broker_request_pwl_dict(resource broker, string filename)", + "creates a dictionary using a PWL file. A PWL file is personal word file one word per line. It must exist before the call." + ], + "enchant_broker_set_dict_path": [ + "bool enchant_broker_set_dict_path(resource broker, int dict_type, string value)", + "Set the directory path for a given backend, works with ispell and myspell" + ], + "enchant_broker_set_ordering": [ + "bool enchant_broker_set_ordering(resource broker, string tag, string ordering)", + "Declares a preference of dictionaries to use for the language described/referred to by 'tag'. The ordering is a comma delimited list of provider names. As a special exception, the \"*\" tag can be used as a language tag to declare a default ordering for any language that does not explictly declare an ordering." + ], + "enchant_dict_add_to_personal": [ + "void enchant_dict_add_to_personal(resource dict, string word)", + "add 'word' to personal word list" + ], + "enchant_dict_add_to_session": [ + "void enchant_dict_add_to_session(resource dict, string word)", + "add 'word' to this spell-checking session" + ], + "enchant_dict_check": [ + "bool enchant_dict_check(resource dict, string word)", + "If the word is correctly spelled return true, otherwise return false" + ], + "enchant_dict_describe": [ + "array enchant_dict_describe(resource dict)", + "Describes an individual dictionary 'dict'" + ], + "enchant_dict_get_error": [ + "string enchant_dict_get_error(resource dict)", + "Returns the last error of the current spelling-session" + ], + "enchant_dict_is_in_session": [ + "bool enchant_dict_is_in_session(resource dict, string word)", + "whether or not 'word' exists in this spelling-session" + ], + "enchant_dict_quick_check": [ + "bool enchant_dict_quick_check(resource dict, string word [, array &suggestions])", + "If the word is correctly spelled return true, otherwise return false, if suggestions variable is provided, fill it with spelling alternatives." + ], + "enchant_dict_store_replacement": [ + "void enchant_dict_store_replacement(resource dict, string mis, string cor)", + "add a correction for 'mis' using 'cor'. Notes that you replaced @mis with @cor, so it's possibly more likely that future occurrences of @mis will be replaced with @cor. So it might bump @cor up in the suggestion list." + ], + "enchant_dict_suggest": [ + "array enchant_dict_suggest(resource dict, string word)", + "Will return a list of values if any of those pre-conditions are not met." + ], + "end": [ + "mixed end(array array_arg)", + "Advances array argument's internal pointer to the last element and return it" + ], + "ereg": [ + "int ereg(string pattern, string string [, array registers])", + "Regular expression match" + ], + "ereg_replace": [ + "string ereg_replace(string pattern, string replacement, string string)", + "Replace regular expression" + ], + "eregi": [ + "int eregi(string pattern, string string [, array registers])", + "Case-insensitive regular expression match" + ], + "eregi_replace": [ + "string eregi_replace(string pattern, string replacement, string string)", + "Case insensitive replace regular expression" + ], + "error_get_last": [ + "array error_get_last()", + "Get the last occurred error as associative array. Returns NULL if there hasn't been an error yet." + ], + "error_log": [ + "bool error_log(string message [, int message_type [, string destination [, string extra_headers]]])", + "Send an error message somewhere" + ], + "error_reporting": [ + "int error_reporting([int new_error_level])", + "Return the current error_reporting level, and if an argument was passed - change to the new level" + ], + "escapeshellarg": [ + "string escapeshellarg(string arg)", + "Quote and escape an argument for use in a shell command" + ], + "escapeshellcmd": [ + "string escapeshellcmd(string command)", + "Escape shell metacharacters" + ], + "exec": [ + "string exec(string command [, array &output [, int &return_value]])", + "Execute an external program" + ], + "exif_imagetype": [ + "int exif_imagetype(string imagefile)", + "Get the type of an image" + ], + "exif_read_data": [ + "array exif_read_data(string filename [, sections_needed [, sub_arrays[, read_thumbnail]]])", + "Reads header data from the JPEG/TIFF image filename and optionally reads the internal thumbnails" + ], + "exif_tagname": [ + "string exif_tagname(index)", + "Get headername for index or false if not defined" + ], + "exif_thumbnail": [ + "string exif_thumbnail(string filename [, &width, &height [, &imagetype]])", + "Reads the embedded thumbnail" + ], + "exit": [ + "void exit([mixed status])", + "Output a message and terminate the current script" + ], + "exp": [ + "float exp(float number)", + "Returns e raised to the power of the number" + ], + "explode": [ + "array explode(string separator, string str [, int limit])", + "Splits a string on string separator and return array of components. If limit is positive only limit number of components is returned. If limit is negative all components except the last abs(limit) are returned." + ], + "expm1": [ + "float expm1(float number)", + "Returns exp(number) - 1, computed in a way that accurate even when the value of number is close to zero" + ], + "extension_loaded": [ + "bool extension_loaded(string extension_name)", + "Returns true if the named extension is loaded" + ], + "extract": [ + "int extract(array var_array [, int extract_type [, string prefix]])", + "Imports variables into symbol table from an array" + ], + "ezmlm_hash": [ + "int ezmlm_hash(string addr)", + "Calculate EZMLM list hash value." + ], + "fclose": [ + "bool fclose(resource fp)", + "Close an open file pointer" + ], + "feof": [ + "bool feof(resource fp)", + "Test for end-of-file on a file pointer" + ], + "fflush": [ + "bool fflush(resource fp)", + "Flushes output" + ], + "fgetc": [ + "string fgetc(resource fp)", + "Get a character from file pointer" + ], + "fgetcsv": [ + "array fgetcsv(resource fp [,int length [, string delimiter [, string enclosure [, string escape]]]])", + "Get line from file pointer and parse for CSV fields" + ], + "fgets": [ + "string fgets(resource fp[, int length])", + "Get a line from file pointer" + ], + "fgetss": [ + "string fgetss(resource fp [, int length [, string allowable_tags]])", + "Get a line from file pointer and strip HTML tags" + ], + "file": [ + "array file(string filename [, int flags[, resource context]])", + "Read entire file into an array" + ], + "file_exists": [ + "bool file_exists(string filename)", + "Returns true if filename exists" + ], + "file_get_contents": [ + "string file_get_contents(string filename [, bool use_include_path [, resource context [, long offset [, long maxlen]]]])", + "Read the entire file into a string" + ], + "file_put_contents": [ + "int file_put_contents(string file, mixed data [, int flags [, resource context]])", + "Write/Create a file with contents data and return the number of bytes written" + ], + "fileatime": [ + "int fileatime(string filename)", + "Get last access time of file" + ], + "filectime": [ + "int filectime(string filename)", + "Get inode modification time of file" + ], + "filegroup": [ + "int filegroup(string filename)", + "Get file group" + ], + "fileinode": [ + "int fileinode(string filename)", + "Get file inode" + ], + "filemtime": [ + "int filemtime(string filename)", + "Get last modification time of file" + ], + "fileowner": [ + "int fileowner(string filename)", + "Get file owner" + ], + "fileperms": [ + "int fileperms(string filename)", + "Get file permissions" + ], + "filesize": [ + "int filesize(string filename)", + "Get file size" + ], + "filetype": [ + "string filetype(string filename)", + "Get file type" + ], + "filter_has_var": [ + "mixed filter_has_var(constant type, string variable_name)", + "* Returns true if the variable with the name 'name' exists in source." + ], + "filter_input": [ + "mixed filter_input(constant type, string variable_name [, long filter [, mixed options]])", + "* Returns the filtered variable 'name'* from source `type`." + ], + "filter_input_array": [ + "mixed filter_input_array(constant type, [, mixed options]])", + "* Returns an array with all arguments defined in 'definition'." + ], + "filter_var": [ + "mixed filter_var(mixed variable [, long filter [, mixed options]])", + "* Returns the filtered version of the vriable." + ], + "filter_var_array": [ + "mixed filter_var_array(array data, [, mixed options]])", + "* Returns an array with all arguments defined in 'definition'." + ], + "finfo_buffer": [ + "string finfo_buffer(resource finfo, char *string [, int options [, resource context]])", + "Return infromation about a string buffer." + ], + "finfo_close": [ + "resource finfo_close(resource finfo)", + "Close fileinfo resource." + ], + "finfo_file": [ + "string finfo_file(resource finfo, char *file_name [, int options [, resource context]])", + "Return information about a file." + ], + "finfo_open": [ + "resource finfo_open([int options [, string arg]])", + "Create a new fileinfo resource." + ], + "finfo_set_flags": [ + "bool finfo_set_flags(resource finfo, int options)", + "Set libmagic configuration options." + ], + "floatval": [ + "float floatval(mixed var)", + "Get the float value of a variable" + ], + "flock": [ + "bool flock(resource fp, int operation [, int &wouldblock])", + "Portable file locking" + ], + "floor": [ + "float floor(float number)", + "Returns the next lowest integer value from the number" + ], + "flush": [ + "void flush(void)", + "Flush the output buffer" + ], + "fmod": [ + "float fmod(float x, float y)", + "Returns the remainder of dividing x by y as a float" + ], + "fnmatch": [ + "bool fnmatch(string pattern, string filename [, int flags])", + "Match filename against pattern" + ], + "fopen": [ + "resource fopen(string filename, string mode [, bool use_include_path [, resource context]])", + "Open a file or a URL and return a file pointer" + ], + "forward_static_call": [ + "mixed forward_static_call(mixed function_name [, mixed parmeter] [, mixed ...])", + "Call a user function which is the first parameter" + ], + "fpassthru": [ + "int fpassthru(resource fp)", + "Output all remaining data from a file pointer" + ], + "fprintf": [ + "int fprintf(resource stream, string format [, mixed arg1 [, mixed ...]])", + "Output a formatted string into a stream" + ], + "fputcsv": [ + "int fputcsv(resource fp, array fields [, string delimiter [, string enclosure]])", + "Format line as CSV and write to file pointer" + ], + "fread": [ + "string fread(resource fp, int length)", + "Binary-safe file read" + ], + "frenchtojd": [ + "int frenchtojd(int month, int day, int year)", + "Converts a french republic calendar date to julian day count" + ], + "fscanf": [ + "mixed fscanf(resource stream, string format [, string ...])", + "Implements a mostly ANSI compatible fscanf()" + ], + "fseek": [ + "int fseek(resource fp, int offset [, int whence])", + "Seek on a file pointer" + ], + "fsockopen": [ + "resource fsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])", + "Open Internet or Unix domain socket connection" + ], + "fstat": [ + "array fstat(resource fp)", + "Stat() on a filehandle" + ], + "ftell": [ + "int ftell(resource fp)", + "Get file pointer's read/write position" + ], + "ftok": [ + "int ftok(string pathname, string proj)", + "Convert a pathname and a project identifier to a System V IPC key" + ], + "ftp_alloc": [ + "bool ftp_alloc(resource stream, int size[, &response])", + "Attempt to allocate space on the remote FTP server" + ], + "ftp_cdup": [ + "bool ftp_cdup(resource stream)", + "Changes to the parent directory" + ], + "ftp_chdir": [ + "bool ftp_chdir(resource stream, string directory)", + "Changes directories" + ], + "ftp_chmod": [ + "int ftp_chmod(resource stream, int mode, string filename)", + "Sets permissions on a file" + ], + "ftp_close": [ + "bool ftp_close(resource stream)", + "Closes the FTP stream" + ], + "ftp_connect": [ + "resource ftp_connect(string host [, int port [, int timeout]])", + "Opens a FTP stream" + ], + "ftp_delete": [ + "bool ftp_delete(resource stream, string file)", + "Deletes a file" + ], + "ftp_exec": [ + "bool ftp_exec(resource stream, string command)", + "Requests execution of a program on the FTP server" + ], + "ftp_fget": [ + "bool ftp_fget(resource stream, resource fp, string remote_file, int mode[, int resumepos])", + "Retrieves a file from the FTP server and writes it to an open file" + ], + "ftp_fput": [ + "bool ftp_fput(resource stream, string remote_file, resource fp, int mode[, int startpos])", + "Stores a file from an open file to the FTP server" + ], + "ftp_get": [ + "bool ftp_get(resource stream, string local_file, string remote_file, int mode[, int resume_pos])", + "Retrieves a file from the FTP server and writes it to a local file" + ], + "ftp_get_option": [ + "mixed ftp_get_option(resource stream, int option)", + "Gets an FTP option" + ], + "ftp_login": [ + "bool ftp_login(resource stream, string username, string password)", + "Logs into the FTP server" + ], + "ftp_mdtm": [ + "int ftp_mdtm(resource stream, string filename)", + "Returns the last modification time of the file, or -1 on error" + ], + "ftp_mkdir": [ + "string ftp_mkdir(resource stream, string directory)", + "Creates a directory and returns the absolute path for the new directory or false on error" + ], + "ftp_nb_continue": [ + "int ftp_nb_continue(resource stream)", + "Continues retrieving/sending a file nbronously" + ], + "ftp_nb_fget": [ + "int ftp_nb_fget(resource stream, resource fp, string remote_file, int mode[, int resumepos])", + "Retrieves a file from the FTP server asynchronly and writes it to an open file" + ], + "ftp_nb_fput": [ + "int ftp_nb_fput(resource stream, string remote_file, resource fp, int mode[, int startpos])", + "Stores a file from an open file to the FTP server nbronly" + ], + "ftp_nb_get": [ + "int ftp_nb_get(resource stream, string local_file, string remote_file, int mode[, int resume_pos])", + "Retrieves a file from the FTP server nbhronly and writes it to a local file" + ], + "ftp_nb_put": [ + "int ftp_nb_put(resource stream, string remote_file, string local_file, int mode[, int startpos])", + "Stores a file on the FTP server" + ], + "ftp_nlist": [ + "array ftp_nlist(resource stream, string directory)", + "Returns an array of filenames in the given directory" + ], + "ftp_pasv": [ + "bool ftp_pasv(resource stream, bool pasv)", + "Turns passive mode on or off" + ], + "ftp_put": [ + "bool ftp_put(resource stream, string remote_file, string local_file, int mode[, int startpos])", + "Stores a file on the FTP server" + ], + "ftp_pwd": [ + "string ftp_pwd(resource stream)", + "Returns the present working directory" + ], + "ftp_raw": [ + "array ftp_raw(resource stream, string command)", + "Sends a literal command to the FTP server" + ], + "ftp_rawlist": [ + "array ftp_rawlist(resource stream, string directory [, bool recursive])", + "Returns a detailed listing of a directory as an array of output lines" + ], + "ftp_rename": [ + "bool ftp_rename(resource stream, string src, string dest)", + "Renames the given file to a new path" + ], + "ftp_rmdir": [ + "bool ftp_rmdir(resource stream, string directory)", + "Removes a directory" + ], + "ftp_set_option": [ + "bool ftp_set_option(resource stream, int option, mixed value)", + "Sets an FTP option" + ], + "ftp_site": [ + "bool ftp_site(resource stream, string cmd)", + "Sends a SITE command to the server" + ], + "ftp_size": [ + "int ftp_size(resource stream, string filename)", + "Returns the size of the file, or -1 on error" + ], + "ftp_ssl_connect": [ + "resource ftp_ssl_connect(string host [, int port [, int timeout]])", + "Opens a FTP-SSL stream" + ], + "ftp_systype": [ + "string ftp_systype(resource stream)", + "Returns the system type identifier" + ], + "ftruncate": [ + "bool ftruncate(resource fp, int size)", + "Truncate file to 'size' length" + ], + "func_get_arg": [ + "mixed func_get_arg(int arg_num)", + "Get the $arg_num'th argument that was passed to the function" + ], + "func_get_args": [ + "array func_get_args()", + "Get an array of the arguments that were passed to the function" + ], + "func_num_args": [ + "int func_num_args(void)", + "Get the number of arguments that were passed to the function" + ], + "function_exists": [ + "bool function_exists(string function_name)", + "Checks if the function exists" + ], + "fwrite": [ + "int fwrite(resource fp, string str [, int length])", + "Binary-safe file write" + ], + "gc_collect_cycles": [ + "int gc_collect_cycles(void)", + "Forces collection of any existing garbage cycles. Returns number of freed zvals" + ], + "gc_disable": [ + "void gc_disable(void)", + "Deactivates the circular reference collector" + ], + "gc_enable": [ + "void gc_enable(void)", + "Activates the circular reference collector" + ], + "gc_enabled": [ + "void gc_enabled(void)", + "Returns status of the circular reference collector" + ], + "gd_info": [ + "array gd_info()", + "" + ], + "getKeywords": [ + "static array getKeywords(string $locale) {", + "* return an associative array containing keyword-value * pairs for this locale. The keys are keys to the array (doh!) * }}}" + ], + "get_browser": [ + "mixed get_browser([string browser_name [, bool return_array]])", + "Get information about the capabilities of a browser. If browser_name is omitted or null, HTTP_USER_AGENT is used. Returns an object by default; if return_array is true, returns an array." + ], + "get_called_class": [ + "string get_called_class()", + "Retrieves the \"Late Static Binding\" class name" + ], + "get_cfg_var": [ + "mixed get_cfg_var(string option_name)", + "Get the value of a PHP configuration option" + ], + "get_class": [ + "string get_class([object object])", + "Retrieves the class name" + ], + "get_class_methods": [ + "array get_class_methods(mixed class)", + "Returns an array of method names for class or class instance." + ], + "get_class_vars": [ + "array get_class_vars(string class_name)", + "Returns an array of default properties of the class." + ], + "get_current_user": [ + "string get_current_user(void)", + "Get the name of the owner of the current PHP script" + ], + "get_declared_classes": [ + "array get_declared_classes()", + "Returns an array of all declared classes." + ], + "get_declared_interfaces": [ + "array get_declared_interfaces()", + "Returns an array of all declared interfaces." + ], + "get_defined_constants": [ + "array get_defined_constants([bool categorize])", + "Return an array containing the names and values of all defined constants" + ], + "get_defined_functions": [ + "array get_defined_functions(void)", + "Returns an array of all defined functions" + ], + "get_defined_vars": [ + "array get_defined_vars(void)", + "Returns an associative array of names and values of all currently defined variable names (variables in the current scope)" + ], + "get_display_language": [ + "static string get_display_language($locale[, $in_locale = null])", + "* gets the language for the $locale in $in_locale or default_locale" + ], + "get_display_name": [ + "static string get_display_name($locale[, $in_locale = null])", + "* gets the name for the $locale in $in_locale or default_locale" + ], + "get_display_region": [ + "static string get_display_region($locale, $in_locale = null)", + "* gets the region for the $locale in $in_locale or default_locale" + ], + "get_display_script": [ + "static string get_display_script($locale, $in_locale = null)", + "* gets the script for the $locale in $in_locale or default_locale" + ], + "get_extension_funcs": [ + "array get_extension_funcs(string extension_name)", + "Returns an array with the names of functions belonging to the named extension" + ], + "get_headers": [ + "array get_headers(string url[, int format])", + "fetches all the headers sent by the server in response to a HTTP request" + ], + "get_html_translation_table": [ + "array get_html_translation_table([int table [, int quote_style]])", + "Returns the internal translation table used by htmlspecialchars and htmlentities" + ], + "get_include_path": [ + "string get_include_path()", + "Get the current include_path configuration option" + ], + "get_included_files": [ + "array get_included_files(void)", + "Returns an array with the file names that were include_once()'d" + ], + "get_loaded_extensions": [ + "array get_loaded_extensions([bool zend_extensions])", + "Return an array containing names of loaded extensions" + ], + "get_magic_quotes_gpc": [ + "int get_magic_quotes_gpc(void)", + "Get the current active configuration setting of magic_quotes_gpc" + ], + "get_magic_quotes_runtime": [ + "int get_magic_quotes_runtime(void)", + "Get the current active configuration setting of magic_quotes_runtime" + ], + "get_meta_tags": [ + "array get_meta_tags(string filename [, bool use_include_path])", + "Extracts all meta tag content attributes from a file and returns an array" + ], + "get_object_vars": [ + "array get_object_vars(object obj)", + "Returns an array of object properties" + ], + "get_parent_class": [ + "string get_parent_class([mixed object])", + "Retrieves the parent class name for object or class or current scope." + ], + "get_resource_type": [ + "string get_resource_type(resource res)", + "Get the resource type name for a given resource" + ], + "getallheaders": [ + "array getallheaders(void)", + "" + ], + "getcwd": [ + "mixed getcwd(void)", + "Gets the current directory" + ], + "getdate": [ + "array getdate([int timestamp])", + "Get date/time information" + ], + "getenv": [ + "string getenv(string varname)", + "Get the value of an environment variable" + ], + "gethostbyaddr": [ + "string gethostbyaddr(string ip_address)", + "Get the Internet host name corresponding to a given IP address" + ], + "gethostbyname": [ + "string gethostbyname(string hostname)", + "Get the IP address corresponding to a given Internet host name" + ], + "gethostbynamel": [ + "array gethostbynamel(string hostname)", + "Return a list of IP addresses that a given hostname resolves to." + ], + "gethostname": [ + "string gethostname()", + "Get the host name of the current machine" + ], + "getimagesize": [ + "array getimagesize(string imagefile [, array info])", + "Get the size of an image as 4-element array" + ], + "getlastmod": [ + "int getlastmod(void)", + "Get time of last page modification" + ], + "getmygid": [ + "int getmygid(void)", + "Get PHP script owner's GID" + ], + "getmyinode": [ + "int getmyinode(void)", + "Get the inode of the current script being parsed" + ], + "getmypid": [ + "int getmypid(void)", + "Get current process ID" + ], + "getmyuid": [ + "int getmyuid(void)", + "Get PHP script owner's UID" + ], + "getopt": [ + "array getopt(string options [, array longopts])", + "Get options from the command line argument list" + ], + "getprotobyname": [ + "int getprotobyname(string name)", + "Returns protocol number associated with name as per /etc/protocols" + ], + "getprotobynumber": [ + "string getprotobynumber(int proto)", + "Returns protocol name associated with protocol number proto" + ], + "getrandmax": [ + "int getrandmax(void)", + "Returns the maximum value a random number can have" + ], + "getrusage": [ + "array getrusage([int who])", + "Returns an array of usage statistics" + ], + "getservbyname": [ + "int getservbyname(string service, string protocol)", + "Returns port associated with service. Protocol must be \"tcp\" or \"udp\"" + ], + "getservbyport": [ + "string getservbyport(int port, string protocol)", + "Returns service name associated with port. Protocol must be \"tcp\" or \"udp\"" + ], + "gettext": [ + "string gettext(string msgid)", + "Return the translation of msgid for the current domain, or msgid unaltered if a translation does not exist" + ], + "gettimeofday": [ + "array gettimeofday([bool get_as_float])", + "Returns the current time as array" + ], + "gettype": [ + "string gettype(mixed var)", + "Returns the type of the variable" + ], + "glob": [ + "array glob(string pattern [, int flags])", + "Find pathnames matching a pattern" + ], + "gmdate": [ + "string gmdate(string format [, long timestamp])", + "Format a GMT date/time" + ], + "gmmktime": [ + "int gmmktime([int hour [, int min [, int sec [, int mon [, int day [, int year]]]]]])", + "Get UNIX timestamp for a GMT date" + ], + "gmp_abs": [ + "resource gmp_abs(resource a)", + "Calculates absolute value" + ], + "gmp_add": [ + "resource gmp_add(resource a, resource b)", + "Add a and b" + ], + "gmp_and": [ + "resource gmp_and(resource a, resource b)", + "Calculates logical AND of a and b" + ], + "gmp_clrbit": [ + "void gmp_clrbit(resource &a, int index)", + "Clears bit in a" + ], + "gmp_cmp": [ + "int gmp_cmp(resource a, resource b)", + "Compares two numbers" + ], + "gmp_com": [ + "resource gmp_com(resource a)", + "Calculates one's complement of a" + ], + "gmp_div_q": [ + "resource gmp_div_q(resource a, resource b [, int round])", + "Divide a by b, returns quotient only" + ], + "gmp_div_qr": [ + "array gmp_div_qr(resource a, resource b [, int round])", + "Divide a by b, returns quotient and reminder" + ], + "gmp_div_r": [ + "resource gmp_div_r(resource a, resource b [, int round])", + "Divide a by b, returns reminder only" + ], + "gmp_divexact": [ + "resource gmp_divexact(resource a, resource b)", + "Divide a by b using exact division algorithm" + ], + "gmp_fact": [ + "resource gmp_fact(int a)", + "Calculates factorial function" + ], + "gmp_gcd": [ + "resource gmp_gcd(resource a, resource b)", + "Computes greatest common denominator (gcd) of a and b" + ], + "gmp_gcdext": [ + "array gmp_gcdext(resource a, resource b)", + "Computes G, S, and T, such that AS + BT = G = `gcd' (A, B)" + ], + "gmp_hamdist": [ + "int gmp_hamdist(resource a, resource b)", + "Calculates hamming distance between a and b" + ], + "gmp_init": [ + "resource gmp_init(mixed number [, int base])", + "Initializes GMP number" + ], + "gmp_intval": [ + "int gmp_intval(resource gmpnumber)", + "Gets signed long value of GMP number" + ], + "gmp_invert": [ + "resource gmp_invert(resource a, resource b)", + "Computes the inverse of a modulo b" + ], + "gmp_jacobi": [ + "int gmp_jacobi(resource a, resource b)", + "Computes Jacobi symbol" + ], + "gmp_legendre": [ + "int gmp_legendre(resource a, resource b)", + "Computes Legendre symbol" + ], + "gmp_mod": [ + "resource gmp_mod(resource a, resource b)", + "Computes a modulo b" + ], + "gmp_mul": [ + "resource gmp_mul(resource a, resource b)", + "Multiply a and b" + ], + "gmp_neg": [ + "resource gmp_neg(resource a)", + "Negates a number" + ], + "gmp_nextprime": [ + "resource gmp_nextprime(resource a)", + "Finds next prime of a" + ], + "gmp_or": [ + "resource gmp_or(resource a, resource b)", + "Calculates logical OR of a and b" + ], + "gmp_perfect_square": [ + "bool gmp_perfect_square(resource a)", + "Checks if a is an exact square" + ], + "gmp_popcount": [ + "int gmp_popcount(resource a)", + "Calculates the population count of a" + ], + "gmp_pow": [ + "resource gmp_pow(resource base, int exp)", + "Raise base to power exp" + ], + "gmp_powm": [ + "resource gmp_powm(resource base, resource exp, resource mod)", + "Raise base to power exp and take result modulo mod" + ], + "gmp_prob_prime": [ + "int gmp_prob_prime(resource a[, int reps])", + "Checks if a is \"probably prime\"" + ], + "gmp_random": [ + "resource gmp_random([int limiter])", + "Gets random number" + ], + "gmp_scan0": [ + "int gmp_scan0(resource a, int start)", + "Finds first zero bit" + ], + "gmp_scan1": [ + "int gmp_scan1(resource a, int start)", + "Finds first non-zero bit" + ], + "gmp_setbit": [ + "void gmp_setbit(resource &a, int index[, bool set_clear])", + "Sets or clear bit in a" + ], + "gmp_sign": [ + "int gmp_sign(resource a)", + "Gets the sign of the number" + ], + "gmp_sqrt": [ + "resource gmp_sqrt(resource a)", + "Takes integer part of square root of a" + ], + "gmp_sqrtrem": [ + "array gmp_sqrtrem(resource a)", + "Square root with remainder" + ], + "gmp_strval": [ + "string gmp_strval(resource gmpnumber [, int base])", + "Gets string representation of GMP number" + ], + "gmp_sub": [ + "resource gmp_sub(resource a, resource b)", + "Subtract b from a" + ], + "gmp_testbit": [ + "bool gmp_testbit(resource a, int index)", + "Tests if bit is set in a" + ], + "gmp_xor": [ + "resource gmp_xor(resource a, resource b)", + "Calculates logical exclusive OR of a and b" + ], + "gmstrftime": [ + "string gmstrftime(string format [, int timestamp])", + "Format a GMT/UCT time/date according to locale settings" + ], + "grapheme_extract": [ + "string grapheme_extract(string str, int size[, int extract_type[, int start[, int next]]])", + "Function to extract a sequence of default grapheme clusters" + ], + "grapheme_stripos": [ + "int grapheme_stripos(string haystack, string needle [, int offset ])", + "Find position of first occurrence of a string within another, ignoring case differences" + ], + "grapheme_stristr": [ + "string grapheme_stristr(string haystack, string needle[, bool part])", + "Finds first occurrence of a string within another" + ], + "grapheme_strlen": [ + "int grapheme_strlen(string str)", + "Get number of graphemes in a string" + ], + "grapheme_strpos": [ + "int grapheme_strpos(string haystack, string needle [, int offset ])", + "Find position of first occurrence of a string within another" + ], + "grapheme_strripos": [ + "int grapheme_strripos(string haystack, string needle [, int offset])", + "Find position of last occurrence of a string within another, ignoring case" + ], + "grapheme_strrpos": [ + "int grapheme_strrpos(string haystack, string needle [, int offset])", + "Find position of last occurrence of a string within another" + ], + "grapheme_strstr": [ + "string grapheme_strstr(string haystack, string needle[, bool part])", + "Finds first occurrence of a string within another" + ], + "grapheme_substr": [ + "string grapheme_substr(string str, int start [, int length])", + "Returns part of a string" + ], + "gregoriantojd": [ + "int gregoriantojd(int month, int day, int year)", + "Converts a gregorian calendar date to julian day count" + ], + "gzcompress": [ + "string gzcompress(string data [, int level])", + "Gzip-compress a string" + ], + "gzdeflate": [ + "string gzdeflate(string data [, int level])", + "Gzip-compress a string" + ], + "gzencode": [ + "string gzencode(string data [, int level [, int encoding_mode]])", + "GZ encode a string" + ], + "gzfile": [ + "array gzfile(string filename [, int use_include_path])", + "Read und uncompress entire .gz-file into an array" + ], + "gzinflate": [ + "string gzinflate(string data [, int length])", + "Unzip a gzip-compressed string" + ], + "gzopen": [ + "resource gzopen(string filename, string mode [, int use_include_path])", + "Open a .gz-file and return a .gz-file pointer" + ], + "gzuncompress": [ + "string gzuncompress(string data [, int length])", + "Unzip a gzip-compressed string" + ], + "hash": [ + "string hash(string algo, string data[, bool raw_output = false])", + "Generate a hash of a given input string Returns lowercase hexits by default" + ], + "hash_algos": [ + "array hash_algos(void)", + "Return a list of registered hashing algorithms" + ], + "hash_copy": [ + "resource hash_copy(resource context)", + "Copy hash resource" + ], + "hash_file": [ + "string hash_file(string algo, string filename[, bool raw_output = false])", + "Generate a hash of a given file Returns lowercase hexits by default" + ], + "hash_final": [ + "string hash_final(resource context[, bool raw_output=false])", + "Output resulting digest" + ], + "hash_hmac": [ + "string hash_hmac(string algo, string data, string key[, bool raw_output = false])", + "Generate a hash of a given input string with a key using HMAC Returns lowercase hexits by default" + ], + "hash_hmac_file": [ + "string hash_hmac_file(string algo, string filename, string key[, bool raw_output = false])", + "Generate a hash of a given file with a key using HMAC Returns lowercase hexits by default" + ], + "hash_init": [ + "resource hash_init(string algo[, int options, string key])", + "Initialize a hashing context" + ], + "hash_update": [ + "bool hash_update(resource context, string data)", + "Pump data into the hashing algorithm" + ], + "hash_update_file": [ + "bool hash_update_file(resource context, string filename[, resource context])", + "Pump data into the hashing algorithm from a file" + ], + "hash_update_stream": [ + "int hash_update_stream(resource context, resource handle[, integer length])", + "Pump data into the hashing algorithm from an open stream" + ], + "header": [ + "void header(string header [, bool replace, [int http_response_code]])", + "Sends a raw HTTP header" + ], + "header_remove": [ + "void header_remove([string name])", + "Removes an HTTP header previously set using header()" + ], + "headers_list": [ + "array headers_list(void)", + "Return list of headers to be sent / already sent" + ], + "headers_sent": [ + "bool headers_sent([string &$file [, int &$line]])", + "Returns true if headers have already been sent, false otherwise" + ], + "hebrev": [ + "string hebrev(string str [, int max_chars_per_line])", + "Converts logical Hebrew text to visual text" + ], + "hebrevc": [ + "string hebrevc(string str [, int max_chars_per_line])", + "Converts logical Hebrew text to visual text with newline conversion" + ], + "hexdec": [ + "int hexdec(string hexadecimal_number)", + "Returns the decimal equivalent of the hexadecimal number" + ], + "highlight_file": [ + "bool highlight_file(string file_name [, bool return] )", + "Syntax highlight a source file" + ], + "highlight_string": [ + "bool highlight_string(string string [, bool return] )", + "Syntax highlight a string or optionally return it" + ], + "html_entity_decode": [ + "string html_entity_decode(string string [, int quote_style][, string charset])", + "Convert all HTML entities to their applicable characters" + ], + "htmlentities": [ + "string htmlentities(string string [, int quote_style[, string charset[, bool double_encode]]])", + "Convert all applicable characters to HTML entities" + ], + "htmlspecialchars": [ + "string htmlspecialchars(string string [, int quote_style[, string charset[, bool double_encode]]])", + "Convert special characters to HTML entities" + ], + "htmlspecialchars_decode": [ + "string htmlspecialchars_decode(string string [, int quote_style])", + "Convert special HTML entities back to characters" + ], + "http_build_query": [ + "string http_build_query(mixed formdata [, string prefix [, string arg_separator]])", + "Generates a form-encoded query string from an associative array or object." + ], + "hypot": [ + "float hypot(float num1, float num2)", + "Returns sqrt(num1*num1 + num2*num2)" + ], + "ibase_add_user": [ + "bool ibase_add_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])", + "Add a user to security database" + ], + "ibase_affected_rows": [ + "int ibase_affected_rows( [ resource link_identifier ] )", + "Returns the number of rows affected by the previous INSERT, UPDATE or DELETE statement" + ], + "ibase_backup": [ + "mixed ibase_backup(resource service_handle, string source_db, string dest_file [, int options [, bool verbose]])", + "Initiates a backup task in the service manager and returns immediately" + ], + "ibase_blob_add": [ + "bool ibase_blob_add(resource blob_handle, string data)", + "Add data into created blob" + ], + "ibase_blob_cancel": [ + "bool ibase_blob_cancel(resource blob_handle)", + "Cancel creating blob" + ], + "ibase_blob_close": [ + "string ibase_blob_close(resource blob_handle)", + "Close blob" + ], + "ibase_blob_create": [ + "resource ibase_blob_create([resource link_identifier])", + "Create blob for adding data" + ], + "ibase_blob_echo": [ + "bool ibase_blob_echo([ resource link_identifier, ] string blob_id)", + "Output blob contents to browser" + ], + "ibase_blob_get": [ + "string ibase_blob_get(resource blob_handle, int len)", + "Get len bytes data from open blob" + ], + "ibase_blob_import": [ + "string ibase_blob_import([ resource link_identifier, ] resource file)", + "Create blob, copy file in it, and close it" + ], + "ibase_blob_info": [ + "array ibase_blob_info([ resource link_identifier, ] string blob_id)", + "Return blob length and other useful info" + ], + "ibase_blob_open": [ + "resource ibase_blob_open([ resource link_identifier, ] string blob_id)", + "Open blob for retrieving data parts" + ], + "ibase_close": [ + "bool ibase_close([resource link_identifier])", + "Close an InterBase connection" + ], + "ibase_commit": [ + "bool ibase_commit( resource link_identifier )", + "Commit transaction" + ], + "ibase_commit_ret": [ + "bool ibase_commit_ret( resource link_identifier )", + "Commit transaction and retain the transaction context" + ], + "ibase_connect": [ + "resource ibase_connect(string database [, string username [, string password [, string charset [, int buffers [, int dialect [, string role]]]]]])", + "Open a connection to an InterBase database" + ], + "ibase_db_info": [ + "string ibase_db_info(resource service_handle, string db, int action [, int argument])", + "Request statistics about a database" + ], + "ibase_delete_user": [ + "bool ibase_delete_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])", + "Delete a user from security database" + ], + "ibase_drop_db": [ + "bool ibase_drop_db([resource link_identifier])", + "Drop an InterBase database" + ], + "ibase_errcode": [ + "int ibase_errcode(void)", + "Return error code" + ], + "ibase_errmsg": [ + "string ibase_errmsg(void)", + "Return error message" + ], + "ibase_execute": [ + "mixed ibase_execute(resource query [, mixed bind_arg [, mixed bind_arg [, ...]]])", + "Execute a previously prepared query" + ], + "ibase_fetch_assoc": [ + "array ibase_fetch_assoc(resource result [, int fetch_flags])", + "Fetch a row from the results of a query" + ], + "ibase_fetch_object": [ + "object ibase_fetch_object(resource result [, int fetch_flags])", + "Fetch a object from the results of a query" + ], + "ibase_fetch_row": [ + "array ibase_fetch_row(resource result [, int fetch_flags])", + "Fetch a row from the results of a query" + ], + "ibase_field_info": [ + "array ibase_field_info(resource query_result, int field_number)", + "Get information about a field" + ], + "ibase_free_event_handler": [ + "bool ibase_free_event_handler(resource event)", + "Frees the event handler set by ibase_set_event_handler()" + ], + "ibase_free_query": [ + "bool ibase_free_query(resource query)", + "Free memory used by a query" + ], + "ibase_free_result": [ + "bool ibase_free_result(resource result)", + "Free the memory used by a result" + ], + "ibase_gen_id": [ + "int ibase_gen_id(string generator [, int increment [, resource link_identifier ]])", + "Increments the named generator and returns its new value" + ], + "ibase_maintain_db": [ + "bool ibase_maintain_db(resource service_handle, string db, int action [, int argument])", + "Execute a maintenance command on the database server" + ], + "ibase_modify_user": [ + "bool ibase_modify_user(resource service_handle, string user_name, string password [, string first_name [, string middle_name [, string last_name]]])", + "Modify a user in security database" + ], + "ibase_name_result": [ + "bool ibase_name_result(resource result, string name)", + "Assign a name to a result for use with ... WHERE CURRENT OF statements" + ], + "ibase_num_fields": [ + "int ibase_num_fields(resource query_result)", + "Get the number of fields in result" + ], + "ibase_num_params": [ + "int ibase_num_params(resource query)", + "Get the number of params in a prepared query" + ], + "ibase_num_rows": [ + "int ibase_num_rows( resource result_identifier )", + "Return the number of rows that are available in a result" + ], + "ibase_param_info": [ + "array ibase_param_info(resource query, int field_number)", + "Get information about a parameter" + ], + "ibase_pconnect": [ + "resource ibase_pconnect(string database [, string username [, string password [, string charset [, int buffers [, int dialect [, string role]]]]]])", + "Open a persistent connection to an InterBase database" + ], + "ibase_prepare": [ + "resource ibase_prepare(resource link_identifier[, string query [, resource trans_identifier ]])", + "Prepare a query for later execution" + ], + "ibase_query": [ + "mixed ibase_query([resource link_identifier, [ resource link_identifier, ]] string query [, mixed bind_arg [, mixed bind_arg [, ...]]])", + "Execute a query" + ], + "ibase_restore": [ + "mixed ibase_restore(resource service_handle, string source_file, string dest_db [, int options [, bool verbose]])", + "Initiates a restore task in the service manager and returns immediately" + ], + "ibase_rollback": [ + "bool ibase_rollback( resource link_identifier )", + "Rollback transaction" + ], + "ibase_rollback_ret": [ + "bool ibase_rollback_ret( resource link_identifier )", + "Rollback transaction and retain the transaction context" + ], + "ibase_server_info": [ + "string ibase_server_info(resource service_handle, int action)", + "Request information about a database server" + ], + "ibase_service_attach": [ + "resource ibase_service_attach(string host, string dba_username, string dba_password)", + "Connect to the service manager" + ], + "ibase_service_detach": [ + "bool ibase_service_detach(resource service_handle)", + "Disconnect from the service manager" + ], + "ibase_set_event_handler": [ + "resource ibase_set_event_handler([resource link_identifier,] callback handler, string event [, string event [, ...]])", + "Register the callback for handling each of the named events" + ], + "ibase_trans": [ + "resource ibase_trans([int trans_args [, resource link_identifier [, ... ], int trans_args [, resource link_identifier [, ... ]] [, ...]]])", + "Start a transaction over one or several databases" + ], + "ibase_wait_event": [ + "string ibase_wait_event([resource link_identifier,] string event [, string event [, ...]])", + "Waits for any one of the passed Interbase events to be posted by the database, and returns its name" + ], + "iconv": [ + "string iconv(string in_charset, string out_charset, string str)", + "Returns str converted to the out_charset character set" + ], + "iconv_get_encoding": [ + "mixed iconv_get_encoding([string type])", + "Get internal encoding and output encoding for ob_iconv_handler()" + ], + "iconv_mime_decode": [ + "string iconv_mime_decode(string encoded_string [, int mode, string charset])", + "Decodes a mime header field" + ], + "iconv_mime_decode_headers": [ + "array iconv_mime_decode_headers(string headers [, int mode, string charset])", + "Decodes multiple mime header fields" + ], + "iconv_mime_encode": [ + "string iconv_mime_encode(string field_name, string field_value [, array preference])", + "Composes a mime header field with field_name and field_value in a specified scheme" + ], + "iconv_set_encoding": [ + "bool iconv_set_encoding(string type, string charset)", + "Sets internal encoding and output encoding for ob_iconv_handler()" + ], + "iconv_strlen": [ + "int iconv_strlen(string str [, string charset])", + "Returns the character count of str" + ], + "iconv_strpos": [ + "int iconv_strpos(string haystack, string needle [, int offset [, string charset]])", + "Finds position of first occurrence of needle within part of haystack beginning with offset" + ], + "iconv_strrpos": [ + "int iconv_strrpos(string haystack, string needle [, string charset])", + "Finds position of last occurrence of needle within part of haystack beginning with offset" + ], + "iconv_substr": [ + "string iconv_substr(string str, int offset, [int length, string charset])", + "Returns specified part of a string" + ], + "idate": [ + "int idate(string format [, int timestamp])", + "Format a local time/date as integer" + ], + "idn_to_ascii": [ + "int idn_to_ascii(string domain[, int options])", + "Converts an Unicode domain to ASCII representation, as defined in the IDNA RFC" + ], + "idn_to_utf8": [ + "int idn_to_utf8(string domain[, int options])", + "Converts an ASCII representation of the domain to Unicode (UTF-8), as defined in the IDNA RFC" + ], + "ignore_user_abort": [ + "int ignore_user_abort([string value])", + "Set whether we want to ignore a user abort event or not" + ], + "image2wbmp": [ + "bool image2wbmp(resource im [, string filename [, int threshold]])", + "Output WBMP image to browser or file" + ], + "image_type_to_extension": [ + "string image_type_to_extension(int imagetype [, bool include_dot])", + "Get file extension for image-type returned by getimagesize, exif_read_data, exif_thumbnail, exif_imagetype" + ], + "image_type_to_mime_type": [ + "string image_type_to_mime_type(int imagetype)", + "Get Mime-Type for image-type returned by getimagesize, exif_read_data, exif_thumbnail, exif_imagetype" + ], + "imagealphablending": [ + "bool imagealphablending(resource im, bool on)", + "Turn alpha blending mode on or off for the given image" + ], + "imageantialias": [ + "bool imageantialias(resource im, bool on)", + "Should antialiased functions used or not" + ], + "imagearc": [ + "bool imagearc(resource im, int cx, int cy, int w, int h, int s, int e, int col)", + "Draw a partial ellipse" + ], + "imagechar": [ + "bool imagechar(resource im, int font, int x, int y, string c, int col)", + "Draw a character" + ], + "imagecharup": [ + "bool imagecharup(resource im, int font, int x, int y, string c, int col)", + "Draw a character rotated 90 degrees counter-clockwise" + ], + "imagecolorallocate": [ + "int imagecolorallocate(resource im, int red, int green, int blue)", + "Allocate a color for an image" + ], + "imagecolorallocatealpha": [ + "int imagecolorallocatealpha(resource im, int red, int green, int blue, int alpha)", + "Allocate a color with an alpha level. Works for true color and palette based images" + ], + "imagecolorat": [ + "int imagecolorat(resource im, int x, int y)", + "Get the index of the color of a pixel" + ], + "imagecolorclosest": [ + "int imagecolorclosest(resource im, int red, int green, int blue)", + "Get the index of the closest color to the specified color" + ], + "imagecolorclosestalpha": [ + "int imagecolorclosestalpha(resource im, int red, int green, int blue, int alpha)", + "Find the closest matching colour with alpha transparency" + ], + "imagecolorclosesthwb": [ + "int imagecolorclosesthwb(resource im, int red, int green, int blue)", + "Get the index of the color which has the hue, white and blackness nearest to the given color" + ], + "imagecolordeallocate": [ + "bool imagecolordeallocate(resource im, int index)", + "De-allocate a color for an image" + ], + "imagecolorexact": [ + "int imagecolorexact(resource im, int red, int green, int blue)", + "Get the index of the specified color" + ], + "imagecolorexactalpha": [ + "int imagecolorexactalpha(resource im, int red, int green, int blue, int alpha)", + "Find exact match for colour with transparency" + ], + "imagecolormatch": [ + "bool imagecolormatch(resource im1, resource im2)", + "Makes the colors of the palette version of an image more closely match the true color version" + ], + "imagecolorresolve": [ + "int imagecolorresolve(resource im, int red, int green, int blue)", + "Get the index of the specified color or its closest possible alternative" + ], + "imagecolorresolvealpha": [ + "int imagecolorresolvealpha(resource im, int red, int green, int blue, int alpha)", + "Resolve/Allocate a colour with an alpha level. Works for true colour and palette based images" + ], + "imagecolorset": [ + "void imagecolorset(resource im, int col, int red, int green, int blue)", + "Set the color for the specified palette index" + ], + "imagecolorsforindex": [ + "array imagecolorsforindex(resource im, int col)", + "Get the colors for an index" + ], + "imagecolorstotal": [ + "int imagecolorstotal(resource im)", + "Find out the number of colors in an image's palette" + ], + "imagecolortransparent": [ + "int imagecolortransparent(resource im [, int col])", + "Define a color as transparent" + ], + "imageconvolution": [ + "resource imageconvolution(resource src_im, array matrix3x3, double div, double offset)", + "Apply a 3x3 convolution matrix, using coefficient div and offset" + ], + "imagecopy": [ + "bool imagecopy(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)", + "Copy part of an image" + ], + "imagecopymerge": [ + "bool imagecopymerge(resource src_im, resource dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)", + "Merge one part of an image with another" + ], + "imagecopymergegray": [ + "bool imagecopymergegray(resource src_im, resource dst_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)", + "Merge one part of an image with another" + ], + "imagecopyresampled": [ + "bool imagecopyresampled(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)", + "Copy and resize part of an image using resampling to help ensure clarity" + ], + "imagecopyresized": [ + "bool imagecopyresized(resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h)", + "Copy and resize part of an image" + ], + "imagecreate": [ + "resource imagecreate(int x_size, int y_size)", + "Create a new image" + ], + "imagecreatefromgd": [ + "resource imagecreatefromgd(string filename)", + "Create a new image from GD file or URL" + ], + "imagecreatefromgd2": [ + "resource imagecreatefromgd2(string filename)", + "Create a new image from GD2 file or URL" + ], + "imagecreatefromgd2part": [ + "resource imagecreatefromgd2part(string filename, int srcX, int srcY, int width, int height)", + "Create a new image from a given part of GD2 file or URL" + ], + "imagecreatefromgif": [ + "resource imagecreatefromgif(string filename)", + "Create a new image from GIF file or URL" + ], + "imagecreatefromjpeg": [ + "resource imagecreatefromjpeg(string filename)", + "Create a new image from JPEG file or URL" + ], + "imagecreatefrompng": [ + "resource imagecreatefrompng(string filename)", + "Create a new image from PNG file or URL" + ], + "imagecreatefromstring": [ + "resource imagecreatefromstring(string image)", + "Create a new image from the image stream in the string" + ], + "imagecreatefromwbmp": [ + "resource imagecreatefromwbmp(string filename)", + "Create a new image from WBMP file or URL" + ], + "imagecreatefromxbm": [ + "resource imagecreatefromxbm(string filename)", + "Create a new image from XBM file or URL" + ], + "imagecreatefromxpm": [ + "resource imagecreatefromxpm(string filename)", + "Create a new image from XPM file or URL" + ], + "imagecreatetruecolor": [ + "resource imagecreatetruecolor(int x_size, int y_size)", + "Create a new true color image" + ], + "imagedashedline": [ + "bool imagedashedline(resource im, int x1, int y1, int x2, int y2, int col)", + "Draw a dashed line" + ], + "imagedestroy": [ + "bool imagedestroy(resource im)", + "Destroy an image" + ], + "imageellipse": [ + "bool imageellipse(resource im, int cx, int cy, int w, int h, int color)", + "Draw an ellipse" + ], + "imagefill": [ + "bool imagefill(resource im, int x, int y, int col)", + "Flood fill" + ], + "imagefilledarc": [ + "bool imagefilledarc(resource im, int cx, int cy, int w, int h, int s, int e, int col, int style)", + "Draw a filled partial ellipse" + ], + "imagefilledellipse": [ + "bool imagefilledellipse(resource im, int cx, int cy, int w, int h, int color)", + "Draw an ellipse" + ], + "imagefilledpolygon": [ + "bool imagefilledpolygon(resource im, array point, int num_points, int col)", + "Draw a filled polygon" + ], + "imagefilledrectangle": [ + "bool imagefilledrectangle(resource im, int x1, int y1, int x2, int y2, int col)", + "Draw a filled rectangle" + ], + "imagefilltoborder": [ + "bool imagefilltoborder(resource im, int x, int y, int border, int col)", + "Flood fill to specific color" + ], + "imagefilter": [ + "bool imagefilter(resource src_im, int filtertype, [args] )", + "Applies Filter an image using a custom angle" + ], + "imagefontheight": [ + "int imagefontheight(int font)", + "Get font height" + ], + "imagefontwidth": [ + "int imagefontwidth(int font)", + "Get font width" + ], + "imageftbbox": [ + "array imageftbbox(float size, float angle, string font_file, string text [, array extrainfo])", + "Give the bounding box of a text using fonts via freetype2" + ], + "imagefttext": [ + "array imagefttext(resource im, float size, float angle, int x, int y, int col, string font_file, string text [, array extrainfo])", + "Write text to the image using fonts via freetype2" + ], + "imagegammacorrect": [ + "bool imagegammacorrect(resource im, float inputgamma, float outputgamma)", + "Apply a gamma correction to a GD image" + ], + "imagegd": [ + "bool imagegd(resource im [, string filename])", + "Output GD image to browser or file" + ], + "imagegd2": [ + "bool imagegd2(resource im [, string filename, [, int chunk_size, [, int type]]])", + "Output GD2 image to browser or file" + ], + "imagegif": [ + "bool imagegif(resource im [, string filename])", + "Output GIF image to browser or file" + ], + "imagegrabscreen": [ + "resource imagegrabscreen()", + "Grab a screenshot" + ], + "imagegrabwindow": [ + "resource imagegrabwindow(int window_handle [, int client_area])", + "Grab a window or its client area using a windows handle (HWND property in COM instance)" + ], + "imageinterlace": [ + "int imageinterlace(resource im [, int interlace])", + "Enable or disable interlace" + ], + "imageistruecolor": [ + "bool imageistruecolor(resource im)", + "return true if the image uses truecolor" + ], + "imagejpeg": [ + "bool imagejpeg(resource im [, string filename [, int quality]])", + "Output JPEG image to browser or file" + ], + "imagelayereffect": [ + "bool imagelayereffect(resource im, int effect)", + "Set the alpha blending flag to use the bundled libgd layering effects" + ], + "imageline": [ + "bool imageline(resource im, int x1, int y1, int x2, int y2, int col)", + "Draw a line" + ], + "imageloadfont": [ + "int imageloadfont(string filename)", + "Load a new font" + ], + "imagepalettecopy": [ + "void imagepalettecopy(resource dst, resource src)", + "Copy the palette from the src image onto the dst image" + ], + "imagepng": [ + "bool imagepng(resource im [, string filename])", + "Output PNG image to browser or file" + ], + "imagepolygon": [ + "bool imagepolygon(resource im, array point, int num_points, int col)", + "Draw a polygon" + ], + "imagepsbbox": [ + "array imagepsbbox(string text, resource font, int size [, int space, int tightness, float angle])", + "Return the bounding box needed by a string if rasterized" + ], + "imagepscopyfont": [ + "int imagepscopyfont(int font_index)", + "Make a copy of a font for purposes like extending or reenconding" + ], + "imagepsencodefont": [ + "bool imagepsencodefont(resource font_index, string filename)", + "To change a fonts character encoding vector" + ], + "imagepsextendfont": [ + "bool imagepsextendfont(resource font_index, float extend)", + "Extend or or condense (if extend < 1) a font" + ], + "imagepsfreefont": [ + "bool imagepsfreefont(resource font_index)", + "Free memory used by a font" + ], + "imagepsloadfont": [ + "resource imagepsloadfont(string pathname)", + "Load a new font from specified file" + ], + "imagepsslantfont": [ + "bool imagepsslantfont(resource font_index, float slant)", + "Slant a font" + ], + "imagepstext": [ + "array imagepstext(resource image, string text, resource font, int size, int foreground, int background, int xcoord, int ycoord [, int space [, int tightness [, float angle [, int antialias])", + "Rasterize a string over an image" + ], + "imagerectangle": [ + "bool imagerectangle(resource im, int x1, int y1, int x2, int y2, int col)", + "Draw a rectangle" + ], + "imagerotate": [ + "resource imagerotate(resource src_im, float angle, int bgdcolor [, int ignoretransparent])", + "Rotate an image using a custom angle" + ], + "imagesavealpha": [ + "bool imagesavealpha(resource im, bool on)", + "Include alpha channel to a saved image" + ], + "imagesetbrush": [ + "bool imagesetbrush(resource image, resource brush)", + "Set the brush image to $brush when filling $image with the \"IMG_COLOR_BRUSHED\" color" + ], + "imagesetpixel": [ + "bool imagesetpixel(resource im, int x, int y, int col)", + "Set a single pixel" + ], + "imagesetstyle": [ + "bool imagesetstyle(resource im, array styles)", + "Set the line drawing styles for use with imageline and IMG_COLOR_STYLED." + ], + "imagesetthickness": [ + "bool imagesetthickness(resource im, int thickness)", + "Set line thickness for drawing lines, ellipses, rectangles, polygons etc." + ], + "imagesettile": [ + "bool imagesettile(resource image, resource tile)", + "Set the tile image to $tile when filling $image with the \"IMG_COLOR_TILED\" color" + ], + "imagestring": [ + "bool imagestring(resource im, int font, int x, int y, string str, int col)", + "Draw a string horizontally" + ], + "imagestringup": [ + "bool imagestringup(resource im, int font, int x, int y, string str, int col)", + "Draw a string vertically - rotated 90 degrees counter-clockwise" + ], + "imagesx": [ + "int imagesx(resource im)", + "Get image width" + ], + "imagesy": [ + "int imagesy(resource im)", + "Get image height" + ], + "imagetruecolortopalette": [ + "void imagetruecolortopalette(resource im, bool ditherFlag, int colorsWanted)", + "Convert a true colour image to a palette based image with a number of colours, optionally using dithering." + ], + "imagettfbbox": [ + "array imagettfbbox(float size, float angle, string font_file, string text)", + "Give the bounding box of a text using TrueType fonts" + ], + "imagettftext": [ + "array imagettftext(resource im, float size, float angle, int x, int y, int col, string font_file, string text)", + "Write text to the image using a TrueType font" + ], + "imagetypes": [ + "int imagetypes(void)", + "Return the types of images supported in a bitfield - 1=GIF, 2=JPEG, 4=PNG, 8=WBMP, 16=XPM" + ], + "imagewbmp": [ + "bool imagewbmp(resource im [, string filename, [, int foreground]])", + "Output WBMP image to browser or file" + ], + "imagexbm": [ + "int imagexbm(int im, string filename [, int foreground])", + "Output XBM image to browser or file" + ], + "imap_8bit": [ + "string imap_8bit(string text)", + "Convert an 8-bit string to a quoted-printable string" + ], + "imap_alerts": [ + "array imap_alerts(void)", + "Returns an array of all IMAP alerts that have been generated since the last page load or since the last imap_alerts() call, whichever came last. The alert stack is cleared after imap_alerts() is called." + ], + "imap_append": [ + "bool imap_append(resource stream_id, string folder, string message [, string options [, string internal_date]])", + "Append a new message to a specified mailbox" + ], + "imap_base64": [ + "string imap_base64(string text)", + "Decode BASE64 encoded text" + ], + "imap_binary": [ + "string imap_binary(string text)", + "Convert an 8bit string to a base64 string" + ], + "imap_body": [ + "string imap_body(resource stream_id, int msg_no [, int options])", + "Read the message body" + ], + "imap_bodystruct": [ + "object imap_bodystruct(resource stream_id, int msg_no, string section)", + "Read the structure of a specified body section of a specific message" + ], + "imap_check": [ + "object imap_check(resource stream_id)", + "Get mailbox properties" + ], + "imap_clearflag_full": [ + "bool imap_clearflag_full(resource stream_id, string sequence, string flag [, int options])", + "Clears flags on messages" + ], + "imap_close": [ + "bool imap_close(resource stream_id [, int options])", + "Close an IMAP stream" + ], + "imap_createmailbox": [ + "bool imap_createmailbox(resource stream_id, string mailbox)", + "Create a new mailbox" + ], + "imap_delete": [ + "bool imap_delete(resource stream_id, int msg_no [, int options])", + "Mark a message for deletion" + ], + "imap_deletemailbox": [ + "bool imap_deletemailbox(resource stream_id, string mailbox)", + "Delete a mailbox" + ], + "imap_errors": [ + "array imap_errors(void)", + "Returns an array of all IMAP errors generated since the last page load, or since the last imap_errors() call, whichever came last. The error stack is cleared after imap_errors() is called." + ], + "imap_expunge": [ + "bool imap_expunge(resource stream_id)", + "Permanently delete all messages marked for deletion" + ], + "imap_fetch_overview": [ + "array imap_fetch_overview(resource stream_id, string sequence [, int options])", + "Read an overview of the information in the headers of the given message sequence" + ], + "imap_fetchbody": [ + "string imap_fetchbody(resource stream_id, int msg_no, string section [, int options])", + "Get a specific body section" + ], + "imap_fetchheader": [ + "string imap_fetchheader(resource stream_id, int msg_no [, int options])", + "Get the full unfiltered header for a message" + ], + "imap_fetchstructure": [ + "object imap_fetchstructure(resource stream_id, int msg_no [, int options])", + "Read the full structure of a message" + ], + "imap_gc": [ + "bool imap_gc(resource stream_id, int flags)", + "This function garbage collects (purges) the cache of entries of a specific type." + ], + "imap_get_quota": [ + "array imap_get_quota(resource stream_id, string qroot)", + "Returns the quota set to the mailbox account qroot" + ], + "imap_get_quotaroot": [ + "array imap_get_quotaroot(resource stream_id, string mbox)", + "Returns the quota set to the mailbox account mbox" + ], + "imap_getacl": [ + "array imap_getacl(resource stream_id, string mailbox)", + "Gets the ACL for a given mailbox" + ], + "imap_getmailboxes": [ + "array imap_getmailboxes(resource stream_id, string ref, string pattern)", + "Reads the list of mailboxes and returns a full array of objects containing name, attributes, and delimiter" + ], + "imap_getsubscribed": [ + "array imap_getsubscribed(resource stream_id, string ref, string pattern)", + "Return a list of subscribed mailboxes, in the same format as imap_getmailboxes()" + ], + "imap_headerinfo": [ + "object imap_headerinfo(resource stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])", + "Read the headers of the message" + ], + "imap_headers": [ + "array imap_headers(resource stream_id)", + "Returns headers for all messages in a mailbox" + ], + "imap_last_error": [ + "string imap_last_error(void)", + "Returns the last error that was generated by an IMAP function. The error stack is NOT cleared after this call." + ], + "imap_list": [ + "array imap_list(resource stream_id, string ref, string pattern)", + "Read the list of mailboxes" + ], + "imap_listscan": [ + "array imap_listscan(resource stream_id, string ref, string pattern, string content)", + "Read list of mailboxes containing a certain string" + ], + "imap_lsub": [ + "array imap_lsub(resource stream_id, string ref, string pattern)", + "Return a list of subscribed mailboxes" + ], + "imap_mail": [ + "bool imap_mail(string to, string subject, string message [, string additional_headers [, string cc [, string bcc [, string rpath]]]])", + "Send an email message" + ], + "imap_mail_compose": [ + "string imap_mail_compose(array envelope, array body)", + "Create a MIME message based on given envelope and body sections" + ], + "imap_mail_copy": [ + "bool imap_mail_copy(resource stream_id, string msglist, string mailbox [, int options])", + "Copy specified message to a mailbox" + ], + "imap_mail_move": [ + "bool imap_mail_move(resource stream_id, string sequence, string mailbox [, int options])", + "Move specified message to a mailbox" + ], + "imap_mailboxmsginfo": [ + "object imap_mailboxmsginfo(resource stream_id)", + "Returns info about the current mailbox" + ], + "imap_mime_header_decode": [ + "array imap_mime_header_decode(string str)", + "Decode mime header element in accordance with RFC 2047 and return array of objects containing 'charset' encoding and decoded 'text'" + ], + "imap_msgno": [ + "int imap_msgno(resource stream_id, int unique_msg_id)", + "Get the sequence number associated with a UID" + ], + "imap_mutf7_to_utf8": [ + "string imap_mutf7_to_utf8(string in)", + "Decode a modified UTF-7 string to UTF-8" + ], + "imap_num_msg": [ + "int imap_num_msg(resource stream_id)", + "Gives the number of messages in the current mailbox" + ], + "imap_num_recent": [ + "int imap_num_recent(resource stream_id)", + "Gives the number of recent messages in current mailbox" + ], + "imap_open": [ + "resource imap_open(string mailbox, string user, string password [, int options [, int n_retries]])", + "Open an IMAP stream to a mailbox" + ], + "imap_ping": [ + "bool imap_ping(resource stream_id)", + "Check if the IMAP stream is still active" + ], + "imap_qprint": [ + "string imap_qprint(string text)", + "Convert a quoted-printable string to an 8-bit string" + ], + "imap_renamemailbox": [ + "bool imap_renamemailbox(resource stream_id, string old_name, string new_name)", + "Rename a mailbox" + ], + "imap_reopen": [ + "bool imap_reopen(resource stream_id, string mailbox [, int options [, int n_retries]])", + "Reopen an IMAP stream to a new mailbox" + ], + "imap_rfc822_parse_adrlist": [ + "array imap_rfc822_parse_adrlist(string address_string, string default_host)", + "Parses an address string" + ], + "imap_rfc822_parse_headers": [ + "object imap_rfc822_parse_headers(string headers [, string default_host])", + "Parse a set of mail headers contained in a string, and return an object similar to imap_headerinfo()" + ], + "imap_rfc822_write_address": [ + "string imap_rfc822_write_address(string mailbox, string host, string personal)", + "Returns a properly formatted email address given the mailbox, host, and personal info" + ], + "imap_savebody": [ + "bool imap_savebody(resource stream_id, string|resource file, int msg_no[, string section = \"\"[, int options = 0]])", + "Save a specific body section to a file" + ], + "imap_search": [ + "array imap_search(resource stream_id, string criteria [, int options [, string charset]])", + "Return a list of messages matching the given criteria" + ], + "imap_set_quota": [ + "bool imap_set_quota(resource stream_id, string qroot, int mailbox_size)", + "Will set the quota for qroot mailbox" + ], + "imap_setacl": [ + "bool imap_setacl(resource stream_id, string mailbox, string id, string rights)", + "Sets the ACL for a given mailbox" + ], + "imap_setflag_full": [ + "bool imap_setflag_full(resource stream_id, string sequence, string flag [, int options])", + "Sets flags on messages" + ], + "imap_sort": [ + "array imap_sort(resource stream_id, int criteria, int reverse [, int options [, string search_criteria [, string charset]]])", + "Sort an array of message headers, optionally including only messages that meet specified criteria." + ], + "imap_status": [ + "object imap_status(resource stream_id, string mailbox, int options)", + "Get status info from a mailbox" + ], + "imap_subscribe": [ + "bool imap_subscribe(resource stream_id, string mailbox)", + "Subscribe to a mailbox" + ], + "imap_thread": [ + "array imap_thread(resource stream_id [, int options])", + "Return threaded by REFERENCES tree" + ], + "imap_timeout": [ + "mixed imap_timeout(int timeout_type [, int timeout])", + "Set or fetch imap timeout" + ], + "imap_uid": [ + "int imap_uid(resource stream_id, int msg_no)", + "Get the unique message id associated with a standard sequential message number" + ], + "imap_undelete": [ + "bool imap_undelete(resource stream_id, int msg_no [, int flags])", + "Remove the delete flag from a message" + ], + "imap_unsubscribe": [ + "bool imap_unsubscribe(resource stream_id, string mailbox)", + "Unsubscribe from a mailbox" + ], + "imap_utf7_decode": [ + "string imap_utf7_decode(string buf)", + "Decode a modified UTF-7 string" + ], + "imap_utf7_encode": [ + "string imap_utf7_encode(string buf)", + "Encode a string in modified UTF-7" + ], + "imap_utf8": [ + "string imap_utf8(string mime_encoded_text)", + "Convert a mime-encoded text to UTF-8" + ], + "imap_utf8_to_mutf7": [ + "string imap_utf8_to_mutf7(string in)", + "Encode a UTF-8 string to modified UTF-7" + ], + "implode": [ + "string implode([string glue,] array pieces)", + "Joins array elements placing glue string between items and return one string" + ], + "import_request_variables": [ + "bool import_request_variables(string types [, string prefix])", + "Import GET/POST/Cookie variables into the global scope" + ], + "in_array": [ + "bool in_array(mixed needle, array haystack [, bool strict])", + "Checks if the given value exists in the array" + ], + "include": [ + "bool include(string path)", + "Includes and evaluates the specified file" + ], + "include_once": [ + "bool include_once(string path)", + "Includes and evaluates the specified file" + ], + "inet_ntop": [ + "string inet_ntop(string in_addr)", + "Converts a packed inet address to a human readable IP address string" + ], + "inet_pton": [ + "string inet_pton(string ip_address)", + "Converts a human readable IP address to a packed binary string" + ], + "ini_get": [ + "string ini_get(string varname)", + "Get a configuration option" + ], + "ini_get_all": [ + "array ini_get_all([string extension[, bool details = true]])", + "Get all configuration options" + ], + "ini_restore": [ + "void ini_restore(string varname)", + "Restore the value of a configuration option specified by varname" + ], + "ini_set": [ + "string ini_set(string varname, string newvalue)", + "Set a configuration option, returns false on error and the old value of the configuration option on success" + ], + "interface_exists": [ + "bool interface_exists(string classname [, bool autoload])", + "Checks if the class exists" + ], + "intl_error_name": [ + "string intl_error_name()", + "* Return a string for a given error code. * The string will be the same as the name of the error code constant." + ], + "intl_get_error_code": [ + "int intl_get_error_code()", + "* Get code of the last occured error." + ], + "intl_get_error_message": [ + "string intl_get_error_message()", + "* Get text description of the last occured error." + ], + "intl_is_failure": [ + "bool intl_is_failure()", + "* Check whether the given error code indicates a failure. * Returns true if it does, and false if the code * indicates success or a warning." + ], + "intval": [ + "int intval(mixed var [, int base])", + "Get the integer value of a variable using the optional base for the conversion" + ], + "ip2long": [ + "int ip2long(string ip_address)", + "Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address" + ], + "iptcembed": [ + "array iptcembed(string iptcdata, string jpeg_file_name [, int spool])", + "Embed binary IPTC data into a JPEG image." + ], + "iptcparse": [ + "array iptcparse(string iptcdata)", + "Parse binary IPTC-data into associative array" + ], + "is_a": [ + "bool is_a(object object, string class_name)", + "Returns true if the object is of this class or has this class as one of its parents" + ], + "is_array": [ + "bool is_array(mixed var)", + "Returns true if variable is an array" + ], + "is_bool": [ + "bool is_bool(mixed var)", + "Returns true if variable is a boolean" + ], + "is_callable": [ + "bool is_callable(mixed var [, bool syntax_only [, string callable_name]])", + "Returns true if var is callable." + ], + "is_dir": [ + "bool is_dir(string filename)", + "Returns true if file is directory" + ], + "is_executable": [ + "bool is_executable(string filename)", + "Returns true if file is executable" + ], + "is_file": [ + "bool is_file(string filename)", + "Returns true if file is a regular file" + ], + "is_finite": [ + "bool is_finite(float val)", + "Returns whether argument is finite" + ], + "is_float": [ + "bool is_float(mixed var)", + "Returns true if variable is float point" + ], + "is_infinite": [ + "bool is_infinite(float val)", + "Returns whether argument is infinite" + ], + "is_link": [ + "bool is_link(string filename)", + "Returns true if file is symbolic link" + ], + "is_long": [ + "bool is_long(mixed var)", + "Returns true if variable is a long (integer)" + ], + "is_nan": [ + "bool is_nan(float val)", + "Returns whether argument is not a number" + ], + "is_null": [ + "bool is_null(mixed var)", + "Returns true if variable is null" + ], + "is_numeric": [ + "bool is_numeric(mixed value)", + "Returns true if value is a number or a numeric string" + ], + "is_object": [ + "bool is_object(mixed var)", + "Returns true if variable is an object" + ], + "is_readable": [ + "bool is_readable(string filename)", + "Returns true if file can be read" + ], + "is_resource": [ + "bool is_resource(mixed var)", + "Returns true if variable is a resource" + ], + "is_scalar": [ + "bool is_scalar(mixed value)", + "Returns true if value is a scalar" + ], + "is_string": [ + "bool is_string(mixed var)", + "Returns true if variable is a string" + ], + "is_subclass_of": [ + "bool is_subclass_of(object object, string class_name)", + "Returns true if the object has this class as one of its parents" + ], + "is_uploaded_file": [ + "bool is_uploaded_file(string path)", + "Check if file was created by rfc1867 upload" + ], + "is_writable": [ + "bool is_writable(string filename)", + "Returns true if file can be written" + ], + "isset": [ + "bool isset(mixed var [, mixed var])", + "Determine whether a variable is set" + ], + "iterator_apply": [ + "int iterator_apply(Traversable it, mixed function [, mixed params])", + "Calls a function for every element in an iterator" + ], + "iterator_count": [ + "int iterator_count(Traversable it)", + "Count the elements in an iterator" + ], + "iterator_to_array": [ + "array iterator_to_array(Traversable it [, bool use_keys = true])", + "Copy the iterator into an array" + ], + "jddayofweek": [ + "mixed jddayofweek(int juliandaycount [, int mode])", + "Returns name or number of day of week from julian day count" + ], + "jdmonthname": [ + "string jdmonthname(int juliandaycount, int mode)", + "Returns name of month for julian day count" + ], + "jdtofrench": [ + "string jdtofrench(int juliandaycount)", + "Converts a julian day count to a french republic calendar date" + ], + "jdtogregorian": [ + "string jdtogregorian(int juliandaycount)", + "Converts a julian day count to a gregorian calendar date" + ], + "jdtojewish": [ + "string jdtojewish(int juliandaycount [, bool hebrew [, int fl]])", + "Converts a julian day count to a jewish calendar date" + ], + "jdtojulian": [ + "string jdtojulian(int juliandaycount)", + "Convert a julian day count to a julian calendar date" + ], + "jdtounix": [ + "int jdtounix(int jday)", + "Convert Julian Day to UNIX timestamp" + ], + "jewishtojd": [ + "int jewishtojd(int month, int day, int year)", + "Converts a jewish calendar date to a julian day count" + ], + "join": [ + "string join(array src, string glue)", + "An alias for implode" + ], + "jpeg2wbmp": [ + "bool jpeg2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)", + "Convert JPEG image to WBMP image" + ], + "json_decode": [ + "mixed json_decode(string json [, bool assoc [, long depth]])", + "Decodes the JSON representation into a PHP value" + ], + "json_encode": [ + "string json_encode(mixed data [, int options])", + "Returns the JSON representation of a value" + ], + "json_last_error": [ + "int json_last_error()", + "Returns the error code of the last json_decode()." + ], + "juliantojd": [ + "int juliantojd(int month, int day, int year)", + "Converts a julian calendar date to julian day count" + ], + "key": [ + "mixed key(array array_arg)", + "Return the key of the element currently pointed to by the internal array pointer" + ], + "krsort": [ + "bool krsort(array &array_arg [, int sort_flags])", + "Sort an array by key value in reverse order" + ], + "ksort": [ + "bool ksort(array &array_arg [, int sort_flags])", + "Sort an array by key" + ], + "lcfirst": [ + "string lcfirst(string str)", + "Make a string's first character lowercase" + ], + "lcg_value": [ + "float lcg_value()", + "Returns a value from the combined linear congruential generator" + ], + "lchgrp": [ + "bool lchgrp(string filename, mixed group)", + "Change symlink group" + ], + "ldap_8859_to_t61": [ + "string ldap_8859_to_t61(string value)", + "Translate 8859 characters to t61 characters" + ], + "ldap_add": [ + "bool ldap_add(resource link, string dn, array entry)", + "Add entries to LDAP directory" + ], + "ldap_bind": [ + "bool ldap_bind(resource link [, string dn [, string password]])", + "Bind to LDAP directory" + ], + "ldap_compare": [ + "bool ldap_compare(resource link, string dn, string attr, string value)", + "Determine if an entry has a specific value for one of its attributes" + ], + "ldap_connect": [ + "resource ldap_connect([string host [, int port [, string wallet [, string wallet_passwd [, int authmode]]]]])", + "Connect to an LDAP server" + ], + "ldap_count_entries": [ + "int ldap_count_entries(resource link, resource result)", + "Count the number of entries in a search result" + ], + "ldap_delete": [ + "bool ldap_delete(resource link, string dn)", + "Delete an entry from a directory" + ], + "ldap_dn2ufn": [ + "string ldap_dn2ufn(string dn)", + "Convert DN to User Friendly Naming format" + ], + "ldap_err2str": [ + "string ldap_err2str(int errno)", + "Convert error number to error string" + ], + "ldap_errno": [ + "int ldap_errno(resource link)", + "Get the current ldap error number" + ], + "ldap_error": [ + "string ldap_error(resource link)", + "Get the current ldap error string" + ], + "ldap_explode_dn": [ + "array ldap_explode_dn(string dn, int with_attrib)", + "Splits DN into its component parts" + ], + "ldap_first_attribute": [ + "string ldap_first_attribute(resource link, resource result_entry)", + "Return first attribute" + ], + "ldap_first_entry": [ + "resource ldap_first_entry(resource link, resource result)", + "Return first result id" + ], + "ldap_first_reference": [ + "resource ldap_first_reference(resource link, resource result)", + "Return first reference" + ], + "ldap_free_result": [ + "bool ldap_free_result(resource result)", + "Free result memory" + ], + "ldap_get_attributes": [ + "array ldap_get_attributes(resource link, resource result_entry)", + "Get attributes from a search result entry" + ], + "ldap_get_dn": [ + "string ldap_get_dn(resource link, resource result_entry)", + "Get the DN of a result entry" + ], + "ldap_get_entries": [ + "array ldap_get_entries(resource link, resource result)", + "Get all result entries" + ], + "ldap_get_option": [ + "bool ldap_get_option(resource link, int option, mixed retval)", + "Get the current value of various session-wide parameters" + ], + "ldap_get_values_len": [ + "array ldap_get_values_len(resource link, resource result_entry, string attribute)", + "Get all values with lengths from a result entry" + ], + "ldap_list": [ + "resource ldap_list(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])", + "Single-level search" + ], + "ldap_mod_add": [ + "bool ldap_mod_add(resource link, string dn, array entry)", + "Add attribute values to current" + ], + "ldap_mod_del": [ + "bool ldap_mod_del(resource link, string dn, array entry)", + "Delete attribute values" + ], + "ldap_mod_replace": [ + "bool ldap_mod_replace(resource link, string dn, array entry)", + "Replace attribute values with new ones" + ], + "ldap_next_attribute": [ + "string ldap_next_attribute(resource link, resource result_entry)", + "Get the next attribute in result" + ], + "ldap_next_entry": [ + "resource ldap_next_entry(resource link, resource result_entry)", + "Get next result entry" + ], + "ldap_next_reference": [ + "resource ldap_next_reference(resource link, resource reference_entry)", + "Get next reference" + ], + "ldap_parse_reference": [ + "bool ldap_parse_reference(resource link, resource reference_entry, array referrals)", + "Extract information from reference entry" + ], + "ldap_parse_result": [ + "bool ldap_parse_result(resource link, resource result, int errcode, string matcheddn, string errmsg, array referrals)", + "Extract information from result" + ], + "ldap_read": [ + "resource ldap_read(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])", + "Read an entry" + ], + "ldap_rename": [ + "bool ldap_rename(resource link, string dn, string newrdn, string newparent, bool deleteoldrdn);", + "Modify the name of an entry" + ], + "ldap_sasl_bind": [ + "bool ldap_sasl_bind(resource link [, string binddn [, string password [, string sasl_mech [, string sasl_realm [, string sasl_authc_id [, string sasl_authz_id [, string props]]]]]]])", + "Bind to LDAP directory using SASL" + ], + "ldap_search": [ + "resource ldap_search(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]])", + "Search LDAP tree under base_dn" + ], + "ldap_set_option": [ + "bool ldap_set_option(resource link, int option, mixed newval)", + "Set the value of various session-wide parameters" + ], + "ldap_set_rebind_proc": [ + "bool ldap_set_rebind_proc(resource link, string callback)", + "Set a callback function to do re-binds on referral chasing." + ], + "ldap_sort": [ + "bool ldap_sort(resource link, resource result, string sortfilter)", + "Sort LDAP result entries" + ], + "ldap_start_tls": [ + "bool ldap_start_tls(resource link)", + "Start TLS" + ], + "ldap_t61_to_8859": [ + "string ldap_t61_to_8859(string value)", + "Translate t61 characters to 8859 characters" + ], + "ldap_unbind": [ + "bool ldap_unbind(resource link)", + "Unbind from LDAP directory" + ], + "leak": [ + "void leak(int num_bytes=3)", + "Cause an intentional memory leak, for testing/debugging purposes" + ], + "levenshtein": [ + "int levenshtein(string str1, string str2[, int cost_ins, int cost_rep, int cost_del])", + "Calculate Levenshtein distance between two strings" + ], + "libxml_clear_errors": [ + "void libxml_clear_errors()", + "Clear last error from libxml" + ], + "libxml_disable_entity_loader": [ + "bool libxml_disable_entity_loader([boolean disable])", + "Disable/Enable ability to load external entities" + ], + "libxml_get_errors": [ + "object libxml_get_errors()", + "Retrieve array of errors" + ], + "libxml_get_last_error": [ + "object libxml_get_last_error()", + "Retrieve last error from libxml" + ], + "libxml_set_streams_context": [ + "void libxml_set_streams_context(resource streams_context)", + "Set the streams context for the next libxml document load or write" + ], + "libxml_use_internal_errors": [ + "bool libxml_use_internal_errors([boolean use_errors])", + "Disable libxml errors and allow user to fetch error information as needed" + ], + "link": [ + "int link(string target, string link)", + "Create a hard link" + ], + "linkinfo": [ + "int linkinfo(string filename)", + "Returns the st_dev field of the UNIX C stat structure describing the link" + ], + "litespeed_request_headers": [ + "array litespeed_request_headers(void)", + "Fetch all HTTP request headers" + ], + "litespeed_response_headers": [ + "array litespeed_response_headers(void)", + "Fetch all HTTP response headers" + ], + "locale_accept_from_http": [ + "string locale_accept_from_http(string $http_accept)", + null + ], + "locale_canonicalize": [ + "static string locale_canonicalize(Locale $loc, string $locale)", + "* @param string $locale The locale string to canonicalize" + ], + "locale_filter_matches": [ + "boolean locale_filter_matches(string $langtag, string $locale[, bool $canonicalize])", + "* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm" + ], + "locale_get_all_variants": [ + "static array locale_get_all_variants($locale)", + "* gets an array containing the list of variants, or null" + ], + "locale_get_default": [ + "static string locale_get_default( )", + "Get default locale" + ], + "locale_get_keywords": [ + "static array locale_get_keywords(string $locale) {", + "* return an associative array containing keyword-value * pairs for this locale. The keys are keys to the array (doh!)" + ], + "locale_get_primary_language": [ + "static string locale_get_primary_language($locale)", + "* gets the primary language for the $locale" + ], + "locale_get_region": [ + "static string locale_get_region($locale)", + "* gets the region for the $locale" + ], + "locale_get_script": [ + "static string locale_get_script($locale)", + "* gets the script for the $locale" + ], + "locale_lookup": [ + "string locale_lookup(array $langtag, string $locale[, bool $canonicalize[, string $default = null]])", + "* Searchs the items in $langtag for the best match to the language * range" + ], + "locale_set_default": [ + "static string locale_set_default( string $locale )", + "Set default locale" + ], + "localeconv": [ + "array localeconv(void)", + "Returns numeric formatting information based on the current locale" + ], + "localtime": [ + "array localtime([int timestamp [, bool associative_array]])", + "Returns the results of the C system call localtime as an associative array if the associative_array argument is set to 1 other wise it is a regular array" + ], + "log": [ + "float log(float number, [float base])", + "Returns the natural logarithm of the number, or the base log if base is specified" + ], + "log10": [ + "float log10(float number)", + "Returns the base-10 logarithm of the number" + ], + "log1p": [ + "float log1p(float number)", + "Returns log(1 + number), computed in a way that accurate even when the value of number is close to zero" + ], + "long2ip": [ + "string long2ip(int proper_address)", + "Converts an (IPv4) Internet network address into a string in Internet standard dotted format" + ], + "lstat": [ + "array lstat(string filename)", + "Give information about a file or symbolic link" + ], + "ltrim": [ + "string ltrim(string str [, string character_mask])", + "Strips whitespace from the beginning of a string" + ], + "mail": [ + "int mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]])", + "Send an email message" + ], + "max": [ + "mixed max(mixed arg1 [, mixed arg2 [, mixed ...]])", + "Return the highest value in an array or a series of arguments" + ], + "mb_check_encoding": [ + "bool mb_check_encoding([string var[, string encoding]])", + "Check if the string is valid for the specified encoding" + ], + "mb_convert_case": [ + "string mb_convert_case(string sourcestring, int mode [, string encoding])", + "Returns a case-folded version of sourcestring" + ], + "mb_convert_encoding": [ + "string mb_convert_encoding(string str, string to-encoding [, mixed from-encoding])", + "Returns converted string in desired encoding" + ], + "mb_convert_kana": [ + "string mb_convert_kana(string str [, string option] [, string encoding])", + "Conversion between full-width character and half-width character (Japanese)" + ], + "mb_convert_variables": [ + "string mb_convert_variables(string to-encoding, mixed from-encoding, mixed vars [, ...])", + "Converts the string resource in variables to desired encoding" + ], + "mb_decode_mimeheader": [ + "string mb_decode_mimeheader(string string)", + "Decodes the MIME \"encoded-word\" in the string" + ], + "mb_decode_numericentity": [ + "string mb_decode_numericentity(string string, array convmap [, string encoding])", + "Converts HTML numeric entities to character code" + ], + "mb_detect_encoding": [ + "string mb_detect_encoding(string str [, mixed encoding_list [, bool strict]])", + "Encodings of the given string is returned (as a string)" + ], + "mb_detect_order": [ + "bool|array mb_detect_order([mixed encoding-list])", + "Sets the current detect_order or Return the current detect_order as a array" + ], + "mb_encode_mimeheader": [ + "string mb_encode_mimeheader(string str [, string charset [, string transfer-encoding [, string linefeed [, int indent]]]])", + "Converts the string to MIME \"encoded-word\" in the format of =?charset?(B|Q)?encoded_string?=" + ], + "mb_encode_numericentity": [ + "string mb_encode_numericentity(string string, array convmap [, string encoding])", + "Converts specified characters to HTML numeric entities" + ], + "mb_encoding_aliases": [ + "array mb_encoding_aliases(string encoding)", + "Returns an array of the aliases of a given encoding name" + ], + "mb_ereg": [ + "int mb_ereg(string pattern, string string [, array registers])", + "Regular expression match for multibyte string" + ], + "mb_ereg_match": [ + "bool mb_ereg_match(string pattern, string string [,string option])", + "Regular expression match for multibyte string" + ], + "mb_ereg_replace": [ + "string mb_ereg_replace(string pattern, string replacement, string string [, string option])", + "Replace regular expression for multibyte string" + ], + "mb_ereg_search": [ + "bool mb_ereg_search([string pattern[, string option]])", + "Regular expression search for multibyte string" + ], + "mb_ereg_search_getpos": [ + "int mb_ereg_search_getpos(void)", + "Get search start position" + ], + "mb_ereg_search_getregs": [ + "array mb_ereg_search_getregs(void)", + "Get matched substring of the last time" + ], + "mb_ereg_search_init": [ + "bool mb_ereg_search_init(string string [, string pattern[, string option]])", + "Initialize string and regular expression for search." + ], + "mb_ereg_search_pos": [ + "array mb_ereg_search_pos([string pattern[, string option]])", + "Regular expression search for multibyte string" + ], + "mb_ereg_search_regs": [ + "array mb_ereg_search_regs([string pattern[, string option]])", + "Regular expression search for multibyte string" + ], + "mb_ereg_search_setpos": [ + "bool mb_ereg_search_setpos(int position)", + "Set search start position" + ], + "mb_eregi": [ + "int mb_eregi(string pattern, string string [, array registers])", + "Case-insensitive regular expression match for multibyte string" + ], + "mb_eregi_replace": [ + "string mb_eregi_replace(string pattern, string replacement, string string)", + "Case insensitive replace regular expression for multibyte string" + ], + "mb_get_info": [ + "mixed mb_get_info([string type])", + "Returns the current settings of mbstring" + ], + "mb_http_input": [ + "mixed mb_http_input([string type])", + "Returns the input encoding" + ], + "mb_http_output": [ + "string mb_http_output([string encoding])", + "Sets the current output_encoding or returns the current output_encoding as a string" + ], + "mb_internal_encoding": [ + "string mb_internal_encoding([string encoding])", + "Sets the current internal encoding or Returns the current internal encoding as a string" + ], + "mb_language": [ + "string mb_language([string language])", + "Sets the current language or Returns the current language as a string" + ], + "mb_list_encodings": [ + "mixed mb_list_encodings()", + "Returns an array of all supported entity encodings" + ], + "mb_output_handler": [ + "string mb_output_handler(string contents, int status)", + "Returns string in output buffer converted to the http_output encoding" + ], + "mb_parse_str": [ + "bool mb_parse_str(string encoded_string [, array result])", + "Parses GET/POST/COOKIE data and sets global variables" + ], + "mb_preferred_mime_name": [ + "string mb_preferred_mime_name(string encoding)", + "Return the preferred MIME name (charset) as a string" + ], + "mb_regex_encoding": [ + "string mb_regex_encoding([string encoding])", + "Returns the current encoding for regex as a string." + ], + "mb_regex_set_options": [ + "string mb_regex_set_options([string options])", + "Set or get the default options for mbregex functions" + ], + "mb_send_mail": [ + "int mb_send_mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]])", + "* Sends an email message with MIME scheme" + ], + "mb_split": [ + "array mb_split(string pattern, string string [, int limit])", + "split multibyte string into array by regular expression" + ], + "mb_strcut": [ + "string mb_strcut(string str, int start [, int length [, string encoding]])", + "Returns part of a string" + ], + "mb_strimwidth": [ + "string mb_strimwidth(string str, int start, int width [, string trimmarker [, string encoding]])", + "Trim the string in terminal width" + ], + "mb_stripos": [ + "int mb_stripos(string haystack, string needle [, int offset [, string encoding]])", + "Finds position of first occurrence of a string within another, case insensitive" + ], + "mb_stristr": [ + "string mb_stristr(string haystack, string needle[, bool part[, string encoding]])", + "Finds first occurrence of a string within another, case insensitive" + ], + "mb_strlen": [ + "int mb_strlen(string str [, string encoding])", + "Get character numbers of a string" + ], + "mb_strpos": [ + "int mb_strpos(string haystack, string needle [, int offset [, string encoding]])", + "Find position of first occurrence of a string within another" + ], + "mb_strrchr": [ + "string mb_strrchr(string haystack, string needle[, bool part[, string encoding]])", + "Finds the last occurrence of a character in a string within another" + ], + "mb_strrichr": [ + "string mb_strrichr(string haystack, string needle[, bool part[, string encoding]])", + "Finds the last occurrence of a character in a string within another, case insensitive" + ], + "mb_strripos": [ + "int mb_strripos(string haystack, string needle [, int offset [, string encoding]])", + "Finds position of last occurrence of a string within another, case insensitive" + ], + "mb_strrpos": [ + "int mb_strrpos(string haystack, string needle [, int offset [, string encoding]])", + "Find position of last occurrence of a string within another" + ], + "mb_strstr": [ + "string mb_strstr(string haystack, string needle[, bool part[, string encoding]])", + "Finds first occurrence of a string within another" + ], + "mb_strtolower": [ + "string mb_strtolower(string sourcestring [, string encoding])", + "* Returns a lowercased version of sourcestring" + ], + "mb_strtoupper": [ + "string mb_strtoupper(string sourcestring [, string encoding])", + "* Returns a uppercased version of sourcestring" + ], + "mb_strwidth": [ + "int mb_strwidth(string str [, string encoding])", + "Gets terminal width of a string" + ], + "mb_substitute_character": [ + "mixed mb_substitute_character([mixed substchar])", + "Sets the current substitute_character or returns the current substitute_character" + ], + "mb_substr": [ + "string mb_substr(string str, int start [, int length [, string encoding]])", + "Returns part of a string" + ], + "mb_substr_count": [ + "int mb_substr_count(string haystack, string needle [, string encoding])", + "Count the number of substring occurrences" + ], + "mcrypt_cbc": [ + "string mcrypt_cbc(int cipher, string key, string data, int mode, string iv)", + "CBC crypt/decrypt data using key key with cipher cipher starting with iv" + ], + "mcrypt_cfb": [ + "string mcrypt_cfb(int cipher, string key, string data, int mode, string iv)", + "CFB crypt/decrypt data using key key with cipher cipher starting with iv" + ], + "mcrypt_create_iv": [ + "string mcrypt_create_iv(int size, int source)", + "Create an initialization vector (IV)" + ], + "mcrypt_decrypt": [ + "string mcrypt_decrypt(string cipher, string key, string data, string mode, string iv)", + "OFB crypt/decrypt data using key key with cipher cipher starting with iv" + ], + "mcrypt_ecb": [ + "string mcrypt_ecb(int cipher, string key, string data, int mode, string iv)", + "ECB crypt/decrypt data using key key with cipher cipher starting with iv" + ], + "mcrypt_enc_get_algorithms_name": [ + "string mcrypt_enc_get_algorithms_name(resource td)", + "Returns the name of the algorithm specified by the descriptor td" + ], + "mcrypt_enc_get_block_size": [ + "int mcrypt_enc_get_block_size(resource td)", + "Returns the block size of the cipher specified by the descriptor td" + ], + "mcrypt_enc_get_iv_size": [ + "int mcrypt_enc_get_iv_size(resource td)", + "Returns the size of the IV in bytes of the algorithm specified by the descriptor td" + ], + "mcrypt_enc_get_key_size": [ + "int mcrypt_enc_get_key_size(resource td)", + "Returns the maximum supported key size in bytes of the algorithm specified by the descriptor td" + ], + "mcrypt_enc_get_modes_name": [ + "string mcrypt_enc_get_modes_name(resource td)", + "Returns the name of the mode specified by the descriptor td" + ], + "mcrypt_enc_get_supported_key_sizes": [ + "array mcrypt_enc_get_supported_key_sizes(resource td)", + "This function decrypts the crypttext" + ], + "mcrypt_enc_is_block_algorithm": [ + "bool mcrypt_enc_is_block_algorithm(resource td)", + "Returns TRUE if the alrogithm is a block algorithms" + ], + "mcrypt_enc_is_block_algorithm_mode": [ + "bool mcrypt_enc_is_block_algorithm_mode(resource td)", + "Returns TRUE if the mode is for use with block algorithms" + ], + "mcrypt_enc_is_block_mode": [ + "bool mcrypt_enc_is_block_mode(resource td)", + "Returns TRUE if the mode outputs blocks" + ], + "mcrypt_enc_self_test": [ + "int mcrypt_enc_self_test(resource td)", + "This function runs the self test on the algorithm specified by the descriptor td" + ], + "mcrypt_encrypt": [ + "string mcrypt_encrypt(string cipher, string key, string data, string mode, string iv)", + "OFB crypt/decrypt data using key key with cipher cipher starting with iv" + ], + "mcrypt_generic": [ + "string mcrypt_generic(resource td, string data)", + "This function encrypts the plaintext" + ], + "mcrypt_generic_deinit": [ + "bool mcrypt_generic_deinit(resource td)", + "This function terminates encrypt specified by the descriptor td" + ], + "mcrypt_generic_init": [ + "int mcrypt_generic_init(resource td, string key, string iv)", + "This function initializes all buffers for the specific module" + ], + "mcrypt_get_block_size": [ + "int mcrypt_get_block_size(string cipher, string module)", + "Get the key size of cipher" + ], + "mcrypt_get_cipher_name": [ + "string mcrypt_get_cipher_name(string cipher)", + "Get the key size of cipher" + ], + "mcrypt_get_iv_size": [ + "int mcrypt_get_iv_size(string cipher, string module)", + "Get the IV size of cipher (Usually the same as the blocksize)" + ], + "mcrypt_get_key_size": [ + "int mcrypt_get_key_size(string cipher, string module)", + "Get the key size of cipher" + ], + "mcrypt_list_algorithms": [ + "array mcrypt_list_algorithms([string lib_dir])", + "List all algorithms in \"module_dir\"" + ], + "mcrypt_list_modes": [ + "array mcrypt_list_modes([string lib_dir])", + "List all modes \"module_dir\"" + ], + "mcrypt_module_close": [ + "bool mcrypt_module_close(resource td)", + "Free the descriptor td" + ], + "mcrypt_module_get_algo_block_size": [ + "int mcrypt_module_get_algo_block_size(string algorithm [, string lib_dir])", + "Returns the block size of the algorithm" + ], + "mcrypt_module_get_algo_key_size": [ + "int mcrypt_module_get_algo_key_size(string algorithm [, string lib_dir])", + "Returns the maximum supported key size of the algorithm" + ], + "mcrypt_module_get_supported_key_sizes": [ + "array mcrypt_module_get_supported_key_sizes(string algorithm [, string lib_dir])", + "This function decrypts the crypttext" + ], + "mcrypt_module_is_block_algorithm": [ + "bool mcrypt_module_is_block_algorithm(string algorithm [, string lib_dir])", + "Returns TRUE if the algorithm is a block algorithm" + ], + "mcrypt_module_is_block_algorithm_mode": [ + "bool mcrypt_module_is_block_algorithm_mode(string mode [, string lib_dir])", + "Returns TRUE if the mode is for use with block algorithms" + ], + "mcrypt_module_is_block_mode": [ + "bool mcrypt_module_is_block_mode(string mode [, string lib_dir])", + "Returns TRUE if the mode outputs blocks of bytes" + ], + "mcrypt_module_open": [ + "resource mcrypt_module_open(string cipher, string cipher_directory, string mode, string mode_directory)", + "Opens the module of the algorithm and the mode to be used" + ], + "mcrypt_module_self_test": [ + "bool mcrypt_module_self_test(string algorithm [, string lib_dir])", + "Does a self test of the module \"module\"" + ], + "mcrypt_ofb": [ + "string mcrypt_ofb(int cipher, string key, string data, int mode, string iv)", + "OFB crypt/decrypt data using key key with cipher cipher starting with iv" + ], + "md5": [ + "string md5(string str, [ bool raw_output])", + "Calculate the md5 hash of a string" + ], + "md5_file": [ + "string md5_file(string filename [, bool raw_output])", + "Calculate the md5 hash of given filename" + ], + "mdecrypt_generic": [ + "string mdecrypt_generic(resource td, string data)", + "This function decrypts the plaintext" + ], + "memory_get_peak_usage": [ + "int memory_get_peak_usage([real_usage])", + "Returns the peak allocated by PHP memory" + ], + "memory_get_usage": [ + "int memory_get_usage([real_usage])", + "Returns the allocated by PHP memory" + ], + "metaphone": [ + "string metaphone(string text[, int phones])", + "Break english phrases down into their phonemes" + ], + "method_exists": [ + "bool method_exists(object object, string method)", + "Checks if the class method exists" + ], + "mhash": [ + "string mhash(int hash, string data [, string key])", + "Hash data with hash" + ], + "mhash_count": [ + "int mhash_count(void)", + "Gets the number of available hashes" + ], + "mhash_get_block_size": [ + "int mhash_get_block_size(int hash)", + "Gets the block size of hash" + ], + "mhash_get_hash_name": [ + "string mhash_get_hash_name(int hash)", + "Gets the name of hash" + ], + "mhash_keygen_s2k": [ + "string mhash_keygen_s2k(int hash, string input_password, string salt, int bytes)", + "Generates a key using hash functions" + ], + "microtime": [ + "mixed microtime([bool get_as_float])", + "Returns either a string or a float containing the current time in seconds and microseconds" + ], + "mime_content_type": [ + "string mime_content_type(string filename|resource stream)", + "Return content-type for file" + ], + "min": [ + "mixed min(mixed arg1 [, mixed arg2 [, mixed ...]])", + "Return the lowest value in an array or a series of arguments" + ], + "mkdir": [ + "bool mkdir(string pathname [, int mode [, bool recursive [, resource context]]])", + "Create a directory" + ], + "mktime": [ + "int mktime([int hour [, int min [, int sec [, int mon [, int day [, int year]]]]]])", + "Get UNIX timestamp for a date" + ], + "money_format": [ + "string money_format(string format , float value)", + "Convert monetary value(s) to string" + ], + "move_uploaded_file": [ + "bool move_uploaded_file(string path, string new_path)", + "Move a file if and only if it was created by an upload" + ], + "msg_get_queue": [ + "resource msg_get_queue(int key [, int perms])", + "Attach to a message queue" + ], + "msg_queue_exists": [ + "bool msg_queue_exists(int key)", + "Check wether a message queue exists" + ], + "msg_receive": [ + "mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed message [, bool unserialize=true [, int flags=0 [, int errorcode]]])", + "Send a message of type msgtype (must be > 0) to a message queue" + ], + "msg_remove_queue": [ + "bool msg_remove_queue(resource queue)", + "Destroy the queue" + ], + "msg_send": [ + "bool msg_send(resource queue, int msgtype, mixed message [, bool serialize=true [, bool blocking=true [, int errorcode]]])", + "Send a message of type msgtype (must be > 0) to a message queue" + ], + "msg_set_queue": [ + "bool msg_set_queue(resource queue, array data)", + "Set information for a message queue" + ], + "msg_stat_queue": [ + "array msg_stat_queue(resource queue)", + "Returns information about a message queue" + ], + "msgfmt_create": [ + "MessageFormatter msgfmt_create( string $locale, string $pattern )", + "* Create formatter." + ], + "msgfmt_format": [ + "mixed msgfmt_format( MessageFormatter $nf, array $args )", + "* Format a message." + ], + "msgfmt_format_message": [ + "mixed msgfmt_format_message( string $locale, string $pattern, array $args )", + "* Format a message." + ], + "msgfmt_get_error_code": [ + "int msgfmt_get_error_code( MessageFormatter $nf )", + "* Get formatter's last error code." + ], + "msgfmt_get_error_message": [ + "string msgfmt_get_error_message( MessageFormatter $coll )", + "* Get text description for formatter's last error code." + ], + "msgfmt_get_locale": [ + "string msgfmt_get_locale(MessageFormatter $mf)", + "* Get formatter locale." + ], + "msgfmt_get_pattern": [ + "string msgfmt_get_pattern( MessageFormatter $mf )", + "* Get formatter pattern." + ], + "msgfmt_parse": [ + "array msgfmt_parse( MessageFormatter $nf, string $source )", + "* Parse a message." + ], + "msgfmt_set_pattern": [ + "bool msgfmt_set_pattern( MessageFormatter $mf, string $pattern )", + "* Set formatter pattern." + ], + "mssql_bind": [ + "bool mssql_bind(resource stmt, string param_name, mixed var, int type [, bool is_output [, bool is_null [, int maxlen]]])", + "Adds a parameter to a stored procedure or a remote stored procedure" + ], + "mssql_close": [ + "bool mssql_close([resource conn_id])", + "Closes a connection to a MS-SQL server" + ], + "mssql_connect": [ + "int mssql_connect([string servername [, string username [, string password [, bool new_link]]]])", + "Establishes a connection to a MS-SQL server" + ], + "mssql_data_seek": [ + "bool mssql_data_seek(resource result_id, int offset)", + "Moves the internal row pointer of the MS-SQL result associated with the specified result identifier to pointer to the specified row number" + ], + "mssql_execute": [ + "mixed mssql_execute(resource stmt [, bool skip_results = false])", + "Executes a stored procedure on a MS-SQL server database" + ], + "mssql_fetch_array": [ + "array mssql_fetch_array(resource result_id [, int result_type])", + "Returns an associative array of the current row in the result set specified by result_id" + ], + "mssql_fetch_assoc": [ + "array mssql_fetch_assoc(resource result_id)", + "Returns an associative array of the current row in the result set specified by result_id" + ], + "mssql_fetch_batch": [ + "int mssql_fetch_batch(resource result_index)", + "Returns the next batch of records" + ], + "mssql_fetch_field": [ + "object mssql_fetch_field(resource result_id [, int offset])", + "Gets information about certain fields in a query result" + ], + "mssql_fetch_object": [ + "object mssql_fetch_object(resource result_id)", + "Returns a pseudo-object of the current row in the result set specified by result_id" + ], + "mssql_fetch_row": [ + "array mssql_fetch_row(resource result_id)", + "Returns an array of the current row in the result set specified by result_id" + ], + "mssql_field_length": [ + "int mssql_field_length(resource result_id [, int offset])", + "Get the length of a MS-SQL field" + ], + "mssql_field_name": [ + "string mssql_field_name(resource result_id [, int offset])", + "Returns the name of the field given by offset in the result set given by result_id" + ], + "mssql_field_seek": [ + "bool mssql_field_seek(resource result_id, int offset)", + "Seeks to the specified field offset" + ], + "mssql_field_type": [ + "string mssql_field_type(resource result_id [, int offset])", + "Returns the type of a field" + ], + "mssql_free_result": [ + "bool mssql_free_result(resource result_index)", + "Free a MS-SQL result index" + ], + "mssql_free_statement": [ + "bool mssql_free_statement(resource result_index)", + "Free a MS-SQL statement index" + ], + "mssql_get_last_message": [ + "string mssql_get_last_message(void)", + "Gets the last message from the MS-SQL server" + ], + "mssql_guid_string": [ + "string mssql_guid_string(string binary [,bool short_format])", + "Converts a 16 byte binary GUID to a string" + ], + "mssql_init": [ + "int mssql_init(string sp_name [, resource conn_id])", + "Initializes a stored procedure or a remote stored procedure" + ], + "mssql_min_error_severity": [ + "void mssql_min_error_severity(int severity)", + "Sets the lower error severity" + ], + "mssql_min_message_severity": [ + "void mssql_min_message_severity(int severity)", + "Sets the lower message severity" + ], + "mssql_next_result": [ + "bool mssql_next_result(resource result_id)", + "Move the internal result pointer to the next result" + ], + "mssql_num_fields": [ + "int mssql_num_fields(resource mssql_result_index)", + "Returns the number of fields fetched in from the result id specified" + ], + "mssql_num_rows": [ + "int mssql_num_rows(resource mssql_result_index)", + "Returns the number of rows fetched in from the result id specified" + ], + "mssql_pconnect": [ + "int mssql_pconnect([string servername [, string username [, string password [, bool new_link]]]])", + "Establishes a persistent connection to a MS-SQL server" + ], + "mssql_query": [ + "resource mssql_query(string query [, resource conn_id [, int batch_size]])", + "Perform an SQL query on a MS-SQL server database" + ], + "mssql_result": [ + "string mssql_result(resource result_id, int row, mixed field)", + "Returns the contents of one cell from a MS-SQL result set" + ], + "mssql_rows_affected": [ + "int mssql_rows_affected(resource conn_id)", + "Returns the number of records affected by the query" + ], + "mssql_select_db": [ + "bool mssql_select_db(string database_name [, resource conn_id])", + "Select a MS-SQL database" + ], + "mt_getrandmax": [ + "int mt_getrandmax(void)", + "Returns the maximum value a random number from Mersenne Twister can have" + ], + "mt_rand": [ + "int mt_rand([int min, int max])", + "Returns a random number from Mersenne Twister" + ], + "mt_srand": [ + "void mt_srand([int seed])", + "Seeds Mersenne Twister random number generator" + ], + "mysql_affected_rows": [ + "int mysql_affected_rows([int link_identifier])", + "Gets number of affected rows in previous MySQL operation" + ], + "mysql_client_encoding": [ + "string mysql_client_encoding([int link_identifier])", + "Returns the default character set for the current connection" + ], + "mysql_close": [ + "bool mysql_close([int link_identifier])", + "Close a MySQL connection" + ], + "mysql_connect": [ + "resource mysql_connect([string hostname[:port][:/path/to/socket] [, string username [, string password [, bool new [, int flags]]]]])", + "Opens a connection to a MySQL Server" + ], + "mysql_create_db": [ + "bool mysql_create_db(string database_name [, int link_identifier])", + "Create a MySQL database" + ], + "mysql_data_seek": [ + "bool mysql_data_seek(resource result, int row_number)", + "Move internal result pointer" + ], + "mysql_db_query": [ + "resource mysql_db_query(string database_name, string query [, int link_identifier])", + "Sends an SQL query to MySQL" + ], + "mysql_drop_db": [ + "bool mysql_drop_db(string database_name [, int link_identifier])", + "Drops (delete) a MySQL database" + ], + "mysql_errno": [ + "int mysql_errno([int link_identifier])", + "Returns the number of the error message from previous MySQL operation" + ], + "mysql_error": [ + "string mysql_error([int link_identifier])", + "Returns the text of the error message from previous MySQL operation" + ], + "mysql_escape_string": [ + "string mysql_escape_string(string to_be_escaped)", + "Escape string for mysql query" + ], + "mysql_fetch_array": [ + "array mysql_fetch_array(resource result [, int result_type])", + "Fetch a result row as an array (associative, numeric or both)" + ], + "mysql_fetch_assoc": [ + "array mysql_fetch_assoc(resource result)", + "Fetch a result row as an associative array" + ], + "mysql_fetch_field": [ + "object mysql_fetch_field(resource result [, int field_offset])", + "Gets column information from a result and return as an object" + ], + "mysql_fetch_lengths": [ + "array mysql_fetch_lengths(resource result)", + "Gets max data size of each column in a result" + ], + "mysql_fetch_object": [ + "object mysql_fetch_object(resource result [, string class_name [, NULL|array ctor_params]])", + "Fetch a result row as an object" + ], + "mysql_fetch_row": [ + "array mysql_fetch_row(resource result)", + "Gets a result row as an enumerated array" + ], + "mysql_field_flags": [ + "string mysql_field_flags(resource result, int field_offset)", + "Gets the flags associated with the specified field in a result" + ], + "mysql_field_len": [ + "int mysql_field_len(resource result, int field_offset)", + "Returns the length of the specified field" + ], + "mysql_field_name": [ + "string mysql_field_name(resource result, int field_index)", + "Gets the name of the specified field in a result" + ], + "mysql_field_seek": [ + "bool mysql_field_seek(resource result, int field_offset)", + "Sets result pointer to a specific field offset" + ], + "mysql_field_table": [ + "string mysql_field_table(resource result, int field_offset)", + "Gets name of the table the specified field is in" + ], + "mysql_field_type": [ + "string mysql_field_type(resource result, int field_offset)", + "Gets the type of the specified field in a result" + ], + "mysql_free_result": [ + "bool mysql_free_result(resource result)", + "Free result memory" + ], + "mysql_get_client_info": [ + "string mysql_get_client_info(void)", + "Returns a string that represents the client library version" + ], + "mysql_get_host_info": [ + "string mysql_get_host_info([int link_identifier])", + "Returns a string describing the type of connection in use, including the server host name" + ], + "mysql_get_proto_info": [ + "int mysql_get_proto_info([int link_identifier])", + "Returns the protocol version used by current connection" + ], + "mysql_get_server_info": [ + "string mysql_get_server_info([int link_identifier])", + "Returns a string that represents the server version number" + ], + "mysql_info": [ + "string mysql_info([int link_identifier])", + "Returns a string containing information about the most recent query" + ], + "mysql_insert_id": [ + "int mysql_insert_id([int link_identifier])", + "Gets the ID generated from the previous INSERT operation" + ], + "mysql_list_dbs": [ + "resource mysql_list_dbs([int link_identifier])", + "List databases available on a MySQL server" + ], + "mysql_list_fields": [ + "resource mysql_list_fields(string database_name, string table_name [, int link_identifier])", + "List MySQL result fields" + ], + "mysql_list_processes": [ + "resource mysql_list_processes([int link_identifier])", + "Returns a result set describing the current server threads" + ], + "mysql_list_tables": [ + "resource mysql_list_tables(string database_name [, int link_identifier])", + "List tables in a MySQL database" + ], + "mysql_num_fields": [ + "int mysql_num_fields(resource result)", + "Gets number of fields in a result" + ], + "mysql_num_rows": [ + "int mysql_num_rows(resource result)", + "Gets number of rows in a result" + ], + "mysql_pconnect": [ + "resource mysql_pconnect([string hostname[:port][:/path/to/socket] [, string username [, string password [, int flags]]]])", + "Opens a persistent connection to a MySQL Server" + ], + "mysql_ping": [ + "bool mysql_ping([int link_identifier])", + "Ping a server connection. If no connection then reconnect." + ], + "mysql_query": [ + "resource mysql_query(string query [, int link_identifier])", + "Sends an SQL query to MySQL" + ], + "mysql_real_escape_string": [ + "string mysql_real_escape_string(string to_be_escaped [, int link_identifier])", + "Escape special characters in a string for use in a SQL statement, taking into account the current charset of the connection" + ], + "mysql_result": [ + "mixed mysql_result(resource result, int row [, mixed field])", + "Gets result data" + ], + "mysql_select_db": [ + "bool mysql_select_db(string database_name [, int link_identifier])", + "Selects a MySQL database" + ], + "mysql_set_charset": [ + "bool mysql_set_charset(string csname [, int link_identifier])", + "sets client character set" + ], + "mysql_stat": [ + "string mysql_stat([int link_identifier])", + "Returns a string containing status information" + ], + "mysql_thread_id": [ + "int mysql_thread_id([int link_identifier])", + "Returns the thread id of current connection" + ], + "mysql_unbuffered_query": [ + "resource mysql_unbuffered_query(string query [, int link_identifier])", + "Sends an SQL query to MySQL, without fetching and buffering the result rows" + ], + "mysqli_affected_rows": [ + "mixed mysqli_affected_rows(object link)", + "Get number of affected rows in previous MySQL operation" + ], + "mysqli_autocommit": [ + "bool mysqli_autocommit(object link, bool mode)", + "Turn auto commit on or of" + ], + "mysqli_cache_stats": [ + "array mysqli_cache_stats(void)", + "Returns statistics about the zval cache" + ], + "mysqli_change_user": [ + "bool mysqli_change_user(object link, string user, string password, string database)", + "Change logged-in user of the active connection" + ], + "mysqli_character_set_name": [ + "string mysqli_character_set_name(object link)", + "Returns the name of the character set used for this connection" + ], + "mysqli_close": [ + "bool mysqli_close(object link)", + "Close connection" + ], + "mysqli_commit": [ + "bool mysqli_commit(object link)", + "Commit outstanding actions and close transaction" + ], + "mysqli_connect": [ + "object mysqli_connect([string hostname [,string username [,string passwd [,string dbname [,int port [,string socket]]]]]])", + "Open a connection to a mysql server" + ], + "mysqli_connect_errno": [ + "int mysqli_connect_errno(void)", + "Returns the numerical value of the error message from last connect command" + ], + "mysqli_connect_error": [ + "string mysqli_connect_error(void)", + "Returns the text of the error message from previous MySQL operation" + ], + "mysqli_data_seek": [ + "bool mysqli_data_seek(object result, int offset)", + "Move internal result pointer" + ], + "mysqli_debug": [ + "void mysqli_debug(string debug)", + "" + ], + "mysqli_dump_debug_info": [ + "bool mysqli_dump_debug_info(object link)", + "" + ], + "mysqli_embedded_server_end": [ + "void mysqli_embedded_server_end(void)", + "" + ], + "mysqli_embedded_server_start": [ + "bool mysqli_embedded_server_start(bool start, array arguments, array groups)", + "initialize and start embedded server" + ], + "mysqli_errno": [ + "int mysqli_errno(object link)", + "Returns the numerical value of the error message from previous MySQL operation" + ], + "mysqli_error": [ + "string mysqli_error(object link)", + "Returns the text of the error message from previous MySQL operation" + ], + "mysqli_fetch_all": [ + "mixed mysqli_fetch_all (object result [,int resulttype])", + "Fetches all result rows as an associative array, a numeric array, or both" + ], + "mysqli_fetch_array": [ + "mixed mysqli_fetch_array (object result [,int resulttype])", + "Fetch a result row as an associative array, a numeric array, or both" + ], + "mysqli_fetch_assoc": [ + "mixed mysqli_fetch_assoc (object result)", + "Fetch a result row as an associative array" + ], + "mysqli_fetch_field": [ + "mixed mysqli_fetch_field (object result)", + "Get column information from a result and return as an object" + ], + "mysqli_fetch_field_direct": [ + "mixed mysqli_fetch_field_direct (object result, int offset)", + "Fetch meta-data for a single field" + ], + "mysqli_fetch_fields": [ + "mixed mysqli_fetch_fields (object result)", + "Return array of objects containing field meta-data" + ], + "mysqli_fetch_lengths": [ + "mixed mysqli_fetch_lengths (object result)", + "Get the length of each output in a result" + ], + "mysqli_fetch_object": [ + "mixed mysqli_fetch_object (object result [, string class_name [, NULL|array ctor_params]])", + "Fetch a result row as an object" + ], + "mysqli_fetch_row": [ + "array mysqli_fetch_row (object result)", + "Get a result row as an enumerated array" + ], + "mysqli_field_count": [ + "int mysqli_field_count(object link)", + "Fetch the number of fields returned by the last query for the given link" + ], + "mysqli_field_seek": [ + "int mysqli_field_seek(object result, int fieldnr)", + "Set result pointer to a specified field offset" + ], + "mysqli_field_tell": [ + "int mysqli_field_tell(object result)", + "Get current field offset of result pointer" + ], + "mysqli_free_result": [ + "void mysqli_free_result(object result)", + "Free query result memory for the given result handle" + ], + "mysqli_get_charset": [ + "object mysqli_get_charset(object link)", + "returns a character set object" + ], + "mysqli_get_client_info": [ + "string mysqli_get_client_info(void)", + "Get MySQL client info" + ], + "mysqli_get_client_stats": [ + "array mysqli_get_client_stats(void)", + "Returns statistics about the zval cache" + ], + "mysqli_get_client_version": [ + "int mysqli_get_client_version(void)", + "Get MySQL client info" + ], + "mysqli_get_connection_stats": [ + "array mysqli_get_connection_stats(void)", + "Returns statistics about the zval cache" + ], + "mysqli_get_host_info": [ + "string mysqli_get_host_info (object link)", + "Get MySQL host info" + ], + "mysqli_get_proto_info": [ + "int mysqli_get_proto_info(object link)", + "Get MySQL protocol information" + ], + "mysqli_get_server_info": [ + "string mysqli_get_server_info(object link)", + "Get MySQL server info" + ], + "mysqli_get_server_version": [ + "int mysqli_get_server_version(object link)", + "Return the MySQL version for the server referenced by the given link" + ], + "mysqli_get_warnings": [ + "object mysqli_get_warnings(object link) */", + "PHP_FUNCTION(mysqli_get_warnings) { MY_MYSQL *mysql; zval *mysql_link; MYSQLI_RESOURCE *mysqli_resource; MYSQLI_WARNING *w; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), \"O\", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, \"mysqli_link\", MYSQLI_STATUS_VALID); if (mysql_warning_count(mysql->mysql)) { w = php_get_warnings(mysql->mysql TSRMLS_CC); } else { RETURN_FALSE; } mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = mysqli_resource->info = (void *)w; mysqli_resource->status = MYSQLI_STATUS_VALID; MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry); } /* }}}" + ], + "mysqli_info": [ + "string mysqli_info(object link)", + "Get information about the most recent query" + ], + "mysqli_init": [ + "resource mysqli_init(void)", + "Initialize mysqli and return a resource for use with mysql_real_connect" + ], + "mysqli_insert_id": [ + "mixed mysqli_insert_id(object link)", + "Get the ID generated from the previous INSERT operation" + ], + "mysqli_kill": [ + "bool mysqli_kill(object link, int processid)", + "Kill a mysql process on the server" + ], + "mysqli_link_construct": [ + "object mysqli_link_construct()", + "" + ], + "mysqli_more_results": [ + "bool mysqli_more_results(object link)", + "check if there any more query results from a multi query" + ], + "mysqli_multi_query": [ + "bool mysqli_multi_query(object link, string query)", + "allows to execute multiple queries" + ], + "mysqli_next_result": [ + "bool mysqli_next_result(object link)", + "read next result from multi_query" + ], + "mysqli_num_fields": [ + "int mysqli_num_fields(object result)", + "Get number of fields in result" + ], + "mysqli_num_rows": [ + "mixed mysqli_num_rows(object result)", + "Get number of rows in result" + ], + "mysqli_options": [ + "bool mysqli_options(object link, int flags, mixed values)", + "Set options" + ], + "mysqli_ping": [ + "bool mysqli_ping(object link)", + "Ping a server connection or reconnect if there is no connection" + ], + "mysqli_poll": [ + "int mysqli_poll(array read, array write, array error, long sec [, long usec])", + "Poll connections" + ], + "mysqli_prepare": [ + "mixed mysqli_prepare(object link, string query)", + "Prepare a SQL statement for execution" + ], + "mysqli_query": [ + "mixed mysqli_query(object link, string query [,int resultmode]) */", + "PHP_FUNCTION(mysqli_query) { MY_MYSQL *mysql; zval *mysql_link; MYSQLI_RESOURCE *mysqli_resource; MYSQL_RES *result; char *query = NULL; unsigned int query_len; unsigned long resultmode = MYSQLI_STORE_RESULT; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), \"Os|l\", &mysql_link, mysqli_link_class_entry, &query, &query_len, &resultmode) == FAILURE) { return; } if (!query_len) { php_error_docref(NULL TSRMLS_CC, E_WARNING, \"Empty query\"); RETURN_FALSE; } if ((resultmode & ~MYSQLI_ASYNC) != MYSQLI_USE_RESULT && (resultmode & ~MYSQLI_ASYNC) != MYSQLI_STORE_RESULT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, \"Invalid value for resultmode\"); RETURN_FALSE; } MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, \"mysqli_link\", MYSQLI_STATUS_VALID); MYSQLI_DISABLE_MQ; #ifdef MYSQLI_USE_MYSQLND if (resultmode & MYSQLI_ASYNC) { if (mysqli_async_query(mysql->mysql, query, query_len)) { MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } mysql->async_result_fetch_type = resultmode & ~MYSQLI_ASYNC; RETURN_TRUE; } #endif if (mysql_real_query(mysql->mysql, query, query_len)) { MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } if (!mysql_field_count(mysql->mysql)) { /* no result set - not a SELECT" + ], + "mysqli_real_connect": [ + "bool mysqli_real_connect(object link [,string hostname [,string username [,string passwd [,string dbname [,int port [,string socket [,int flags]]]]]]])", + "Open a connection to a mysql server" + ], + "mysqli_real_escape_string": [ + "string mysqli_real_escape_string(object link, string escapestr)", + "Escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection" + ], + "mysqli_real_query": [ + "bool mysqli_real_query(object link, string query)", + "Binary-safe version of mysql_query()" + ], + "mysqli_reap_async_query": [ + "int mysqli_reap_async_query(object link)", + "Poll connections" + ], + "mysqli_refresh": [ + "bool mysqli_refresh(object link, long options)", + "Flush tables or caches, or reset replication server information" + ], + "mysqli_report": [ + "bool mysqli_report(int flags)", + "sets report level" + ], + "mysqli_rollback": [ + "bool mysqli_rollback(object link)", + "Undo actions from current transaction" + ], + "mysqli_select_db": [ + "bool mysqli_select_db(object link, string dbname)", + "Select a MySQL database" + ], + "mysqli_set_charset": [ + "bool mysqli_set_charset(object link, string csname)", + "sets client character set" + ], + "mysqli_set_local_infile_default": [ + "void mysqli_set_local_infile_default(object link)", + "unsets user defined handler for load local infile command" + ], + "mysqli_set_local_infile_handler": [ + "bool mysqli_set_local_infile_handler(object link, callback read_func)", + "Set callback functions for LOAD DATA LOCAL INFILE" + ], + "mysqli_sqlstate": [ + "string mysqli_sqlstate(object link)", + "Returns the SQLSTATE error from previous MySQL operation" + ], + "mysqli_ssl_set": [ + "bool mysqli_ssl_set(object link ,string key ,string cert ,string ca ,string capath ,string cipher])", + "" + ], + "mysqli_stat": [ + "mixed mysqli_stat(object link)", + "Get current system status" + ], + "mysqli_stmt_affected_rows": [ + "mixed mysqli_stmt_affected_rows(object stmt)", + "Return the number of rows affected in the last query for the given link" + ], + "mysqli_stmt_attr_get": [ + "int mysqli_stmt_attr_get(object stmt, long attr)", + "" + ], + "mysqli_stmt_attr_set": [ + "int mysqli_stmt_attr_set(object stmt, long attr, long mode)", + "" + ], + "mysqli_stmt_bind_param": [ + "bool mysqli_stmt_bind_param(object stmt, string types, mixed variable [,mixed,....])", + "Bind variables to a prepared statement as parameters" + ], + "mysqli_stmt_bind_result": [ + "bool mysqli_stmt_bind_result(object stmt, mixed var, [,mixed, ...])", + "Bind variables to a prepared statement for result storage" + ], + "mysqli_stmt_close": [ + "bool mysqli_stmt_close(object stmt)", + "Close statement" + ], + "mysqli_stmt_data_seek": [ + "void mysqli_stmt_data_seek(object stmt, int offset)", + "Move internal result pointer" + ], + "mysqli_stmt_errno": [ + "int mysqli_stmt_errno(object stmt)", + "" + ], + "mysqli_stmt_error": [ + "string mysqli_stmt_error(object stmt)", + "" + ], + "mysqli_stmt_execute": [ + "bool mysqli_stmt_execute(object stmt)", + "Execute a prepared statement" + ], + "mysqli_stmt_fetch": [ + "mixed mysqli_stmt_fetch(object stmt)", + "Fetch results from a prepared statement into the bound variables" + ], + "mysqli_stmt_field_count": [ + "int mysqli_stmt_field_count(object stmt) {", + "Return the number of result columns for the given statement" + ], + "mysqli_stmt_free_result": [ + "void mysqli_stmt_free_result(object stmt)", + "Free stored result memory for the given statement handle" + ], + "mysqli_stmt_get_result": [ + "object mysqli_stmt_get_result(object link)", + "Buffer result set on client" + ], + "mysqli_stmt_get_warnings": [ + "object mysqli_stmt_get_warnings(object link) */", + "PHP_FUNCTION(mysqli_stmt_get_warnings) { MY_STMT *stmt; zval *stmt_link; MYSQLI_RESOURCE *mysqli_resource; MYSQLI_WARNING *w; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), \"O\", &stmt_link, mysqli_stmt_class_entry) == FAILURE) { return; } MYSQLI_FETCH_RESOURCE(stmt, MY_STMT*, &stmt_link, \"mysqli_stmt\", MYSQLI_STATUS_VALID); if (mysqli_stmt_warning_count(stmt->stmt)) { w = php_get_warnings(mysqli_stmt_get_connection(stmt->stmt) TSRMLS_CC); } else { RETURN_FALSE; } mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = mysqli_resource->info = (void *)w; mysqli_resource->status = MYSQLI_STATUS_VALID; MYSQLI_RETURN_RESOURCE(mysqli_resource, mysqli_warning_class_entry); } /* }}}" + ], + "mysqli_stmt_init": [ + "mixed mysqli_stmt_init(object link)", + "Initialize statement object" + ], + "mysqli_stmt_insert_id": [ + "mixed mysqli_stmt_insert_id(object stmt)", + "Get the ID generated from the previous INSERT operation" + ], + "mysqli_stmt_next_result": [ + "bool mysqli_stmt_next_result(object link)", + "read next result from multi_query" + ], + "mysqli_stmt_num_rows": [ + "mixed mysqli_stmt_num_rows(object stmt)", + "Return the number of rows in statements result set" + ], + "mysqli_stmt_param_count": [ + "int mysqli_stmt_param_count(object stmt)", + "Return the number of parameter for the given statement" + ], + "mysqli_stmt_prepare": [ + "bool mysqli_stmt_prepare(object stmt, string query)", + "prepare server side statement with query" + ], + "mysqli_stmt_reset": [ + "bool mysqli_stmt_reset(object stmt)", + "reset a prepared statement" + ], + "mysqli_stmt_result_metadata": [ + "mixed mysqli_stmt_result_metadata(object stmt)", + "return result set from statement" + ], + "mysqli_stmt_send_long_data": [ + "bool mysqli_stmt_send_long_data(object stmt, int param_nr, string data)", + "" + ], + "mysqli_stmt_sqlstate": [ + "string mysqli_stmt_sqlstate(object stmt)", + "" + ], + "mysqli_stmt_store_result": [ + "bool mysqli_stmt_store_result(stmt)", + "" + ], + "mysqli_store_result": [ + "object mysqli_store_result(object link)", + "Buffer result set on client" + ], + "mysqli_thread_id": [ + "int mysqli_thread_id(object link)", + "Return the current thread ID" + ], + "mysqli_thread_safe": [ + "bool mysqli_thread_safe(void)", + "Return whether thread safety is given or not" + ], + "mysqli_use_result": [ + "mixed mysqli_use_result(object link)", + "Directly retrieve query results - do not buffer results on client side" + ], + "mysqli_warning_count": [ + "int mysqli_warning_count (object link)", + "Return number of warnings from the last query for the given link" + ], + "natcasesort": [ + "void natcasesort(array &array_arg)", + "Sort an array using case-insensitive natural sort" + ], + "natsort": [ + "void natsort(array &array_arg)", + "Sort an array using natural sort" + ], + "next": [ + "mixed next(array array_arg)", + "Move array argument's internal pointer to the next element and return it" + ], + "ngettext": [ + "string ngettext(string MSGID1, string MSGID2, int N)", + "Plural version of gettext()" + ], + "nl2br": [ + "string nl2br(string str [, bool is_xhtml])", + "Converts newlines to HTML line breaks" + ], + "nl_langinfo": [ + "string nl_langinfo(int item)", + "Query language and locale information" + ], + "normalizer_is_normalize": [ + "bool normalizer_is_normalize( string $input [, string $form = FORM_C] )", + "* Test if a string is in a given normalization form." + ], + "normalizer_normalize": [ + "string normalizer_normalize( string $input [, string $form = FORM_C] )", + "* Normalize a string." + ], + "nsapi_request_headers": [ + "array nsapi_request_headers(void)", + "Get all headers from the request" + ], + "nsapi_response_headers": [ + "array nsapi_response_headers(void)", + "Get all headers from the response" + ], + "nsapi_virtual": [ + "bool nsapi_virtual(string uri)", + "Perform an NSAPI sub-request" + ], + "number_format": [ + "string number_format(float number [, int num_decimal_places [, string dec_seperator, string thousands_seperator]])", + "Formats a number with grouped thousands" + ], + "numfmt_create": [ + "NumberFormatter numfmt_create( string $locale, int style[, string $pattern ] )", + "* Create number formatter." + ], + "numfmt_format": [ + "mixed numfmt_format( NumberFormatter $nf, mixed $num[, int type] )", + "* Format a number." + ], + "numfmt_format_currency": [ + "mixed numfmt_format_currency( NumberFormatter $nf, double $num, string $currency )", + "* Format a number as currency." + ], + "numfmt_get_attribute": [ + "mixed numfmt_get_attribute( NumberFormatter $nf, int $attr )", + "* Get formatter attribute value." + ], + "numfmt_get_error_code": [ + "int numfmt_get_error_code( NumberFormatter $nf )", + "* Get formatter's last error code." + ], + "numfmt_get_error_message": [ + "string numfmt_get_error_message( NumberFormatter $nf )", + "* Get text description for formatter's last error code." + ], + "numfmt_get_locale": [ + "string numfmt_get_locale( NumberFormatter $nf[, int type] )", + "* Get formatter locale." + ], + "numfmt_get_pattern": [ + "string numfmt_get_pattern( NumberFormatter $nf )", + "* Get formatter pattern." + ], + "numfmt_get_symbol": [ + "string numfmt_get_symbol( NumberFormatter $nf, int $attr )", + "* Get formatter symbol value." + ], + "numfmt_get_text_attribute": [ + "string numfmt_get_text_attribute( NumberFormatter $nf, int $attr )", + "* Get formatter attribute value." + ], + "numfmt_parse": [ + "mixed numfmt_parse( NumberFormatter $nf, string $str[, int $type, int &$position ])", + "* Parse a number." + ], + "numfmt_parse_currency": [ + "double numfmt_parse_currency( NumberFormatter $nf, string $str, string $¤cy[, int $&position] )", + "* Parse a number as currency." + ], + "numfmt_parse_message": [ + "array numfmt_parse_message( string $locale, string $pattern, string $source )", + "* Parse a message." + ], + "numfmt_set_attribute": [ + "bool numfmt_set_attribute( NumberFormatter $nf, int $attr, mixed $value )", + "* Get formatter attribute value." + ], + "numfmt_set_pattern": [ + "bool numfmt_set_pattern( NumberFormatter $nf, string $pattern )", + "* Set formatter pattern." + ], + "numfmt_set_symbol": [ + "bool numfmt_set_symbol( NumberFormatter $nf, int $attr, string $symbol )", + "* Set formatter symbol value." + ], + "numfmt_set_text_attribute": [ + "bool numfmt_set_text_attribute( NumberFormatter $nf, int $attr, string $value )", + "* Get formatter attribute value." + ], + "ob_clean": [ + "bool ob_clean(void)", + "Clean (delete) the current output buffer" + ], + "ob_end_clean": [ + "bool ob_end_clean(void)", + "Clean the output buffer, and delete current output buffer" + ], + "ob_end_flush": [ + "bool ob_end_flush(void)", + "Flush (send) the output buffer, and delete current output buffer" + ], + "ob_flush": [ + "bool ob_flush(void)", + "Flush (send) contents of the output buffer. The last buffer content is sent to next buffer" + ], + "ob_get_clean": [ + "bool ob_get_clean(void)", + "Get current buffer contents and delete current output buffer" + ], + "ob_get_contents": [ + "string ob_get_contents(void)", + "Return the contents of the output buffer" + ], + "ob_get_flush": [ + "bool ob_get_flush(void)", + "Get current buffer contents, flush (send) the output buffer, and delete current output buffer" + ], + "ob_get_length": [ + "int ob_get_length(void)", + "Return the length of the output buffer" + ], + "ob_get_level": [ + "int ob_get_level(void)", + "Return the nesting level of the output buffer" + ], + "ob_get_status": [ + "false|array ob_get_status([bool full_status])", + "Return the status of the active or all output buffers" + ], + "ob_gzhandler": [ + "string ob_gzhandler(string str, int mode)", + "Encode str based on accept-encoding setting - designed to be called from ob_start()" + ], + "ob_iconv_handler": [ + "string ob_iconv_handler(string contents, int status)", + "Returns str in output buffer converted to the iconv.output_encoding character set" + ], + "ob_implicit_flush": [ + "void ob_implicit_flush([int flag])", + "Turn implicit flush on/off and is equivalent to calling flush() after every output call" + ], + "ob_list_handlers": [ + "false|array ob_list_handlers()", + "* List all output_buffers in an array" + ], + "ob_start": [ + "bool ob_start([ string|array user_function [, int chunk_size [, bool erase]]])", + "Turn on Output Buffering (specifying an optional output handler)." + ], + "oci_bind_array_by_name": [ + "bool oci_bind_array_by_name(resource stmt, string name, array &var, int max_table_length [, int max_item_length [, int type ]])", + "Bind a PHP array to an Oracle PL/SQL type by name" + ], + "oci_bind_by_name": [ + "bool oci_bind_by_name(resource stmt, string name, mixed &var, [, int maxlength [, int type]])", + "Bind a PHP variable to an Oracle placeholder by name" + ], + "oci_cancel": [ + "bool oci_cancel(resource stmt)", + "Cancel reading from a cursor" + ], + "oci_close": [ + "bool oci_close(resource connection)", + "Disconnect from database" + ], + "oci_collection_append": [ + "bool oci_collection_append(string value)", + "Append an object to the collection" + ], + "oci_collection_assign": [ + "bool oci_collection_assign(object from)", + "Assign a collection from another existing collection" + ], + "oci_collection_element_assign": [ + "bool oci_collection_element_assign(int index, string val)", + "Assign element val to collection at index ndx" + ], + "oci_collection_element_get": [ + "string oci_collection_element_get(int ndx)", + "Retrieve the value at collection index ndx" + ], + "oci_collection_max": [ + "int oci_collection_max()", + "Return the max value of a collection. For a varray this is the maximum length of the array" + ], + "oci_collection_size": [ + "int oci_collection_size()", + "Return the size of a collection" + ], + "oci_collection_trim": [ + "bool oci_collection_trim(int num)", + "Trim num elements from the end of a collection" + ], + "oci_commit": [ + "bool oci_commit(resource connection)", + "Commit the current context" + ], + "oci_connect": [ + "resource oci_connect(string user, string pass [, string db [, string charset [, int session_mode ]])", + "Connect to an Oracle database and log on. Returns a new session." + ], + "oci_define_by_name": [ + "bool oci_define_by_name(resource stmt, string name, mixed &var [, int type])", + "Define a PHP variable to an Oracle column by name" + ], + "oci_error": [ + "array oci_error([resource stmt|connection|global])", + "Return the last error of stmt|connection|global. If no error happened returns false." + ], + "oci_execute": [ + "bool oci_execute(resource stmt [, int mode])", + "Execute a parsed statement" + ], + "oci_fetch": [ + "bool oci_fetch(resource stmt)", + "Prepare a new row of data for reading" + ], + "oci_fetch_all": [ + "int oci_fetch_all(resource stmt, array &output[, int skip[, int maxrows[, int flags]]])", + "Fetch all rows of result data into an array" + ], + "oci_fetch_array": [ + "array oci_fetch_array( resource stmt [, int mode ])", + "Fetch a result row as an array" + ], + "oci_fetch_assoc": [ + "array oci_fetch_assoc( resource stmt )", + "Fetch a result row as an associative array" + ], + "oci_fetch_object": [ + "object oci_fetch_object( resource stmt )", + "Fetch a result row as an object" + ], + "oci_fetch_row": [ + "array oci_fetch_row( resource stmt )", + "Fetch a result row as an enumerated array" + ], + "oci_field_is_null": [ + "bool oci_field_is_null(resource stmt, int col)", + "Tell whether a column is NULL" + ], + "oci_field_name": [ + "string oci_field_name(resource stmt, int col)", + "Tell the name of a column" + ], + "oci_field_precision": [ + "int oci_field_precision(resource stmt, int col)", + "Tell the precision of a column" + ], + "oci_field_scale": [ + "int oci_field_scale(resource stmt, int col)", + "Tell the scale of a column" + ], + "oci_field_size": [ + "int oci_field_size(resource stmt, int col)", + "Tell the maximum data size of a column" + ], + "oci_field_type": [ + "mixed oci_field_type(resource stmt, int col)", + "Tell the data type of a column" + ], + "oci_field_type_raw": [ + "int oci_field_type_raw(resource stmt, int col)", + "Tell the raw oracle data type of a column" + ], + "oci_free_collection": [ + "bool oci_free_collection()", + "Deletes collection object" + ], + "oci_free_descriptor": [ + "bool oci_free_descriptor()", + "Deletes large object description" + ], + "oci_free_statement": [ + "bool oci_free_statement(resource stmt)", + "Free all resources associated with a statement" + ], + "oci_internal_debug": [ + "void oci_internal_debug(int onoff)", + "Toggle internal debugging output for the OCI extension" + ], + "oci_lob_append": [ + "bool oci_lob_append( object lob )", + "Appends data from a LOB to another LOB" + ], + "oci_lob_close": [ + "bool oci_lob_close()", + "Closes lob descriptor" + ], + "oci_lob_copy": [ + "bool oci_lob_copy( object lob_to, object lob_from [, int length ] )", + "Copies data from a LOB to another LOB" + ], + "oci_lob_eof": [ + "bool oci_lob_eof()", + "Checks if EOF is reached" + ], + "oci_lob_erase": [ + "int oci_lob_erase( [ int offset [, int length ] ] )", + "Erases a specified portion of the internal LOB, starting at a specified offset" + ], + "oci_lob_export": [ + "bool oci_lob_export([string filename [, int start [, int length]]])", + "Writes a large object into a file" + ], + "oci_lob_flush": [ + "bool oci_lob_flush( [ int flag ] )", + "Flushes the LOB buffer" + ], + "oci_lob_import": [ + "bool oci_lob_import( string filename )", + "Loads file into a LOB" + ], + "oci_lob_is_equal": [ + "bool oci_lob_is_equal( object lob1, object lob2 )", + "Tests to see if two LOB/FILE locators are equal" + ], + "oci_lob_load": [ + "string oci_lob_load()", + "Loads a large object" + ], + "oci_lob_read": [ + "string oci_lob_read( int length )", + "Reads particular part of a large object" + ], + "oci_lob_rewind": [ + "bool oci_lob_rewind()", + "Rewind pointer of a LOB" + ], + "oci_lob_save": [ + "bool oci_lob_save( string data [, int offset ])", + "Saves a large object" + ], + "oci_lob_seek": [ + "bool oci_lob_seek( int offset [, int whence ])", + "Moves the pointer of a LOB" + ], + "oci_lob_size": [ + "int oci_lob_size()", + "Returns size of a large object" + ], + "oci_lob_tell": [ + "int oci_lob_tell()", + "Tells LOB pointer position" + ], + "oci_lob_truncate": [ + "bool oci_lob_truncate( [ int length ])", + "Truncates a LOB" + ], + "oci_lob_write": [ + "int oci_lob_write( string string [, int length ])", + "Writes data to current position of a LOB" + ], + "oci_lob_write_temporary": [ + "bool oci_lob_write_temporary(string var [, int lob_type])", + "Writes temporary blob" + ], + "oci_new_collection": [ + "object oci_new_collection(resource connection, string tdo [, string schema])", + "Initialize a new collection" + ], + "oci_new_connect": [ + "resource oci_new_connect(string user, string pass [, string db])", + "Connect to an Oracle database and log on. Returns a new session." + ], + "oci_new_cursor": [ + "resource oci_new_cursor(resource connection)", + "Return a new cursor (Statement-Handle) - use this to bind ref-cursors!" + ], + "oci_new_descriptor": [ + "object oci_new_descriptor(resource connection [, int type])", + "Initialize a new empty descriptor LOB/FILE (LOB is default)" + ], + "oci_num_fields": [ + "int oci_num_fields(resource stmt)", + "Return the number of result columns in a statement" + ], + "oci_num_rows": [ + "int oci_num_rows(resource stmt)", + "Return the row count of an OCI statement" + ], + "oci_parse": [ + "resource oci_parse(resource connection, string query)", + "Parse a query and return a statement" + ], + "oci_password_change": [ + "bool oci_password_change(resource connection, string username, string old_password, string new_password)", + "Changes the password of an account" + ], + "oci_pconnect": [ + "resource oci_pconnect(string user, string pass [, string db [, string charset ]])", + "Connect to an Oracle database using a persistent connection and log on. Returns a new session." + ], + "oci_result": [ + "string oci_result(resource stmt, mixed column)", + "Return a single column of result data" + ], + "oci_rollback": [ + "bool oci_rollback(resource connection)", + "Rollback the current context" + ], + "oci_server_version": [ + "string oci_server_version(resource connection)", + "Return a string containing server version information" + ], + "oci_set_action": [ + "bool oci_set_action(resource connection, string value)", + "Sets the action attribute on the connection" + ], + "oci_set_client_identifier": [ + "bool oci_set_client_identifier(resource connection, string value)", + "Sets the client identifier attribute on the connection" + ], + "oci_set_client_info": [ + "bool oci_set_client_info(resource connection, string value)", + "Sets the client info attribute on the connection" + ], + "oci_set_edition": [ + "bool oci_set_edition(string value)", + "Sets the edition attribute for all subsequent connections created" + ], + "oci_set_module_name": [ + "bool oci_set_module_name(resource connection, string value)", + "Sets the module attribute on the connection" + ], + "oci_set_prefetch": [ + "bool oci_set_prefetch(resource stmt, int prefetch_rows)", + "Sets the number of rows to be prefetched on execute to prefetch_rows for stmt" + ], + "oci_statement_type": [ + "string oci_statement_type(resource stmt)", + "Return the query type of an OCI statement" + ], + "ocifetchinto": [ + "int ocifetchinto(resource stmt, array &output [, int mode])", + "Fetch a row of result data into an array" + ], + "ocigetbufferinglob": [ + "bool ocigetbufferinglob()", + "Returns current state of buffering for a LOB" + ], + "ocisetbufferinglob": [ + "bool ocisetbufferinglob( boolean flag )", + "Enables/disables buffering for a LOB" + ], + "octdec": [ + "int octdec(string octal_number)", + "Returns the decimal equivalent of an octal string" + ], + "odbc_autocommit": [ + "mixed odbc_autocommit(resource connection_id [, int OnOff])", + "Toggle autocommit mode or get status" + ], + "odbc_binmode": [ + "bool odbc_binmode(int result_id, int mode)", + "Handle binary column data" + ], + "odbc_close": [ + "void odbc_close(resource connection_id)", + "Close an ODBC connection" + ], + "odbc_close_all": [ + "void odbc_close_all(void)", + "Close all ODBC connections" + ], + "odbc_columnprivileges": [ + "resource odbc_columnprivileges(resource connection_id, string catalog, string schema, string table, string column)", + "Returns a result identifier that can be used to fetch a list of columns and associated privileges for the specified table" + ], + "odbc_columns": [ + "resource odbc_columns(resource connection_id [, string qualifier [, string owner [, string table_name [, string column_name]]]])", + "Returns a result identifier that can be used to fetch a list of column names in specified tables" + ], + "odbc_commit": [ + "bool odbc_commit(resource connection_id)", + "Commit an ODBC transaction" + ], + "odbc_connect": [ + "resource odbc_connect(string DSN, string user, string password [, int cursor_option])", + "Connect to a datasource" + ], + "odbc_cursor": [ + "string odbc_cursor(resource result_id)", + "Get cursor name" + ], + "odbc_data_source": [ + "array odbc_data_source(resource connection_id, int fetch_type)", + "Return information about the currently connected data source" + ], + "odbc_error": [ + "string odbc_error([resource connection_id])", + "Get the last error code" + ], + "odbc_errormsg": [ + "string odbc_errormsg([resource connection_id])", + "Get the last error message" + ], + "odbc_exec": [ + "resource odbc_exec(resource connection_id, string query [, int flags])", + "Prepare and execute an SQL statement" + ], + "odbc_execute": [ + "bool odbc_execute(resource result_id [, array parameters_array])", + "Execute a prepared statement" + ], + "odbc_fetch_array": [ + "array odbc_fetch_array(int result [, int rownumber])", + "Fetch a result row as an associative array" + ], + "odbc_fetch_into": [ + "int odbc_fetch_into(resource result_id, array &result_array, [, int rownumber])", + "Fetch one result row into an array" + ], + "odbc_fetch_object": [ + "object odbc_fetch_object(int result [, int rownumber])", + "Fetch a result row as an object" + ], + "odbc_fetch_row": [ + "bool odbc_fetch_row(resource result_id [, int row_number])", + "Fetch a row" + ], + "odbc_field_len": [ + "int odbc_field_len(resource result_id, int field_number)", + "Get the length (precision) of a column" + ], + "odbc_field_name": [ + "string odbc_field_name(resource result_id, int field_number)", + "Get a column name" + ], + "odbc_field_num": [ + "int odbc_field_num(resource result_id, string field_name)", + "Return column number" + ], + "odbc_field_scale": [ + "int odbc_field_scale(resource result_id, int field_number)", + "Get the scale of a column" + ], + "odbc_field_type": [ + "string odbc_field_type(resource result_id, int field_number)", + "Get the datatype of a column" + ], + "odbc_foreignkeys": [ + "resource odbc_foreignkeys(resource connection_id, string pk_qualifier, string pk_owner, string pk_table, string fk_qualifier, string fk_owner, string fk_table)", + "Returns a result identifier to either a list of foreign keys in the specified table or a list of foreign keys in other tables that refer to the primary key in the specified table" + ], + "odbc_free_result": [ + "bool odbc_free_result(resource result_id)", + "Free resources associated with a result" + ], + "odbc_gettypeinfo": [ + "resource odbc_gettypeinfo(resource connection_id [, int data_type])", + "Returns a result identifier containing information about data types supported by the data source" + ], + "odbc_longreadlen": [ + "bool odbc_longreadlen(int result_id, int length)", + "Handle LONG columns" + ], + "odbc_next_result": [ + "bool odbc_next_result(resource result_id)", + "Checks if multiple results are avaiable" + ], + "odbc_num_fields": [ + "int odbc_num_fields(resource result_id)", + "Get number of columns in a result" + ], + "odbc_num_rows": [ + "int odbc_num_rows(resource result_id)", + "Get number of rows in a result" + ], + "odbc_pconnect": [ + "resource odbc_pconnect(string DSN, string user, string password [, int cursor_option])", + "Establish a persistent connection to a datasource" + ], + "odbc_prepare": [ + "resource odbc_prepare(resource connection_id, string query)", + "Prepares a statement for execution" + ], + "odbc_primarykeys": [ + "resource odbc_primarykeys(resource connection_id, string qualifier, string owner, string table)", + "Returns a result identifier listing the column names that comprise the primary key for a table" + ], + "odbc_procedurecolumns": [ + "resource odbc_procedurecolumns(resource connection_id [, string qualifier, string owner, string proc, string column])", + "Returns a result identifier containing the list of input and output parameters, as well as the columns that make up the result set for the specified procedures" + ], + "odbc_procedures": [ + "resource odbc_procedures(resource connection_id [, string qualifier, string owner, string name])", + "Returns a result identifier containg the list of procedure names in a datasource" + ], + "odbc_result": [ + "mixed odbc_result(resource result_id, mixed field)", + "Get result data" + ], + "odbc_result_all": [ + "int odbc_result_all(resource result_id [, string format])", + "Print result as HTML table" + ], + "odbc_rollback": [ + "bool odbc_rollback(resource connection_id)", + "Rollback a transaction" + ], + "odbc_setoption": [ + "bool odbc_setoption(resource conn_id|result_id, int which, int option, int value)", + "Sets connection or statement options" + ], + "odbc_specialcolumns": [ + "resource odbc_specialcolumns(resource connection_id, int type, string qualifier, string owner, string table, int scope, int nullable)", + "Returns a result identifier containing either the optimal set of columns that uniquely identifies a row in the table or columns that are automatically updated when any value in the row is updated by a transaction" + ], + "odbc_statistics": [ + "resource odbc_statistics(resource connection_id, string qualifier, string owner, string name, int unique, int accuracy)", + "Returns a result identifier that contains statistics about a single table and the indexes associated with the table" + ], + "odbc_tableprivileges": [ + "resource odbc_tableprivileges(resource connection_id, string qualifier, string owner, string name)", + "Returns a result identifier containing a list of tables and the privileges associated with each table" + ], + "odbc_tables": [ + "resource odbc_tables(resource connection_id [, string qualifier [, string owner [, string name [, string table_types]]]])", + "Call the SQLTables function" + ], + "opendir": [ + "mixed opendir(string path[, resource context])", + "Open a directory and return a dir_handle" + ], + "openlog": [ + "bool openlog(string ident, int option, int facility)", + "Open connection to system logger" + ], + "openssl_csr_export": [ + "bool openssl_csr_export(resource csr, string &out [, bool notext=true])", + "Exports a CSR to file or a var" + ], + "openssl_csr_export_to_file": [ + "bool openssl_csr_export_to_file(resource csr, string outfilename [, bool notext=true])", + "Exports a CSR to file" + ], + "openssl_csr_get_public_key": [ + "mixed openssl_csr_get_public_key(mixed csr)", + "Returns the subject of a CERT or FALSE on error" + ], + "openssl_csr_get_subject": [ + "mixed openssl_csr_get_subject(mixed csr)", + "Returns the subject of a CERT or FALSE on error" + ], + "openssl_csr_new": [ + "bool openssl_csr_new(array dn, resource &privkey [, array configargs [, array extraattribs]])", + "Generates a privkey and CSR" + ], + "openssl_csr_sign": [ + "resource openssl_csr_sign(mixed csr, mixed x509, mixed priv_key, long days [, array config_args [, long serial]])", + "Signs a cert with another CERT" + ], + "openssl_decrypt": [ + "string openssl_decrypt(string data, string method, string password [, bool raw_input=false])", + "Takes raw or base64 encoded string and dectupt it using given method and key" + ], + "openssl_dh_compute_key": [ + "string openssl_dh_compute_key(string pub_key, resource dh_key)", + "Computes shared sicret for public value of remote DH key and local DH key" + ], + "openssl_digest": [ + "string openssl_digest(string data, string method [, bool raw_output=false])", + "Computes digest hash value for given data using given method, returns raw or binhex encoded string" + ], + "openssl_encrypt": [ + "string openssl_encrypt(string data, string method, string password [, bool raw_output=false])", + "Encrypts given data with given method and key, returns raw or base64 encoded string" + ], + "openssl_error_string": [ + "mixed openssl_error_string(void)", + "Returns a description of the last error, and alters the index of the error messages. Returns false when the are no more messages" + ], + "openssl_get_cipher_methods": [ + "array openssl_get_cipher_methods([bool aliases = false])", + "Return array of available cipher methods" + ], + "openssl_get_md_methods": [ + "array openssl_get_md_methods([bool aliases = false])", + "Return array of available digest methods" + ], + "openssl_open": [ + "bool openssl_open(string data, &string opendata, string ekey, mixed privkey)", + "Opens data" + ], + "openssl_pkcs12_export": [ + "bool openssl_pkcs12_export(mixed x509, string &out, mixed priv_key, string pass[, array args])", + "Creates and exports a PKCS12 to a var" + ], + "openssl_pkcs12_export_to_file": [ + "bool openssl_pkcs12_export_to_file(mixed x509, string filename, mixed priv_key, string pass[, array args])", + "Creates and exports a PKCS to file" + ], + "openssl_pkcs12_read": [ + "bool openssl_pkcs12_read(string PKCS12, array &certs, string pass)", + "Parses a PKCS12 to an array" + ], + "openssl_pkcs7_decrypt": [ + "bool openssl_pkcs7_decrypt(string infilename, string outfilename, mixed recipcert [, mixed recipkey])", + "Decrypts the S/MIME message in the file name infilename and output the results to the file name outfilename. recipcert is a CERT for one of the recipients. recipkey specifies the private key matching recipcert, if recipcert does not include the key" + ], + "openssl_pkcs7_encrypt": [ + "bool openssl_pkcs7_encrypt(string infile, string outfile, mixed recipcerts, array headers [, long flags [, long cipher]])", + "Encrypts the message in the file named infile with the certificates in recipcerts and output the result to the file named outfile" + ], + "openssl_pkcs7_sign": [ + "bool openssl_pkcs7_sign(string infile, string outfile, mixed signcert, mixed signkey, array headers [, long flags [, string extracertsfilename]])", + "Signs the MIME message in the file named infile with signcert/signkey and output the result to file name outfile. headers lists plain text headers to exclude from the signed portion of the message, and should include to, from and subject as a minimum" + ], + "openssl_pkcs7_verify": [ + "bool openssl_pkcs7_verify(string filename, long flags [, string signerscerts [, array cainfo [, string extracerts [, string content]]]])", + "Verifys that the data block is intact, the signer is who they say they are, and returns the CERTs of the signers" + ], + "openssl_pkey_export": [ + "bool openssl_pkey_export(mixed key, &mixed out [, string passphrase [, array config_args]])", + "Gets an exportable representation of a key into a string or file" + ], + "openssl_pkey_export_to_file": [ + "bool openssl_pkey_export_to_file(mixed key, string outfilename [, string passphrase, array config_args)", + "Gets an exportable representation of a key into a file" + ], + "openssl_pkey_free": [ + "void openssl_pkey_free(int key)", + "Frees a key" + ], + "openssl_pkey_get_details": [ + "resource openssl_pkey_get_details(resource key)", + "returns an array with the key details (bits, pkey, type)" + ], + "openssl_pkey_get_private": [ + "int openssl_pkey_get_private(string key [, string passphrase])", + "Gets private keys" + ], + "openssl_pkey_get_public": [ + "int openssl_pkey_get_public(mixed cert)", + "Gets public key from X.509 certificate" + ], + "openssl_pkey_new": [ + "resource openssl_pkey_new([array configargs])", + "Generates a new private key" + ], + "openssl_private_decrypt": [ + "bool openssl_private_decrypt(string data, string &decrypted, mixed key [, int padding])", + "Decrypts data with private key" + ], + "openssl_private_encrypt": [ + "bool openssl_private_encrypt(string data, string &crypted, mixed key [, int padding])", + "Encrypts data with private key" + ], + "openssl_public_decrypt": [ + "bool openssl_public_decrypt(string data, string &crypted, resource key [, int padding])", + "Decrypts data with public key" + ], + "openssl_public_encrypt": [ + "bool openssl_public_encrypt(string data, string &crypted, mixed key [, int padding])", + "Encrypts data with public key" + ], + "openssl_random_pseudo_bytes": [ + "string openssl_random_pseudo_bytes(integer length [, &bool returned_strong_result])", + "Returns a string of the length specified filled with random pseudo bytes" + ], + "openssl_seal": [ + "int openssl_seal(string data, &string sealdata, &array ekeys, array pubkeys)", + "Seals data" + ], + "openssl_sign": [ + "bool openssl_sign(string data, &string signature, mixed key[, mixed method])", + "Signs data" + ], + "openssl_verify": [ + "int openssl_verify(string data, string signature, mixed key[, mixed method])", + "Verifys data" + ], + "openssl_x509_check_private_key": [ + "bool openssl_x509_check_private_key(mixed cert, mixed key)", + "Checks if a private key corresponds to a CERT" + ], + "openssl_x509_checkpurpose": [ + "int openssl_x509_checkpurpose(mixed x509cert, int purpose, array cainfo [, string untrustedfile])", + "Checks the CERT to see if it can be used for the purpose in purpose. cainfo holds information about trusted CAs" + ], + "openssl_x509_export": [ + "bool openssl_x509_export(mixed x509, string &out [, bool notext = true])", + "Exports a CERT to file or a var" + ], + "openssl_x509_export_to_file": [ + "bool openssl_x509_export_to_file(mixed x509, string outfilename [, bool notext = true])", + "Exports a CERT to file or a var" + ], + "openssl_x509_free": [ + "void openssl_x509_free(resource x509)", + "Frees X.509 certificates" + ], + "openssl_x509_parse": [ + "array openssl_x509_parse(mixed x509 [, bool shortnames=true])", + "Returns an array of the fields/values of the CERT" + ], + "openssl_x509_read": [ + "resource openssl_x509_read(mixed cert)", + "Reads X.509 certificates" + ], + "ord": [ + "int ord(string character)", + "Returns ASCII value of character" + ], + "output_add_rewrite_var": [ + "bool output_add_rewrite_var(string name, string value)", + "Add URL rewriter values" + ], + "output_reset_rewrite_vars": [ + "bool output_reset_rewrite_vars(void)", + "Reset(clear) URL rewriter values" + ], + "pack": [ + "string pack(string format, mixed arg1 [, mixed arg2 [, mixed ...]])", + "Takes one or more arguments and packs them into a binary string according to the format argument" + ], + "parse_ini_file": [ + "array parse_ini_file(string filename [, bool process_sections [, int scanner_mode]])", + "Parse configuration file" + ], + "parse_ini_string": [ + "array parse_ini_string(string ini_string [, bool process_sections [, int scanner_mode]])", + "Parse configuration string" + ], + "parse_locale": [ + "static array parse_locale($locale)", + "* parses a locale-id into an array the different parts of it" + ], + "parse_str": [ + "void parse_str(string encoded_string [, array result])", + "Parses GET/POST/COOKIE data and sets global variables" + ], + "parse_url": [ + "mixed parse_url(string url, [int url_component])", + "Parse a URL and return its components" + ], + "passthru": [ + "void passthru(string command [, int &return_value])", + "Execute an external program and display raw output" + ], + "pathinfo": [ + "array pathinfo(string path[, int options])", + "Returns information about a certain string" + ], + "pclose": [ + "int pclose(resource fp)", + "Close a file pointer opened by popen()" + ], + "pcnlt_sigwaitinfo": [ + "int pcnlt_sigwaitinfo(array set[, array &siginfo])", + "Synchronously wait for queued signals" + ], + "pcntl_alarm": [ + "int pcntl_alarm(int seconds)", + "Set an alarm clock for delivery of a signal" + ], + "pcntl_exec": [ + "bool pcntl_exec(string path [, array args [, array envs]])", + "Executes specified program in current process space as defined by exec(2)" + ], + "pcntl_fork": [ + "int pcntl_fork(void)", + "Forks the currently running process following the same behavior as the UNIX fork() system call" + ], + "pcntl_getpriority": [ + "int pcntl_getpriority([int pid [, int process_identifier]])", + "Get the priority of any process" + ], + "pcntl_setpriority": [ + "bool pcntl_setpriority(int priority [, int pid [, int process_identifier]])", + "Change the priority of any process" + ], + "pcntl_signal": [ + "bool pcntl_signal(int signo, callback handle [, bool restart_syscalls])", + "Assigns a system signal handler to a PHP function" + ], + "pcntl_signal_dispatch": [ + "bool pcntl_signal_dispatch()", + "Dispatch signals to signal handlers" + ], + "pcntl_sigprocmask": [ + "bool pcntl_sigprocmask(int how, array set[, array &oldset])", + "Examine and change blocked signals" + ], + "pcntl_sigtimedwait": [ + "int pcntl_sigtimedwait(array set[, array &siginfo[, int seconds[, int nanoseconds]]])", + "Wait for queued signals" + ], + "pcntl_wait": [ + "int pcntl_wait(int &status)", + "Waits on or returns the status of a forked child as defined by the waitpid() system call" + ], + "pcntl_waitpid": [ + "int pcntl_waitpid(int pid, int &status, int options)", + "Waits on or returns the status of a forked child as defined by the waitpid() system call" + ], + "pcntl_wexitstatus": [ + "int pcntl_wexitstatus(int status)", + "Returns the status code of a child's exit" + ], + "pcntl_wifexited": [ + "bool pcntl_wifexited(int status)", + "Returns true if the child status code represents a successful exit" + ], + "pcntl_wifsignaled": [ + "bool pcntl_wifsignaled(int status)", + "Returns true if the child status code represents a process that was terminated due to a signal" + ], + "pcntl_wifstopped": [ + "bool pcntl_wifstopped(int status)", + "Returns true if the child status code represents a stopped process (WUNTRACED must have been used with waitpid)" + ], + "pcntl_wstopsig": [ + "int pcntl_wstopsig(int status)", + "Returns the number of the signal that caused the process to stop who's status code is passed" + ], + "pcntl_wtermsig": [ + "int pcntl_wtermsig(int status)", + "Returns the number of the signal that terminated the process who's status code is passed" + ], + "pdo_drivers": [ + "array pdo_drivers()", + "Return array of available PDO drivers" + ], + "pfsockopen": [ + "resource pfsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])", + "Open persistent Internet or Unix domain socket connection" + ], + "pg_affected_rows": [ + "int pg_affected_rows(resource result)", + "Returns the number of affected tuples" + ], + "pg_cancel_query": [ + "bool pg_cancel_query(resource connection)", + "Cancel request" + ], + "pg_client_encoding": [ + "string pg_client_encoding([resource connection])", + "Get the current client encoding" + ], + "pg_close": [ + "bool pg_close([resource connection])", + "Close a PostgreSQL connection" + ], + "pg_connect": [ + "resource pg_connect(string connection_string[, int connect_type] | [string host, string port [, string options [, string tty,]]] string database)", + "Open a PostgreSQL connection" + ], + "pg_connection_busy": [ + "bool pg_connection_busy(resource connection)", + "Get connection is busy or not" + ], + "pg_connection_reset": [ + "bool pg_connection_reset(resource connection)", + "Reset connection (reconnect)" + ], + "pg_connection_status": [ + "int pg_connection_status(resource connnection)", + "Get connection status" + ], + "pg_convert": [ + "array pg_convert(resource db, string table, array values[, int options])", + "Check and convert values for PostgreSQL SQL statement" + ], + "pg_copy_from": [ + "bool pg_copy_from(resource connection, string table_name , array rows [, string delimiter [, string null_as]])", + "Copy table from array" + ], + "pg_copy_to": [ + "array pg_copy_to(resource connection, string table_name [, string delimiter [, string null_as]])", + "Copy table to array" + ], + "pg_dbname": [ + "string pg_dbname([resource connection])", + "Get the database name" + ], + "pg_delete": [ + "mixed pg_delete(resource db, string table, array ids[, int options])", + "Delete records has ids (id=>value)" + ], + "pg_end_copy": [ + "bool pg_end_copy([resource connection])", + "Sync with backend. Completes the Copy command" + ], + "pg_escape_bytea": [ + "string pg_escape_bytea([resource connection,] string data)", + "Escape binary for bytea type" + ], + "pg_escape_string": [ + "string pg_escape_string([resource connection,] string data)", + "Escape string for text/char type" + ], + "pg_execute": [ + "resource pg_execute([resource connection,] string stmtname, array params)", + "Execute a prepared query" + ], + "pg_fetch_all": [ + "array pg_fetch_all(resource result)", + "Fetch all rows into array" + ], + "pg_fetch_all_columns": [ + "array pg_fetch_all_columns(resource result [, int column_number])", + "Fetch all rows into array" + ], + "pg_fetch_array": [ + "array pg_fetch_array(resource result [, int row [, int result_type]])", + "Fetch a row as an array" + ], + "pg_fetch_assoc": [ + "array pg_fetch_assoc(resource result [, int row])", + "Fetch a row as an assoc array" + ], + "pg_fetch_object": [ + "object pg_fetch_object(resource result [, int row [, string class_name [, NULL|array ctor_params]]])", + "Fetch a row as an object" + ], + "pg_fetch_result": [ + "mixed pg_fetch_result(resource result, [int row_number,] mixed field_name)", + "Returns values from a result identifier" + ], + "pg_fetch_row": [ + "array pg_fetch_row(resource result [, int row [, int result_type]])", + "Get a row as an enumerated array" + ], + "pg_field_is_null": [ + "int pg_field_is_null(resource result, [int row,] mixed field_name_or_number)", + "Test if a field is NULL" + ], + "pg_field_name": [ + "string pg_field_name(resource result, int field_number)", + "Returns the name of the field" + ], + "pg_field_num": [ + "int pg_field_num(resource result, string field_name)", + "Returns the field number of the named field" + ], + "pg_field_prtlen": [ + "int pg_field_prtlen(resource result, [int row,] mixed field_name_or_number)", + "Returns the printed length" + ], + "pg_field_size": [ + "int pg_field_size(resource result, int field_number)", + "Returns the internal size of the field" + ], + "pg_field_table": [ + "mixed pg_field_table(resource result, int field_number[, bool oid_only])", + "Returns the name of the table field belongs to, or table's oid if oid_only is true" + ], + "pg_field_type": [ + "string pg_field_type(resource result, int field_number)", + "Returns the type name for the given field" + ], + "pg_field_type_oid": [ + "string pg_field_type_oid(resource result, int field_number)", + "Returns the type oid for the given field" + ], + "pg_free_result": [ + "bool pg_free_result(resource result)", + "Free result memory" + ], + "pg_get_notify": [ + "array pg_get_notify([resource connection[, result_type]])", + "Get asynchronous notification" + ], + "pg_get_pid": [ + "int pg_get_pid([resource connection)", + "Get backend(server) pid" + ], + "pg_get_result": [ + "resource pg_get_result(resource connection)", + "Get asynchronous query result" + ], + "pg_host": [ + "string pg_host([resource connection])", + "Returns the host name associated with the connection" + ], + "pg_insert": [ + "mixed pg_insert(resource db, string table, array values[, int options])", + "Insert values (filed=>value) to table" + ], + "pg_last_error": [ + "string pg_last_error([resource connection])", + "Get the error message string" + ], + "pg_last_notice": [ + "string pg_last_notice(resource connection)", + "Returns the last notice set by the backend" + ], + "pg_last_oid": [ + "string pg_last_oid(resource result)", + "Returns the last object identifier" + ], + "pg_lo_close": [ + "bool pg_lo_close(resource large_object)", + "Close a large object" + ], + "pg_lo_create": [ + "mixed pg_lo_create([resource connection],[mixed large_object_oid])", + "Create a large object" + ], + "pg_lo_export": [ + "bool pg_lo_export([resource connection, ] int objoid, string filename)", + "Export large object direct to filesystem" + ], + "pg_lo_import": [ + "int pg_lo_import([resource connection, ] string filename [, mixed oid])", + "Import large object direct from filesystem" + ], + "pg_lo_open": [ + "resource pg_lo_open([resource connection,] int large_object_oid, string mode)", + "Open a large object and return fd" + ], + "pg_lo_read": [ + "string pg_lo_read(resource large_object [, int len])", + "Read a large object" + ], + "pg_lo_read_all": [ + "int pg_lo_read_all(resource large_object)", + "Read a large object and send straight to browser" + ], + "pg_lo_seek": [ + "bool pg_lo_seek(resource large_object, int offset [, int whence])", + "Seeks position of large object" + ], + "pg_lo_tell": [ + "int pg_lo_tell(resource large_object)", + "Returns current position of large object" + ], + "pg_lo_unlink": [ + "bool pg_lo_unlink([resource connection,] string large_object_oid)", + "Delete a large object" + ], + "pg_lo_write": [ + "int pg_lo_write(resource large_object, string buf [, int len])", + "Write a large object" + ], + "pg_meta_data": [ + "array pg_meta_data(resource db, string table)", + "Get meta_data" + ], + "pg_num_fields": [ + "int pg_num_fields(resource result)", + "Return the number of fields in the result" + ], + "pg_num_rows": [ + "int pg_num_rows(resource result)", + "Return the number of rows in the result" + ], + "pg_options": [ + "string pg_options([resource connection])", + "Get the options associated with the connection" + ], + "pg_parameter_status": [ + "string|false pg_parameter_status([resource connection,] string param_name)", + "Returns the value of a server parameter" + ], + "pg_pconnect": [ + "resource pg_pconnect(string connection_string | [string host, string port [, string options [, string tty,]]] string database)", + "Open a persistent PostgreSQL connection" + ], + "pg_ping": [ + "bool pg_ping([resource connection])", + "Ping database. If connection is bad, try to reconnect." + ], + "pg_port": [ + "int pg_port([resource connection])", + "Return the port number associated with the connection" + ], + "pg_prepare": [ + "resource pg_prepare([resource connection,] string stmtname, string query)", + "Prepare a query for future execution" + ], + "pg_put_line": [ + "bool pg_put_line([resource connection,] string query)", + "Send null-terminated string to backend server" + ], + "pg_query": [ + "resource pg_query([resource connection,] string query)", + "Execute a query" + ], + "pg_query_params": [ + "resource pg_query_params([resource connection,] string query, array params)", + "Execute a query" + ], + "pg_result_error": [ + "string pg_result_error(resource result)", + "Get error message associated with result" + ], + "pg_result_error_field": [ + "string pg_result_error_field(resource result, int fieldcode)", + "Get error message field associated with result" + ], + "pg_result_seek": [ + "bool pg_result_seek(resource result, int offset)", + "Set internal row offset" + ], + "pg_result_status": [ + "mixed pg_result_status(resource result[, long result_type])", + "Get status of query result" + ], + "pg_select": [ + "mixed pg_select(resource db, string table, array ids[, int options])", + "Select records that has ids (id=>value)" + ], + "pg_send_execute": [ + "bool pg_send_execute(resource connection, string stmtname, array params)", + "Executes prevriously prepared stmtname asynchronously" + ], + "pg_send_prepare": [ + "bool pg_send_prepare(resource connection, string stmtname, string query)", + "Asynchronously prepare a query for future execution" + ], + "pg_send_query": [ + "bool pg_send_query(resource connection, string query)", + "Send asynchronous query" + ], + "pg_send_query_params": [ + "bool pg_send_query_params(resource connection, string query, array params)", + "Send asynchronous parameterized query" + ], + "pg_set_client_encoding": [ + "int pg_set_client_encoding([resource connection,] string encoding)", + "Set client encoding" + ], + "pg_set_error_verbosity": [ + "int pg_set_error_verbosity([resource connection,] int verbosity)", + "Set error verbosity" + ], + "pg_trace": [ + "bool pg_trace(string filename [, string mode [, resource connection]])", + "Enable tracing a PostgreSQL connection" + ], + "pg_transaction_status": [ + "int pg_transaction_status(resource connnection)", + "Get transaction status" + ], + "pg_tty": [ + "string pg_tty([resource connection])", + "Return the tty name associated with the connection" + ], + "pg_unescape_bytea": [ + "string pg_unescape_bytea(string data)", + "Unescape binary for bytea type" + ], + "pg_untrace": [ + "bool pg_untrace([resource connection])", + "Disable tracing of a PostgreSQL connection" + ], + "pg_update": [ + "mixed pg_update(resource db, string table, array fields, array ids[, int options])", + "Update table using values (field=>value) and ids (id=>value)" + ], + "pg_version": [ + "array pg_version([resource connection])", + "Returns an array with client, protocol and server version (when available)" + ], + "php_egg_logo_guid": [ + "string php_egg_logo_guid(void)", + "Return the special ID used to request the PHP logo in phpinfo screens" + ], + "php_ini_loaded_file": [ + "string php_ini_loaded_file(void)", + "Return the actual loaded ini filename" + ], + "php_ini_scanned_files": [ + "string php_ini_scanned_files(void)", + "Return comma-separated string of .ini files parsed from the additional ini dir" + ], + "php_logo_guid": [ + "string php_logo_guid(void)", + "Return the special ID used to request the PHP logo in phpinfo screens" + ], + "php_real_logo_guid": [ + "string php_real_logo_guid(void)", + "Return the special ID used to request the PHP logo in phpinfo screens" + ], + "php_sapi_name": [ + "string php_sapi_name(void)", + "Return the current SAPI module name" + ], + "php_snmpv3": [ + "void php_snmpv3(INTERNAL_FUNCTION_PARAMETERS, int st)", + "* * Generic SNMPv3 object fetcher * From here is passed on the the common internal object fetcher. * * st=SNMP_CMD_GET snmp3_get() - query an agent and return a single value. * st=SNMP_CMD_GETNEXT snmp3_getnext() - query an agent and return the next single value. * st=SNMP_CMD_WALK snmp3_walk() - walk the mib and return a single dimensional array * containing the values. * st=SNMP_CMD_REALWALK snmp3_real_walk() - walk the mib and return an * array of oid,value pairs. * st=SNMP_CMD_SET snmp3_set() - query an agent and set a single value *" + ], + "php_strip_whitespace": [ + "string php_strip_whitespace(string file_name)", + "Return source with stripped comments and whitespace" + ], + "php_uname": [ + "string php_uname(void)", + "Return information about the system PHP was built on" + ], + "phpcredits": [ + "void phpcredits([int flag])", + "Prints the list of people who've contributed to the PHP project" + ], + "phpinfo": [ + "void phpinfo([int what])", + "Output a page of useful information about PHP and the current request" + ], + "phpversion": [ + "string phpversion([string extension])", + "Return the current PHP version" + ], + "pi": [ + "float pi(void)", + "Returns an approximation of pi" + ], + "png2wbmp": [ + "bool png2wbmp (string f_org, string f_dest, int d_height, int d_width, int threshold)", + "Convert PNG image to WBMP image" + ], + "popen": [ + "resource popen(string command, string mode)", + "Execute a command and open either a read or a write pipe to it" + ], + "posix_access": [ + "bool posix_access(string file [, int mode])", + "Determine accessibility of a file (POSIX.1 5.6.3)" + ], + "posix_ctermid": [ + "string posix_ctermid(void)", + "Generate terminal path name (POSIX.1, 4.7.1)" + ], + "posix_get_last_error": [ + "int posix_get_last_error(void)", + "Retrieve the error number set by the last posix function which failed." + ], + "posix_getcwd": [ + "string posix_getcwd(void)", + "Get working directory pathname (POSIX.1, 5.2.2)" + ], + "posix_getegid": [ + "int posix_getegid(void)", + "Get the current effective group id (POSIX.1, 4.2.1)" + ], + "posix_geteuid": [ + "int posix_geteuid(void)", + "Get the current effective user id (POSIX.1, 4.2.1)" + ], + "posix_getgid": [ + "int posix_getgid(void)", + "Get the current group id (POSIX.1, 4.2.1)" + ], + "posix_getgrgid": [ + "array posix_getgrgid(long gid)", + "Group database access (POSIX.1, 9.2.1)" + ], + "posix_getgrnam": [ + "array posix_getgrnam(string groupname)", + "Group database access (POSIX.1, 9.2.1)" + ], + "posix_getgroups": [ + "array posix_getgroups(void)", + "Get supplementary group id's (POSIX.1, 4.2.3)" + ], + "posix_getlogin": [ + "string posix_getlogin(void)", + "Get user name (POSIX.1, 4.2.4)" + ], + "posix_getpgid": [ + "int posix_getpgid(void)", + "Get the process group id of the specified process (This is not a POSIX function, but a SVR4ism, so we compile conditionally)" + ], + "posix_getpgrp": [ + "int posix_getpgrp(void)", + "Get current process group id (POSIX.1, 4.3.1)" + ], + "posix_getpid": [ + "int posix_getpid(void)", + "Get the current process id (POSIX.1, 4.1.1)" + ], + "posix_getppid": [ + "int posix_getppid(void)", + "Get the parent process id (POSIX.1, 4.1.1)" + ], + "posix_getpwnam": [ + "array posix_getpwnam(string groupname)", + "User database access (POSIX.1, 9.2.2)" + ], + "posix_getpwuid": [ + "array posix_getpwuid(long uid)", + "User database access (POSIX.1, 9.2.2)" + ], + "posix_getrlimit": [ + "array posix_getrlimit(void)", + "Get system resource consumption limits (This is not a POSIX function, but a BSDism and a SVR4ism. We compile conditionally)" + ], + "posix_getsid": [ + "int posix_getsid(void)", + "Get process group id of session leader (This is not a POSIX function, but a SVR4ism, so be compile conditionally)" + ], + "posix_getuid": [ + "int posix_getuid(void)", + "Get the current user id (POSIX.1, 4.2.1)" + ], + "posix_initgroups": [ + "bool posix_initgroups(string name, int base_group_id)", + "Calculate the group access list for the user specified in name." + ], + "posix_isatty": [ + "bool posix_isatty(int fd)", + "Determine if filedesc is a tty (POSIX.1, 4.7.1)" + ], + "posix_kill": [ + "bool posix_kill(int pid, int sig)", + "Send a signal to a process (POSIX.1, 3.3.2)" + ], + "posix_mkfifo": [ + "bool posix_mkfifo(string pathname, int mode)", + "Make a FIFO special file (POSIX.1, 5.4.2)" + ], + "posix_mknod": [ + "bool posix_mknod(string pathname, int mode [, int major [, int minor]])", + "Make a special or ordinary file (POSIX.1)" + ], + "posix_setegid": [ + "bool posix_setegid(long uid)", + "Set effective group id" + ], + "posix_seteuid": [ + "bool posix_seteuid(long uid)", + "Set effective user id" + ], + "posix_setgid": [ + "bool posix_setgid(int uid)", + "Set group id (POSIX.1, 4.2.2)" + ], + "posix_setpgid": [ + "bool posix_setpgid(int pid, int pgid)", + "Set process group id for job control (POSIX.1, 4.3.3)" + ], + "posix_setsid": [ + "int posix_setsid(void)", + "Create session and set process group id (POSIX.1, 4.3.2)" + ], + "posix_setuid": [ + "bool posix_setuid(long uid)", + "Set user id (POSIX.1, 4.2.2)" + ], + "posix_strerror": [ + "string posix_strerror(int errno)", + "Retrieve the system error message associated with the given errno." + ], + "posix_times": [ + "array posix_times(void)", + "Get process times (POSIX.1, 4.5.2)" + ], + "posix_ttyname": [ + "string posix_ttyname(int fd)", + "Determine terminal device name (POSIX.1, 4.7.2)" + ], + "posix_uname": [ + "array posix_uname(void)", + "Get system name (POSIX.1, 4.4.1)" + ], + "pow": [ + "number pow(number base, number exponent)", + "Returns base raised to the power of exponent. Returns integer result when possible" + ], + "preg_filter": [ + "mixed preg_filter(mixed regex, mixed replace, mixed subject [, int limit [, int &count]])", + "Perform Perl-style regular expression replacement and only return matches." + ], + "preg_grep": [ + "array preg_grep(string regex, array input [, int flags])", + "Searches array and returns entries which match regex" + ], + "preg_last_error": [ + "int preg_last_error()", + "Returns the error code of the last regexp execution." + ], + "preg_match": [ + "int preg_match(string pattern, string subject [, array &subpatterns [, int flags [, int offset]]])", + "Perform a Perl-style regular expression match" + ], + "preg_match_all": [ + "int preg_match_all(string pattern, string subject, array &subpatterns [, int flags [, int offset]])", + "Perform a Perl-style global regular expression match" + ], + "preg_quote": [ + "string preg_quote(string str [, string delim_char])", + "Quote regular expression characters plus an optional character" + ], + "preg_replace": [ + "mixed preg_replace(mixed regex, mixed replace, mixed subject [, int limit [, int &count]])", + "Perform Perl-style regular expression replacement." + ], + "preg_replace_callback": [ + "mixed preg_replace_callback(mixed regex, mixed callback, mixed subject [, int limit [, int &count]])", + "Perform Perl-style regular expression replacement using replacement callback." + ], + "preg_split": [ + "array preg_split(string pattern, string subject [, int limit [, int flags]])", + "Split string into an array using a perl-style regular expression as a delimiter" + ], + "prev": [ + "mixed prev(array array_arg)", + "Move array argument's internal pointer to the previous element and return it" + ], + "print": [ + "int print(string arg)", + "Output a string" + ], + "print_r": [ + "mixed print_r(mixed var [, bool return])", + "Prints out or returns information about the specified variable" + ], + "printf": [ + "int printf(string format [, mixed arg1 [, mixed ...]])", + "Output a formatted string" + ], + "proc_close": [ + "int proc_close(resource process)", + "close a process opened by proc_open" + ], + "proc_get_status": [ + "array proc_get_status(resource process)", + "get information about a process opened by proc_open" + ], + "proc_nice": [ + "bool proc_nice(int priority)", + "Change the priority of the current process" + ], + "proc_open": [ + "resource proc_open(string command, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]])", + "Run a process with more control over it's file descriptors" + ], + "proc_terminate": [ + "bool proc_terminate(resource process [, long signal])", + "kill a process opened by proc_open" + ], + "property_exists": [ + "bool property_exists(mixed object_or_class, string property_name)", + "Checks if the object or class has a property" + ], + "pspell_add_to_personal": [ + "bool pspell_add_to_personal(int pspell, string word)", + "Adds a word to a personal list" + ], + "pspell_add_to_session": [ + "bool pspell_add_to_session(int pspell, string word)", + "Adds a word to the current session" + ], + "pspell_check": [ + "bool pspell_check(int pspell, string word)", + "Returns true if word is valid" + ], + "pspell_clear_session": [ + "bool pspell_clear_session(int pspell)", + "Clears the current session" + ], + "pspell_config_create": [ + "int pspell_config_create(string language [, string spelling [, string jargon [, string encoding]]])", + "Create a new config to be used later to create a manager" + ], + "pspell_config_data_dir": [ + "bool pspell_config_data_dir(int conf, string directory)", + "location of language data files" + ], + "pspell_config_dict_dir": [ + "bool pspell_config_dict_dir(int conf, string directory)", + "location of the main word list" + ], + "pspell_config_ignore": [ + "bool pspell_config_ignore(int conf, int ignore)", + "Ignore words <= n chars" + ], + "pspell_config_mode": [ + "bool pspell_config_mode(int conf, long mode)", + "Select mode for config (PSPELL_FAST, PSPELL_NORMAL or PSPELL_BAD_SPELLERS)" + ], + "pspell_config_personal": [ + "bool pspell_config_personal(int conf, string personal)", + "Use a personal dictionary for this config" + ], + "pspell_config_repl": [ + "bool pspell_config_repl(int conf, string repl)", + "Use a personal dictionary with replacement pairs for this config" + ], + "pspell_config_runtogether": [ + "bool pspell_config_runtogether(int conf, bool runtogether)", + "Consider run-together words as valid components" + ], + "pspell_config_save_repl": [ + "bool pspell_config_save_repl(int conf, bool save)", + "Save replacement pairs when personal list is saved for this config" + ], + "pspell_new": [ + "int pspell_new(string language [, string spelling [, string jargon [, string encoding [, int mode]]]])", + "Load a dictionary" + ], + "pspell_new_config": [ + "int pspell_new_config(int config)", + "Load a dictionary based on the given config" + ], + "pspell_new_personal": [ + "int pspell_new_personal(string personal, string language [, string spelling [, string jargon [, string encoding [, int mode]]]])", + "Load a dictionary with a personal wordlist" + ], + "pspell_save_wordlist": [ + "bool pspell_save_wordlist(int pspell)", + "Saves the current (personal) wordlist" + ], + "pspell_store_replacement": [ + "bool pspell_store_replacement(int pspell, string misspell, string correct)", + "Notify the dictionary of a user-selected replacement" + ], + "pspell_suggest": [ + "array pspell_suggest(int pspell, string word)", + "Returns array of suggestions" + ], + "putenv": [ + "bool putenv(string setting)", + "Set the value of an environment variable" + ], + "quoted_printable_decode": [ + "string quoted_printable_decode(string str)", + "Convert a quoted-printable string to an 8 bit string" + ], + "quoted_printable_encode": [ + "string quoted_printable_encode(string str) */", + "PHP_FUNCTION(quoted_printable_encode) { char *str, *new_str; int str_len; size_t new_str_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, \"s\", &str, &str_len) != SUCCESS) { return; } if (!str_len) { RETURN_EMPTY_STRING(); } new_str = (char *)php_quot_print_encode((unsigned char *)str, (size_t)str_len, &new_str_len); RETURN_STRINGL(new_str, new_str_len, 0); } /* }}}" + ], + "quotemeta": [ + "string quotemeta(string str)", + "Quotes meta characters" + ], + "rad2deg": [ + "float rad2deg(float number)", + "Converts the radian number to the equivalent number in degrees" + ], + "rand": [ + "int rand([int min, int max])", + "Returns a random number" + ], + "range": [ + "array range(mixed low, mixed high[, int step])", + "Create an array containing the range of integers or characters from low to high (inclusive)" + ], + "rawurldecode": [ + "string rawurldecode(string str)", + "Decodes URL-encodes string" + ], + "rawurlencode": [ + "string rawurlencode(string str)", + "URL-encodes string" + ], + "readdir": [ + "string readdir([resource dir_handle])", + "Read directory entry from dir_handle" + ], + "readfile": [ + "int readfile(string filename [, bool use_include_path[, resource context]])", + "Output a file or a URL" + ], + "readgzfile": [ + "int readgzfile(string filename [, int use_include_path])", + "Output a .gz-file" + ], + "readline": [ + "string readline([string prompt])", + "Reads a line" + ], + "readline_add_history": [ + "bool readline_add_history(string prompt)", + "Adds a line to the history" + ], + "readline_callback_handler_install": [ + "void readline_callback_handler_install(string prompt, mixed callback)", + "Initializes the readline callback interface and terminal, prints the prompt and returns immediately" + ], + "readline_callback_handler_remove": [ + "bool readline_callback_handler_remove()", + "Removes a previously installed callback handler and restores terminal settings" + ], + "readline_callback_read_char": [ + "void readline_callback_read_char()", + "Informs the readline callback interface that a character is ready for input" + ], + "readline_clear_history": [ + "bool readline_clear_history(void)", + "Clears the history" + ], + "readline_completion_function": [ + "bool readline_completion_function(string funcname)", + "Readline completion function?" + ], + "readline_info": [ + "mixed readline_info([string varname [, string newvalue]])", + "Gets/sets various internal readline variables." + ], + "readline_list_history": [ + "array readline_list_history(void)", + "Lists the history" + ], + "readline_on_new_line": [ + "void readline_on_new_line(void)", + "Inform readline that the cursor has moved to a new line" + ], + "readline_read_history": [ + "bool readline_read_history([string filename])", + "Reads the history" + ], + "readline_redisplay": [ + "void readline_redisplay(void)", + "Ask readline to redraw the display" + ], + "readline_write_history": [ + "bool readline_write_history([string filename])", + "Writes the history" + ], + "readlink": [ + "string readlink(string filename)", + "Return the target of a symbolic link" + ], + "realpath": [ + "string realpath(string path)", + "Return the resolved path" + ], + "realpath_cache_get": [ + "bool realpath_cache_get()", + "Get current size of realpath cache" + ], + "realpath_cache_size": [ + "bool realpath_cache_size()", + "Get current size of realpath cache" + ], + "recode_file": [ + "bool recode_file(string request, resource input, resource output)", + "Recode file input into file output according to request" + ], + "recode_string": [ + "string recode_string(string request, string str)", + "Recode string str according to request string" + ], + "register_shutdown_function": [ + "void register_shutdown_function(string function_name)", + "Register a user-level function to be called on request termination" + ], + "register_tick_function": [ + "bool register_tick_function(string function_name [, mixed arg [, mixed ... ]])", + "Registers a tick callback function" + ], + "rename": [ + "bool rename(string old_name, string new_name[, resource context])", + "Rename a file" + ], + "require": [ + "bool require(string path)", + "Includes and evaluates the specified file, erroring if the file cannot be included" + ], + "require_once": [ + "bool require_once(string path)", + "Includes and evaluates the specified file, erroring if the file cannot be included" + ], + "reset": [ + "mixed reset(array array_arg)", + "Set array argument's internal pointer to the first element and return it" + ], + "restore_error_handler": [ + "void restore_error_handler(void)", + "Restores the previously defined error handler function" + ], + "restore_exception_handler": [ + "void restore_exception_handler(void)", + "Restores the previously defined exception handler function" + ], + "restore_include_path": [ + "void restore_include_path()", + "Restore the value of the include_path configuration option" + ], + "rewind": [ + "bool rewind(resource fp)", + "Rewind the position of a file pointer" + ], + "rewinddir": [ + "void rewinddir([resource dir_handle])", + "Rewind dir_handle back to the start" + ], + "rmdir": [ + "bool rmdir(string dirname[, resource context])", + "Remove a directory" + ], + "round": [ + "float round(float number [, int precision [, int mode]])", + "Returns the number rounded to specified precision" + ], + "rsort": [ + "bool rsort(array &array_arg [, int sort_flags])", + "Sort an array in reverse order" + ], + "rtrim": [ + "string rtrim(string str [, string character_mask])", + "Removes trailing whitespace" + ], + "scandir": [ + "array scandir(string dir [, int sorting_order [, resource context]])", + "List files & directories inside the specified path" + ], + "sem_acquire": [ + "bool sem_acquire(resource id)", + "Acquires the semaphore with the given id, blocking if necessary" + ], + "sem_get": [ + "resource sem_get(int key [, int max_acquire [, int perm [, int auto_release]])", + "Return an id for the semaphore with the given key, and allow max_acquire (default 1) processes to acquire it simultaneously" + ], + "sem_release": [ + "bool sem_release(resource id)", + "Releases the semaphore with the given id" + ], + "sem_remove": [ + "bool sem_remove(resource id)", + "Removes semaphore from Unix systems" + ], + "serialize": [ + "string serialize(mixed variable)", + "Returns a string representation of variable (which can later be unserialized)" + ], + "session_cache_expire": [ + "int session_cache_expire([int new_cache_expire])", + "Return the current cache expire. If new_cache_expire is given, the current cache_expire is replaced with new_cache_expire" + ], + "session_cache_limiter": [ + "string session_cache_limiter([string new_cache_limiter])", + "Return the current cache limiter. If new_cache_limited is given, the current cache_limiter is replaced with new_cache_limiter" + ], + "session_decode": [ + "bool session_decode(string data)", + "Deserializes data and reinitializes the variables" + ], + "session_destroy": [ + "bool session_destroy(void)", + "Destroy the current session and all data associated with it" + ], + "session_encode": [ + "string session_encode(void)", + "Serializes the current setup and returns the serialized representation" + ], + "session_get_cookie_params": [ + "array session_get_cookie_params(void)", + "Return the session cookie parameters" + ], + "session_id": [ + "string session_id([string newid])", + "Return the current session id. If newid is given, the session id is replaced with newid" + ], + "session_is_registered": [ + "bool session_is_registered(string varname)", + "Checks if a variable is registered in session" + ], + "session_module_name": [ + "string session_module_name([string newname])", + "Return the current module name used for accessing session data. If newname is given, the module name is replaced with newname" + ], + "session_name": [ + "string session_name([string newname])", + "Return the current session name. If newname is given, the session name is replaced with newname" + ], + "session_regenerate_id": [ + "bool session_regenerate_id([bool delete_old_session])", + "Update the current session id with a newly generated one. If delete_old_session is set to true, remove the old session." + ], + "session_register": [ + "bool session_register(mixed var_names [, mixed ...])", + "Adds varname(s) to the list of variables which are freezed at the session end" + ], + "session_save_path": [ + "string session_save_path([string newname])", + "Return the current save path passed to module_name. If newname is given, the save path is replaced with newname" + ], + "session_set_cookie_params": [ + "void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure[, bool httponly]]]])", + "Set session cookie parameters" + ], + "session_set_save_handler": [ + "void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)", + "Sets user-level functions" + ], + "session_start": [ + "bool session_start(void)", + "Begin session - reinitializes freezed variables, registers browsers etc" + ], + "session_unregister": [ + "bool session_unregister(string varname)", + "Removes varname from the list of variables which are freezed at the session end" + ], + "session_unset": [ + "void session_unset(void)", + "Unset all registered variables" + ], + "session_write_close": [ + "void session_write_close(void)", + "Write session data and end session" + ], + "set_error_handler": [ + "string set_error_handler(string error_handler [, int error_types])", + "Sets a user-defined error handler function. Returns the previously defined error handler, or false on error" + ], + "set_exception_handler": [ + "string set_exception_handler(callable exception_handler)", + "Sets a user-defined exception handler function. Returns the previously defined exception handler, or false on error" + ], + "set_include_path": [ + "string set_include_path(string new_include_path)", + "Sets the include_path configuration option" + ], + "set_magic_quotes_runtime": [ + "bool set_magic_quotes_runtime(int new_setting)", + "Set the current active configuration setting of magic_quotes_runtime and return previous" + ], + "set_time_limit": [ + "bool set_time_limit(int seconds)", + "Sets the maximum time a script can run" + ], + "setcookie": [ + "bool setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly]]]]]])", + "Send a cookie" + ], + "setlocale": [ + "string setlocale(mixed category, string locale [, string ...])", + "Set locale information" + ], + "setrawcookie": [ + "bool setrawcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly]]]]]])", + "Send a cookie with no url encoding of the value" + ], + "settype": [ + "bool settype(mixed var, string type)", + "Set the type of the variable" + ], + "sha1": [ + "string sha1(string str [, bool raw_output])", + "Calculate the sha1 hash of a string" + ], + "sha1_file": [ + "string sha1_file(string filename [, bool raw_output])", + "Calculate the sha1 hash of given filename" + ], + "shell_exec": [ + "string shell_exec(string cmd)", + "Execute command via shell and return complete output as string" + ], + "shm_attach": [ + "int shm_attach(int key [, int memsize [, int perm]])", + "Creates or open a shared memory segment" + ], + "shm_detach": [ + "bool shm_detach(resource shm_identifier)", + "Disconnects from shared memory segment" + ], + "shm_get_var": [ + "mixed shm_get_var(resource id, int variable_key)", + "Returns a variable from shared memory" + ], + "shm_has_var": [ + "bool shm_has_var(resource id, int variable_key)", + "Checks whether a specific entry exists" + ], + "shm_put_var": [ + "bool shm_put_var(resource shm_identifier, int variable_key, mixed variable)", + "Inserts or updates a variable in shared memory" + ], + "shm_remove": [ + "bool shm_remove(resource shm_identifier)", + "Removes shared memory from Unix systems" + ], + "shm_remove_var": [ + "bool shm_remove_var(resource id, int variable_key)", + "Removes variable from shared memory" + ], + "shmop_close": [ + "void shmop_close (int shmid)", + "closes a shared memory segment" + ], + "shmop_delete": [ + "bool shmop_delete (int shmid)", + "mark segment for deletion" + ], + "shmop_open": [ + "int shmop_open (int key, string flags, int mode, int size)", + "gets and attaches a shared memory segment" + ], + "shmop_read": [ + "string shmop_read (int shmid, int start, int count)", + "reads from a shm segment" + ], + "shmop_size": [ + "int shmop_size (int shmid)", + "returns the shm size" + ], + "shmop_write": [ + "int shmop_write (int shmid, string data, int offset)", + "writes to a shared memory segment" + ], + "shuffle": [ + "bool shuffle(array array_arg)", + "Randomly shuffle the contents of an array" + ], + "similar_text": [ + "int similar_text(string str1, string str2 [, float percent])", + "Calculates the similarity between two strings" + ], + "simplexml_import_dom": [ + "simplemxml_element simplexml_import_dom(domNode node [, string class_name])", + "Get a simplexml_element object from dom to allow for processing" + ], + "simplexml_load_file": [ + "simplemxml_element simplexml_load_file(string filename [, string class_name [, int options [, string ns [, bool is_prefix]]]])", + "Load a filename and return a simplexml_element object to allow for processing" + ], + "simplexml_load_string": [ + "simplemxml_element simplexml_load_string(string data [, string class_name [, int options [, string ns [, bool is_prefix]]]])", + "Load a string and return a simplexml_element object to allow for processing" + ], + "sin": [ + "float sin(float number)", + "Returns the sine of the number in radians" + ], + "sinh": [ + "float sinh(float number)", + "Returns the hyperbolic sine of the number, defined as (exp(number) - exp(-number))/2" + ], + "sleep": [ + "void sleep(int seconds)", + "Delay for a given number of seconds" + ], + "smfi_addheader": [ + "bool smfi_addheader(string headerf, string headerv)", + "Adds a header to the current message." + ], + "smfi_addrcpt": [ + "bool smfi_addrcpt(string rcpt)", + "Add a recipient to the message envelope." + ], + "smfi_chgheader": [ + "bool smfi_chgheader(string headerf, string headerv)", + "Changes a header's value for the current message." + ], + "smfi_delrcpt": [ + "bool smfi_delrcpt(string rcpt)", + "Removes the named recipient from the current message's envelope." + ], + "smfi_getsymval": [ + "string smfi_getsymval(string macro)", + "Returns the value of the given macro or NULL if the macro is not defined." + ], + "smfi_replacebody": [ + "bool smfi_replacebody(string body)", + "Replaces the body of the current message. If called more than once, subsequent calls result in data being appended to the new body." + ], + "smfi_setflags": [ + "void smfi_setflags(long flags)", + "Sets the flags describing the actions the filter may take." + ], + "smfi_setreply": [ + "bool smfi_setreply(string rcode, string xcode, string message)", + "Directly set the SMTP error reply code for this connection. This code will be used on subsequent error replies resulting from actions taken by this filter." + ], + "smfi_settimeout": [ + "void smfi_settimeout(long timeout)", + "Sets the number of seconds libmilter will wait for an MTA connection before timing out a socket." + ], + "snmp2_get": [ + "string snmp2_get(string host, string community, string object_id [, int timeout [, int retries]])", + "Fetch a SNMP object" + ], + "snmp2_getnext": [ + "string snmp2_getnext(string host, string community, string object_id [, int timeout [, int retries]])", + "Fetch a SNMP object" + ], + "snmp2_real_walk": [ + "array snmp2_real_walk(string host, string community, string object_id [, int timeout [, int retries]])", + "Return all objects including their respective object id withing the specified one" + ], + "snmp2_set": [ + "int snmp2_set(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])", + "Set the value of a SNMP object" + ], + "snmp2_walk": [ + "array snmp2_walk(string host, string community, string object_id [, int timeout [, int retries]])", + "Return all objects under the specified object id" + ], + "snmp3_get": [ + "int snmp3_get(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])", + "Fetch the value of a SNMP object" + ], + "snmp3_getnext": [ + "int snmp3_getnext(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])", + "Fetch the value of a SNMP object" + ], + "snmp3_real_walk": [ + "int snmp3_real_walk(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])", + "Fetch the value of a SNMP object" + ], + "snmp3_set": [ + "int snmp3_set(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id, string type, mixed value [, int timeout [, int retries]])", + "Fetch the value of a SNMP object" + ], + "snmp3_walk": [ + "int snmp3_walk(string host, string sec_name, string sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, string priv_passphrase, string object_id [, int timeout [, int retries]])", + "Fetch the value of a SNMP object" + ], + "snmp_get_quick_print": [ + "bool snmp_get_quick_print(void)", + "Return the current status of quick_print" + ], + "snmp_get_valueretrieval": [ + "int snmp_get_valueretrieval()", + "Return the method how the SNMP values will be returned" + ], + "snmp_read_mib": [ + "int snmp_read_mib(string filename)", + "Reads and parses a MIB file into the active MIB tree." + ], + "snmp_set_enum_print": [ + "void snmp_set_enum_print(int enum_print)", + "Return all values that are enums with their enum value instead of the raw integer" + ], + "snmp_set_oid_output_format": [ + "void snmp_set_oid_output_format(int oid_format)", + "Set the OID output format." + ], + "snmp_set_quick_print": [ + "void snmp_set_quick_print(int quick_print)", + "Return all objects including their respective object id withing the specified one" + ], + "snmp_set_valueretrieval": [ + "void snmp_set_valueretrieval(int method)", + "Specify the method how the SNMP values will be returned" + ], + "snmpget": [ + "string snmpget(string host, string community, string object_id [, int timeout [, int retries]])", + "Fetch a SNMP object" + ], + "snmpgetnext": [ + "string snmpgetnext(string host, string community, string object_id [, int timeout [, int retries]])", + "Fetch a SNMP object" + ], + "snmprealwalk": [ + "array snmprealwalk(string host, string community, string object_id [, int timeout [, int retries]])", + "Return all objects including their respective object id withing the specified one" + ], + "snmpset": [ + "int snmpset(string host, string community, string object_id, string type, mixed value [, int timeout [, int retries]])", + "Set the value of a SNMP object" + ], + "snmpwalk": [ + "array snmpwalk(string host, string community, string object_id [, int timeout [, int retries]])", + "Return all objects under the specified object id" + ], + "socket_accept": [ + "resource socket_accept(resource socket)", + "Accepts a connection on the listening socket fd" + ], + "socket_bind": [ + "bool socket_bind(resource socket, string addr [, int port])", + "Binds an open socket to a listening port, port is only specified in AF_INET family." + ], + "socket_clear_error": [ + "void socket_clear_error([resource socket])", + "Clears the error on the socket or the last error code." + ], + "socket_close": [ + "void socket_close(resource socket)", + "Closes a file descriptor" + ], + "socket_connect": [ + "bool socket_connect(resource socket, string addr [, int port])", + "Opens a connection to addr:port on the socket specified by socket" + ], + "socket_create": [ + "resource socket_create(int domain, int type, int protocol)", + "Creates an endpoint for communication in the domain specified by domain, of type specified by type" + ], + "socket_create_listen": [ + "resource socket_create_listen(int port[, int backlog])", + "Opens a socket on port to accept connections" + ], + "socket_create_pair": [ + "bool socket_create_pair(int domain, int type, int protocol, array &fd)", + "Creates a pair of indistinguishable sockets and stores them in fds." + ], + "socket_get_option": [ + "mixed socket_get_option(resource socket, int level, int optname)", + "Gets socket options for the socket" + ], + "socket_getpeername": [ + "bool socket_getpeername(resource socket, string &addr[, int &port])", + "Queries the remote side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type." + ], + "socket_getsockname": [ + "bool socket_getsockname(resource socket, string &addr[, int &port])", + "Queries the remote side of the given socket which may either result in host/port or in a UNIX filesystem path, dependent on its type." + ], + "socket_last_error": [ + "int socket_last_error([resource socket])", + "Returns the last socket error (either the last used or the provided socket resource)" + ], + "socket_listen": [ + "bool socket_listen(resource socket[, int backlog])", + "Sets the maximum number of connections allowed to be waited for on the socket specified by fd" + ], + "socket_read": [ + "string socket_read(resource socket, int length [, int type])", + "Reads a maximum of length bytes from socket" + ], + "socket_recv": [ + "int socket_recv(resource socket, string &buf, int len, int flags)", + "Receives data from a connected socket" + ], + "socket_recvfrom": [ + "int socket_recvfrom(resource socket, string &buf, int len, int flags, string &name [, int &port])", + "Receives data from a socket, connected or not" + ], + "socket_select": [ + "int socket_select(array &read_fds, array &write_fds, array &except_fds, int tv_sec[, int tv_usec])", + "Runs the select() system call on the sets mentioned with a timeout specified by tv_sec and tv_usec" + ], + "socket_send": [ + "int socket_send(resource socket, string buf, int len, int flags)", + "Sends data to a connected socket" + ], + "socket_sendto": [ + "int socket_sendto(resource socket, string buf, int len, int flags, string addr [, int port])", + "Sends a message to a socket, whether it is connected or not" + ], + "socket_set_block": [ + "bool socket_set_block(resource socket)", + "Sets blocking mode on a socket resource" + ], + "socket_set_nonblock": [ + "bool socket_set_nonblock(resource socket)", + "Sets nonblocking mode on a socket resource" + ], + "socket_set_option": [ + "bool socket_set_option(resource socket, int level, int optname, int|array optval)", + "Sets socket options for the socket" + ], + "socket_shutdown": [ + "bool socket_shutdown(resource socket[, int how])", + "Shuts down a socket for receiving, sending, or both." + ], + "socket_strerror": [ + "string socket_strerror(int errno)", + "Returns a string describing an error" + ], + "socket_write": [ + "int socket_write(resource socket, string buf[, int length])", + "Writes the buffer to the socket resource, length is optional" + ], + "solid_fetch_prev": [ + "bool solid_fetch_prev(resource result_id)", + "" + ], + "sort": [ + "bool sort(array &array_arg [, int sort_flags])", + "Sort an array" + ], + "soundex": [ + "string soundex(string str)", + "Calculate the soundex key of a string" + ], + "spl_autoload": [ + "void spl_autoload(string class_name [, string file_extensions])", + "Default implementation for __autoload()" + ], + "spl_autoload_call": [ + "void spl_autoload_call(string class_name)", + "Try all registerd autoload function to load the requested class" + ], + "spl_autoload_extensions": [ + "string spl_autoload_extensions([string file_extensions])", + "Register and return default file extensions for spl_autoload" + ], + "spl_autoload_functions": [ + "false|array spl_autoload_functions()", + "Return all registered __autoload() functionns" + ], + "spl_autoload_register": [ + "bool spl_autoload_register([mixed autoload_function = \"spl_autoload\" [, throw = true [, prepend]]])", + "Register given function as __autoload() implementation" + ], + "spl_autoload_unregister": [ + "bool spl_autoload_unregister(mixed autoload_function)", + "Unregister given function as __autoload() implementation" + ], + "spl_classes": [ + "array spl_classes()", + "Return an array containing the names of all clsses and interfaces defined in SPL" + ], + "spl_object_hash": [ + "string spl_object_hash(object obj)", + "Return hash id for given object" + ], + "split": [ + "array split(string pattern, string string [, int limit])", + "Split string into array by regular expression" + ], + "spliti": [ + "array spliti(string pattern, string string [, int limit])", + "Split string into array by regular expression case-insensitive" + ], + "sprintf": [ + "string sprintf(string format [, mixed arg1 [, mixed ...]])", + "Return a formatted string" + ], + "sql_regcase": [ + "string sql_regcase(string string)", + "Make regular expression for case insensitive match" + ], + "sqlite_array_query": [ + "array sqlite_array_query(resource db, string query [ , int result_type [, bool decode_binary]])", + "Executes a query against a given database and returns an array of arrays." + ], + "sqlite_busy_timeout": [ + "void sqlite_busy_timeout(resource db, int ms)", + "Set busy timeout duration. If ms <= 0, all busy handlers are disabled." + ], + "sqlite_changes": [ + "int sqlite_changes(resource db)", + "Returns the number of rows that were changed by the most recent SQL statement." + ], + "sqlite_close": [ + "void sqlite_close(resource db)", + "Closes an open sqlite database." + ], + "sqlite_column": [ + "mixed sqlite_column(resource result, mixed index_or_name [, bool decode_binary])", + "Fetches a column from the current row of a result set." + ], + "sqlite_create_aggregate": [ + "bool sqlite_create_aggregate(resource db, string funcname, mixed step_func, mixed finalize_func[, long num_args])", + "Registers an aggregate function for queries." + ], + "sqlite_create_function": [ + "bool sqlite_create_function(resource db, string funcname, mixed callback[, long num_args])", + "Registers a \"regular\" function for queries." + ], + "sqlite_current": [ + "array sqlite_current(resource result [, int result_type [, bool decode_binary]])", + "Fetches the current row from a result set as an array." + ], + "sqlite_error_string": [ + "string sqlite_error_string(int error_code)", + "Returns the textual description of an error code." + ], + "sqlite_escape_string": [ + "string sqlite_escape_string(string item)", + "Escapes a string for use as a query parameter." + ], + "sqlite_exec": [ + "boolean sqlite_exec(string query, resource db[, string &error_message])", + "Executes a result-less query against a given database" + ], + "sqlite_factory": [ + "object sqlite_factory(string filename [, int mode [, string &error_message]])", + "Opens a SQLite database and creates an object for it. Will create the database if it does not exist." + ], + "sqlite_fetch_all": [ + "array sqlite_fetch_all(resource result [, int result_type [, bool decode_binary]])", + "Fetches all rows from a result set as an array of arrays." + ], + "sqlite_fetch_array": [ + "array sqlite_fetch_array(resource result [, int result_type [, bool decode_binary]])", + "Fetches the next row from a result set as an array." + ], + "sqlite_fetch_column_types": [ + "resource sqlite_fetch_column_types(string table_name, resource db [, int result_type])", + "Return an array of column types from a particular table." + ], + "sqlite_fetch_object": [ + "object sqlite_fetch_object(resource result [, string class_name [, NULL|array ctor_params [, bool decode_binary]]])", + "Fetches the next row from a result set as an object." + ], + "sqlite_fetch_single": [ + "string sqlite_fetch_single(resource result [, bool decode_binary])", + "Fetches the first column of a result set as a string." + ], + "sqlite_field_name": [ + "string sqlite_field_name(resource result, int field_index)", + "Returns the name of a particular field of a result set." + ], + "sqlite_has_prev": [ + "bool sqlite_has_prev(resource result)", + "* Returns whether a previous row is available." + ], + "sqlite_key": [ + "int sqlite_key(resource result)", + "Return the current row index of a buffered result." + ], + "sqlite_last_error": [ + "int sqlite_last_error(resource db)", + "Returns the error code of the last error for a database." + ], + "sqlite_last_insert_rowid": [ + "int sqlite_last_insert_rowid(resource db)", + "Returns the rowid of the most recently inserted row." + ], + "sqlite_libencoding": [ + "string sqlite_libencoding()", + "Returns the encoding (iso8859 or UTF-8) of the linked SQLite library." + ], + "sqlite_libversion": [ + "string sqlite_libversion()", + "Returns the version of the linked SQLite library." + ], + "sqlite_next": [ + "bool sqlite_next(resource result)", + "Seek to the next row number of a result set." + ], + "sqlite_num_fields": [ + "int sqlite_num_fields(resource result)", + "Returns the number of fields in a result set." + ], + "sqlite_num_rows": [ + "int sqlite_num_rows(resource result)", + "Returns the number of rows in a buffered result set." + ], + "sqlite_open": [ + "resource sqlite_open(string filename [, int mode [, string &error_message]])", + "Opens a SQLite database. Will create the database if it does not exist." + ], + "sqlite_popen": [ + "resource sqlite_popen(string filename [, int mode [, string &error_message]])", + "Opens a persistent handle to a SQLite database. Will create the database if it does not exist." + ], + "sqlite_prev": [ + "bool sqlite_prev(resource result)", + "* Seek to the previous row number of a result set." + ], + "sqlite_query": [ + "resource sqlite_query(string query, resource db [, int result_type [, string &error_message]])", + "Executes a query against a given database and returns a result handle." + ], + "sqlite_rewind": [ + "bool sqlite_rewind(resource result)", + "Seek to the first row number of a buffered result set." + ], + "sqlite_seek": [ + "bool sqlite_seek(resource result, int row)", + "Seek to a particular row number of a buffered result set." + ], + "sqlite_single_query": [ + "array sqlite_single_query(resource db, string query [, bool first_row_only [, bool decode_binary]])", + "Executes a query and returns either an array for one single column or the value of the first row." + ], + "sqlite_udf_decode_binary": [ + "string sqlite_udf_decode_binary(string data)", + "Decode binary encoding on a string parameter passed to an UDF." + ], + "sqlite_udf_encode_binary": [ + "string sqlite_udf_encode_binary(string data)", + "Apply binary encoding (if required) to a string to return from an UDF." + ], + "sqlite_unbuffered_query": [ + "resource sqlite_unbuffered_query(string query, resource db [ , int result_type [, string &error_message]])", + "Executes a query that does not prefetch and buffer all data." + ], + "sqlite_valid": [ + "bool sqlite_valid(resource result)", + "Returns whether more rows are available." + ], + "sqrt": [ + "float sqrt(float number)", + "Returns the square root of the number" + ], + "srand": [ + "void srand([int seed])", + "Seeds random number generator" + ], + "sscanf": [ + "mixed sscanf(string str, string format [, string ...])", + "Implements an ANSI C compatible sscanf" + ], + "stat": [ + "array stat(string filename)", + "Give information about a file" + ], + "str_getcsv": [ + "array str_getcsv(string input[, string delimiter[, string enclosure[, string escape]]])", + "Parse a CSV string into an array" + ], + "str_ireplace": [ + "mixed str_ireplace(mixed search, mixed replace, mixed subject [, int &replace_count])", + "Replaces all occurrences of search in haystack with replace / case-insensitive" + ], + "str_pad": [ + "string str_pad(string input, int pad_length [, string pad_string [, int pad_type]])", + "Returns input string padded on the left or right to specified length with pad_string" + ], + "str_repeat": [ + "string str_repeat(string input, int mult)", + "Returns the input string repeat mult times" + ], + "str_replace": [ + "mixed str_replace(mixed search, mixed replace, mixed subject [, int &replace_count])", + "Replaces all occurrences of search in haystack with replace" + ], + "str_rot13": [ + "string str_rot13(string str)", + "Perform the rot13 transform on a string" + ], + "str_shuffle": [ + "void str_shuffle(string str)", + "Shuffles string. One permutation of all possible is created" + ], + "str_split": [ + "array str_split(string str [, int split_length])", + "Convert a string to an array. If split_length is specified, break the string down into chunks each split_length characters long." + ], + "str_word_count": [ + "mixed str_word_count(string str, [int format [, string charlist]])", + "Counts the number of words inside a string. If format of 1 is specified, then the function will return an array containing all the words found inside the string. If format of 2 is specified, then the function will return an associated array where the position of the word is the key and the word itself is the value. For the purpose of this function, 'word' is defined as a locale dependent string containing alphabetic characters, which also may contain, but not start with \"'\" and \"-\" characters." + ], + "strcasecmp": [ + "int strcasecmp(string str1, string str2)", + "Binary safe case-insensitive string comparison" + ], + "strchr": [ + "string strchr(string haystack, string needle)", + "An alias for strstr" + ], + "strcmp": [ + "int strcmp(string str1, string str2)", + "Binary safe string comparison" + ], + "strcoll": [ + "int strcoll(string str1, string str2)", + "Compares two strings using the current locale" + ], + "strcspn": [ + "int strcspn(string str, string mask [, start [, len]])", + "Finds length of initial segment consisting entirely of characters not found in mask. If start or/and length is provide works like strcspn(substr($s,$start,$len),$bad_chars)" + ], + "stream_bucket_append": [ + "void stream_bucket_append(resource brigade, resource bucket)", + "Append bucket to brigade" + ], + "stream_bucket_make_writeable": [ + "object stream_bucket_make_writeable(resource brigade)", + "Return a bucket object from the brigade for operating on" + ], + "stream_bucket_new": [ + "resource stream_bucket_new(resource stream, string buffer)", + "Create a new bucket for use on the current stream" + ], + "stream_bucket_prepend": [ + "void stream_bucket_prepend(resource brigade, resource bucket)", + "Prepend bucket to brigade" + ], + "stream_context_create": [ + "resource stream_context_create([array options[, array params]])", + "Create a file context and optionally set parameters" + ], + "stream_context_get_default": [ + "resource stream_context_get_default([array options])", + "Get a handle on the default file/stream context and optionally set parameters" + ], + "stream_context_get_options": [ + "array stream_context_get_options(resource context|resource stream)", + "Retrieve options for a stream/wrapper/context" + ], + "stream_context_get_params": [ + "array stream_context_get_params(resource context|resource stream)", + "Get parameters of a file context" + ], + "stream_context_set_default": [ + "resource stream_context_set_default(array options)", + "Set default file/stream context, returns the context as a resource" + ], + "stream_context_set_option": [ + "bool stream_context_set_option(resource context|resource stream, string wrappername, string optionname, mixed value)", + "Set an option for a wrapper" + ], + "stream_context_set_params": [ + "bool stream_context_set_params(resource context|resource stream, array options)", + "Set parameters for a file context" + ], + "stream_copy_to_stream": [ + "long stream_copy_to_stream(resource source, resource dest [, long maxlen [, long pos]])", + "Reads up to maxlen bytes from source stream and writes them to dest stream." + ], + "stream_filter_append": [ + "resource stream_filter_append(resource stream, string filtername[, int read_write[, string filterparams]])", + "Append a filter to a stream" + ], + "stream_filter_prepend": [ + "resource stream_filter_prepend(resource stream, string filtername[, int read_write[, string filterparams]])", + "Prepend a filter to a stream" + ], + "stream_filter_register": [ + "bool stream_filter_register(string filtername, string classname)", + "Registers a custom filter handler class" + ], + "stream_filter_remove": [ + "bool stream_filter_remove(resource stream_filter)", + "Flushes any data in the filter's internal buffer, removes it from the chain, and frees the resource" + ], + "stream_get_contents": [ + "string stream_get_contents(resource source [, long maxlen [, long offset]])", + "Reads all remaining bytes (or up to maxlen bytes) from a stream and returns them as a string." + ], + "stream_get_filters": [ + "array stream_get_filters(void)", + "Returns a list of registered filters" + ], + "stream_get_line": [ + "string stream_get_line(resource stream, int maxlen [, string ending])", + "Read up to maxlen bytes from a stream or until the ending string is found" + ], + "stream_get_meta_data": [ + "array stream_get_meta_data(resource fp)", + "Retrieves header/meta data from streams/file pointers" + ], + "stream_get_transports": [ + "array stream_get_transports()", + "Retrieves list of registered socket transports" + ], + "stream_get_wrappers": [ + "array stream_get_wrappers()", + "Retrieves list of registered stream wrappers" + ], + "stream_is_local": [ + "bool stream_is_local(resource stream|string url)", + "" + ], + "stream_resolve_include_path": [ + "string stream_resolve_include_path(string filename)", + "Determine what file will be opened by calls to fopen() with a relative path" + ], + "stream_select": [ + "int stream_select(array &read_streams, array &write_streams, array &except_streams, int tv_sec[, int tv_usec])", + "Runs the select() system call on the sets of streams with a timeout specified by tv_sec and tv_usec" + ], + "stream_set_blocking": [ + "bool stream_set_blocking(resource socket, int mode)", + "Set blocking/non-blocking mode on a socket or stream" + ], + "stream_set_timeout": [ + "bool stream_set_timeout(resource stream, int seconds [, int microseconds])", + "Set timeout on stream read to seconds + microseonds" + ], + "stream_set_write_buffer": [ + "int stream_set_write_buffer(resource fp, int buffer)", + "Set file write buffer" + ], + "stream_socket_accept": [ + "resource stream_socket_accept(resource serverstream, [ double timeout [, string &peername ]])", + "Accept a client connection from a server socket" + ], + "stream_socket_client": [ + "resource stream_socket_client(string remoteaddress [, long &errcode [, string &errstring [, double timeout [, long flags [, resource context]]]]])", + "Open a client connection to a remote address" + ], + "stream_socket_enable_crypto": [ + "int stream_socket_enable_crypto(resource stream, bool enable [, int cryptokind [, resource sessionstream]])", + "Enable or disable a specific kind of crypto on the stream" + ], + "stream_socket_get_name": [ + "string stream_socket_get_name(resource stream, bool want_peer)", + "Returns either the locally bound or remote name for a socket stream" + ], + "stream_socket_pair": [ + "array stream_socket_pair(int domain, int type, int protocol)", + "Creates a pair of connected, indistinguishable socket streams" + ], + "stream_socket_recvfrom": [ + "string stream_socket_recvfrom(resource stream, long amount [, long flags [, string &remote_addr]])", + "Receives data from a socket stream" + ], + "stream_socket_sendto": [ + "long stream_socket_sendto(resouce stream, string data [, long flags [, string target_addr]])", + "Send data to a socket stream. If target_addr is specified it must be in dotted quad (or [ipv6]) format" + ], + "stream_socket_server": [ + "resource stream_socket_server(string localaddress [, long &errcode [, string &errstring [, long flags [, resource context]]]])", + "Create a server socket bound to localaddress" + ], + "stream_socket_shutdown": [ + "int stream_socket_shutdown(resource stream, int how)", + "causes all or part of a full-duplex connection on the socket associated with stream to be shut down. If how is SHUT_RD, further receptions will be disallowed. If how is SHUT_WR, further transmissions will be disallowed. If how is SHUT_RDWR, further receptions and transmissions will be disallowed." + ], + "stream_supports_lock": [ + "bool stream_supports_lock(resource stream)", + "Tells wether the stream supports locking through flock()." + ], + "stream_wrapper_register": [ + "bool stream_wrapper_register(string protocol, string classname[, integer flags])", + "Registers a custom URL protocol handler class" + ], + "stream_wrapper_restore": [ + "bool stream_wrapper_restore(string protocol)", + "Restore the original protocol handler, overriding if necessary" + ], + "stream_wrapper_unregister": [ + "bool stream_wrapper_unregister(string protocol)", + "Unregister a wrapper for the life of the current request." + ], + "strftime": [ + "string strftime(string format [, int timestamp])", + "Format a local time/date according to locale settings" + ], + "strip_tags": [ + "string strip_tags(string str [, string allowable_tags])", + "Strips HTML and PHP tags from a string" + ], + "stripcslashes": [ + "string stripcslashes(string str)", + "Strips backslashes from a string. Uses C-style conventions" + ], + "stripos": [ + "int stripos(string haystack, string needle [, int offset])", + "Finds position of first occurrence of a string within another, case insensitive" + ], + "stripslashes": [ + "string stripslashes(string str)", + "Strips backslashes from a string" + ], + "stristr": [ + "string stristr(string haystack, string needle[, bool part])", + "Finds first occurrence of a string within another, case insensitive" + ], + "strlen": [ + "int strlen(string str)", + "Get string length" + ], + "strnatcasecmp": [ + "int strnatcasecmp(string s1, string s2)", + "Returns the result of case-insensitive string comparison using 'natural' algorithm" + ], + "strnatcmp": [ + "int strnatcmp(string s1, string s2)", + "Returns the result of string comparison using 'natural' algorithm" + ], + "strncasecmp": [ + "int strncasecmp(string str1, string str2, int len)", + "Binary safe string comparison" + ], + "strncmp": [ + "int strncmp(string str1, string str2, int len)", + "Binary safe string comparison" + ], + "strpbrk": [ + "array strpbrk(string haystack, string char_list)", + "Search a string for any of a set of characters" + ], + "strpos": [ + "int strpos(string haystack, string needle [, int offset])", + "Finds position of first occurrence of a string within another" + ], + "strptime": [ + "string strptime(string timestamp, string format)", + "Parse a time/date generated with strftime()" + ], + "strrchr": [ + "string strrchr(string haystack, string needle)", + "Finds the last occurrence of a character in a string within another" + ], + "strrev": [ + "string strrev(string str)", + "Reverse a string" + ], + "strripos": [ + "int strripos(string haystack, string needle [, int offset])", + "Finds position of last occurrence of a string within another string" + ], + "strrpos": [ + "int strrpos(string haystack, string needle [, int offset])", + "Finds position of last occurrence of a string within another string" + ], + "strspn": [ + "int strspn(string str, string mask [, start [, len]])", + "Finds length of initial segment consisting entirely of characters found in mask. If start or/and length is provided works like strspn(substr($s,$start,$len),$good_chars)" + ], + "strstr": [ + "string strstr(string haystack, string needle[, bool part])", + "Finds first occurrence of a string within another" + ], + "strtok": [ + "string strtok([string str,] string token)", + "Tokenize a string" + ], + "strtolower": [ + "string strtolower(string str)", + "Makes a string lowercase" + ], + "strtotime": [ + "int strtotime(string time [, int now ])", + "Convert string representation of date and time to a timestamp" + ], + "strtoupper": [ + "string strtoupper(string str)", + "Makes a string uppercase" + ], + "strtr": [ + "string strtr(string str, string from[, string to])", + "Translates characters in str using given translation tables" + ], + "strval": [ + "string strval(mixed var)", + "Get the string value of a variable" + ], + "substr": [ + "string substr(string str, int start [, int length])", + "Returns part of a string" + ], + "substr_compare": [ + "int substr_compare(string main_str, string str, int offset [, int length [, bool case_sensitivity]])", + "Binary safe optionally case insensitive comparison of 2 strings from an offset, up to length characters" + ], + "substr_count": [ + "int substr_count(string haystack, string needle [, int offset [, int length]])", + "Returns the number of times a substring occurs in the string" + ], + "substr_replace": [ + "mixed substr_replace(mixed str, mixed repl, mixed start [, mixed length])", + "Replaces part of a string with another string" + ], + "sybase_affected_rows": [ + "int sybase_affected_rows([resource link_id])", + "Get number of affected rows in last query" + ], + "sybase_close": [ + "bool sybase_close([resource link_id])", + "Close Sybase connection" + ], + "sybase_connect": [ + "int sybase_connect([string host [, string user [, string password [, string charset [, string appname [, bool new]]]]]])", + "Open Sybase server connection" + ], + "sybase_data_seek": [ + "bool sybase_data_seek(resource result, int offset)", + "Move internal row pointer" + ], + "sybase_deadlock_retry_count": [ + "void sybase_deadlock_retry_count(int retry_count)", + "Sets deadlock retry count" + ], + "sybase_fetch_array": [ + "array sybase_fetch_array(resource result)", + "Fetch row as array" + ], + "sybase_fetch_assoc": [ + "array sybase_fetch_assoc(resource result)", + "Fetch row as array without numberic indices" + ], + "sybase_fetch_field": [ + "object sybase_fetch_field(resource result [, int offset])", + "Get field information" + ], + "sybase_fetch_object": [ + "object sybase_fetch_object(resource result [, mixed object])", + "Fetch row as object" + ], + "sybase_fetch_row": [ + "array sybase_fetch_row(resource result)", + "Get row as enumerated array" + ], + "sybase_field_seek": [ + "bool sybase_field_seek(resource result, int offset)", + "Set field offset" + ], + "sybase_free_result": [ + "bool sybase_free_result(resource result)", + "Free result memory" + ], + "sybase_get_last_message": [ + "string sybase_get_last_message(void)", + "Returns the last message from server (over min_message_severity)" + ], + "sybase_min_client_severity": [ + "void sybase_min_client_severity(int severity)", + "Sets minimum client severity" + ], + "sybase_min_server_severity": [ + "void sybase_min_server_severity(int severity)", + "Sets minimum server severity" + ], + "sybase_num_fields": [ + "int sybase_num_fields(resource result)", + "Get number of fields in result" + ], + "sybase_num_rows": [ + "int sybase_num_rows(resource result)", + "Get number of rows in result" + ], + "sybase_pconnect": [ + "int sybase_pconnect([string host [, string user [, string password [, string charset [, string appname]]]]])", + "Open persistent Sybase connection" + ], + "sybase_query": [ + "int sybase_query(string query [, resource link_id])", + "Send Sybase query" + ], + "sybase_result": [ + "string sybase_result(resource result, int row, mixed field)", + "Get result data" + ], + "sybase_select_db": [ + "bool sybase_select_db(string database [, resource link_id])", + "Select Sybase database" + ], + "sybase_set_message_handler": [ + "bool sybase_set_message_handler(mixed error_func [, resource connection])", + "Set the error handler, to be called when a server message is raised. If error_func is NULL the handler will be deleted" + ], + "sybase_unbuffered_query": [ + "int sybase_unbuffered_query(string query [, resource link_id])", + "Send Sybase query" + ], + "symlink": [ + "int symlink(string target, string link)", + "Create a symbolic link" + ], + "sys_get_temp_dir": [ + "string sys_get_temp_dir()", + "Returns directory path used for temporary files" + ], + "sys_getloadavg": [ + "array sys_getloadavg()", + "" + ], + "syslog": [ + "bool syslog(int priority, string message)", + "Generate a system log message" + ], + "system": [ + "int system(string command [, int &return_value])", + "Execute an external program and display output" + ], + "tan": [ + "float tan(float number)", + "Returns the tangent of the number in radians" + ], + "tanh": [ + "float tanh(float number)", + "Returns the hyperbolic tangent of the number, defined as sinh(number)/cosh(number)" + ], + "tempnam": [ + "string tempnam(string dir, string prefix)", + "Create a unique filename in a directory" + ], + "textdomain": [ + "string textdomain(string domain)", + "Set the textdomain to \"domain\". Returns the current domain" + ], + "tidy_access_count": [ + "int tidy_access_count()", + "Returns the Number of Tidy accessibility warnings encountered for specified document." + ], + "tidy_clean_repair": [ + "boolean tidy_clean_repair()", + "Execute configured cleanup and repair operations on parsed markup" + ], + "tidy_config_count": [ + "int tidy_config_count()", + "Returns the Number of Tidy configuration errors encountered for specified document." + ], + "tidy_diagnose": [ + "boolean tidy_diagnose()", + "Run configured diagnostics on parsed and repaired markup." + ], + "tidy_error_count": [ + "int tidy_error_count()", + "Returns the Number of Tidy errors encountered for specified document." + ], + "tidy_get_body": [ + "TidyNode tidy_get_body(resource tidy)", + "Returns a TidyNode Object starting from the tag of the tidy parse tree" + ], + "tidy_get_config": [ + "array tidy_get_config()", + "Get current Tidy configuarion" + ], + "tidy_get_error_buffer": [ + "string tidy_get_error_buffer([boolean detailed])", + "Return warnings and errors which occured parsing the specified document" + ], + "tidy_get_head": [ + "TidyNode tidy_get_head()", + "Returns a TidyNode Object starting from the tag of the tidy parse tree" + ], + "tidy_get_html": [ + "TidyNode tidy_get_html()", + "Returns a TidyNode Object starting from the tag of the tidy parse tree" + ], + "tidy_get_html_ver": [ + "int tidy_get_html_ver()", + "Get the Detected HTML version for the specified document." + ], + "tidy_get_opt_doc": [ + "string tidy_get_opt_doc(tidy resource, string optname)", + "Returns the documentation for the given option name" + ], + "tidy_get_output": [ + "string tidy_get_output()", + "Return a string representing the parsed tidy markup" + ], + "tidy_get_release": [ + "string tidy_get_release()", + "Get release date (version) for Tidy library" + ], + "tidy_get_root": [ + "TidyNode tidy_get_root()", + "Returns a TidyNode Object representing the root of the tidy parse tree" + ], + "tidy_get_status": [ + "int tidy_get_status()", + "Get status of specfied document." + ], + "tidy_getopt": [ + "mixed tidy_getopt(string option)", + "Returns the value of the specified configuration option for the tidy document." + ], + "tidy_is_xhtml": [ + "boolean tidy_is_xhtml()", + "Indicates if the document is a XHTML document." + ], + "tidy_is_xml": [ + "boolean tidy_is_xml()", + "Indicates if the document is a generic (non HTML/XHTML) XML document." + ], + "tidy_parse_file": [ + "boolean tidy_parse_file(string file [, mixed config_options [, string encoding [, bool use_include_path]]])", + "Parse markup in file or URI" + ], + "tidy_parse_string": [ + "bool tidy_parse_string(string input [, mixed config_options [, string encoding]])", + "Parse a document stored in a string" + ], + "tidy_repair_file": [ + "boolean tidy_repair_file(string filename [, mixed config_file [, string encoding [, bool use_include_path]]])", + "Repair a file using an optionally provided configuration file" + ], + "tidy_repair_string": [ + "boolean tidy_repair_string(string data [, mixed config_file [, string encoding]])", + "Repair a string using an optionally provided configuration file" + ], + "tidy_warning_count": [ + "int tidy_warning_count()", + "Returns the Number of Tidy warnings encountered for specified document." + ], + "time": [ + "int time(void)", + "Return current UNIX timestamp" + ], + "time_nanosleep": [ + "mixed time_nanosleep(long seconds, long nanoseconds)", + "Delay for a number of seconds and nano seconds" + ], + "time_sleep_until": [ + "mixed time_sleep_until(float timestamp)", + "Make the script sleep until the specified time" + ], + "timezone_abbreviations_list": [ + "array timezone_abbreviations_list()", + "Returns associative array containing dst, offset and the timezone name" + ], + "timezone_identifiers_list": [ + "array timezone_identifiers_list([long what[, string country]])", + "Returns numerically index array with all timezone identifiers." + ], + "timezone_location_get": [ + "array timezone_location_get()", + "Returns location information for a timezone, including country code, latitude/longitude and comments" + ], + "timezone_name_from_abbr": [ + "string timezone_name_from_abbr(string abbr[, long gmtOffset[, long isdst]])", + "Returns the timezone name from abbrevation" + ], + "timezone_name_get": [ + "string timezone_name_get(DateTimeZone object)", + "Returns the name of the timezone." + ], + "timezone_offset_get": [ + "long timezone_offset_get(DateTimeZone object, DateTime object)", + "Returns the timezone offset." + ], + "timezone_open": [ + "DateTimeZone timezone_open(string timezone)", + "Returns new DateTimeZone object" + ], + "timezone_transitions_get": [ + "array timezone_transitions_get(DateTimeZone object [, long timestamp_begin [, long timestamp_end ]])", + "Returns numerically indexed array containing associative array for all transitions in the specified range for the timezone." + ], + "timezone_version_get": [ + "array timezone_version_get()", + "Returns the Olson database version number." + ], + "tmpfile": [ + "resource tmpfile(void)", + "Create a temporary file that will be deleted automatically after use" + ], + "token_get_all": [ + "array token_get_all(string source)", + "" + ], + "token_name": [ + "string token_name(int type)", + "" + ], + "touch": [ + "bool touch(string filename [, int time [, int atime]])", + "Set modification time of file" + ], + "trigger_error": [ + "void trigger_error(string messsage [, int error_type])", + "Generates a user-level error/warning/notice message" + ], + "trim": [ + "string trim(string str [, string character_mask])", + "Strips whitespace from the beginning and end of a string" + ], + "uasort": [ + "bool uasort(array array_arg, string cmp_function)", + "Sort an array with a user-defined comparison function and maintain index association" + ], + "ucfirst": [ + "string ucfirst(string str)", + "Make a string's first character lowercase" + ], + "ucwords": [ + "string ucwords(string str)", + "Uppercase the first character of every word in a string" + ], + "uksort": [ + "bool uksort(array array_arg, string cmp_function)", + "Sort an array by keys using a user-defined comparison function" + ], + "umask": [ + "int umask([int mask])", + "Return or change the umask" + ], + "uniqid": [ + "string uniqid([string prefix [, bool more_entropy]])", + "Generates a unique ID" + ], + "unixtojd": [ + "int unixtojd([int timestamp])", + "Convert UNIX timestamp to Julian Day" + ], + "unlink": [ + "bool unlink(string filename[, context context])", + "Delete a file" + ], + "unpack": [ + "array unpack(string format, string input)", + "Unpack binary string into named array elements according to format argument" + ], + "unregister_tick_function": [ + "void unregister_tick_function(string function_name)", + "Unregisters a tick callback function" + ], + "unserialize": [ + "mixed unserialize(string variable_representation)", + "Takes a string representation of variable and recreates it" + ], + "unset": [ + "void unset (mixed var [, mixed var])", + "Unset a given variable" + ], + "urldecode": [ + "string urldecode(string str)", + "Decodes URL-encoded string" + ], + "urlencode": [ + "string urlencode(string str)", + "URL-encodes string" + ], + "usleep": [ + "void usleep(int micro_seconds)", + "Delay for a given number of micro seconds" + ], + "usort": [ + "bool usort(array array_arg, string cmp_function)", + "Sort an array by values using a user-defined comparison function" + ], + "utf8_decode": [ + "string utf8_decode(string data)", + "Converts a UTF-8 encoded string to ISO-8859-1" + ], + "utf8_encode": [ + "string utf8_encode(string data)", + "Encodes an ISO-8859-1 string to UTF-8" + ], + "var_dump": [ + "void var_dump(mixed var)", + "Dumps a string representation of variable to output" + ], + "var_export": [ + "mixed var_export(mixed var [, bool return])", + "Outputs or returns a string representation of a variable" + ], + "variant_abs": [ + "mixed variant_abs(mixed left)", + "Returns the absolute value of a variant" + ], + "variant_add": [ + "mixed variant_add(mixed left, mixed right)", + "\"Adds\" two variant values together and returns the result" + ], + "variant_and": [ + "mixed variant_and(mixed left, mixed right)", + "performs a bitwise AND operation between two variants and returns the result" + ], + "variant_cast": [ + "object variant_cast(object variant, int type)", + "Convert a variant into a new variant object of another type" + ], + "variant_cat": [ + "mixed variant_cat(mixed left, mixed right)", + "concatenates two variant values together and returns the result" + ], + "variant_cmp": [ + "int variant_cmp(mixed left, mixed right [, int lcid [, int flags]])", + "Compares two variants" + ], + "variant_date_from_timestamp": [ + "object variant_date_from_timestamp(int timestamp)", + "Returns a variant date representation of a unix timestamp" + ], + "variant_date_to_timestamp": [ + "int variant_date_to_timestamp(object variant)", + "Converts a variant date/time value to unix timestamp" + ], + "variant_div": [ + "mixed variant_div(mixed left, mixed right)", + "Returns the result from dividing two variants" + ], + "variant_eqv": [ + "mixed variant_eqv(mixed left, mixed right)", + "Performs a bitwise equivalence on two variants" + ], + "variant_fix": [ + "mixed variant_fix(mixed left)", + "Returns the integer part ? of a variant" + ], + "variant_get_type": [ + "int variant_get_type(object variant)", + "Returns the VT_XXX type code for a variant" + ], + "variant_idiv": [ + "mixed variant_idiv(mixed left, mixed right)", + "Converts variants to integers and then returns the result from dividing them" + ], + "variant_imp": [ + "mixed variant_imp(mixed left, mixed right)", + "Performs a bitwise implication on two variants" + ], + "variant_int": [ + "mixed variant_int(mixed left)", + "Returns the integer portion of a variant" + ], + "variant_mod": [ + "mixed variant_mod(mixed left, mixed right)", + "Divides two variants and returns only the remainder" + ], + "variant_mul": [ + "mixed variant_mul(mixed left, mixed right)", + "multiplies the values of the two variants and returns the result" + ], + "variant_neg": [ + "mixed variant_neg(mixed left)", + "Performs logical negation on a variant" + ], + "variant_not": [ + "mixed variant_not(mixed left)", + "Performs bitwise not negation on a variant" + ], + "variant_or": [ + "mixed variant_or(mixed left, mixed right)", + "Performs a logical disjunction on two variants" + ], + "variant_pow": [ + "mixed variant_pow(mixed left, mixed right)", + "Returns the result of performing the power function with two variants" + ], + "variant_round": [ + "mixed variant_round(mixed left, int decimals)", + "Rounds a variant to the specified number of decimal places" + ], + "variant_set": [ + "void variant_set(object variant, mixed value)", + "Assigns a new value for a variant object" + ], + "variant_set_type": [ + "void variant_set_type(object variant, int type)", + "Convert a variant into another type. Variant is modified \"in-place\"" + ], + "variant_sub": [ + "mixed variant_sub(mixed left, mixed right)", + "subtracts the value of the right variant from the left variant value and returns the result" + ], + "variant_xor": [ + "mixed variant_xor(mixed left, mixed right)", + "Performs a logical exclusion on two variants" + ], + "version_compare": [ + "int version_compare(string ver1, string ver2 [, string oper])", + "Compares two \"PHP-standardized\" version number strings" + ], + "vfprintf": [ + "int vfprintf(resource stream, string format, array args)", + "Output a formatted string into a stream" + ], + "virtual": [ + "bool virtual(string filename)", + "Perform an Apache sub-request" + ], + "vprintf": [ + "int vprintf(string format, array args)", + "Output a formatted string" + ], + "vsprintf": [ + "string vsprintf(string format, array args)", + "Return a formatted string" + ], + "wddx_add_vars": [ + "int wddx_add_vars(resource packet_id, mixed var_names [, mixed ...])", + "Serializes given variables and adds them to packet given by packet_id" + ], + "wddx_deserialize": [ + "mixed wddx_deserialize(mixed packet)", + "Deserializes given packet and returns a PHP value" + ], + "wddx_packet_end": [ + "string wddx_packet_end(resource packet_id)", + "Ends specified WDDX packet and returns the string containing the packet" + ], + "wddx_packet_start": [ + "resource wddx_packet_start([string comment])", + "Starts a WDDX packet with optional comment and returns the packet id" + ], + "wddx_serialize_value": [ + "string wddx_serialize_value(mixed var [, string comment])", + "Creates a new packet and serializes the given value" + ], + "wddx_serialize_vars": [ + "string wddx_serialize_vars(mixed var_name [, mixed ...])", + "Creates a new packet and serializes given variables into a struct" + ], + "wordwrap": [ + "string wordwrap(string str [, int width [, string break [, boolean cut]]])", + "Wraps buffer to selected number of characters using string break char" + ], + "xml_error_string": [ + "string xml_error_string(int code)", + "Get XML parser error string" + ], + "xml_get_current_byte_index": [ + "int xml_get_current_byte_index(resource parser)", + "Get current byte index for an XML parser" + ], + "xml_get_current_column_number": [ + "int xml_get_current_column_number(resource parser)", + "Get current column number for an XML parser" + ], + "xml_get_current_line_number": [ + "int xml_get_current_line_number(resource parser)", + "Get current line number for an XML parser" + ], + "xml_get_error_code": [ + "int xml_get_error_code(resource parser)", + "Get XML parser error code" + ], + "xml_parse": [ + "int xml_parse(resource parser, string data [, int isFinal])", + "Start parsing an XML document" + ], + "xml_parse_into_struct": [ + "int xml_parse_into_struct(resource parser, string data, array &values [, array &index ])", + "Parsing a XML document" + ], + "xml_parser_create": [ + "resource xml_parser_create([string encoding])", + "Create an XML parser" + ], + "xml_parser_create_ns": [ + "resource xml_parser_create_ns([string encoding [, string sep]])", + "Create an XML parser" + ], + "xml_parser_free": [ + "int xml_parser_free(resource parser)", + "Free an XML parser" + ], + "xml_parser_get_option": [ + "int xml_parser_get_option(resource parser, int option)", + "Get options from an XML parser" + ], + "xml_parser_set_option": [ + "int xml_parser_set_option(resource parser, int option, mixed value)", + "Set options in an XML parser" + ], + "xml_set_character_data_handler": [ + "int xml_set_character_data_handler(resource parser, string hdl)", + "Set up character data handler" + ], + "xml_set_default_handler": [ + "int xml_set_default_handler(resource parser, string hdl)", + "Set up default handler" + ], + "xml_set_element_handler": [ + "int xml_set_element_handler(resource parser, string shdl, string ehdl)", + "Set up start and end element handlers" + ], + "xml_set_end_namespace_decl_handler": [ + "int xml_set_end_namespace_decl_handler(resource parser, string hdl)", + "Set up character data handler" + ], + "xml_set_external_entity_ref_handler": [ + "int xml_set_external_entity_ref_handler(resource parser, string hdl)", + "Set up external entity reference handler" + ], + "xml_set_notation_decl_handler": [ + "int xml_set_notation_decl_handler(resource parser, string hdl)", + "Set up notation declaration handler" + ], + "xml_set_object": [ + "int xml_set_object(resource parser, object &obj)", + "Set up object which should be used for callbacks" + ], + "xml_set_processing_instruction_handler": [ + "int xml_set_processing_instruction_handler(resource parser, string hdl)", + "Set up processing instruction (PI) handler" + ], + "xml_set_start_namespace_decl_handler": [ + "int xml_set_start_namespace_decl_handler(resource parser, string hdl)", + "Set up character data handler" + ], + "xml_set_unparsed_entity_decl_handler": [ + "int xml_set_unparsed_entity_decl_handler(resource parser, string hdl)", + "Set up unparsed entity declaration handler" + ], + "xmlrpc_decode": [ + "array xmlrpc_decode(string xml [, string encoding])", + "Decodes XML into native PHP types" + ], + "xmlrpc_decode_request": [ + "array xmlrpc_decode_request(string xml, string& method [, string encoding])", + "Decodes XML into native PHP types" + ], + "xmlrpc_encode": [ + "string xmlrpc_encode(mixed value)", + "Generates XML for a PHP value" + ], + "xmlrpc_encode_request": [ + "string xmlrpc_encode_request(string method, mixed params [, array output_options])", + "Generates XML for a method request" + ], + "xmlrpc_get_type": [ + "string xmlrpc_get_type(mixed value)", + "Gets xmlrpc type for a PHP value. Especially useful for base64 and datetime strings" + ], + "xmlrpc_is_fault": [ + "bool xmlrpc_is_fault(array)", + "Determines if an array value represents an XMLRPC fault." + ], + "xmlrpc_parse_method_descriptions": [ + "array xmlrpc_parse_method_descriptions(string xml)", + "Decodes XML into a list of method descriptions" + ], + "xmlrpc_server_add_introspection_data": [ + "int xmlrpc_server_add_introspection_data(resource server, array desc)", + "Adds introspection documentation" + ], + "xmlrpc_server_call_method": [ + "mixed xmlrpc_server_call_method(resource server, string xml, mixed user_data [, array output_options])", + "Parses XML requests and call methods" + ], + "xmlrpc_server_create": [ + "resource xmlrpc_server_create(void)", + "Creates an xmlrpc server" + ], + "xmlrpc_server_destroy": [ + "int xmlrpc_server_destroy(resource server)", + "Destroys server resources" + ], + "xmlrpc_server_register_introspection_callback": [ + "bool xmlrpc_server_register_introspection_callback(resource server, string function)", + "Register a PHP function to generate documentation" + ], + "xmlrpc_server_register_method": [ + "bool xmlrpc_server_register_method(resource server, string method_name, string function)", + "Register a PHP function to handle method matching method_name" + ], + "xmlrpc_set_type": [ + "bool xmlrpc_set_type(string value, string type)", + "Sets xmlrpc type, base64 or datetime, for a PHP string value" + ], + "xmlwriter_end_attribute": [ + "bool xmlwriter_end_attribute(resource xmlwriter)", + "End attribute - returns FALSE on error" + ], + "xmlwriter_end_cdata": [ + "bool xmlwriter_end_cdata(resource xmlwriter)", + "End current CDATA - returns FALSE on error" + ], + "xmlwriter_end_comment": [ + "bool xmlwriter_end_comment(resource xmlwriter)", + "Create end comment - returns FALSE on error" + ], + "xmlwriter_end_document": [ + "bool xmlwriter_end_document(resource xmlwriter)", + "End current document - returns FALSE on error" + ], + "xmlwriter_end_dtd": [ + "bool xmlwriter_end_dtd(resource xmlwriter)", + "End current DTD - returns FALSE on error" + ], + "xmlwriter_end_dtd_attlist": [ + "bool xmlwriter_end_dtd_attlist(resource xmlwriter)", + "End current DTD AttList - returns FALSE on error" + ], + "xmlwriter_end_dtd_element": [ + "bool xmlwriter_end_dtd_element(resource xmlwriter)", + "End current DTD element - returns FALSE on error" + ], + "xmlwriter_end_dtd_entity": [ + "bool xmlwriter_end_dtd_entity(resource xmlwriter)", + "End current DTD Entity - returns FALSE on error" + ], + "xmlwriter_end_element": [ + "bool xmlwriter_end_element(resource xmlwriter)", + "End current element - returns FALSE on error" + ], + "xmlwriter_end_pi": [ + "bool xmlwriter_end_pi(resource xmlwriter)", + "End current PI - returns FALSE on error" + ], + "xmlwriter_flush": [ + "mixed xmlwriter_flush(resource xmlwriter [,bool empty])", + "Output current buffer" + ], + "xmlwriter_full_end_element": [ + "bool xmlwriter_full_end_element(resource xmlwriter)", + "End current element - returns FALSE on error" + ], + "xmlwriter_open_memory": [ + "resource xmlwriter_open_memory()", + "Create new xmlwriter using memory for string output" + ], + "xmlwriter_open_uri": [ + "resource xmlwriter_open_uri(resource xmlwriter, string source)", + "Create new xmlwriter using source uri for output" + ], + "xmlwriter_output_memory": [ + "string xmlwriter_output_memory(resource xmlwriter [,bool flush])", + "Output current buffer as string" + ], + "xmlwriter_set_indent": [ + "bool xmlwriter_set_indent(resource xmlwriter, bool indent)", + "Toggle indentation on/off - returns FALSE on error" + ], + "xmlwriter_set_indent_string": [ + "bool xmlwriter_set_indent_string(resource xmlwriter, string indentString)", + "Set string used for indenting - returns FALSE on error" + ], + "xmlwriter_start_attribute": [ + "bool xmlwriter_start_attribute(resource xmlwriter, string name)", + "Create start attribute - returns FALSE on error" + ], + "xmlwriter_start_attribute_ns": [ + "bool xmlwriter_start_attribute_ns(resource xmlwriter, string prefix, string name, string uri)", + "Create start namespaced attribute - returns FALSE on error" + ], + "xmlwriter_start_cdata": [ + "bool xmlwriter_start_cdata(resource xmlwriter)", + "Create start CDATA tag - returns FALSE on error" + ], + "xmlwriter_start_comment": [ + "bool xmlwriter_start_comment(resource xmlwriter)", + "Create start comment - returns FALSE on error" + ], + "xmlwriter_start_document": [ + "bool xmlwriter_start_document(resource xmlwriter, string version, string encoding, string standalone)", + "Create document tag - returns FALSE on error" + ], + "xmlwriter_start_dtd": [ + "bool xmlwriter_start_dtd(resource xmlwriter, string name, string pubid, string sysid)", + "Create start DTD tag - returns FALSE on error" + ], + "xmlwriter_start_dtd_attlist": [ + "bool xmlwriter_start_dtd_attlist(resource xmlwriter, string name)", + "Create start DTD AttList - returns FALSE on error" + ], + "xmlwriter_start_dtd_element": [ + "bool xmlwriter_start_dtd_element(resource xmlwriter, string name)", + "Create start DTD element - returns FALSE on error" + ], + "xmlwriter_start_dtd_entity": [ + "bool xmlwriter_start_dtd_entity(resource xmlwriter, string name, bool isparam)", + "Create start DTD Entity - returns FALSE on error" + ], + "xmlwriter_start_element": [ + "bool xmlwriter_start_element(resource xmlwriter, string name)", + "Create start element tag - returns FALSE on error" + ], + "xmlwriter_start_element_ns": [ + "bool xmlwriter_start_element_ns(resource xmlwriter, string prefix, string name, string uri)", + "Create start namespaced element tag - returns FALSE on error" + ], + "xmlwriter_start_pi": [ + "bool xmlwriter_start_pi(resource xmlwriter, string target)", + "Create start PI tag - returns FALSE on error" + ], + "xmlwriter_text": [ + "bool xmlwriter_text(resource xmlwriter, string content)", + "Write text - returns FALSE on error" + ], + "xmlwriter_write_attribute": [ + "bool xmlwriter_write_attribute(resource xmlwriter, string name, string content)", + "Write full attribute - returns FALSE on error" + ], + "xmlwriter_write_attribute_ns": [ + "bool xmlwriter_write_attribute_ns(resource xmlwriter, string prefix, string name, string uri, string content)", + "Write full namespaced attribute - returns FALSE on error" + ], + "xmlwriter_write_cdata": [ + "bool xmlwriter_write_cdata(resource xmlwriter, string content)", + "Write full CDATA tag - returns FALSE on error" + ], + "xmlwriter_write_comment": [ + "bool xmlwriter_write_comment(resource xmlwriter, string content)", + "Write full comment tag - returns FALSE on error" + ], + "xmlwriter_write_dtd": [ + "bool xmlwriter_write_dtd(resource xmlwriter, string name, string pubid, string sysid, string subset)", + "Write full DTD tag - returns FALSE on error" + ], + "xmlwriter_write_dtd_attlist": [ + "bool xmlwriter_write_dtd_attlist(resource xmlwriter, string name, string content)", + "Write full DTD AttList tag - returns FALSE on error" + ], + "xmlwriter_write_dtd_element": [ + "bool xmlwriter_write_dtd_element(resource xmlwriter, string name, string content)", + "Write full DTD element tag - returns FALSE on error" + ], + "xmlwriter_write_dtd_entity": [ + "bool xmlwriter_write_dtd_entity(resource xmlwriter, string name, string content [, int pe [, string pubid [, string sysid [, string ndataid]]]])", + "Write full DTD Entity tag - returns FALSE on error" + ], + "xmlwriter_write_element": [ + "bool xmlwriter_write_element(resource xmlwriter, string name[, string content])", + "Write full element tag - returns FALSE on error" + ], + "xmlwriter_write_element_ns": [ + "bool xmlwriter_write_element_ns(resource xmlwriter, string prefix, string name, string uri[, string content])", + "Write full namesapced element tag - returns FALSE on error" + ], + "xmlwriter_write_pi": [ + "bool xmlwriter_write_pi(resource xmlwriter, string target, string content)", + "Write full PI tag - returns FALSE on error" + ], + "xmlwriter_write_raw": [ + "bool xmlwriter_write_raw(resource xmlwriter, string content)", + "Write text - returns FALSE on error" + ], + "xsl_xsltprocessor_get_parameter": [ + "string xsl_xsltprocessor_get_parameter(string namespace, string name);", + "" + ], + "xsl_xsltprocessor_has_exslt_support": [ + "bool xsl_xsltprocessor_has_exslt_support();", + "" + ], + "xsl_xsltprocessor_import_stylesheet": [ + "void xsl_xsltprocessor_import_stylesheet(domdocument doc);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html# Since:" + ], + "xsl_xsltprocessor_register_php_functions": [ + "void xsl_xsltprocessor_register_php_functions([mixed $restrict]);", + "" + ], + "xsl_xsltprocessor_remove_parameter": [ + "bool xsl_xsltprocessor_remove_parameter(string namespace, string name);", + "" + ], + "xsl_xsltprocessor_set_parameter": [ + "bool xsl_xsltprocessor_set_parameter(string namespace, mixed name [, string value]);", + "" + ], + "xsl_xsltprocessor_set_profiling": [ + "bool xsl_xsltprocessor_set_profiling(string filename) */", + "PHP_FUNCTION(xsl_xsltprocessor_set_profiling) { zval *id; xsl_object *intern; char *filename = NULL; int filename_len; DOM_GET_THIS(id); if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, \"s!\", &filename, &filename_len) == SUCCESS) { intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC); if (intern->profiling) { efree(intern->profiling); } if (filename != NULL) { intern->profiling = estrndup(filename,filename_len); } else { intern->profiling = NULL; } RETURN_TRUE; } else { WRONG_PARAM_COUNT; } } /* }}} end xsl_xsltprocessor_set_profiling" + ], + "xsl_xsltprocessor_transform_to_doc": [ + "domdocument xsl_xsltprocessor_transform_to_doc(domnode doc);", + "URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html# Since:" + ], + "xsl_xsltprocessor_transform_to_uri": [ + "int xsl_xsltprocessor_transform_to_uri(domdocument doc, string uri);", + "" + ], + "xsl_xsltprocessor_transform_to_xml": [ + "string xsl_xsltprocessor_transform_to_xml(domdocument doc);", + "" + ], + "zend_logo_guid": [ + "string zend_logo_guid(void)", + "Return the special ID used to request the Zend logo in phpinfo screens" + ], + "zend_version": [ + "string zend_version(void)", + "Get the version of the Zend Engine" + ], + "zip_close": [ + "void zip_close(resource zip)", + "Close a Zip archive" + ], + "zip_entry_close": [ + "void zip_entry_close(resource zip_ent)", + "Close a zip entry" + ], + "zip_entry_compressedsize": [ + "int zip_entry_compressedsize(resource zip_entry)", + "Return the compressed size of a ZZip entry" + ], + "zip_entry_compressionmethod": [ + "string zip_entry_compressionmethod(resource zip_entry)", + "Return a string containing the compression method used on a particular entry" + ], + "zip_entry_filesize": [ + "int zip_entry_filesize(resource zip_entry)", + "Return the actual filesize of a ZZip entry" + ], + "zip_entry_name": [ + "string zip_entry_name(resource zip_entry)", + "Return the name given a ZZip entry" + ], + "zip_entry_open": [ + "bool zip_entry_open(resource zip_dp, resource zip_entry [, string mode])", + "Open a Zip File, pointed by the resource entry" + ], + "zip_entry_read": [ + "mixed zip_entry_read(resource zip_entry [, int len])", + "Read from an open directory entry" + ], + "zip_open": [ + "resource zip_open(string filename)", + "Create new zip using source uri for output" + ], + "zip_read": [ + "resource zip_read(resource zip)", + "Returns the next file in the archive" + ], + "zlib_get_coding_type": [ + "string zlib_get_coding_type(void)", + "Returns the coding type used for output compression" + ] +}; + +var variableMap = { + "$_COOKIE": { + type: "array" + }, + "$_ENV": { + type: "array" + }, + "$_FILES": { + type: "array" + }, + "$_GET": { + type: "array" + }, + "$_POST": { + type: "array" + }, + "$_REQUEST": { + type: "array" + }, + "$_SERVER": { + type: "array", + value: { + "DOCUMENT_ROOT": 1, + "GATEWAY_INTERFACE": 1, + "HTTP_ACCEPT": 1, + "HTTP_ACCEPT_CHARSET": 1, + "HTTP_ACCEPT_ENCODING": 1 , + "HTTP_ACCEPT_LANGUAGE": 1, + "HTTP_CONNECTION": 1, + "HTTP_HOST": 1, + "HTTP_REFERER": 1, + "HTTP_USER_AGENT": 1, + "PATH_TRANSLATED": 1, + "PHP_SELF": 1, + "QUERY_STRING": 1, + "REMOTE_ADDR": 1, + "REMOTE_PORT": 1, + "REQUEST_METHOD": 1, + "REQUEST_URI": 1, + "SCRIPT_FILENAME": 1, + "SCRIPT_NAME": 1, + "SERVER_ADMIN": 1, + "SERVER_NAME": 1, + "SERVER_PORT": 1, + "SERVER_PROTOCOL": 1, + "SERVER_SIGNATURE": 1, + "SERVER_SOFTWARE": 1 + } + }, + "$_SESSION": { + type: "array" + }, + "$GLOBALS": { + type: "array" + } +}; + +function is(token, type) { + return token.type.lastIndexOf(type) > -1; +} + +var PhpCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (token.type==='identifier') + return this.getFunctionCompletions(state, session, pos, prefix); + if (is(token, "variable")) + return this.getVariableCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (token.type==='string' && /(\$[\w]*)\[["']([^'"]*)$/i.test(line)) + return this.getArrayKeyCompletions(state, session, pos, prefix); + + return []; + }; + + this.getFunctionCompletions = function(state, session, pos, prefix) { + var functions = Object.keys(functionMap); + return functions.map(function(func){ + return { + caption: func, + snippet: func + '($0)', + meta: "php function", + score: Number.MAX_VALUE, + docHTML: functionMap[func][1] + }; + }); + }; + + this.getVariableCompletions = function(state, session, pos, prefix) { + var variables = Object.keys(variableMap); + return variables.map(function(variable){ + return { + caption: variable, + value: variable, + meta: "php variable", + score: Number.MAX_VALUE + }; + }); + }; + + this.getArrayKeyCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var variable = line.match(/(\$[\w]*)\[["']([^'"]*)$/i)[1]; + + if (!variableMap[variable]) { + return []; + } + + var keys = []; + if (variableMap[variable].type==='array' && variableMap[variable].value) + keys = Object.keys(variableMap[variable].value); + + return keys.map(function(key) { + return { + caption: key, + value: key, + meta: "php array key", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(PhpCompletions.prototype); + +exports.PhpCompletions = PhpCompletions; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/php",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/php_highlight_rules","ace/mode/php_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/php_completions","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/unicode","ace/mode/html","ace/mode/javascript","ace/mode/css"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PhpHighlightRules = require("./php_highlight_rules").PhpHighlightRules; +var PhpLangHighlightRules = require("./php_highlight_rules").PhpLangHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var PhpCompletions = require("./php_completions").PhpCompletions; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var unicode = require("../unicode"); +var HtmlMode = require("./html").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; + +var PhpMode = function(opts) { + this.HighlightRules = PhpLangHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.$completer = new PhpCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(PhpMode, TextMode); + +(function() { + + this.tokenRe = new RegExp("^[" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "_]+", "g" + ); + + this.nonTokenRe = new RegExp("^(?:[^" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "_]|\\s])+", "g" + ); + + + this.lineCommentStart = ["//", "#"]; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState != "doc-start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.$id = "ace/mode/php-inline"; +}).call(PhpMode.prototype); + +var Mode = function(opts) { + if (opts && opts.inline) { + var mode = new PhpMode(); + mode.createWorker = this.createWorker; + mode.inlinePhp = true; + return mode; + } + HtmlMode.call(this); + this.HighlightRules = PhpHighlightRules; + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode, + "php-": PhpMode + }); + this.foldingRules.subModes["php-"] = new CStyleFoldMode(); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/php_worker", "PhpWorker"); + worker.attachToDocument(session.getDocument()); + + if (this.inlinePhp) + worker.call("setOptions", [{inline: true}]); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/php"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-pig.js b/src/libs/ace/mode-pig.js new file mode 100755 index 0000000..e251e38 --- /dev/null +++ b/src/libs/ace/mode-pig.js @@ -0,0 +1,303 @@ +ace.define("ace/mode/pig_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PigHighlightRules = function() { + + this.$rules = { + start: [{ + token: "comment.block.pig", + regex: /\/\*/, + push: [{ + token: "comment.block.pig", + regex: /\*\//, + next: "pop" + }, { + defaultToken: "comment.block.pig" + }] + }, { + token: "comment.line.double-dash.asciidoc", + regex: /--.*$/ + }, { + token: "keyword.control.pig", + regex: /\b(?:ASSERT|LOAD|STORE|DUMP|FILTER|DISTINCT|FOREACH|GENERATE|STREAM|JOIN|COGROUP|GROUP|CROSS|ORDER|LIMIT|UNION|SPLIT|DESCRIBE|EXPLAIN|ILLUSTRATE|AS|BY|INTO|USING|LIMIT|PARALLEL|OUTER|INNER|DEFAULT|LEFT|SAMPLE|RANK|CUBE|ALL|KILL|QUIT|MAPREDUCE|ASC|DESC|THROUGH|SHIP|CACHE|DECLARE|CASE|WHEN|THEN|END|IN|PARTITION|FULL|IMPORT|IF|ONSCHEMA|INPUT|OUTPUT)\b/, + caseInsensitive: true + }, { + token: "storage.datatypes.pig", + regex: /\b(?:int|long|float|double|chararray|bytearray|boolean|datetime|biginteger|bigdecimal|tuple|bag|map)\b/, + caseInsensitive: true + }, { + token: "support.function.storage.pig", + regex: /\b(?:PigStorage|BinStorage|BinaryStorage|PigDump|HBaseStorage|JsonLoader|JsonStorage|AvroStorage|TextLoader|PigStreaming|TrevniStorage|AccumuloStorage)\b/ + }, { + token: "support.function.udf.pig", + regex: /\b(?:DIFF|TOBAG|TOMAP|TOP|TOTUPLE|RANDOM|FLATTEN|flatten|CUBE|ROLLUP|IsEmpty|ARITY|PluckTuple|SUBTRACT|BagToString)\b/ + }, { + token: "support.function.udf.math.pig", + regex: /\b(?:ABS|ACOS|ASIN|ATAN|CBRT|CEIL|COS|COSH|EXP|FLOOR|LOG|LOG10|ROUND|ROUND_TO|SIN|SINH|SQRT|TAN|TANH|AVG|COUNT|COUNT_STAR|MAX|MIN|SUM|COR|COV)\b/ + }, { + token: "support.function.udf.string.pig", + regex: /\b(?:CONCAT|INDEXOF|LAST_INDEX_OF|LCFIRST|LOWER|REGEX_EXTRACT|REGEX_EXTRACT_ALL|REPLACE|SIZE|STRSPLIT|SUBSTRING|TOKENIZE|TRIM|UCFIRST|UPPER|LTRIM|RTRIM|ENDSWITH|STARTSWITH|TRIM)\b/ + }, { + token: "support.function.udf.datetime.pig", + regex: /\b(?:AddDuration|CurrentTime|DaysBetween|GetDay|GetHour|GetMilliSecond|GetMinute|GetMonth|GetSecond|GetWeek|GetWeekYear|GetYear|HoursBetween|MilliSecondsBetween|MinutesBetween|MonthsBetween|SecondsBetween|SubtractDuration|ToDate|WeeksBetween|YearsBetween|ToMilliSeconds|ToString|ToUnixTime)\b/ + }, { + token: "support.function.command.pig", + regex: /\b(?:cat|cd|copyFromLocal|copyToLocal|cp|ls|mkdir|mv|pwd|rm)\b/ + }, { + token: "variable.pig", + regex: /\$[a_zA-Z0-9_]+/ + }, { + token: "constant.language.pig", + regex: /\b(?:NULL|true|false|stdin|stdout|stderr)\b/, + caseInsensitive: true + }, { + token: "constant.numeric.pig", + regex: /\b\d+(?:\.\d+)?\b/ + }, { + token: "keyword.operator.comparison.pig", + regex: /!=|==|<|>|<=|>=|\b(?:MATCHES|IS|OR|AND|NOT)\b/, + caseInsensitive: true + }, { + token: "keyword.operator.arithmetic.pig", + regex: /\+|\-|\*|\/|\%|\?|:|::|\.\.|#/ + }, { + token: "string.quoted.double.pig", + regex: /"/, + push: [{ + token: "string.quoted.double.pig", + regex: /"/, + next: "pop" + }, { + token: "constant.character.escape.pig", + regex: /\\./ + }, { + defaultToken: "string.quoted.double.pig" + }] + }, { + token: "string.quoted.single.pig", + regex: /'/, + push: [{ + token: "string.quoted.single.pig", + regex: /'/, + next: "pop" + }, { + token: "constant.character.escape.pig", + regex: /\\./ + }, { + defaultToken: "string.quoted.single.pig" + }] + }, { + todo: { + token: [ + "text", + "keyword.parameter.pig", + "text", + "storage.type.parameter.pig" + ], + regex: /^(\s*)(set)(\s+)(\S+)/, + caseInsensitive: true, + push: [{ + token: "text", + regex: /$/, + next: "pop" + }, { + include: "$self" + }] + } + }, { + token: [ + "text", + "keyword.alias.pig", + "text", + "storage.type.alias.pig" + ], + regex: /(\s*)(DEFINE|DECLARE|REGISTER)(\s+)(\S+)/, + caseInsensitive: true, + push: [{ + token: "text", + regex: /;?$/, + next: "pop" + }] + }] + } + + this.normalizeRules(); +}; + +PigHighlightRules.metaData = { + fileTypes: ["pig"], + name: "Pig", + scopeName: "source.pig" +} + + +oop.inherits(PigHighlightRules, TextHighlightRules); + +exports.PigHighlightRules = PigHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/pig",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/pig_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PigHighlightRules = require("./pig_highlight_rules").PigHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = PigHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/pig" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-plain_text.js b/src/libs/ace/mode-plain_text.js new file mode 100755 index 0000000..0f0c938 --- /dev/null +++ b/src/libs/ace/mode-plain_text.js @@ -0,0 +1,25 @@ +ace.define("ace/mode/plain_text",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/behaviour"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var Behaviour = require("./behaviour").Behaviour; + +var Mode = function() { + this.HighlightRules = TextHighlightRules; + this.$behaviour = new Behaviour(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + this.type = "text"; + this.getNextLineIndent = function(state, line, tab) { + return ''; + }; + this.$id = "ace/mode/plain_text"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-powershell.js b/src/libs/ace/mode-powershell.js new file mode 100755 index 0000000..0b43a83 --- /dev/null +++ b/src/libs/ace/mode-powershell.js @@ -0,0 +1,411 @@ +ace.define("ace/mode/powershell_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PowershellHighlightRules = function() { + var keywords = ( + "begin|break|catch|continue|data|do|dynamicparam|else|elseif|end|exit|filter|" + + "finally|for|foreach|from|function|if|in|inlinescript|hidden|parallel|param|" + + "process|return|sequence|switch|throw|trap|try|until|while|workflow" + ); + var builtinFunctions = ( + "Get-AppBackgroundTask|Start-AppBackgroundTask|Unregister-AppBackgroundTask|Disable-AppBackgroundTaskDiagnosticLog|Enable-AppBackgroundTaskDiagnosticLog|Set-AppBackgroundTaskResourcePolicy|" + + "Get-AppLockerFileInformation|Get-AppLockerPolicy|New-AppLockerPolicy|Set-AppLockerPolicy|Test-AppLockerPolicy|" + + "Get-AppxLastError|Get-AppxLog|Add-AppxPackage|Add-AppxVolume|Dismount-AppxVolume|Get-AppxDefaultVolume|Get-AppxPackage|Get-AppxPackageManifest|Get-AppxVolume|Mount-AppxVolume|Move-AppxPackage|Remove-AppxPackage|Remove-AppxVolume|Set-AppxDefaultVolume|" + + "Clear-AssignedAccess|Get-AssignedAccess|Set-AssignedAccess|" + + "Add-BitLockerKeyProtector|Backup-BitLockerKeyProtector|Clear-BitLockerAutoUnlock|Disable-BitLocker|Disable-BitLockerAutoUnlock|Enable-BitLocker|Enable-BitLockerAutoUnlock|Get-BitLockerVolume|Lock-BitLocker|Remove-BitLockerKeyProtector|Resume-BitLocker|Suspend-BitLocker|Unlock-BitLocker|" + + "Add-BitsFile|Complete-BitsTransfer|Get-BitsTransfer|Remove-BitsTransfer|Resume-BitsTransfer|Set-BitsTransfer|Start-BitsTransfer|Suspend-BitsTransfer|" + + "Add-BCDataCacheExtension|Clear-BCCache|Disable-BC|Disable-BCDowngrading|Disable-BCServeOnBattery|Enable-BCDistributed|Enable-BCDowngrading|Enable-BCHostedClient|Enable-BCHostedServer|Enable-BCLocal|Enable-BCServeOnBattery|Export-BCCachePackage|Export-BCSecretKey|Get-BCClientConfiguration|Get-BCContentServerConfiguration|Get-BCDataCache|Get-BCDataCacheExtension|Get-BCHashCache|Get-BCHostedCacheServerConfiguration|Get-BCNetworkConfiguration|Get-BCStatus|Import-BCCachePackage|Import-BCSecretKey|Publish-BCFileContent|Publish-BCWebContent|Remove-BCDataCacheExtension|Reset-BC|Set-BCAuthentication|Set-BCCache|Set-BCDataCacheEntryMaxAge|Set-BCMinSMBLatency|Set-BCSecretKey|" + + "Export-BinaryMiLog|Get-CimAssociatedInstance|Get-CimClass|Get-CimInstance|Get-CimSession|Import-BinaryMiLog|Invoke-CimMethod|New-CimInstance|New-CimSession|New-CimSessionOption|Register-CimIndicationEvent|Remove-CimInstance|Remove-CimSession|Set-CimInstance|" + + "ConvertFrom-CIPolicy|" + + "Add-SignerRule|Edit-CIPolicyRule|Get-CIPolicy|Get-CIPolicyInfo|Get-SystemDriver|Merge-CIPolicy|New-CIPolicy|New-CIPolicyRule|Remove-CIPolicyRule|Set-CIPolicyVersion|Set-HVCIOptions|Set-RuleOption|" + + "Add-MpPreference|Get-MpComputerStatus|Get-MpPreference|Get-MpThreat|Get-MpThreatCatalog|Get-MpThreatDetection|Remove-MpPreference|Remove-MpThreat|Set-MpPreference|Start-MpScan|Start-MpWDOScan|Update-MpSignature|" + + "Disable-DAManualEntryPointSelection|Enable-DAManualEntryPointSelection|Get-DAClientExperienceConfiguration|Get-DAEntryPointTableItem|New-DAEntryPointTableItem|Remove-DAEntryPointTableItem|Rename-DAEntryPointTableItem|Reset-DAClientExperienceConfiguration|Reset-DAEntryPointTableItem|Set-DAClientExperienceConfiguration|Set-DAEntryPointTableItem|" + + "Add-ProvisionedAppxPackage|Apply-WindowsUnattend|Get-ProvisionedAppxPackage|Remove-ProvisionedAppxPackage|Add-AppxProvisionedPackage|Add-WindowsCapability|Add-WindowsDriver|Add-WindowsImage|Add-WindowsPackage|Clear-WindowsCorruptMountPoint|Disable-WindowsOptionalFeature|Dismount-WindowsImage|Enable-WindowsOptionalFeature|Expand-WindowsCustomDataImage|Expand-WindowsImage|Export-WindowsDriver|Export-WindowsImage|Get-AppxProvisionedPackage|Get-WIMBootEntry|Get-WindowsCapability|Get-WindowsDriver|Get-WindowsEdition|Get-WindowsImage|Get-WindowsImageContent|Get-WindowsOptionalFeature|Get-WindowsPackage|Mount-WindowsImage|New-WindowsCustomImage|New-WindowsImage|Optimize-WindowsImage|Remove-AppxProvisionedPackage|Remove-WindowsCapability|Remove-WindowsDriver|Remove-WindowsImage|Remove-WindowsPackage|Repair-WindowsImage|Save-WindowsImage|Set-AppXProvisionedDataFile|Set-WindowsEdition|Set-WindowsProductKey|Split-WindowsImage|Update-WIMBootEntry|Use-WindowsUnattend|" + + "Add-DnsClientNrptRule|Clear-DnsClientCache|Get-DnsClient|Get-DnsClientCache|Get-DnsClientGlobalSetting|Get-DnsClientNrptGlobal|Get-DnsClientNrptPolicy|Get-DnsClientNrptRule|Get-DnsClientServerAddress|Register-DnsClient|Remove-DnsClientNrptRule|Set-DnsClient|Set-DnsClientGlobalSetting|Set-DnsClientNrptGlobal|Set-DnsClientNrptRule|Set-DnsClientServerAddress|Resolve-DnsName|" + + "Add-EtwTraceProvider|Get-AutologgerConfig|Get-EtwTraceProvider|Get-EtwTraceSession|New-AutologgerConfig|New-EtwTraceSession|Remove-AutologgerConfig|Remove-EtwTraceProvider|Remove-EtwTraceSession|Send-EtwTraceSession|Set-AutologgerConfig|Set-EtwTraceProvider|Set-EtwTraceSession|" + + "Get-WinAcceptLanguageFromLanguageListOptOut|Get-WinCultureFromLanguageListOptOut|Get-WinDefaultInputMethodOverride|Get-WinHomeLocation|Get-WinLanguageBarOption|Get-WinSystemLocale|Get-WinUILanguageOverride|Get-WinUserLanguageList|New-WinUserLanguageList|Set-Culture|Set-WinAcceptLanguageFromLanguageListOptOut|Set-WinCultureFromLanguageListOptOut|Set-WinDefaultInputMethodOverride|Set-WinHomeLocation|Set-WinLanguageBarOption|Set-WinSystemLocale|Set-WinUILanguageOverride|Set-WinUserLanguageList|" + + "Connect-IscsiTarget|Disconnect-IscsiTarget|Get-IscsiConnection|Get-IscsiSession|Get-IscsiTarget|Get-IscsiTargetPortal|New-IscsiTargetPortal|Register-IscsiSession|Remove-IscsiTargetPortal|Set-IscsiChapSecret|Unregister-IscsiSession|Update-IscsiTarget|Update-IscsiTargetPortal|" + + "Get-IseSnippet|Import-IseSnippet|New-IseSnippet|" + + "Add-KdsRootKey|Clear-KdsCache|Get-KdsConfiguration|Get-KdsRootKey|Set-KdsConfiguration|Test-KdsRootKey|" + + "Compress-Archive|Expand-Archive|" + + "Export-Counter|Get-Counter|Get-WinEvent|Import-Counter|New-WinEvent|" + + "Start-Transcript|Stop-Transcript|" + + "Add-Computer|Add-Content|Checkpoint-Computer|Clear-Content|Clear-EventLog|Clear-Item|Clear-ItemProperty|Clear-RecycleBin|Complete-Transaction|Convert-Path|Copy-Item|Copy-ItemProperty|Debug-Process|Disable-ComputerRestore|Enable-ComputerRestore|Get-ChildItem|Get-Clipboard|Get-ComputerRestorePoint|Get-Content|Get-ControlPanelItem|Get-EventLog|Get-HotFix|Get-Item|Get-ItemProperty|Get-ItemPropertyValue|Get-Location|Get-Process|Get-PSDrive|Get-PSProvider|Get-Service|Get-Transaction|Get-WmiObject|Invoke-Item|Invoke-WmiMethod|Join-Path|Limit-EventLog|Move-Item|Move-ItemProperty|New-EventLog|New-Item|New-ItemProperty|New-PSDrive|New-Service|New-WebServiceProxy|Pop-Location|Push-Location|Register-WmiEvent|Remove-Computer|Remove-EventLog|Remove-Item|Remove-ItemProperty|Remove-PSDrive|Remove-WmiObject|Rename-Computer|Rename-Item|Rename-ItemProperty|Reset-ComputerMachinePassword|Resolve-Path|Restart-Computer|Restart-Service|Restore-Computer|Resume-Service|Set-Clipboard|Set-Content|Set-Item|Set-ItemProperty|Set-Location|Set-Service|Set-WmiInstance|Show-ControlPanelItem|Show-EventLog|Split-Path|Start-Process|Start-Service|Start-Transaction|Stop-Computer|Stop-Process|Stop-Service|Suspend-Service|Test-ComputerSecureChannel|Test-Connection|Test-Path|Undo-Transaction|Use-Transaction|Wait-Process|Write-EventLog|" + + "Export-ODataEndpointProxy|" + + "ConvertFrom-SecureString|ConvertTo-SecureString|Get-Acl|Get-AuthenticodeSignature|Get-CmsMessage|Get-Credential|Get-ExecutionPolicy|Get-PfxCertificate|Protect-CmsMessage|Set-Acl|Set-AuthenticodeSignature|Set-ExecutionPolicy|Unprotect-CmsMessage|" + + "ConvertFrom-SddlString|Format-Hex|Get-FileHash|Import-PowerShellDataFile|New-Guid|New-TemporaryFile|Add-Member|Add-Type|Clear-Variable|Compare-Object|ConvertFrom-Csv|ConvertFrom-Json|ConvertFrom-String|ConvertFrom-StringData|Convert-String|ConvertTo-Csv|ConvertTo-Html|ConvertTo-Json|ConvertTo-Xml|Debug-Runspace|Disable-PSBreakpoint|Disable-RunspaceDebug|Enable-PSBreakpoint|Enable-RunspaceDebug|Export-Alias|Export-Clixml|Export-Csv|Export-FormatData|Export-PSSession|Format-Custom|Format-List|Format-Table|Format-Wide|Get-Alias|Get-Culture|Get-Date|Get-Event|Get-EventSubscriber|Get-FormatData|Get-Host|Get-Member|Get-PSBreakpoint|Get-PSCallStack|Get-Random|Get-Runspace|Get-RunspaceDebug|Get-TraceSource|Get-TypeData|Get-UICulture|Get-Unique|Get-Variable|Group-Object|Import-Alias|Import-Clixml|Import-Csv|Import-LocalizedData|Import-PSSession|Invoke-Expression|Invoke-RestMethod|Invoke-WebRequest|Measure-Command|Measure-Object|New-Alias|New-Event|New-Object|New-TimeSpan|New-Variable|Out-File|Out-GridView|Out-Printer|Out-String|Read-Host|Register-EngineEvent|Register-ObjectEvent|Remove-Event|Remove-PSBreakpoint|Remove-TypeData|Remove-Variable|Select-Object|Select-String|Select-Xml|Send-MailMessage|Set-Alias|Set-Date|Set-PSBreakpoint|Set-TraceSource|Set-Variable|Show-Command|Sort-Object|Start-Sleep|Tee-Object|Trace-Command|Unblock-File|Unregister-Event|Update-FormatData|Update-List|Update-TypeData|Wait-Debugger|Wait-Event|Write-Debug|Write-Error|Write-Host|Write-Information|Write-Output|Write-Progress|Write-Verbose|Write-Warning|" + + "Connect-WSMan|Disable-WSManCredSSP|Disconnect-WSMan|Enable-WSManCredSSP|Get-WSManCredSSP|Get-WSManInstance|Invoke-WSManAction|New-WSManInstance|New-WSManSessionOption|Remove-WSManInstance|Set-WSManInstance|Set-WSManQuickConfig|Test-WSMan|" + + "Debug-MMAppPrelaunch|Disable-MMAgent|Enable-MMAgent|Get-MMAgent|Set-MMAgent|" + + "Add-DtcClusterTMMapping|Get-Dtc|Get-DtcAdvancedHostSetting|Get-DtcAdvancedSetting|Get-DtcClusterDefault|Get-DtcClusterTMMapping|Get-DtcDefault|Get-DtcLog|Get-DtcNetworkSetting|Get-DtcTransaction|Get-DtcTransactionsStatistics|Get-DtcTransactionsTraceSession|Get-DtcTransactionsTraceSetting|Install-Dtc|Remove-DtcClusterTMMapping|Reset-DtcLog|Set-DtcAdvancedHostSetting|Set-DtcAdvancedSetting|Set-DtcClusterDefault|Set-DtcClusterTMMapping|Set-DtcDefault|Set-DtcLog|Set-DtcNetworkSetting|Set-DtcTransaction|Set-DtcTransactionsTraceSession|Set-DtcTransactionsTraceSetting|Start-Dtc|Start-DtcTransactionsTraceSession|Stop-Dtc|Stop-DtcTransactionsTraceSession|Test-Dtc|Uninstall-Dtc|Write-DtcTransactionsTraceSession|Complete-DtcDiagnosticTransaction|Join-DtcDiagnosticResourceManager|New-DtcDiagnosticTransaction|Receive-DtcDiagnosticTransaction|Send-DtcDiagnosticTransaction|Start-DtcDiagnosticResourceManager|Stop-DtcDiagnosticResourceManager|Undo-DtcDiagnosticTransaction|" + + "Disable-NetAdapter|Disable-NetAdapterBinding|Disable-NetAdapterChecksumOffload|Disable-NetAdapterEncapsulatedPacketTaskOffload|Disable-NetAdapterIPsecOffload|Disable-NetAdapterLso|Disable-NetAdapterPacketDirect|Disable-NetAdapterPowerManagement|Disable-NetAdapterQos|Disable-NetAdapterRdma|Disable-NetAdapterRsc|Disable-NetAdapterRss|Disable-NetAdapterSriov|Disable-NetAdapterVmq|Enable-NetAdapter|Enable-NetAdapterBinding|Enable-NetAdapterChecksumOffload|Enable-NetAdapterEncapsulatedPacketTaskOffload|Enable-NetAdapterIPsecOffload|Enable-NetAdapterLso|Enable-NetAdapterPacketDirect|Enable-NetAdapterPowerManagement|Enable-NetAdapterQos|Enable-NetAdapterRdma|Enable-NetAdapterRsc|Enable-NetAdapterRss|Enable-NetAdapterSriov|Enable-NetAdapterVmq|Get-NetAdapter|Get-NetAdapterAdvancedProperty|Get-NetAdapterBinding|Get-NetAdapterChecksumOffload|Get-NetAdapterEncapsulatedPacketTaskOffload|Get-NetAdapterHardwareInfo|Get-NetAdapterIPsecOffload|Get-NetAdapterLso|Get-NetAdapterPacketDirect|Get-NetAdapterPowerManagement|Get-NetAdapterQos|Get-NetAdapterRdma|Get-NetAdapterRsc|Get-NetAdapterRss|Get-NetAdapterSriov|Get-NetAdapterSriovVf|Get-NetAdapterStatistics|Get-NetAdapterVmq|Get-NetAdapterVmqQueue|Get-NetAdapterVPort|New-NetAdapterAdvancedProperty|Remove-NetAdapterAdvancedProperty|Rename-NetAdapter|Reset-NetAdapterAdvancedProperty|Restart-NetAdapter|Set-NetAdapter|Set-NetAdapterAdvancedProperty|Set-NetAdapterBinding|Set-NetAdapterChecksumOffload|Set-NetAdapterEncapsulatedPacketTaskOffload|Set-NetAdapterIPsecOffload|Set-NetAdapterLso|Set-NetAdapterPacketDirect|Set-NetAdapterPowerManagement|Set-NetAdapterQos|Set-NetAdapterRdma|Set-NetAdapterRsc|Set-NetAdapterRss|Set-NetAdapterSriov|Set-NetAdapterVmq|" + + "Get-NetConnectionProfile|Set-NetConnectionProfile|" + + "Add-NetEventNetworkAdapter|Add-NetEventPacketCaptureProvider|Add-NetEventProvider|Add-NetEventVmNetworkAdapter|Add-NetEventVmSwitch|Add-NetEventWFPCaptureProvider|Get-NetEventNetworkAdapter|Get-NetEventPacketCaptureProvider|Get-NetEventProvider|Get-NetEventSession|Get-NetEventVmNetworkAdapter|Get-NetEventVmSwitch|Get-NetEventWFPCaptureProvider|New-NetEventSession|Remove-NetEventNetworkAdapter|Remove-NetEventPacketCaptureProvider|Remove-NetEventProvider|Remove-NetEventSession|Remove-NetEventVmNetworkAdapter|Remove-NetEventVmSwitch|Remove-NetEventWFPCaptureProvider|Set-NetEventPacketCaptureProvider|Set-NetEventProvider|Set-NetEventSession|Set-NetEventWFPCaptureProvider|Start-NetEventSession|Stop-NetEventSession|" + + "Add-NetLbfoTeamMember|Add-NetLbfoTeamNic|Get-NetLbfoTeam|Get-NetLbfoTeamMember|Get-NetLbfoTeamNic|New-NetLbfoTeam|Remove-NetLbfoTeam|Remove-NetLbfoTeamMember|Remove-NetLbfoTeamNic|Rename-NetLbfoTeam|Set-NetLbfoTeam|Set-NetLbfoTeamMember|Set-NetLbfoTeamNic|" + + "Add-NetNatExternalAddress|Add-NetNatStaticMapping|Get-NetNat|Get-NetNatExternalAddress|Get-NetNatGlobal|Get-NetNatSession|Get-NetNatStaticMapping|New-NetNat|Remove-NetNat|Remove-NetNatExternalAddress|Remove-NetNatStaticMapping|Set-NetNat|Set-NetNatGlobal|" + + "Get-NetQosPolicy|New-NetQosPolicy|Remove-NetQosPolicy|Set-NetQosPolicy|" + + "Copy-NetFirewallRule|Copy-NetIPsecMainModeCryptoSet|Copy-NetIPsecMainModeRule|Copy-NetIPsecPhase1AuthSet|Copy-NetIPsecPhase2AuthSet|Copy-NetIPsecQuickModeCryptoSet|Copy-NetIPsecRule|Disable-NetFirewallRule|Disable-NetIPsecMainModeRule|Disable-NetIPsecRule|Enable-NetFirewallRule|Enable-NetIPsecMainModeRule|Enable-NetIPsecRule|Find-NetIPsecRule|Get-NetFirewallAddressFilter|Get-NetFirewallApplicationFilter|Get-NetFirewallInterfaceFilter|Get-NetFirewallInterfaceTypeFilter|Get-NetFirewallPortFilter|Get-NetFirewallProfile|Get-NetFirewallRule|Get-NetFirewallSecurityFilter|Get-NetFirewallServiceFilter|Get-NetFirewallSetting|Get-NetIPsecDospSetting|Get-NetIPsecMainModeCryptoSet|Get-NetIPsecMainModeRule|Get-NetIPsecMainModeSA|Get-NetIPsecPhase1AuthSet|Get-NetIPsecPhase2AuthSet|Get-NetIPsecQuickModeCryptoSet|Get-NetIPsecQuickModeSA|Get-NetIPsecRule|New-NetFirewallRule|New-NetIPsecDospSetting|New-NetIPsecMainModeCryptoSet|New-NetIPsecMainModeRule|New-NetIPsecPhase1AuthSet|New-NetIPsecPhase2AuthSet|New-NetIPsecQuickModeCryptoSet|New-NetIPsecRule|Open-NetGPO|Remove-NetFirewallRule|Remove-NetIPsecDospSetting|Remove-NetIPsecMainModeCryptoSet|Remove-NetIPsecMainModeRule|Remove-NetIPsecMainModeSA|Remove-NetIPsecPhase1AuthSet|Remove-NetIPsecPhase2AuthSet|Remove-NetIPsecQuickModeCryptoSet|Remove-NetIPsecQuickModeSA|Remove-NetIPsecRule|Rename-NetFirewallRule|Rename-NetIPsecMainModeCryptoSet|Rename-NetIPsecMainModeRule|Rename-NetIPsecPhase1AuthSet|Rename-NetIPsecPhase2AuthSet|Rename-NetIPsecQuickModeCryptoSet|Rename-NetIPsecRule|Save-NetGPO|Set-NetFirewallAddressFilter|Set-NetFirewallApplicationFilter|Set-NetFirewallInterfaceFilter|Set-NetFirewallInterfaceTypeFilter|Set-NetFirewallPortFilter|Set-NetFirewallProfile|Set-NetFirewallRule|Set-NetFirewallSecurityFilter|Set-NetFirewallServiceFilter|Set-NetFirewallSetting|Set-NetIPsecDospSetting|Set-NetIPsecMainModeCryptoSet|Set-NetIPsecMainModeRule|Set-NetIPsecPhase1AuthSet|Set-NetIPsecPhase2AuthSet|Set-NetIPsecQuickModeCryptoSet|Set-NetIPsecRule|Show-NetFirewallRule|Show-NetIPsecRule|Sync-NetIPsecRule|Update-NetIPsecRule|Get-DAPolicyChange|New-NetIPsecAuthProposal|New-NetIPsecMainModeCryptoProposal|New-NetIPsecQuickModeCryptoProposal|" + + "Add-NetSwitchTeamMember|Get-NetSwitchTeam|Get-NetSwitchTeamMember|New-NetSwitchTeam|Remove-NetSwitchTeam|Remove-NetSwitchTeamMember|Rename-NetSwitchTeam|" + + "Find-NetRoute|Get-NetCompartment|Get-NetIPAddress|Get-NetIPConfiguration|Get-NetIPInterface|Get-NetIPv4Protocol|Get-NetIPv6Protocol|Get-NetNeighbor|Get-NetOffloadGlobalSetting|Get-NetPrefixPolicy|Get-NetRoute|Get-NetTCPConnection|Get-NetTCPSetting|Get-NetTransportFilter|Get-NetUDPEndpoint|Get-NetUDPSetting|New-NetIPAddress|New-NetNeighbor|New-NetRoute|New-NetTransportFilter|Remove-NetIPAddress|Remove-NetNeighbor|Remove-NetRoute|Remove-NetTransportFilter|Set-NetIPAddress|Set-NetIPInterface|Set-NetIPv4Protocol|Set-NetIPv6Protocol|Set-NetNeighbor|Set-NetOffloadGlobalSetting|Set-NetRoute|Set-NetTCPSetting|Set-NetUDPSetting|Test-NetConnection|" + + "Get-DAConnectionStatus|Get-NCSIPolicyConfiguration|Reset-NCSIPolicyConfiguration|Set-NCSIPolicyConfiguration|" + + "Disable-NetworkSwitchEthernetPort|Disable-NetworkSwitchFeature|Disable-NetworkSwitchVlan|Enable-NetworkSwitchEthernetPort|Enable-NetworkSwitchFeature|Enable-NetworkSwitchVlan|Get-NetworkSwitchEthernetPort|Get-NetworkSwitchFeature|Get-NetworkSwitchGlobalData|Get-NetworkSwitchVlan|New-NetworkSwitchVlan|Remove-NetworkSwitchEthernetPortIPAddress|Remove-NetworkSwitchVlan|Restore-NetworkSwitchConfiguration|Save-NetworkSwitchConfiguration|Set-NetworkSwitchEthernetPortIPAddress|Set-NetworkSwitchPortMode|Set-NetworkSwitchPortProperty|Set-NetworkSwitchVlanProperty|" + + "Add-NetIPHttpsCertBinding|Disable-NetDnsTransitionConfiguration|Disable-NetIPHttpsProfile|Disable-NetNatTransitionConfiguration|Enable-NetDnsTransitionConfiguration|Enable-NetIPHttpsProfile|Enable-NetNatTransitionConfiguration|Get-Net6to4Configuration|Get-NetDnsTransitionConfiguration|Get-NetDnsTransitionMonitoring|Get-NetIPHttpsConfiguration|Get-NetIPHttpsState|Get-NetIsatapConfiguration|Get-NetNatTransitionConfiguration|Get-NetNatTransitionMonitoring|Get-NetTeredoConfiguration|Get-NetTeredoState|New-NetIPHttpsConfiguration|New-NetNatTransitionConfiguration|Remove-NetIPHttpsCertBinding|Remove-NetIPHttpsConfiguration|Remove-NetNatTransitionConfiguration|Rename-NetIPHttpsConfiguration|Reset-Net6to4Configuration|Reset-NetDnsTransitionConfiguration|Reset-NetIPHttpsConfiguration|Reset-NetIsatapConfiguration|Reset-NetTeredoConfiguration|Set-Net6to4Configuration|Set-NetDnsTransitionConfiguration|Set-NetIPHttpsConfiguration|Set-NetIsatapConfiguration|Set-NetNatTransitionConfiguration|Set-NetTeredoConfiguration|" + + "Find-Package|Find-PackageProvider|Get-Package|Get-PackageProvider|Get-PackageSource|Import-PackageProvider|Install-Package|Install-PackageProvider|Register-PackageSource|Save-Package|Set-PackageSource|Uninstall-Package|Unregister-PackageSource|" + + "Clear-PcsvDeviceLog|Get-PcsvDevice|Get-PcsvDeviceLog|Restart-PcsvDevice|Set-PcsvDeviceBootConfiguration|Set-PcsvDeviceNetworkConfiguration|Set-PcsvDeviceUserPassword|Start-PcsvDevice|Stop-PcsvDevice|" + + "AfterAll|AfterEach|Assert-MockCalled|Assert-VerifiableMocks|BeforeAll|BeforeEach|Context|Describe|Get-MockDynamicParameters|Get-TestDriveItem|In|InModuleScope|Invoke-Mock|Invoke-Pester|It|Mock|New-Fixture|Set-DynamicParameterVariables|Setup|Should|" + + "Add-CertificateEnrollmentPolicyServer|Export-Certificate|Export-PfxCertificate|Get-Certificate|Get-CertificateAutoEnrollmentPolicy|Get-CertificateEnrollmentPolicyServer|Get-CertificateNotificationTask|Get-PfxData|Import-Certificate|Import-PfxCertificate|New-CertificateNotificationTask|New-SelfSignedCertificate|Remove-CertificateEnrollmentPolicyServer|Remove-CertificateNotificationTask|Set-CertificateAutoEnrollmentPolicy|Switch-Certificate|Test-Certificate|" + + "Disable-PnpDevice|Enable-PnpDevice|Get-PnpDevice|Get-PnpDeviceProperty|" + + "Find-DscResource|Find-Module|Find-Script|Get-InstalledModule|Get-InstalledScript|Get-PSRepository|Install-Module|Install-Script|New-ScriptFileInfo|Publish-Module|Publish-Script|Register-PSRepository|Save-Module|Save-Script|Set-PSRepository|Test-ScriptFileInfo|Uninstall-Module|Uninstall-Script|Unregister-PSRepository|Update-Module|Update-ModuleManifest|Update-Script|Update-ScriptFileInfo|" + + "Add-Printer|Add-PrinterDriver|Add-PrinterPort|Get-PrintConfiguration|Get-Printer|Get-PrinterDriver|Get-PrinterPort|Get-PrinterProperty|Get-PrintJob|Read-PrinterNfcTag|Remove-Printer|Remove-PrinterDriver|Remove-PrinterPort|Remove-PrintJob|Rename-Printer|Restart-PrintJob|Resume-PrintJob|Set-PrintConfiguration|Set-Printer|Set-PrinterProperty|Suspend-PrintJob|Write-PrinterNfcTag|" + + "Configuration|Disable-DscDebug|Enable-DscDebug|Get-DscConfiguration|Get-DscConfigurationStatus|Get-DscLocalConfigurationManager|Get-DscResource|New-DscChecksum|Remove-DscConfigurationDocument|Restore-DscConfiguration|Stop-DscConfiguration|Invoke-DscResource|Publish-DscConfiguration|Set-DscLocalConfigurationManager|Start-DscConfiguration|Test-DscConfiguration|Update-DscConfiguration|" + + "Disable-PSTrace|Disable-PSWSManCombinedTrace|Disable-WSManTrace|Enable-PSTrace|Enable-PSWSManCombinedTrace|Enable-WSManTrace|Get-LogProperties|Set-LogProperties|Start-Trace|Stop-Trace|" + + "PSConsoleHostReadline|Get-PSReadlineKeyHandler|Get-PSReadlineOption|Remove-PSReadlineKeyHandler|Set-PSReadlineKeyHandler|Set-PSReadlineOption|" + + "Add-JobTrigger|Disable-JobTrigger|Disable-ScheduledJob|Enable-JobTrigger|Enable-ScheduledJob|Get-JobTrigger|Get-ScheduledJob|Get-ScheduledJobOption|New-JobTrigger|New-ScheduledJobOption|Register-ScheduledJob|Remove-JobTrigger|Set-JobTrigger|Set-ScheduledJob|Set-ScheduledJobOption|Unregister-ScheduledJob|" + + "New-PSWorkflowSession|New-PSWorkflowExecutionOption|" + + "Invoke-AsWorkflow|" + + "Disable-ScheduledTask|Enable-ScheduledTask|Export-ScheduledTask|Get-ClusteredScheduledTask|Get-ScheduledTask|Get-ScheduledTaskInfo|New-ScheduledTask|New-ScheduledTaskAction|New-ScheduledTaskPrincipal|New-ScheduledTaskSettingsSet|New-ScheduledTaskTrigger|Register-ClusteredScheduledTask|Register-ScheduledTask|Set-ClusteredScheduledTask|Set-ScheduledTask|Start-ScheduledTask|Stop-ScheduledTask|Unregister-ClusteredScheduledTask|Unregister-ScheduledTask|" + + "Confirm-SecureBootUEFI|Format-SecureBootUEFI|Get-SecureBootPolicy|Get-SecureBootUEFI|Set-SecureBootUEFI|" + + "Block-SmbShareAccess|Close-SmbOpenFile|Close-SmbSession|Disable-SmbDelegation|Enable-SmbDelegation|Get-SmbBandwidthLimit|Get-SmbClientConfiguration|Get-SmbClientNetworkInterface|Get-SmbConnection|Get-SmbDelegation|Get-SmbMapping|Get-SmbMultichannelConnection|Get-SmbMultichannelConstraint|Get-SmbOpenFile|Get-SmbServerConfiguration|Get-SmbServerNetworkInterface|Get-SmbSession|Get-SmbShare|Get-SmbShareAccess|Grant-SmbShareAccess|New-SmbMapping|New-SmbMultichannelConstraint|New-SmbShare|Remove-SmbBandwidthLimit|Remove-SmbMapping|Remove-SmbMultichannelConstraint|Remove-SmbShare|Revoke-SmbShareAccess|Set-SmbBandwidthLimit|Set-SmbClientConfiguration|Set-SmbPathAcl|Set-SmbServerConfiguration|Set-SmbShare|Unblock-SmbShareAccess|Update-SmbMultichannelConnection|" + + "Move-SmbClient|Get-SmbWitnessClient|Move-SmbWitnessClient|" + + "Get-StartApps|Export-StartLayout|Import-StartLayout|" + + "Disable-PhysicalDiskIndication|Disable-StorageDiagnosticLog|Enable-PhysicalDiskIndication|Enable-StorageDiagnosticLog|Flush-Volume|Get-DiskSNV|Get-PhysicalDiskSNV|Get-StorageEnclosureSNV|Initialize-Volume|Write-FileSystemCache|Add-InitiatorIdToMaskingSet|Add-PartitionAccessPath|Add-PhysicalDisk|Add-TargetPortToMaskingSet|Add-VirtualDiskToMaskingSet|Block-FileShareAccess|Clear-Disk|Clear-FileStorageTier|Clear-StorageDiagnosticInfo|Connect-VirtualDisk|Debug-FileShare|Debug-StorageSubSystem|Debug-Volume|Disable-PhysicalDiskIdentification|Disable-StorageEnclosureIdentification|Disable-StorageHighAvailability|Disconnect-VirtualDisk|Dismount-DiskImage|Enable-PhysicalDiskIdentification|Enable-StorageEnclosureIdentification|Enable-StorageHighAvailability|Format-Volume|Get-DedupProperties|Get-Disk|Get-DiskImage|Get-DiskStorageNodeView|Get-FileIntegrity|Get-FileShare|Get-FileShareAccessControlEntry|Get-FileStorageTier|Get-InitiatorId|Get-InitiatorPort|Get-MaskingSet|Get-OffloadDataTransferSetting|Get-Partition|Get-PartitionSupportedSize|Get-PhysicalDisk|Get-PhysicalDiskStorageNodeView|Get-ResiliencySetting|Get-StorageAdvancedProperty|Get-StorageDiagnosticInfo|Get-StorageEnclosure|Get-StorageEnclosureStorageNodeView|Get-StorageEnclosureVendorData|Get-StorageFaultDomain|Get-StorageFileServer|Get-StorageFirmwareInformation|Get-StorageHealthAction|Get-StorageHealthReport|Get-StorageHealthSetting|Get-StorageJob|Get-StorageNode|Get-StoragePool|Get-StorageProvider|Get-StorageReliabilityCounter|Get-StorageSetting|Get-StorageSubSystem|Get-StorageTier|Get-StorageTierSupportedSize|Get-SupportedClusterSizes|Get-SupportedFileSystems|Get-TargetPort|Get-TargetPortal|Get-VirtualDisk|Get-VirtualDiskSupportedSize|Get-Volume|Get-VolumeCorruptionCount|Get-VolumeScrubPolicy|Grant-FileShareAccess|Hide-VirtualDisk|Initialize-Disk|Mount-DiskImage|New-FileShare|New-MaskingSet|New-Partition|New-StorageFileServer|New-StoragePool|New-StorageSubsystemVirtualDisk|New-StorageTier|New-VirtualDisk|New-VirtualDiskClone|New-VirtualDiskSnapshot|New-Volume|Optimize-StoragePool|Optimize-Volume|Register-StorageSubsystem|Remove-FileShare|Remove-InitiatorId|Remove-InitiatorIdFromMaskingSet|Remove-MaskingSet|Remove-Partition|Remove-PartitionAccessPath|Remove-PhysicalDisk|Remove-StorageFileServer|Remove-StorageHealthSetting|Remove-StoragePool|Remove-StorageTier|Remove-TargetPortFromMaskingSet|Remove-VirtualDisk|Remove-VirtualDiskFromMaskingSet|Rename-MaskingSet|Repair-FileIntegrity|Repair-VirtualDisk|Repair-Volume|Reset-PhysicalDisk|Reset-StorageReliabilityCounter|Resize-Partition|Resize-StorageTier|Resize-VirtualDisk|Revoke-FileShareAccess|Set-Disk|Set-FileIntegrity|Set-FileShare|Set-FileStorageTier|Set-InitiatorPort|Set-Partition|Set-PhysicalDisk|Set-ResiliencySetting|Set-StorageFileServer|Set-StorageHealthSetting|Set-StoragePool|Set-StorageProvider|Set-StorageSetting|Set-StorageSubSystem|Set-StorageTier|Set-VirtualDisk|Set-Volume|Set-VolumeScrubPolicy|Show-VirtualDisk|Start-StorageDiagnosticLog|Stop-StorageDiagnosticLog|Stop-StorageJob|Unblock-FileShareAccess|Unregister-StorageSubsystem|Update-Disk|Update-HostStorageCache|Update-StorageFirmware|Update-StoragePool|Update-StorageProviderCache|Write-VolumeCache|" + + "Disable-TlsCipherSuite|Disable-TlsSessionTicketKey|Enable-TlsCipherSuite|Enable-TlsSessionTicketKey|Export-TlsSessionTicketKey|Get-TlsCipherSuite|New-TlsSessionTicketKey|" + + "Get-TroubleshootingPack|Invoke-TroubleshootingPack|" + + "Clear-Tpm|ConvertTo-TpmOwnerAuth|Disable-TpmAutoProvisioning|Enable-TpmAutoProvisioning|Get-Tpm|Get-TpmEndorsementKeyInfo|Get-TpmSupportedFeature|Import-TpmOwnerAuth|Initialize-Tpm|Set-TpmOwnerAuth|Unblock-Tpm|" + + "Add-VpnConnection|Add-VpnConnectionRoute|Add-VpnConnectionTriggerApplication|Add-VpnConnectionTriggerDnsConfiguration|Add-VpnConnectionTriggerTrustedNetwork|Get-VpnConnection|Get-VpnConnectionTrigger|New-EapConfiguration|New-VpnServerAddress|Remove-VpnConnection|Remove-VpnConnectionRoute|Remove-VpnConnectionTriggerApplication|Remove-VpnConnectionTriggerDnsConfiguration|Remove-VpnConnectionTriggerTrustedNetwork|Set-VpnConnection|Set-VpnConnectionIPsecConfiguration|Set-VpnConnectionProxy|Set-VpnConnectionTriggerDnsConfiguration|Set-VpnConnectionTriggerTrustedNetwork|" + + "Add-OdbcDsn|Disable-OdbcPerfCounter|Disable-WdacBidTrace|Enable-OdbcPerfCounter|Enable-WdacBidTrace|Get-OdbcDriver|Get-OdbcDsn|Get-OdbcPerfCounter|Get-WdacBidTrace|Remove-OdbcDsn|Set-OdbcDriver|Set-OdbcDsn|" + + "Get-WindowsDeveloperLicense|Show-WindowsDeveloperLicenseRegistration|Unregister-WindowsDeveloperLicense|" + + "Disable-WindowsErrorReporting|Enable-WindowsErrorReporting|Get-WindowsErrorReporting|" + + "Get-WindowsSearchSetting|Set-WindowsSearchSetting|" + + "Get-WindowsUpdateLog" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords + }, "identifier"); + var binaryOperatorsRe = ( + "eq|ne|gt|lt|le|ge|like|notlike|match|notmatch|contains|notcontains|in|notin|band|bor|bxor|bnot|" + + "ceq|cne|cgt|clt|cle|cge|clike|cnotlike|cmatch|cnotmatch|ccontains|cnotcontains|cin|cnotin|" + + "ieq|ine|igt|ilt|ile|ige|ilike|inotlike|imatch|inotmatch|icontains|inotcontains|iin|inotin|" + + "and|or|xor|not|" + + "split|join|replace|f|" + + "csplit|creplace|" + + "isplit|ireplace|" + + "is|isnot|as|" + + "shl|shr" + ); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment.start", + regex : "<#", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "[$](?:[Tt]rue|[Ff]alse)\\b" + }, { + token : "constant.language", + regex : "[$][Nn]ull\\b" + }, { + token : "variable.instance", + regex : "[$][a-zA-Z][a-zA-Z0-9_]*\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$\\-]*\\b" + }, { + token : "keyword.operator", + regex : "\\-(?:" + binaryOperatorsRe + ")" + }, { + token : "keyword.operator", + regex : "&|\\+|\\-|\\*|\\/|\\%|\\=|\\>|\\&|\\!|\\|" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment.end", + regex : "#>", + next : "start" + }, { + token : "doc.comment.tag", + regex : "^\\.\\w+" + }, { + defaultToken : "comment" + } + ] + }; +}; + +oop.inherits(PowershellHighlightRules, TextHighlightRules); + +exports.PowershellHighlightRules = PowershellHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/powershell",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/powershell_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PowershellHighlightRules = require("./powershell_highlight_rules").PowershellHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = PowershellHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode({start: "^\\s*(<#)", end: "^[#\\s]>\\s*$"}); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + this.blockComment = {start: "<#", end: "#>"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + + this.createWorker = function(session) { + return null; + }; + + this.$id = "ace/mode/powershell"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-praat.js b/src/libs/ace/mode-praat.js new file mode 100755 index 0000000..a3a50f7 --- /dev/null +++ b/src/libs/ace/mode-praat.js @@ -0,0 +1,468 @@ +ace.define("ace/mode/praat_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PraatHighlightRules = function() { + + var keywords = ( + "if|then|else|elsif|elif|endif|fi|" + + "endfor|endproc|" + // related keywords specified below + "while|endwhile|" + + "repeat|until|" + + "select|plus|minus|" + + "assert|asserterror" + ); + + var predefinedVariables = ( + "macintosh|windows|unix|" + + "praatVersion|praatVersion\\$" + + "pi|undefined|" + + "newline\\$|tab\\$|" + + "shellDirectory\\$|homeDirectory\\$|preferencesDirectory\\$|" + + "temporaryDirectory\\$|defaultDirectory\\$" + ); + var directives = ( + "clearinfo|endSendPraat" + ); + + var functions = ( + "writeInfo|writeInfoLine|appendInfo|appendInfoLine|info\\$|" + + "writeFile|writeFileLine|appendFile|appendFileLine|" + + "abs|round|floor|ceiling|min|max|imin|imax|" + + "sqrt|sin|cos|tan|arcsin|arccos|arctan|arctan2|sinc|sincpi|" + + "exp|ln|lnBeta|lnGamma|log10|log2|" + + "sinh|cosh|tanh|arcsinh|arccosh|arctanh|" + + "sigmoid|invSigmoid|erf|erfc|" + + "random(?:Uniform|Integer|Gauss|Poisson|Binomial)|" + + "gaussP|gaussQ|invGaussQ|incompleteGammaP|incompleteBeta|" + + "chiSquareP|chiSquareQ|invChiSquareQ|studentP|studentQ|invStudentQ|" + + "fisherP|fisherQ|invFisherQ|" + + "binomialP|binomialQ|invBinomialP|invBinomialQ|" + + "hertzToBark|barkToHerz|" + + "hertzToMel|melToHertz|" + + "hertzToSemitones|semitonesToHerz|" + + "erb|hertzToErb|erbToHertz|" + + "phonToDifferenceLimens|differenceLimensToPhon|" + + "soundPressureToPhon|" + + "beta|beta2|besselI|besselK|" + + "numberOfColumns|numberOfRows|" + + "selected|selected\\$|numberOfSelected|variableExists|"+ + "index|rindex|startsWith|endsWith|"+ + "index_regex|rindex_regex|replace_regex\\$|"+ + "length|extractWord\\$|extractLine\\$|extractNumber|" + + "left\\$|right\\$|mid\\$|replace\\$|" + + "date\\$|fixed\\$|percent\\$|" + + "zero#|linear#|randomUniform#|randomInteger#|randomGauss#|" + + "beginPause|endPause|" + + "demoShow|demoWindowTitle|demoInput|demoWaitForInput|" + + "demoClicked|demoClickedIn|demoX|demoY|" + + "demoKeyPressed|demoKey\\$|" + + "demoExtraControlKeyPressed|demoShiftKeyPressed|"+ + "demoCommandKeyPressed|demoOptionKeyPressed|" + + "environment\\$|chooseReadFile\\$|" + + "chooseDirectory\\$|createDirectory|fileReadable|deleteFile|" + + "selectObject|removeObject|plusObject|minusObject|" + + "runScript|exitScript|" + + "beginSendPraat|endSendPraat|" + + "objectsAreIdentical" + ); + + var objectTypes = ( + "Activation|AffineTransform|AmplitudeTier|Art|Artword|Autosegment|" + + "BarkFilter|CCA|Categories|Cepstrum|Cepstrumc|ChebyshevSeries|" + + "ClassificationTable|Cochleagram|Collection|Configuration|" + + "Confusion|ContingencyTable|Corpus|Correlation|Covariance|" + + "CrossCorrelationTable|CrossCorrelationTables|DTW|Diagonalizer|" + + "Discriminant|Dissimilarity|Distance|Distributions|DurationTier|" + + "EEG|ERP|ERPTier|Eigen|Excitation|Excitations|ExperimentMFC|FFNet|" + + "FeatureWeights|Formant|FormantFilter|FormantGrid|FormantPoint|" + + "FormantTier|GaussianMixture|HMM|HMM_Observation|" + + "HMM_ObservationSequence|HMM_State|HMM_StateSequence|Harmonicity|" + + "ISpline|Index|Intensity|IntensityTier|IntervalTier|KNN|KlattGrid|" + + "KlattTable|LFCC|LPC|Label|LegendreSeries|LinearRegression|" + + "LogisticRegression|LongSound|Ltas|MFCC|MSpline|ManPages|" + + "Manipulation|Matrix|MelFilter|MixingMatrix|Movie|Network|" + + "OTGrammar|OTHistory|OTMulti|PCA|PairDistribution|ParamCurve|" + + "Pattern|Permutation|Pitch|PitchTier|PointProcess|Polygon|" + + "Polynomial|Procrustes|RealPoint|RealTier|ResultsMFC|Roots|SPINET|" + + "SSCP|SVD|Salience|ScalarProduct|Similarity|SimpleString|" + + "SortedSetOfString|Sound|Speaker|Spectrogram|Spectrum|SpectrumTier|" + + "SpeechSynthesizer|SpellingChecker|Strings|StringsIndex|Table|" + + "TableOfReal|TextGrid|TextInterval|TextPoint|TextTier|Tier|" + + "Transition|VocalTract|Weight|WordList" + ); + + this.$rules = { + "start" : [ + { + token : "string.interpolated", + regex : /'((?:[a-z][a-zA-Z0-9_]*)(?:\$|#|:[0-9]+)?)'/ + }, { + token : ["text", "text", "keyword.operator", "text", "keyword"], + regex : /(^\s*)(?:([a-z][a-zA-Z0-9_]*\$?\s+)(=)(\s+))?(stopwatch)/ + }, { + token : ["text", "keyword", "text", "string"], + regex : /(^\s*)(print(?:line|tab)?|echo|exit|pause|send(?:praat|socket)|include|execute|system(?:_nocheck)?)(\s+)(.*)/ + }, { + token : ["text", "keyword"], + regex : "(^\\s*)(" + directives + ")$" + }, { + token : ["text", "keyword.operator", "text"], + regex : /(\s+)((?:\+|-|\/|\*|<|>)=?|==?|!=|%|\^|\||and|or|not)(\s+)/ + }, { + token : ["text", "text", "keyword.operator", "text", "keyword", "text", "keyword"], + regex : /(^\s*)(?:([a-z][a-zA-Z0-9_]*\$?\s+)(=)(\s+))?(?:((?:no)?warn|(?:unix_)?nocheck|noprogress)(\s+))?((?:[A-Z][^.:"]+)(?:$|(?:\.{3}|:)))/ + }, { + token : ["text", "keyword", "text", "keyword"], + regex : /(^\s*)(?:(demo)?(\s+))((?:[A-Z][^.:"]+)(?:$|(?:\.{3}|:)))/ + }, { + token : ["text", "keyword", "text", "keyword"], + regex : /^(\s*)(?:(demo)(\s+))?(10|12|14|16|24)$/ + }, { + token : ["text", "support.function", "text"], + regex : /(\s*)(do\$?)(\s*:\s*|\s*\(\s*)/ + }, { + token : "entity.name.type", + regex : "(" + objectTypes + ")" + }, { + token : "variable.language", + regex : "(" + predefinedVariables + ")" + }, { + token : ["support.function", "text"], + regex : "((?:" + functions + ")\\$?)(\\s*(?::|\\())" + }, { + token : "keyword", + regex : /(\bfor\b)/, + next : "for" + }, { + token : "keyword", + regex : "(\\b(?:" + keywords + ")\\b)" + }, { + token : "string", + regex : /"[^"]*"/ + }, { + token : "string", + regex : /"[^"]*$/, + next : "brokenstring" + }, { + token : ["text", "keyword", "text", "entity.name.section"], + regex : /(^\s*)(\bform\b)(\s+)(.*)/, + next : "form" + }, { + token : "constant.numeric", + regex : /\b[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : ["keyword", "text", "entity.name.function"], + regex : /(procedure)(\s+)(\S+)/ + }, { + token : ["entity.name.function", "text"], + regex : /(@\S+)(:|\s*\()/ + }, { + token : ["text", "keyword", "text", "entity.name.function"], + regex : /(^\s*)(call)(\s+)(\S+)/ + }, { + token : "comment", + regex : /(^\s*#|;).*$/ + }, { + token : "text", + regex : /\s+/ + } + ], + "form" : [ + { + token : ["keyword", "text", "constant.numeric"], + regex : /((?:optionmenu|choice)\s+)(\S+:\s+)([0-9]+)/ + }, { + token : ["keyword", "constant.numeric"], + regex : /((?:option|button)\s+)([+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b)/ + }, { + token : ["keyword", "string"], + regex : /((?:option|button)\s+)(.*)/ + }, { + token : ["keyword", "text", "string"], + regex : /((?:sentence|text)\s+)(\S+\s*)(.*)/ + }, { + token : ["keyword", "text", "string", "invalid.illegal"], + regex : /(word\s+)(\S+\s*)(\S+)?(\s.*)?/ + }, { + token : ["keyword", "text", "constant.language"], + regex : /(boolean\s+)(\S+\s*)(0|1|"?(?:yes|no)"?)/ + }, { + token : ["keyword", "text", "constant.numeric"], + regex : /((?:real|natural|positive|integer)\s+)(\S+\s*)([+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b)/ + }, { + token : ["keyword", "string"], + regex : /(comment\s+)(.*)/ + }, { + token : "keyword", + regex : 'endform', + next : "start" + } + ], + "for" : [ + { + token : ["keyword", "text", "constant.numeric", "text"], + regex : /(from|to)(\s+)([+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?)(\s*)/ + }, { + token : ["keyword", "text"], + regex : /(from|to)(\s+\S+\s*)/ + }, { + token : "text", + regex : /$/, + next : "start" + } + ], + "brokenstring" : [ + { + token : ["text", "string"], + regex : /(\s*\.{3})([^"]*)/ + }, { + token : "string", + regex : /"/, + next : "start" + } + ] + }; +}; + +oop.inherits(PraatHighlightRules, TextHighlightRules); + +exports.PraatHighlightRules = PraatHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/praat",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/praat_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PraatHighlightRules = require("./praat_highlight_rules").PraatHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = PraatHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/praat"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-prolog.js b/src/libs/ace/mode-prolog.js new file mode 100755 index 0000000..6bf01ad --- /dev/null +++ b/src/libs/ace/mode-prolog.js @@ -0,0 +1,364 @@ +ace.define("ace/mode/prolog_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PrologHighlightRules = function() { + + this.$rules = { start: + [ { include: '#comment' }, + { include: '#basic_fact' }, + { include: '#rule' }, + { include: '#directive' }, + { include: '#fact' } ], + '#atom': + [ { token: 'constant.other.atom.prolog', + regex: '\\b[a-z][a-zA-Z0-9_]*\\b' }, + { token: 'constant.numeric.prolog', + regex: '-?\\d+(?:\\.\\d+)?' }, + { include: '#string' } ], + '#basic_elem': + [ { include: '#comment' }, + { include: '#statement' }, + { include: '#constants' }, + { include: '#operators' }, + { include: '#builtins' }, + { include: '#list' }, + { include: '#atom' }, + { include: '#variable' } ], + '#basic_fact': + [ { token: + [ 'entity.name.function.fact.basic.prolog', + 'punctuation.end.fact.basic.prolog' ], + regex: '([a-z]\\w*)(\\.)' } ], + '#builtins': + [ { token: 'support.function.builtin.prolog', + regex: '\\b(?:abolish|abort|ancestors|arg|ascii|assert[az]|atom(?:ic)?|body|char|close|conc|concat|consult|define|definition|dynamic|dump|fail|file|free|free_proc|functor|getc|goal|halt|head|head|integer|length|listing|match_args|member|next_clause|nl|nonvar|nth|number|cvars|nvars|offset|op|print?|prompt|putc|quoted|ratom|read|redefine|rename|retract(?:all)?|see|seeing|seen|skip|spy|statistics|system|tab|tell|telling|term|time|told|univ|unlink_clause|unspy_predicate|var|write)\\b' } ], + '#comment': + [ { token: + [ 'punctuation.definition.comment.prolog', + 'comment.line.percentage.prolog' ], + regex: '(%)(.*$)' }, + { token: 'punctuation.definition.comment.prolog', + regex: '/\\*', + push: + [ { token: 'punctuation.definition.comment.prolog', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.prolog' } ] } ], + '#constants': + [ { token: 'constant.language.prolog', + regex: '\\b(?:true|false|yes|no)\\b' } ], + '#directive': + [ { token: 'keyword.operator.directive.prolog', + regex: ':-', + push: + [ { token: 'meta.directive.prolog', regex: '\\.', next: 'pop' }, + { include: '#comment' }, + { include: '#statement' }, + { defaultToken: 'meta.directive.prolog' } ] } ], + '#expr': + [ { include: '#comments' }, + { token: 'meta.expression.prolog', + regex: '\\(', + push: + [ { token: 'meta.expression.prolog', regex: '\\)', next: 'pop' }, + { include: '#expr' }, + { defaultToken: 'meta.expression.prolog' } ] }, + { token: 'keyword.control.cutoff.prolog', regex: '!' }, + { token: 'punctuation.control.and.prolog', regex: ',' }, + { token: 'punctuation.control.or.prolog', regex: ';' }, + { include: '#basic_elem' } ], + '#fact': + [ { token: + [ 'entity.name.function.fact.prolog', + 'punctuation.begin.fact.parameters.prolog' ], + regex: '([a-z]\\w*)(\\()(?!.*:-)', + push: + [ { token: + [ 'punctuation.end.fact.parameters.prolog', + 'punctuation.end.fact.prolog' ], + regex: '(\\))(\\.?)', + next: 'pop' }, + { include: '#parameter' }, + { defaultToken: 'meta.fact.prolog' } ] } ], + '#list': + [ { token: 'punctuation.begin.list.prolog', + regex: '\\[(?=.*\\])', + push: + [ { token: 'punctuation.end.list.prolog', + regex: '\\]', + next: 'pop' }, + { include: '#comment' }, + { token: 'punctuation.separator.list.prolog', regex: ',' }, + { token: 'punctuation.concat.list.prolog', + regex: '\\|', + push: + [ { token: 'meta.list.concat.prolog', + regex: '(?=\\s*\\])', + next: 'pop' }, + { include: '#basic_elem' }, + { defaultToken: 'meta.list.concat.prolog' } ] }, + { include: '#basic_elem' }, + { defaultToken: 'meta.list.prolog' } ] } ], + '#operators': + [ { token: 'keyword.operator.prolog', + regex: '\\\\\\+|\\bnot\\b|\\bis\\b|->|[><]|[><\\\\:=]?=|(?:=\\\\|\\\\=)=' } ], + '#parameter': + [ { token: 'variable.language.anonymous.prolog', + regex: '\\b_\\b' }, + { token: 'variable.parameter.prolog', + regex: '\\b[A-Z_]\\w*\\b' }, + { token: 'punctuation.separator.parameters.prolog', regex: ',' }, + { include: '#basic_elem' }, + { token: 'text', regex: '[^\\s]' } ], + '#rule': + [ { token: 'meta.rule.prolog', + regex: '(?=[a-z]\\w*.*:-)', + push: + [ { token: 'punctuation.rule.end.prolog', + regex: '\\.', + next: 'pop' }, + { token: 'meta.rule.signature.prolog', + regex: '(?=[a-z]\\w*.*:-)', + push: + [ { token: 'meta.rule.signature.prolog', + regex: '(?=:-)', + next: 'pop' }, + { token: 'entity.name.function.rule.prolog', + regex: '[a-z]\\w*(?=\\(|\\s*:-)' }, + { token: 'punctuation.rule.parameters.begin.prolog', + regex: '\\(', + push: + [ { token: 'punctuation.rule.parameters.end.prolog', + regex: '\\)', + next: 'pop' }, + { include: '#parameter' }, + { defaultToken: 'meta.rule.parameters.prolog' } ] }, + { defaultToken: 'meta.rule.signature.prolog' } ] }, + { token: 'keyword.operator.definition.prolog', + regex: ':-', + push: + [ { token: 'meta.rule.definition.prolog', + regex: '(?=\\.)', + next: 'pop' }, + { include: '#comment' }, + { include: '#expr' }, + { defaultToken: 'meta.rule.definition.prolog' } ] }, + { defaultToken: 'meta.rule.prolog' } ] } ], + '#statement': + [ { token: 'meta.statement.prolog', + regex: '(?=[a-z]\\w*\\()', + push: + [ { token: 'punctuation.end.statement.parameters.prolog', + regex: '\\)', + next: 'pop' }, + { include: '#builtins' }, + { include: '#atom' }, + { token: 'punctuation.begin.statement.parameters.prolog', + regex: '\\(', + push: + [ { token: 'meta.statement.parameters.prolog', + regex: '(?=\\))', + next: 'pop' }, + { token: 'punctuation.separator.statement.prolog', regex: ',' }, + { include: '#basic_elem' }, + { defaultToken: 'meta.statement.parameters.prolog' } ] }, + { defaultToken: 'meta.statement.prolog' } ] } ], + '#string': + [ { token: 'punctuation.definition.string.begin.prolog', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.prolog', + regex: '\'', + next: 'pop' }, + { token: 'constant.character.escape.prolog', regex: '\\\\.' }, + { token: 'constant.character.escape.quote.prolog', + regex: '\'\'' }, + { defaultToken: 'string.quoted.single.prolog' } ] } ], + '#variable': + [ { token: 'variable.language.anonymous.prolog', + regex: '\\b_\\b' }, + { token: 'variable.other.prolog', + regex: '\\b[A-Z_][a-zA-Z0-9_]*\\b' } ] } + + this.normalizeRules(); +}; + +PrologHighlightRules.metaData = { fileTypes: [ 'plg', 'prolog' ], + foldingStartMarker: '(%\\s*region \\w*)|([a-z]\\w*.*:- ?)', + foldingStopMarker: '(%\\s*end(\\s*region)?)|(?=\\.)', + keyEquivalent: '^~P', + name: 'Prolog', + scopeName: 'source.prolog' } + + +oop.inherits(PrologHighlightRules, TextHighlightRules); + +exports.PrologHighlightRules = PrologHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/prolog",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/prolog_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PrologHighlightRules = require("./prolog_highlight_rules").PrologHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = PrologHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "%"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/prolog"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-properties.js b/src/libs/ace/mode-properties.js new file mode 100755 index 0000000..2e9ba72 --- /dev/null +++ b/src/libs/ace/mode-properties.js @@ -0,0 +1,73 @@ +ace.define("ace/mode/properties_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PropertiesHighlightRules = function() { + + var escapeRe = /\\u[0-9a-fA-F]{4}|\\/; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : /[!#].*$/ + }, { + token : "keyword", + regex : /[=:]$/ + }, { + token : "keyword", + regex : /[=:]/, + next : "value" + }, { + token : "constant.language.escape", + regex : escapeRe + }, { + defaultToken: "variable" + } + ], + "value" : [ + { + regex : /\\$/, + token : "string", + next : "value" + }, { + regex : /$/, + token : "string", + next : "start" + }, { + token : "constant.language.escape", + regex : escapeRe + }, { + defaultToken: "string" + } + ] + }; + +}; + +oop.inherits(PropertiesHighlightRules, TextHighlightRules); + +exports.PropertiesHighlightRules = PropertiesHighlightRules; +}); + +ace.define("ace/mode/properties",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/properties_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PropertiesHighlightRules = require("./properties_highlight_rules").PropertiesHighlightRules; + +var Mode = function() { + this.HighlightRules = PropertiesHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/properties"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-protobuf.js b/src/libs/ace/mode-protobuf.js new file mode 100755 index 0000000..8cef657 --- /dev/null +++ b/src/libs/ace/mode-protobuf.js @@ -0,0 +1,577 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/c_cpp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var cFunctions = exports.cFunctions = "\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\b" + +var c_cppHighlightRules = function() { + + var keywordControls = ( + "break|case|continue|default|do|else|for|goto|if|_Pragma|" + + "return|switch|while|catch|operator|try|throw|using" + ); + + var storageType = ( + "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" + + "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" + + "class|wchar_t|template|char16_t|char32_t" + ); + + var storageModifiers = ( + "const|extern|register|restrict|static|volatile|inline|private|" + + "protected|public|friend|explicit|virtual|export|mutable|typename|" + + "constexpr|new|delete|alignas|alignof|decltype|noexcept|thread_local" + ); + + var keywordOperators = ( + "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" + + "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace" + ); + + var builtinConstants = ( + "NULL|true|false|TRUE|FALSE|nullptr" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword.control" : keywordControls, + "storage.type" : storageType, + "storage.modifier" : storageModifiers, + "keyword.operator" : keywordOperators, + "variable.language": "this", + "constant.language": builtinConstants + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + var escapeRe = /\\(?:['"?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}U[a-fA-F\d]{8}|.)/.source; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "//$", + next : "start" + }, { + token : "comment", + regex : "//", + next : "singleLineComment" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // character + regex : "'(?:" + escapeRe + "|.)?'" + }, { + token : "string.start", + regex : '"', + stateName: "qqstring", + next: [ + { token: "string", regex: /\\\s*$/, next: "qqstring" }, + { token: "constant.language.escape", regex: escapeRe }, + { token: "constant.language.escape", regex: /%[^'"\\]/ }, + { token: "string.end", regex: '"|$', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "string.start", + regex : 'R"\\(', + stateName: "rawString", + next: [ + { token: "string.end", regex: '\\)"', next: "start" }, + { defaultToken: "string"} + ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "#\\s*(?:include|import|pragma|line|define|undef)\\b", + next : "directive" + }, { + token : "keyword", // special case pre-compiler directive + regex : "#\\s*(?:endif|if|ifdef|else|elif|ifndef)\\b" + }, { + token : "support.function.C99.c", + regex : cFunctions + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*" + }, { + token : "keyword.operator", + regex : /--|\+\+|<<=|>>=|>>>=|<>|&&|\|\||\?:|[*%\/+\-&\^|~!<>=]=?/ + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "singleLineComment" : [ + { + token : "comment", + regex : /\\$/, + next : "singleLineComment" + }, { + token : "comment", + regex : /$/, + next : "start" + }, { + defaultToken: "comment" + } + ], + "directive" : [ + { + token : "constant.other.multiline", + regex : /\\/ + }, + { + token : "constant.other.multiline", + regex : /.*\\/ + }, + { + token : "constant.other", + regex : "\\s*<.+?>", + next : "start" + }, + { + token : "constant.other", // single line + regex : '\\s*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]', + next : "start" + }, + { + token : "constant.other", // single line + regex : "\\s*['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']", + next : "start" + }, + { + token : "constant.other", + regex : /[^\\\/]+/, + next : "start" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(c_cppHighlightRules, TextHighlightRules); + +exports.c_cppHighlightRules = c_cppHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/c_cpp",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/c_cpp_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = c_cppHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/c_cpp"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/protobuf_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { + "use strict"; + + var oop = require("../lib/oop"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + + var ProtobufHighlightRules = function() { + + var builtinTypes = "double|float|int32|int64|uint32|uint64|sint32|" + + "sint64|fixed32|fixed64|sfixed32|sfixed64|bool|" + + "string|bytes"; + var keywordDeclaration = "message|required|optional|repeated|package|" + + "import|option|enum"; + + var keywordMapper = this.createKeywordMapper({ + "keyword.declaration.protobuf": keywordDeclaration, + "support.type": builtinTypes + }, "identifier"); + + this.$rules = { + "start": [{ + token: "comment", + regex: /\/\/.*$/ + }, { + token: "comment", + regex: /\/\*/, + next: "comment" + }, { + token: "constant", + regex: "<[^>]+>" + }, { + regex: "=", + token: "keyword.operator.assignment.protobuf" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : '[\'](?:(?:\\\\.)|(?:[^\'\\\\]))*?[\']' + }, { + token: "constant.numeric", // hex + regex: "0[xX][0-9a-fA-F]+\\b" + }, { + token: "constant.numeric", // float + regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token: keywordMapper, + regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }], + "comment": [{ + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + }] + }; + + this.normalizeRules(); + }; + + oop.inherits(ProtobufHighlightRules, TextHighlightRules); + + exports.ProtobufHighlightRules = ProtobufHighlightRules; +}); + +ace.define("ace/mode/protobuf",["require","exports","module","ace/lib/oop","ace/mode/c_cpp","ace/mode/protobuf_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var CMode = require("./c_cpp").Mode; +var ProtobufHighlightRules = require("./protobuf_highlight_rules").ProtobufHighlightRules; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + CMode.call(this); + this.foldingRules = new CStyleFoldMode(); + this.HighlightRules = ProtobufHighlightRules; +}; +oop.inherits(Mode, CMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/protobuf"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-python.js b/src/libs/ace/mode-python.js new file mode 100755 index 0000000..19efccb --- /dev/null +++ b/src/libs/ace/mode-python.js @@ -0,0 +1,265 @@ +ace.define("ace/mode/python_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var PythonHighlightRules = function() { + + var keywords = ( + "and|as|assert|break|class|continue|def|del|elif|else|except|exec|" + + "finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|" + + "raise|return|try|while|with|yield" + ); + + var builtinConstants = ( + "True|False|None|NotImplemented|Ellipsis|__debug__" + ); + + var builtinFunctions = ( + "abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|" + + "eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|" + + "binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|" + + "float|list|raw_input|unichr|callable|format|locals|reduce|unicode|" + + "chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|" + + "cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|" + + "__import__|complex|hash|min|set|apply|delattr|help|next|setattr|" + + "buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern" + ); + var keywordMapper = this.createKeywordMapper({ + "invalid.deprecated": "debugger", + "support.function": builtinFunctions, + "constant.language": builtinConstants, + "keyword": keywords + }, "identifier"); + + var strPre = "(?:r|u|ur|R|U|UR|Ur|uR)?"; + + var decimalInteger = "(?:(?:[1-9]\\d*)|(?:0))"; + var octInteger = "(?:0[oO]?[0-7]+)"; + var hexInteger = "(?:0[xX][\\dA-Fa-f]+)"; + var binInteger = "(?:0[bB][01]+)"; + var integer = "(?:" + decimalInteger + "|" + octInteger + "|" + hexInteger + "|" + binInteger + ")"; + + var exponent = "(?:[eE][+-]?\\d+)"; + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + exponent + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + + var stringEscape = "\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\abfnrtv'\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})"; + + this.$rules = { + "start" : [ { + token : "comment", + regex : "#.*$" + }, { + token : "string", // multi line """ string start + regex : strPre + '"{3}', + next : "qqstring3" + }, { + token : "string", // " string + regex : strPre + '"(?=.)', + next : "qqstring" + }, { + token : "string", // multi line ''' string start + regex : strPre + "'{3}", + next : "qstring3" + }, { + token : "string", // ' string + regex : strPre + "'(?=.)", + next : "qstring" + }, { + token : "constant.numeric", // imaginary + regex : "(?:" + floatNumber + "|\\d+)[jJ]\\b" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // long integer + regex : integer + "[lL]\\b" + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|%|<<|>>|&|\\||\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]\\)\\}]" + }, { + token : "text", + regex : "\\s+" + } ], + "qqstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line """ string end + regex : '"{3}', + next : "start" + }, { + defaultToken : "string" + } ], + "qstring3" : [ { + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", // multi line ''' string end + regex : "'{3}", + next : "start" + }, { + defaultToken : "string" + } ], + "qqstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "start" + }, { + defaultToken: "string" + }], + "qstring" : [{ + token : "constant.language.escape", + regex : stringEscape + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "start" + }, { + defaultToken: "string" + }] + }; +}; + +oop.inherits(PythonHighlightRules, TextHighlightRules); + +exports.PythonHighlightRules = PythonHighlightRules; +}); + +ace.define("ace/mode/folding/pythonic",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(markers) { + this.foldingStartMarker = new RegExp("([\\[{])(?:\\s*)$|(" + markers + ")(?:\\s*)(?:#.*)?$"); +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var line = session.getLine(row); + var match = line.match(this.foldingStartMarker); + if (match) { + if (match[1]) + return this.openingBracketBlock(session, match[1], row, match.index); + if (match[2]) + return this.indentationBlock(session, row, match.index + match[2].length); + return this.indentationBlock(session, row); + } + } + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/python",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/python_highlight_rules","ace/mode/folding/pythonic","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var PythonHighlightRules = require("./python_highlight_rules").PythonHighlightRules; +var PythonFoldMode = require("./folding/pythonic").FoldMode; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = PythonHighlightRules; + this.foldingRules = new PythonFoldMode("\\:"); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + + this.$id = "ace/mode/python"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-r.js b/src/libs/ace/mode-r.js new file mode 100755 index 0000000..297d7e0 --- /dev/null +++ b/src/libs/ace/mode-r.js @@ -0,0 +1,301 @@ +ace.define("ace/mode/tex_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TexHighlightRules = function(textClass) { + + if (!textClass) + textClass = "text"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "%.*$" + }, { + token : textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b", + next : "nospell" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, { + token : textClass, + regex : "\\s+" + } + ], + "nospell" : [ + { + token : "comment", + regex : "%.*$", + next : "start" + }, { + token : "nospell." + textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])", + next : "start" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])]" + }, { + token : "paren.keyword.operator", + regex : "}", + next : "start" + }, { + token : "nospell." + textClass, + regex : "\\s+" + }, { + token : "nospell." + textClass, + regex : "\\w+" + } + ] + }; +}; + +oop.inherits(TexHighlightRules, TextHighlightRules); + +exports.TexHighlightRules = TexHighlightRules; +}); + +ace.define("ace/mode/r_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/tex_highlight_rules"], function(require, exports, module) +{ + + var oop = require("../lib/oop"); + var lang = require("../lib/lang"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules; + + var RHighlightRules = function() + { + + var keywords = lang.arrayToMap( + ("function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass") + .split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|" + + "NA_complex_").split("|") + ); + + this.$rules = { + "start" : [ + { + token : "comment.sectionhead", + regex : "#+(?!').*(?:----|====|####)\\s*$" + }, + { + token : "comment", + regex : "#+'", + next : "rd-start" + }, + { + token : "comment", + regex : "#.*$" + }, + { + token : "string", // multi line string start + regex : '["]', + next : "qqstring" + }, + { + token : "string", // multi line string start + regex : "[']", + next : "qstring" + }, + { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+[Li]?\\b" + }, + { + token : "constant.numeric", // explicit integer + regex : "\\d+L\\b" + }, + { + token : "constant.numeric", // number + regex : "\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b" + }, + { + token : "constant.numeric", // number with leading decimal + regex : "\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b" + }, + { + token : "constant.language.boolean", + regex : "(?:TRUE|FALSE|T|F)\\b" + }, + { + token : "identifier", + regex : "`.*?`" + }, + { + onMatch : function(value) { + if (keywords[value]) + return "keyword"; + else if (buildinConstants[value]) + return "constant.language"; + else if (value == '...' || value.match(/^\.\.\d+$/)) + return "variable.language"; + else + return "identifier"; + }, + regex : "[a-zA-Z.][a-zA-Z0-9._]*\\b" + }, + { + token : "keyword.operator", + regex : "%%|>=|<=|==|!=|\\->|<\\-|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||~|\\$|:" + }, + { + token : "keyword.operator", // infix operators + regex : "%.*?%" + }, + { + token : "paren.keyword.operator", + regex : "[[({]" + }, + { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, + { + token : "text", + regex : "\\s+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, + { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, + { + token : "string", + regex : '.+' + } + ] + }; + + var rdRules = new TexHighlightRules("comment").getRules(); + for (var i = 0; i < rdRules["start"].length; i++) { + rdRules["start"][i].token += ".virtual-comment"; + } + + this.addRules(rdRules, "rd-"); + this.$rules["rd-start"].unshift({ + token: "text", + regex: "^", + next: "start" + }); + this.$rules["rd-start"].unshift({ + token : "keyword", + regex : "@(?!@)[^ ]*" + }); + this.$rules["rd-start"].unshift({ + token : "comment", + regex : "@@" + }); + this.$rules["rd-start"].push({ + token : "comment", + regex : "[^%\\\\[({\\])}]+" + }); + }; + + oop.inherits(RHighlightRules, TextHighlightRules); + + exports.RHighlightRules = RHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/r",["require","exports","module","ace/range","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/r_highlight_rules","ace/mode/matching_brace_outdent"], function(require, exports, module) { + "use strict"; + + var Range = require("../range").Range; + var oop = require("../lib/oop"); + var TextMode = require("./text").Mode; + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + var RHighlightRules = require("./r_highlight_rules").RHighlightRules; + var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + + var Mode = function(){ + this.HighlightRules = RHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = this.$defaultBehaviour; + }; + oop.inherits(Mode, TextMode); + + (function() + { + this.lineCommentStart = "#"; + this.$id = "ace/mode/r"; + }).call(Mode.prototype); + exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-razor.js b/src/libs/ace/mode-razor.js new file mode 100755 index 0000000..c19ec55 --- /dev/null +++ b/src/libs/ace/mode-razor.js @@ -0,0 +1,2845 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/csharp_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var CSharpHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": "abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic", + "constant.language": "null|true|false" + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // character + regex : /'(?:.|\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n]))?'/ + }, { + token : "string", start : '"', end : '"|$', next: [ + {token: "constant.language.escape", regex: /\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/}, + {token: "invalid", regex: /\\./} + ] + }, { + token : "string", start : '@"', end : '"', next:[ + {token: "constant.language.escape", regex: '""'} + ] + }, { + token : "string", start : /\$"/, end : '"|$', next: [ + {token: "constant.language.escape", regex: /\\(:?$)|{{/}, + {token: "constant.language.escape", regex: /\\(:?u[\da-fA-F]+|x[\da-fA-F]+|[tbrf'"n])/}, + {token: "invalid", regex: /\\./} + ] + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "keyword", + regex : "^\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + this.normalizeRules(); +}; + +oop.inherits(CSharpHighlightRules, TextHighlightRules); + +exports.CSharpHighlightRules = CSharpHighlightRules; +}); + +ace.define("ace/mode/razor_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/html_highlight_rules","ace/mode/csharp_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var CSharpHighlightRules = require("./csharp_highlight_rules").CSharpHighlightRules; + +var blockPrefix = 'razor-block-'; +var RazorLangHighlightRules = function() { + CSharpHighlightRules.call(this); + + var processPotentialCallback = function(value, stackItem) { + if (typeof stackItem === "function") + return stackItem(value); + + return stackItem; + }; + + var inBraces = 'in-braces'; + this.$rules.start.unshift({ + regex: '[\\[({]', + onMatch: function(value, state, stack) { + var prefix = /razor-[^\-]+-/.exec(state)[0]; + + stack.unshift(value); + stack.unshift(prefix + inBraces); + this.next = prefix + inBraces; + return 'paren.lparen'; + } + }, { + start: "@\\*", + end: "\\*@", + token: "comment" + }); + + var parentCloseMap = { + '{': '}', + '[': ']', + '(': ')' + }; + + this.$rules[inBraces] = lang.deepCopy(this.$rules.start); + this.$rules[inBraces].unshift({ + regex: '[\\])}]', + onMatch: function(value, state, stack) { + var open = stack[1]; + if (parentCloseMap[open] !== value) + return 'invalid.illegal'; + + stack.shift(); // exit in-braces block + stack.shift(); // exit brace marker + this.next = processPotentialCallback(value, stack[0]) || 'start'; + return 'paren.rparen'; + } + }); +}; + +oop.inherits(RazorLangHighlightRules, CSharpHighlightRules); + +var RazorHighlightRules = function() { + HtmlHighlightRules.call(this); + + var blockStartRule = { + regex: '@[({]|@functions{', + onMatch: function(value, state, stack) { + stack.unshift(value); + stack.unshift('razor-block-start'); + this.next = 'razor-block-start'; + return 'punctuation.block.razor'; + } + }; + + var blockEndMap = { + '@{': '}', + '@(': ')', + '@functions{':'}' + }; + + var blockEndRule = { + regex: '[})]', + onMatch: function(value, state, stack) { + var blockStart = stack[1]; + if (blockEndMap[blockStart] !== value) + return 'invalid.illegal'; + + stack.shift(); // exit razor block + stack.shift(); // remove block type marker + this.next = stack.shift() || 'start'; + return 'punctuation.block.razor'; + } + }; + + var shortStartRule = { + regex: "@(?![{(])", + onMatch: function(value, state, stack) { + stack.unshift("razor-short-start"); + this.next = "razor-short-start"; + return 'punctuation.short.razor'; + } + }; + + var shortEndRule = { + token: "", + regex: "(?=[^A-Za-z_\\.()\\[\\]])", + next: 'pop' + }; + + var ifStartRule = { + regex: "@(?=if)", + onMatch: function(value, state, stack) { + stack.unshift(function(value) { + if (value !== '}') + return 'start'; + + return stack.shift() || 'start'; + }); + this.next = 'razor-block-start'; + return 'punctuation.control.razor'; + } + }; + + var razorStartRules = [ + { + start: "@\\*", + end: "\\*@", + token: "comment" + }, + { + token: ["meta.directive.razor", "text", "identifier"], + regex: "^(\\s*@model)(\\s+)(.+)$" + }, + blockStartRule, + shortStartRule + ]; + + for (var key in this.$rules) + this.$rules[key].unshift.apply(this.$rules[key], razorStartRules); + + this.embedRules(RazorLangHighlightRules, "razor-block-", [blockEndRule], ["start"]); + this.embedRules(RazorLangHighlightRules, "razor-short-", [shortEndRule], ["start"]); + + this.normalizeRules(); +}; + +oop.inherits(RazorHighlightRules, HtmlHighlightRules); + +exports.RazorHighlightRules = RazorHighlightRules; +exports.RazorLangHighlightRules = RazorLangHighlightRules; +}); + +ace.define("ace/mode/razor_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var keywords = [ + "abstract", "as", "base", "bool", + "break", "byte", "case", "catch", + "char", "checked", "class", "const", + "continue", "decimal", "default", "delegate", + "do", "double","else","enum", + "event", "explicit", "extern", "false", + "finally", "fixed", "float", "for", + "foreach", "goto", "if", "implicit", + "in", "int", "interface", "internal", + "is", "lock", "long", "namespace", + "new", "null", "object", "operator", + "out", "override", "params", "private", + "protected", "public", "readonly", "ref", + "return", "sbyte", "sealed", "short", + "sizeof", "stackalloc", "static", "string", + "struct", "switch", "this", "throw", + "true", "try", "typeof", "uint", + "ulong", "unchecked", "unsafe", "ushort", + "using", "var", "virtual", "void", + "volatile", "while"]; + +var shortHands = [ + "Html", "Model", "Url", "Layout" +]; + +var RazorCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + + if(state.lastIndexOf("razor-short-start") == -1 && state.lastIndexOf("razor-block-start") == -1) + return []; + + var token = session.getTokenAt(pos.row, pos.column); + if (!token) + return []; + + if(state.lastIndexOf("razor-short-start") != -1) { + return this.getShortStartCompletions(state, session, pos, prefix); + } + + if(state.lastIndexOf("razor-block-start") != -1) { + return this.getKeywordCompletions(state, session, pos, prefix); + } + + + }; + + this.getShortStartCompletions = function(state, session, pos, prefix) { + return shortHands.map(function(element){ + return { + value: element, + meta: "keyword", + score: Number.MAX_VALUE + }; + }); + }; + + this.getKeywordCompletions = function(state, session, pos, prefix) { + return shortHands.concat(keywords).map(function(element){ + return { + value: element, + meta: "keyword", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(RazorCompletions.prototype); + +exports.RazorCompletions = RazorCompletions; + +}); + +ace.define("ace/mode/razor",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/razor_highlight_rules","ace/mode/razor_completions","ace/mode/html_completions"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var RazorHighlightRules = require("./razor_highlight_rules").RazorHighlightRules; +var RazorCompletions = require("./razor_completions").RazorCompletions; +var HtmlCompletions = require("./html_completions").HtmlCompletions; + +var Mode = function() { + HtmlMode.call(this); + this.$highlightRules = new RazorHighlightRules(); + this.$completer = new RazorCompletions(); + this.$htmlCompleter = new HtmlCompletions(); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.getCompletions = function(state, session, pos, prefix) { + var razorToken = this.$completer.getCompletions(state, session, pos, prefix); + var htmlToken = this.$htmlCompleter.getCompletions(state, session, pos, prefix); + return razorToken.concat(htmlToken); + }; + + this.createWorker = function(session) { + return null; + }; + + this.$id = "ace/mode/razor"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-rdoc.js b/src/libs/ace/mode-rdoc.js new file mode 100755 index 0000000..50d6b4b --- /dev/null +++ b/src/libs/ace/mode-rdoc.js @@ -0,0 +1,205 @@ +ace.define("ace/mode/latex_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var LatexHighlightRules = function() { + + this.$rules = { + "start" : [{ + token : "comment", + regex : "%.*$" + }, { + token : ["keyword", "lparen", "variable.parameter", "rparen", "lparen", "storage.type", "rparen"], + regex : "(\\\\(?:documentclass|usepackage|input))(?:(\\[)([^\\]]*)(\\]))?({)([^}]*)(})" + }, { + token : ["keyword","lparen", "variable.parameter", "rparen"], + regex : "(\\\\(?:label|v?ref|cite(?:[^{]*)))(?:({)([^}]*)(}))?" + }, { + token : ["storage.type", "lparen", "variable.parameter", "rparen"], + regex : "(\\\\(?:begin|end))({)(\\w*)(})" + }, { + token : "storage.type", + regex : "\\\\[a-zA-Z]+" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "constant.character.escape", + regex : "\\\\[^a-zA-Z]?" + }, { + token : "string", + regex : "\\${1,2}", + next : "equation" + }], + "equation" : [{ + token : "comment", + regex : "%.*$" + }, { + token : "string", + regex : "\\${1,2}", + next : "start" + }, { + token : "constant.character.escape", + regex : "\\\\(?:[^a-zA-Z]|[a-zA-Z]+)" + }, { + token : "error", + regex : "^\\s*$", + next : "start" + }, { + defaultToken : "string" + }] + + }; +}; +oop.inherits(LatexHighlightRules, TextHighlightRules); + +exports.LatexHighlightRules = LatexHighlightRules; + +}); + +ace.define("ace/mode/rdoc_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/latex_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var LaTeXHighlightRules = require("./latex_highlight_rules"); + +var RDocHighlightRules = function() { + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "%.*$" + }, { + token : "text", // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\b", + next : "nospell" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "nospell" : [ + { + token : "comment", + regex : "%.*$", + next : "start" + }, { + token : "nospell.text", // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\b" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])", + next : "start" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])]" + }, { + token : "paren.keyword.operator", + regex : "}", + next : "start" + }, { + token : "nospell.text", + regex : "\\s+" + }, { + token : "nospell.text", + regex : "\\w+" + } + ] + }; +}; + +oop.inherits(RDocHighlightRules, TextHighlightRules); + +exports.RDocHighlightRules = RDocHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/rdoc",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/rdoc_highlight_rules","ace/mode/matching_brace_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var RDocHighlightRules = require("./rdoc_highlight_rules").RDocHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function(suppressHighlighting) { + this.HighlightRules = RDocHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + this.$id = "ace/mode/rdoc"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-rhtml.js b/src/libs/ace/mode-rhtml.js new file mode 100755 index 0000000..aae0378 --- /dev/null +++ b/src/libs/ace/mode-rhtml.js @@ -0,0 +1,2779 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/tex_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TexHighlightRules = function(textClass) { + + if (!textClass) + textClass = "text"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "%.*$" + }, { + token : textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b", + next : "nospell" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, { + token : textClass, + regex : "\\s+" + } + ], + "nospell" : [ + { + token : "comment", + regex : "%.*$", + next : "start" + }, { + token : "nospell." + textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])", + next : "start" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])]" + }, { + token : "paren.keyword.operator", + regex : "}", + next : "start" + }, { + token : "nospell." + textClass, + regex : "\\s+" + }, { + token : "nospell." + textClass, + regex : "\\w+" + } + ] + }; +}; + +oop.inherits(TexHighlightRules, TextHighlightRules); + +exports.TexHighlightRules = TexHighlightRules; +}); + +ace.define("ace/mode/r_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/tex_highlight_rules"], function(require, exports, module) +{ + + var oop = require("../lib/oop"); + var lang = require("../lib/lang"); + var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules; + + var RHighlightRules = function() + { + + var keywords = lang.arrayToMap( + ("function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass") + .split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|" + + "NA_complex_").split("|") + ); + + this.$rules = { + "start" : [ + { + token : "comment.sectionhead", + regex : "#+(?!').*(?:----|====|####)\\s*$" + }, + { + token : "comment", + regex : "#+'", + next : "rd-start" + }, + { + token : "comment", + regex : "#.*$" + }, + { + token : "string", // multi line string start + regex : '["]', + next : "qqstring" + }, + { + token : "string", // multi line string start + regex : "[']", + next : "qstring" + }, + { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+[Li]?\\b" + }, + { + token : "constant.numeric", // explicit integer + regex : "\\d+L\\b" + }, + { + token : "constant.numeric", // number + regex : "\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b" + }, + { + token : "constant.numeric", // number with leading decimal + regex : "\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b" + }, + { + token : "constant.language.boolean", + regex : "(?:TRUE|FALSE|T|F)\\b" + }, + { + token : "identifier", + regex : "`.*?`" + }, + { + onMatch : function(value) { + if (keywords[value]) + return "keyword"; + else if (buildinConstants[value]) + return "constant.language"; + else if (value == '...' || value.match(/^\.\.\d+$/)) + return "variable.language"; + else + return "identifier"; + }, + regex : "[a-zA-Z.][a-zA-Z0-9._]*\\b" + }, + { + token : "keyword.operator", + regex : "%%|>=|<=|==|!=|\\->|<\\-|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||~|\\$|:" + }, + { + token : "keyword.operator", // infix operators + regex : "%.*?%" + }, + { + token : "paren.keyword.operator", + regex : "[[({]" + }, + { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, + { + token : "text", + regex : "\\s+" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, + { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, + { + token : "string", + regex : '.+' + } + ] + }; + + var rdRules = new TexHighlightRules("comment").getRules(); + for (var i = 0; i < rdRules["start"].length; i++) { + rdRules["start"][i].token += ".virtual-comment"; + } + + this.addRules(rdRules, "rd-"); + this.$rules["rd-start"].unshift({ + token: "text", + regex: "^", + next: "start" + }); + this.$rules["rd-start"].unshift({ + token : "keyword", + regex : "@(?!@)[^ ]*" + }); + this.$rules["rd-start"].unshift({ + token : "comment", + regex : "@@" + }); + this.$rules["rd-start"].push({ + token : "comment", + regex : "[^%\\\\[({\\])}]+" + }); + }; + + oop.inherits(RHighlightRules, TextHighlightRules); + + exports.RHighlightRules = RHighlightRules; +}); + +ace.define("ace/mode/rhtml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/r_highlight_rules","ace/mode/html_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var RHighlightRules = require("./r_highlight_rules").RHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var RHtmlHighlightRules = function() { + HtmlHighlightRules.call(this); + + this.$rules["start"].unshift({ + token: "support.function.codebegin", + regex: "^<" + "!--\\s*begin.rcode\\s*(?:.*)", + next: "r-start" + }); + + this.embedRules(RHighlightRules, "r-", [{ + token: "support.function.codeend", + regex: "^\\s*end.rcode\\s*-->", + next: "start" + }], ["start"]); + + this.normalizeRules(); +}; +oop.inherits(RHtmlHighlightRules, TextHighlightRules); + +exports.RHtmlHighlightRules = RHtmlHighlightRules; +}); + +ace.define("ace/mode/rhtml",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/rhtml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; + +var RHtmlHighlightRules = require("./rhtml_highlight_rules").RHtmlHighlightRules; + +var Mode = function(doc, session) { + HtmlMode.call(this); + this.$session = session; + this.HighlightRules = RHtmlHighlightRules; +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.insertChunkInfo = { + value: "\n", + position: {row: 0, column: 15} + }; + + this.getLanguageMode = function(position) + { + return this.$session.getState(position.row).match(/^r-/) ? 'R' : 'HTML'; + }; + + this.$id = "ace/mode/rhtml"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-rst.js b/src/libs/ace/mode-rst.js new file mode 100755 index 0000000..235d31a --- /dev/null +++ b/src/libs/ace/mode-rst.js @@ -0,0 +1,249 @@ +ace.define("ace/mode/rst_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var RSTHighlightRules = function() { + + var tokens = { + title: "markup.heading", + list: "markup.heading", + table: "constant", + directive: "keyword.operator", + entity: "string", + link: "markup.underline.list", + bold: "markup.bold", + italic: "markup.italic", + literal: "support.function", + comment: "comment" + }; + + var startStringPrefix = "(^|\\s|[\"'(<\\[{\\-/:])"; + var endStringSuffix = "(?:$|(?=\\s|[\\\\.,;!?\\-/:\"')>\\]}]))"; + + this.$rules = { + "start": [ + { + token : tokens.title, + regex : "(^)([\\=\\-`:\\.'\"~\\^_\\*\\+#])(\\2{2,}\\s*$)" + }, + { + token : ["text", tokens.directive, tokens.literal], + regex : "(^\\s*\\.\\. )([^: ]+::)(.*$)", + next : "codeblock" + }, + { + token : tokens.directive, + regex : "::$", + next : "codeblock" + }, + { + token : [tokens.entity, tokens.link], + regex : "(^\\.\\. _[^:]+:)(.*$)" + }, + { + token : [tokens.entity, tokens.link], + regex : "(^__ )(https?://.*$)" + }, + { + token : tokens.entity, + regex : "^\\.\\. \\[[^\\]]+\\] " + }, + { + token : tokens.comment, + regex : "^\\.\\. .*$", + next : "comment" + }, + { + token : tokens.list, + regex : "^\\s*[\\*\\+-] " + }, + { + token : tokens.list, + regex : "^\\s*(?:[A-Za-z]|[0-9]+|[ivxlcdmIVXLCDM]+)\\. " + }, + { + token : tokens.list, + regex : "^\\s*\\(?(?:[A-Za-z]|[0-9]+|[ivxlcdmIVXLCDM]+)\\) " + }, + { + token : tokens.table, + regex : "^={2,}(?: +={2,})+$" + }, + { + token : tokens.table, + regex : "^\\+-{2,}(?:\\+-{2,})+\\+$" + }, + { + token : tokens.table, + regex : "^\\+={2,}(?:\\+={2,})+\\+$" + }, + { + token : ["text", tokens.literal], + regex : startStringPrefix + "(``)(?=\\S)", + next : "code" + }, + { + token : ["text", tokens.bold], + regex : startStringPrefix + "(\\*\\*)(?=\\S)", + next : "bold" + }, + { + token : ["text", tokens.italic], + regex : startStringPrefix + "(\\*)(?=\\S)", + next : "italic" + }, + { + token : tokens.entity, + regex : "\\|[\\w\\-]+?\\|" + }, + { + token : tokens.entity, + regex : ":[\\w-:]+:`\\S", + next : "entity" + }, + { + token : ["text", tokens.entity], + regex : startStringPrefix + "(_`)(?=\\S)", + next : "entity" + }, + { + token : tokens.entity, + regex : "_[A-Za-z0-9\\-]+?" + }, + { + token : ["text", tokens.link], + regex : startStringPrefix + "(`)(?=\\S)", + next : "link" + }, + { + token : tokens.link, + regex : "[A-Za-z0-9\\-]+?__?" + }, + { + token : tokens.link, + regex : "\\[[^\\]]+?\\]_" + }, + { + token : tokens.link, + regex : "https?://\\S+" + }, + { + token : tokens.table, + regex : "\\|" + } + ], + "codeblock": [ + { + token : tokens.literal, + regex : "^ +.+$", + next : "codeblock" + }, + { + token : tokens.literal, + regex : '^$', + next: "codeblock" + }, + { + token : "empty", + regex : "", + next : "start" + } + ], + "code": [ + { + token : tokens.literal, + regex : "\\S``" + endStringSuffix, + next : "start" + }, + { + defaultToken: tokens.literal + } + ], + "bold": [ + { + token : tokens.bold, + regex : "\\S\\*\\*" + endStringSuffix, + next : "start" + }, + { + defaultToken: tokens.bold + } + ], + "italic": [ + { + token : tokens.italic, + regex : "\\S\\*" + endStringSuffix, + next : "start" + }, + { + defaultToken: tokens.italic + } + ], + "entity": [ + { + token : tokens.entity, + regex : "\\S`" + endStringSuffix, + next : "start" + }, + { + defaultToken: tokens.entity + } + ], + "link": [ + { + token : tokens.link, + regex : "\\S`__?" + endStringSuffix, + next : "start" + }, + { + defaultToken: tokens.link + } + ], + "comment": [ + { + token : tokens.comment, + regex : "^ +.+$", + next : "comment" + }, + { + token : tokens.comment, + regex : '^$', + next: "comment" + }, + { + token : "empty", + regex : "", + next : "start" + } + ] + }; +}; +oop.inherits(RSTHighlightRules, TextHighlightRules); + +exports.RSTHighlightRules = RSTHighlightRules; +}); + +ace.define("ace/mode/rst",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/rst_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var RSTHighlightRules = require("./rst_highlight_rules").RSTHighlightRules; + +var Mode = function() { + this.HighlightRules = RSTHighlightRules; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.type = "text"; + + this.$id = "ace/mode/rst"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-ruby.js b/src/libs/ace/mode-ruby.js new file mode 100755 index 0000000..6732c68 --- /dev/null +++ b/src/libs/ace/mode-ruby.js @@ -0,0 +1,491 @@ +ace.define("ace/mode/ruby_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var constantOtherSymbol = exports.constantOtherSymbol = { + token : "constant.other.symbol.ruby", // symbol + regex : "[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?" +}; + +var qString = exports.qString = { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" +}; + +var qqString = exports.qqString = { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' +}; + +var tString = exports.tString = { + token : "string", // backtick string + regex : "[`](?:(?:\\\\.)|(?:[^'\\\\]))*?[`]" +}; + +var constantNumericHex = exports.constantNumericHex = { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\b" +}; + +var constantNumericFloat = exports.constantNumericFloat = { + token : "constant.numeric", // float + regex : "[+-]?\\d(?:\\d|_(?=\\d))*(?:(?:\\.\\d(?:\\d|_(?=\\d))*)?(?:[eE][+-]?\\d+)?)?\\b" +}; + +var instanceVariable = exports.instanceVariable = { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" +}; + +var RubyHighlightRules = function() { + + var builtinFunctions = ( + "abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|" + + "assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|" + + "assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|" + + "assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|" + + "assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|" + + "assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|" + + "attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|" + + "caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|" + + "exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|" + + "gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|" + + "link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|" + + "p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|" + + "raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|" + + "set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|" + + "throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|" + + "render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|" + + "content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|" + + "fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|" + + "time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|" + + "select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|" + + "file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|" + + "protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|" + + "send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|" + + "validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|" + + "validates_inclusion_of|validates_numericality_of|validates_with|validates_each|" + + "authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|" + + "filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|" + + "translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|" + + "cache|expire_fragment|expire_cache_for|observe|cache_sweeper|" + + "has_many|has_one|belongs_to|has_and_belongs_to_many" + ); + + var keywords = ( + "alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|" + + "__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|" + + "redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield" + ); + + var buildinConstants = ( + "true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|" + + "RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING" + ); + + var builtinVariables = ( + "$DEBUG|$defout|$FILENAME|$LOAD_PATH|$SAFE|$stdin|$stdout|$stderr|$VERBOSE|" + + "$!|root_url|flash|session|cookies|params|request|response|logger|self" + ); + + var keywordMapper = this.$keywords = this.createKeywordMapper({ + "keyword": keywords, + "constant.language": buildinConstants, + "variable.language": builtinVariables, + "support.function": builtinFunctions, + "invalid.deprecated": "debugger" // TODO is this a remnant from js mode? + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "comment", // multi line comment + regex : "^=begin(?:$|\\s.*$)", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, + + [{ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren.lparen"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1) + return "paren.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.start", + regex : /"/, + push : [{ + token : "constant.language.escape", + regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/ + }, { + token : "paren.start", + regex : /#{/, + push : "start" + }, { + token : "string.end", + regex : /"/, + next : "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : /\\(?:[nsrtvfbae'"\\]|c.|C-.|M-.(?:\\C-.)?|[0-7]{3}|x[\da-fA-F]{2}|u[\da-fA-F]{4})/ + }, { + token : "paren.start", + regex : /#{/, + push : "start" + }, { + token : "string.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : /'/, + push : [{ + token : "constant.language.escape", + regex : /\\['\\]/ + }, { + token : "string.end", + regex : /'/, + next : "pop" + }, { + defaultToken: "string" + }] + }], + + { + token : "text", // namespaces aren't symbols + regex : "::" + }, { + token : "variable.instance", // instance variable + regex : "@{1,2}[a-zA-Z_\\d]+" + }, { + token : "support.class", // class name + regex : "[A-Z][a-zA-Z_\\d]+" + }, + + constantOtherSymbol, + constantNumericHex, + constantNumericFloat, + + { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "punctuation.separator.key-value", + regex : "=>" + }, { + stateName: "heredoc", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[3]); + return [ + {type:"constant", value: tokens[1]}, + {type:"string", value: tokens[2]}, + {type:"support.class", value: tokens[3]}, + {type:"string", value: tokens[4]} + ]; + }, + regex : "(<<-?)(['\"`]?)([\\w]+)(['\"`]?)", + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^ +" + }, { + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + regex : "$", + token : "empty", + next : function(currentState, stack) { + if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc") + return stack[0]; + return currentState; + } + }, { + token : "string.character", + regex : "\\B\\?." + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "^=end(?:$|\\s.*$)", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.normalizeRules(); +}; + +oop.inherits(RubyHighlightRules, TextHighlightRules); + +exports.RubyHighlightRules = RubyHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/ruby",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/ruby_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/mode/behaviour/cstyle","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var RubyHighlightRules = require("./ruby_highlight_rules").RubyHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = RubyHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + var startingClassOrMethod = line.match(/^\s*(class|def|module)\s.*$/); + var startingDoBlock = line.match(/.*do(\s*|\s+\|.*\|\s*)$/); + var startingConditional = line.match(/^\s*(if|else|when)\s*/) + if (match || startingClassOrMethod || startingDoBlock || startingConditional) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return /^\s+(end|else)$/.test(line + input) || this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, session, row) { + var line = session.getLine(row); + if (/}/.test(line)) + return this.$outdent.autoOutdent(session, row); + var indent = this.$getIndent(line); + var prevLine = session.getLine(row - 1); + var prevIndent = this.$getIndent(prevLine); + var tab = session.getTabString(); + if (prevIndent.length <= indent.length) { + if (indent.slice(-tab.length) == tab) + session.remove(new Range(row, indent.length-tab.length, row, indent.length)); + } + }; + + this.$id = "ace/mode/ruby"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-rust.js b/src/libs/ace/mode-rust.js new file mode 100755 index 0000000..0802f6b --- /dev/null +++ b/src/libs/ace/mode-rust.js @@ -0,0 +1,272 @@ +ace.define("ace/mode/rust_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var stringEscape = /\\(?:[nrt0'"\\]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\})/.source; +var RustHighlightRules = function() { + + this.$rules = { start: + [ { token: 'variable.other.source.rust', + regex: '\'[a-zA-Z_][a-zA-Z0-9_]*(?![\\\'])' }, + { token: 'string.quoted.single.source.rust', + regex: "'(?:[^'\\\\]|" + stringEscape + ")'" }, + { + stateName: "bracketedComment", + onMatch : function(value, currentState, stack){ + stack.unshift(this.next, value.length - 1, currentState); + return "string.quoted.raw.source.rust"; + }, + regex : /r#*"/, + next : [ + { + onMatch : function(value, currentState, stack) { + var token = "string.quoted.raw.source.rust"; + if (value.length >= stack[1]) { + if (value.length > stack[1]) + token = "invalid"; + stack.shift(); + stack.shift(); + this.next = stack.shift(); + } else { + this.next = ""; + } + return token; + }, + regex : /"#*/, + next : "start" + }, { + defaultToken : "string.quoted.raw.source.rust" + } + ] + }, + { token: 'string.quoted.double.source.rust', + regex: '"', + push: + [ { token: 'string.quoted.double.source.rust', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.source.rust', + regex: stringEscape }, + { defaultToken: 'string.quoted.double.source.rust' } ] }, + { token: [ 'keyword.source.rust', 'text', 'entity.name.function.source.rust' ], + regex: '\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)' }, + { token: 'support.constant', regex: '\\b[a-zA-Z_][\\w\\d]*::' }, + { token: 'keyword.source.rust', + regex: '\\b(?:abstract|alignof|as|box|break|continue|const|crate|do|else|enum|extern|for|final|if|impl|in|let|loop|macro|match|mod|move|mut|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\\b' }, + { token: 'storage.type.source.rust', + regex: '\\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|u128|f16|f32|f64|i8|i16|i32|i64|i128|str|option|either|c_float|c_double|c_void|FILE|fpos_t|DIR|dirent|c_char|c_schar|c_uchar|c_short|c_ushort|c_int|c_uint|c_long|c_ulong|size_t|ptrdiff_t|clock_t|time_t|c_longlong|c_ulonglong|intptr_t|uintptr_t|off_t|dev_t|ino_t|pid_t|mode_t|ssize_t)\\b' }, + { token: 'variable.language.source.rust', regex: '\\bself\\b' }, + + { token: 'comment.line.doc.source.rust', + regex: '//!.*$' }, + { token: 'comment.line.double-dash.source.rust', + regex: '//.*$' }, + { token: 'comment.start.block.source.rust', + regex: '/\\*', + stateName: 'comment', + push: + [ { token: 'comment.start.block.source.rust', + regex: '/\\*', + push: 'comment' }, + { token: 'comment.end.block.source.rust', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.source.rust' } ] }, + + { token: 'keyword.operator', + regex: /\$|[-=]>|[-+%^=!&|<>]=?|[*/](?![*/])=?/ }, + { token : "punctuation.operator", regex : /[?:,;.]/ }, + { token : "paren.lparen", regex : /[\[({]/ }, + { token : "paren.rparen", regex : /[\])}]/ }, + { token: 'constant.language.source.rust', + regex: '\\b(?:true|false|Some|None|Ok|Err)\\b' }, + { token: 'support.constant.source.rust', + regex: '\\b(?:EXIT_FAILURE|EXIT_SUCCESS|RAND_MAX|EOF|SEEK_SET|SEEK_CUR|SEEK_END|_IOFBF|_IONBF|_IOLBF|BUFSIZ|FOPEN_MAX|FILENAME_MAX|L_tmpnam|TMP_MAX|O_RDONLY|O_WRONLY|O_RDWR|O_APPEND|O_CREAT|O_EXCL|O_TRUNC|S_IFIFO|S_IFCHR|S_IFBLK|S_IFDIR|S_IFREG|S_IFMT|S_IEXEC|S_IWRITE|S_IREAD|S_IRWXU|S_IXUSR|S_IWUSR|S_IRUSR|F_OK|R_OK|W_OK|X_OK|STDIN_FILENO|STDOUT_FILENO|STDERR_FILENO)\\b' }, + { token: 'meta.preprocessor.source.rust', + regex: '\\b\\w\\(\\w\\)*!|#\\[[\\w=\\(\\)_]+\\]\\b' }, + { token: 'constant.numeric.source.rust', + regex: /\b(?:0x[a-fA-F0-9_]+|0o[0-7_]+|0b[01_]+|[0-9][0-9_]*(?!\.))(?:[iu](?:size|8|16|32|64|128))?\b/ }, + { token: 'constant.numeric.source.rust', + regex: /\b(?:[0-9][0-9_]*)(?:\.[0-9][0-9_]*)?(?:[Ee][+-][0-9][0-9_]*)?(?:f32|f64)?\b/ } ] } + + this.normalizeRules(); +}; + +RustHighlightRules.metaData = { fileTypes: [ 'rs', 'rc' ], + foldingStartMarker: '^.*\\bfn\\s*(\\w+\\s*)?\\([^\\)]*\\)(\\s*\\{[^\\}]*)?\\s*$', + foldingStopMarker: '^\\s*\\}', + name: 'Rust', + scopeName: 'source.rust' } + + +oop.inherits(RustHighlightRules, TextHighlightRules); + +exports.RustHighlightRules = RustHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/rust",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/rust_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var RustHighlightRules = require("./rust_highlight_rules").RustHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = RustHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/", nestable: true}; + this.$quotes = { '"': '"' }; + this.$id = "ace/mode/rust"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-sass.js b/src/libs/ace/mode-sass.js new file mode 100755 index 0000000..bd18170 --- /dev/null +++ b/src/libs/ace/mode-sass.js @@ -0,0 +1,434 @@ +ace.define("ace/mode/scss_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ScssHighlightRules = function() { + + var properties = lang.arrayToMap( (function () { + + var browserPrefix = ("-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-").split("|"); + + var prefixProperties = ("appearance|background-clip|background-inline-policy|background-origin|" + + "background-size|binding|border-bottom-colors|border-left-colors|" + + "border-right-colors|border-top-colors|border-end|border-end-color|" + + "border-end-style|border-end-width|border-image|border-start|" + + "border-start-color|border-start-style|border-start-width|box-align|" + + "box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|" + + "box-pack|box-sizing|column-count|column-gap|column-width|column-rule|" + + "column-rule-width|column-rule-style|column-rule-color|float-edge|" + + "font-feature-settings|font-language-override|force-broken-image-icon|" + + "image-region|margin-end|margin-start|opacity|outline|outline-color|" + + "outline-offset|outline-radius|outline-radius-bottomleft|" + + "outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|" + + "outline-style|outline-width|padding-end|padding-start|stack-sizing|" + + "tab-size|text-blink|text-decoration-color|text-decoration-line|" + + "text-decoration-style|transform|transform-origin|transition|" + + "transition-delay|transition-duration|transition-property|" + + "transition-timing-function|user-focus|user-input|user-modify|user-select|" + + "window-shadow|border-radius").split("|"); + + var properties = ("azimuth|background-attachment|background-color|background-image|" + + "background-position|background-repeat|background|border-bottom-color|" + + "border-bottom-style|border-bottom-width|border-bottom|border-collapse|" + + "border-color|border-left-color|border-left-style|border-left-width|" + + "border-left|border-right-color|border-right-style|border-right-width|" + + "border-right|border-spacing|border-style|border-top-color|" + + "border-top-style|border-top-width|border-top|border-width|border|bottom|" + + "box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|" + + "counter-reset|cue-after|cue-before|cue|cursor|direction|display|" + + "elevation|empty-cells|float|font-family|font-size-adjust|font-size|" + + "font-stretch|font-style|font-variant|font-weight|font|height|left|" + + "letter-spacing|line-height|list-style-image|list-style-position|" + + "list-style-type|list-style|margin-bottom|margin-left|margin-right|" + + "margin-top|marker-offset|margin|marks|max-height|max-width|min-height|" + + "min-width|opacity|orphans|outline-color|" + + "outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|" + + "padding-left|padding-right|padding-top|padding|page-break-after|" + + "page-break-before|page-break-inside|page|pause-after|pause-before|" + + "pause|pitch-range|pitch|play-during|position|quotes|richness|right|" + + "size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|" + + "stress|table-layout|text-align|text-decoration|text-indent|" + + "text-shadow|text-transform|top|unicode-bidi|vertical-align|" + + "visibility|voice-family|volume|white-space|widows|width|word-spacing|" + + "z-index").split("|"); + var ret = []; + for (var i=0, ln=browserPrefix.length; i|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; +}; + +oop.inherits(ScssHighlightRules, TextHighlightRules); + +exports.ScssHighlightRules = ScssHighlightRules; + +}); + +ace.define("ace/mode/sass_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/scss_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var ScssHighlightRules = require("./scss_highlight_rules").ScssHighlightRules; + +var SassHighlightRules = function() { + ScssHighlightRules.call(this); + var start = this.$rules.start; + if (start[1].token == "comment") { + start.splice(1, 1, { + onMatch: function(value, currentState, stack) { + stack.unshift(this.next, -1, value.length - 2, currentState); + return "comment"; + }, + regex: /^\s*\/\*/, + next: "comment" + }, { + token: "error.invalid", + regex: "/\\*|[{;}]" + }, { + token: "support.type", + regex: /^\s*:[\w\-]+\s/ + }); + + this.$rules.comment = [ + {regex: /^\s*/, onMatch: function(value, currentState, stack) { + if (stack[1] === -1) + stack[1] = Math.max(stack[2], value.length - 1); + if (value.length <= stack[1]) {stack.shift();stack.shift();stack.shift(); + this.next = stack.shift(); + return "text"; + } else { + this.next = ""; + return "comment"; + } + }, next: "start"}, + {defaultToken: "comment"} + ] + } +}; + +oop.inherits(SassHighlightRules, ScssHighlightRules); + +exports.SassHighlightRules = SassHighlightRules; + +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/sass",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sass_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var SassHighlightRules = require("./sass_highlight_rules").SassHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = SassHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.$id = "ace/mode/sass"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-scad.js b/src/libs/ace/mode-scad.js new file mode 100755 index 0000000..c9a767b --- /dev/null +++ b/src/libs/ace/mode-scad.js @@ -0,0 +1,407 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/scad_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var scadHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": "module|if|else|for", + "constant.language": "NULL" + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : '["].*\\\\$', + next : "qqstring" + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "string", // multi line string start + regex : "['].*\\\\$", + next : "qstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant", // + regex : "<[a-zA-Z0-9.]+>" + }, { + token : "keyword", // pre-compiler directivs + regex : "(?:use|include)" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(scadHighlightRules, TextHighlightRules); + +exports.scadHighlightRules = scadHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/scad",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/scad_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var scadHighlightRules = require("./scad_highlight_rules").scadHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = scadHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/scad"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-scala.js b/src/libs/ace/mode-scala.js new file mode 100755 index 0000000..94c645c --- /dev/null +++ b/src/libs/ace/mode-scala.js @@ -0,0 +1,975 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/scala_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ScalaHighlightRules = function() { + + var keywords = ( + "case|default|do|else|for|if|match|while|throw|return|try|trye|catch|finally|yield|" + + "abstract|class|def|extends|final|forSome|implicit|implicits|import|lazy|new|object|null|" + + "override|package|private|protected|sealed|super|this|trait|type|val|var|with|" + + "assert|assume|require|print|println|printf|readLine|readBoolean|readByte|readShort|" + // package scala + "readChar|readInt|readLong|readFloat|readDouble" // package scala + ); + + var buildinConstants = ("true|false"); + + var langClasses = ( + "AbstractMethodError|AssertionError|ClassCircularityError|"+ + "ClassFormatError|Deprecated|EnumConstantNotPresentException|"+ + "ExceptionInInitializerError|IllegalAccessError|"+ + "IllegalThreadStateException|InstantiationError|InternalError|"+ + + "NegativeArraySizeException|NoSuchFieldError|Override|Process|"+ + "ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|"+ + "SuppressWarnings|TypeNotPresentException|UnknownError|"+ + "UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|"+ + "InstantiationException|IndexOutOfBoundsException|"+ + "ArrayIndexOutOfBoundsException|CloneNotSupportedException|"+ + "NoSuchFieldException|IllegalArgumentException|NumberFormatException|"+ + "SecurityException|Void|InheritableThreadLocal|IllegalStateException|"+ + "InterruptedException|NoSuchMethodException|IllegalAccessException|"+ + "UnsupportedOperationException|Enum|StrictMath|Package|Compiler|"+ + "Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|"+ + "NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|"+ + "NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|"+ + "Character|Boolean|StackTraceElement|Appendable|StringBuffer|"+ + "Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|"+ + "StackOverflowError|OutOfMemoryError|VirtualMachineError|"+ + "ArrayStoreException|ClassCastException|LinkageError|"+ + "NoClassDefFoundError|ClassNotFoundException|RuntimeException|"+ + "Exception|ThreadDeath|Error|Throwable|System|ClassLoader|"+ + "Cloneable|Class|CharSequence|Comparable|String|Object|" + + "Unit|Any|AnyVal|AnyRef|Null|ScalaObject|Singleton|Seq|Iterable|List|" + + "Option|Array|Char|Byte|Int|Long|Nothing|" + + + "App|Application|BufferedIterator|BigDecimal|BigInt|Console|Either|" + + "Enumeration|Equiv|Fractional|Function|IndexedSeq|Integral|Iterator|" + + "Map|Numeric|Nil|NotNull|Ordered|Ordering|PartialFunction|PartialOrdering|" + + "Product|Proxy|Range|Responder|Seq|Serializable|Set|Specializable|Stream|" + + "StringContext|Symbol|Traversable|TraversableOnce|Tuple|Vector|Pair|Triple" + + + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "support.function": langClasses, + "constant.language": buildinConstants + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", + regex : '"""', + next : "tstring" + }, { + token : "string", + regex : '"(?=.)', // " strings can't span multiple lines + next : "string" + }, { + token : "symbol.constant", // single line + regex : "'[\\w\\d_]+" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "string" : [ + { + token : "escape", + regex : '\\\\"' + }, { + token : "string", + regex : '"', + next : "start" + }, { + token : "string.invalid", + regex : '[^"\\\\]*$', + next : "start" + }, { + token : "string", + regex : '[^"\\\\]+' + } + ], + "tstring" : [ + { + token : "string", + regex : '"{3,5}', + next : "start" + }, { + defaultToken : "string" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(ScalaHighlightRules, TextHighlightRules); + +exports.ScalaHighlightRules = ScalaHighlightRules; +}); + +ace.define("ace/mode/scala",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/scala_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptMode = require("./javascript").Mode; +var ScalaHighlightRules = require("./scala_highlight_rules").ScalaHighlightRules; + +var Mode = function() { + JavaScriptMode.call(this); + this.HighlightRules = ScalaHighlightRules; +}; +oop.inherits(Mode, JavaScriptMode); + +(function() { + + this.createWorker = function(session) { + return null; + }; + + this.$id = "ace/mode/scala"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-scheme.js b/src/libs/ace/mode-scheme.js new file mode 100755 index 0000000..2e6b7ff --- /dev/null +++ b/src/libs/ace/mode-scheme.js @@ -0,0 +1,225 @@ +ace.define("ace/mode/scheme_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SchemeHighlightRules = function() { + var keywordControl = "case|do|let|loop|if|else|when"; + var keywordOperator = "eq?|eqv?|equal?|and|or|not|null?"; + var constantLanguage = "#t|#f"; + var supportFunctions = "cons|car|cdr|cond|lambda|lambda*|syntax-rules|format|set!|quote|eval|append|list|list?|member?|load"; + + var keywordMapper = this.createKeywordMapper({ + "keyword.control": keywordControl, + "keyword.operator": keywordOperator, + "constant.language": constantLanguage, + "support.function": supportFunctions + }, "identifier", true); + + this.$rules = + { + "start": [ + { + token : "comment", + regex : ";.*$" + }, + { + "token": ["storage.type.function-type.scheme", "text", "entity.name.function.scheme"], + "regex": "(?:\\b(?:(define|define-syntax|define-macro))\\b)(\\s+)((?:\\w|\\-|\\!|\\?)*)" + }, + { + "token": "punctuation.definition.constant.character.scheme", + "regex": "#:\\S+" + }, + { + "token": ["punctuation.definition.variable.scheme", "variable.other.global.scheme", "punctuation.definition.variable.scheme"], + "regex": "(\\*)(\\S*)(\\*)" + }, + { + "token" : "constant.numeric", // hex + "regex" : "#[xXoObB][0-9a-fA-F]+" + }, + { + "token" : "constant.numeric", // float + "regex" : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?" + }, + { + "token" : keywordMapper, + "regex" : "[a-zA-Z_#][a-zA-Z0-9_\\-\\?\\!\\*]*" + }, + { + "token" : "string", + "regex" : '"(?=.)', + "next" : "qqstring" + } + ], + "qqstring": [ + { + "token": "constant.character.escape.scheme", + "regex": "\\\\." + }, + { + "token" : "string", + "regex" : '[^"\\\\]+', + "merge" : true + }, { + "token" : "string", + "regex" : "\\\\$", + "next" : "qqstring", + "merge" : true + }, { + "token" : "string", + "regex" : '"|$', + "next" : "start", + "merge" : true + } + ] +} + +}; + +oop.inherits(SchemeHighlightRules, TextHighlightRules); + +exports.SchemeHighlightRules = SchemeHighlightRules; +}); + +ace.define("ace/mode/matching_parens_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingParensOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\)/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\))/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + var match = line.match(/^(\s+)/); + if (match) { + return match[1]; + } + + return ""; + }; + +}).call(MatchingParensOutdent.prototype); + +exports.MatchingParensOutdent = MatchingParensOutdent; +}); + +ace.define("ace/mode/scheme",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/scheme_highlight_rules","ace/mode/matching_parens_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var SchemeHighlightRules = require("./scheme_highlight_rules").SchemeHighlightRules; +var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensOutdent; + +var Mode = function() { + this.HighlightRules = SchemeHighlightRules; + this.$outdent = new MatchingParensOutdent(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ";"; + this.minorIndentFunctions = ["define", "lambda", "define-macro", "define-syntax", "syntax-rules", "define-record-type", "define-structure"]; + + this.$toIndent = function(str) { + return str.split('').map(function(ch) { + if (/\s/.exec(ch)) { + return ch; + } else { + return ' '; + } + }).join(''); + }; + + this.$calculateIndent = function(line, tab) { + var baseIndent = this.$getIndent(line); + var delta = 0; + var isParen, ch; + for (var i = line.length - 1; i >= 0; i--) { + ch = line[i]; + if (ch === '(') { + delta--; + isParen = true; + } else if (ch === '(' || ch === '[' || ch === '{') { + delta--; + isParen = false; + } else if (ch === ')' || ch === ']' || ch === '}') { + delta++; + } + if (delta < 0) { + break; + } + } + if (delta < 0 && isParen) { + i += 1; + var iBefore = i; + var fn = ''; + while (true) { + ch = line[i]; + if (ch === ' ' || ch === '\t') { + if(this.minorIndentFunctions.indexOf(fn) !== -1) { + return this.$toIndent(line.substring(0, iBefore - 1) + tab); + } else { + return this.$toIndent(line.substring(0, i + 1)); + } + } else if (ch === undefined) { + return this.$toIndent(line.substring(0, iBefore - 1) + tab); + } + fn += line[i]; + i++; + } + } else if(delta < 0 && !isParen) { + return this.$toIndent(line.substring(0, i+1)); + } else if(delta > 0) { + baseIndent = baseIndent.substring(0, baseIndent.length - tab.length); + return baseIndent; + } else { + return baseIndent; + } + }; + + this.getNextLineIndent = function(state, line, tab) { + return this.$calculateIndent(line, tab); + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/scheme"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-scss.js b/src/libs/ace/mode-scss.js new file mode 100755 index 0000000..4785dc3 --- /dev/null +++ b/src/libs/ace/mode-scss.js @@ -0,0 +1,586 @@ +ace.define("ace/mode/scss_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ScssHighlightRules = function() { + + var properties = lang.arrayToMap( (function () { + + var browserPrefix = ("-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-").split("|"); + + var prefixProperties = ("appearance|background-clip|background-inline-policy|background-origin|" + + "background-size|binding|border-bottom-colors|border-left-colors|" + + "border-right-colors|border-top-colors|border-end|border-end-color|" + + "border-end-style|border-end-width|border-image|border-start|" + + "border-start-color|border-start-style|border-start-width|box-align|" + + "box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|" + + "box-pack|box-sizing|column-count|column-gap|column-width|column-rule|" + + "column-rule-width|column-rule-style|column-rule-color|float-edge|" + + "font-feature-settings|font-language-override|force-broken-image-icon|" + + "image-region|margin-end|margin-start|opacity|outline|outline-color|" + + "outline-offset|outline-radius|outline-radius-bottomleft|" + + "outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|" + + "outline-style|outline-width|padding-end|padding-start|stack-sizing|" + + "tab-size|text-blink|text-decoration-color|text-decoration-line|" + + "text-decoration-style|transform|transform-origin|transition|" + + "transition-delay|transition-duration|transition-property|" + + "transition-timing-function|user-focus|user-input|user-modify|user-select|" + + "window-shadow|border-radius").split("|"); + + var properties = ("azimuth|background-attachment|background-color|background-image|" + + "background-position|background-repeat|background|border-bottom-color|" + + "border-bottom-style|border-bottom-width|border-bottom|border-collapse|" + + "border-color|border-left-color|border-left-style|border-left-width|" + + "border-left|border-right-color|border-right-style|border-right-width|" + + "border-right|border-spacing|border-style|border-top-color|" + + "border-top-style|border-top-width|border-top|border-width|border|bottom|" + + "box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|" + + "counter-reset|cue-after|cue-before|cue|cursor|direction|display|" + + "elevation|empty-cells|float|font-family|font-size-adjust|font-size|" + + "font-stretch|font-style|font-variant|font-weight|font|height|left|" + + "letter-spacing|line-height|list-style-image|list-style-position|" + + "list-style-type|list-style|margin-bottom|margin-left|margin-right|" + + "margin-top|marker-offset|margin|marks|max-height|max-width|min-height|" + + "min-width|opacity|orphans|outline-color|" + + "outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|" + + "padding-left|padding-right|padding-top|padding|page-break-after|" + + "page-break-before|page-break-inside|page|pause-after|pause-before|" + + "pause|pitch-range|pitch|play-during|position|quotes|richness|right|" + + "size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|" + + "stress|table-layout|text-align|text-decoration|text-indent|" + + "text-shadow|text-transform|top|unicode-bidi|vertical-align|" + + "visibility|voice-family|volume|white-space|widows|width|word-spacing|" + + "z-index").split("|"); + var ret = []; + for (var i=0, ln=browserPrefix.length; i|<=|>=|==|!=|-|%|#|\\+|\\$|\\+|\\*" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + }, { + caseInsensitive: true + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qqstring" : [ + { + token : "string", + regex : '(?:(?:\\\\.)|(?:[^"\\\\]))*?"', + next : "start" + }, { + token : "string", + regex : '.+' + } + ], + "qstring" : [ + { + token : "string", + regex : "(?:(?:\\\\.)|(?:[^'\\\\]))*?'", + next : "start" + }, { + token : "string", + regex : '.+' + } + ] + }; +}; + +oop.inherits(ScssHighlightRules, TextHighlightRules); + +exports.ScssHighlightRules = ScssHighlightRules; + +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/scss",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/scss_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ScssHighlightRules = require("./scss_highlight_rules").ScssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = ScssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/scss"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-sh.js b/src/libs/ace/mode-sh.js new file mode 100755 index 0000000..bcded08 --- /dev/null +++ b/src/libs/ace/mode-sh.js @@ -0,0 +1,441 @@ +ace.define("ace/mode/sh_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var reservedKeywords = exports.reservedKeywords = ( + '!|{|}|case|do|done|elif|else|'+ + 'esac|fi|for|if|in|then|until|while|'+ + '&|;|export|local|read|typeset|unset|'+ + 'elif|select|set|function|declare|readonly' + ); + +var languageConstructs = exports.languageConstructs = ( + '[|]|alias|bg|bind|break|builtin|'+ + 'cd|command|compgen|complete|continue|'+ + 'dirs|disown|echo|enable|eval|exec|'+ + 'exit|fc|fg|getopts|hash|help|history|'+ + 'jobs|kill|let|logout|popd|printf|pushd|'+ + 'pwd|return|set|shift|shopt|source|'+ + 'suspend|test|times|trap|type|ulimit|'+ + 'umask|unalias|wait' +); + +var ShHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "keyword": reservedKeywords, + "support.function.builtin": languageConstructs, + "invalid.deprecated": "debugger" + }, "identifier"); + + var integer = "(?:(?:[1-9]\\d*)|(?:0))"; + + var fraction = "(?:\\.\\d+)"; + var intPart = "(?:\\d+)"; + var pointFloat = "(?:(?:" + intPart + "?" + fraction + ")|(?:" + intPart + "\\.))"; + var exponentFloat = "(?:(?:" + pointFloat + "|" + intPart + ")" + ")"; + var floatNumber = "(?:" + exponentFloat + "|" + pointFloat + ")"; + var fileDescriptor = "(?:&" + intPart + ")"; + + var variableName = "[a-zA-Z_][a-zA-Z0-9_]*"; + var variable = "(?:" + variableName + "=)"; + + var builtinVariable = "(?:\\$(?:SHLVL|\\$|\\!|\\?))"; + + var func = "(?:" + variableName + "\\s*\\(\\))"; + + this.$rules = { + "start" : [{ + token : "constant", + regex : /\\./ + }, { + token : ["text", "comment"], + regex : /(^|\s)(#.*)$/ + }, { + token : "string.start", + regex : '"', + push : [{ + token : "constant.language.escape", + regex : /\\(?:[$`"\\]|$)/ + }, { + include : "variables" + }, { + token : "keyword.operator", + regex : /`/ // TODO highlight ` + }, { + token : "string.end", + regex : '"', + next: "pop" + }, { + defaultToken: "string" + }] + }, { + token : "string", + regex : "\\$'", + push : [{ + token : "constant.language.escape", + regex : /\\(?:[abeEfnrtv\\'"]|x[a-fA-F\d]{1,2}|u[a-fA-F\d]{4}([a-fA-F\d]{4})?|c.|\d{1,3})/ + }, { + token : "string", + regex : "'", + next: "pop" + }, { + defaultToken: "string" + }] + }, { + regex : "<<<", + token : "keyword.operator" + }, { + stateName: "heredoc", + regex : "(<<-?)(\\s*)(['\"`]?)([\\w\\-]+)(['\"`]?)", + onMatch : function(value, currentState, stack) { + var next = value[2] == '-' ? "indentedHeredoc" : "heredoc"; + var tokens = value.split(this.splitRegex); + stack.push(next, tokens[4]); + return [ + {type:"constant", value: tokens[1]}, + {type:"text", value: tokens[2]}, + {type:"string", value: tokens[3]}, + {type:"support.class", value: tokens[4]}, + {type:"string", value: tokens[5]} + ]; + }, + rules: { + heredoc: [{ + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }], + indentedHeredoc: [{ + token: "string", + regex: "^\t+" + }, { + onMatch: function(value, currentState, stack) { + if (value === stack[1]) { + stack.shift(); + stack.shift(); + this.next = stack[0] || "start"; + return "support.class"; + } + this.next = ""; + return "string"; + }, + regex: ".*$", + next: "start" + }] + } + }, { + regex : "$", + token : "empty", + next : function(currentState, stack) { + if (stack[0] === "heredoc" || stack[0] === "indentedHeredoc") + return stack[0]; + return currentState; + } + }, { + token : ["keyword", "text", "text", "text", "variable"], + regex : /(declare|local|readonly)(\s+)(?:(-[fixar]+)(\s+))?([a-zA-Z_][a-zA-Z0-9_]*\b)/ + }, { + token : "variable.language", + regex : builtinVariable + }, { + token : "variable", + regex : variable + }, { + include : "variables" + }, { + token : "support.function", + regex : func + }, { + token : "support.function", + regex : fileDescriptor + }, { + token : "string", // ' string + start : "'", end : "'" + }, { + token : "constant.numeric", // float + regex : floatNumber + }, { + token : "constant.numeric", // integer + regex : integer + "\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_][a-zA-Z0-9_]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\*|\\*\\*|\\/|\\/\\/|~|<|>|<=|=>|=|!=|[%&|`]" + }, { + token : "punctuation.operator", + regex : ";" + }, { + token : "paren.lparen", + regex : "[\\[\\(\\{]" + }, { + token : "paren.rparen", + regex : "[\\]]" + }, { + token : "paren.rparen", + regex : "[\\)\\}]", + next : "pop" + }], + variables: [{ + token : "variable", + regex : /(\$)(\w+)/ + }, { + token : ["variable", "paren.lparen"], + regex : /(\$)(\()/, + push : "start" + }, { + token : ["variable", "paren.lparen", "keyword.operator", "variable", "keyword.operator"], + regex : /(\$)(\{)([#!]?)(\w+|[*@#?\-$!0_])(:[?+\-=]?|##?|%%?|,,?\/|\^\^?)?/, + push : "start" + }, { + token : "variable", + regex : /\$[*@#?\-$!0_]/ + }, { + token : ["variable", "paren.lparen"], + regex : /(\$)(\{)/, + push : "start" + }] + }; + + this.normalizeRules(); +}; + +oop.inherits(ShHighlightRules, TextHighlightRules); + +exports.ShHighlightRules = ShHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/sh",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sh_highlight_rules","ace/range","ace/mode/folding/cstyle","ace/mode/behaviour/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var ShHighlightRules = require("./sh_highlight_rules").ShHighlightRules; +var Range = require("../range").Range; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; + +var Mode = function() { + this.HighlightRules = ShHighlightRules; + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = new CstyleBehaviour(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[:]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + var outdents = { + "pass": 1, + "return": 1, + "raise": 1, + "break": 1, + "continue": 1 + }; + + this.checkOutdent = function(state, line, input) { + if (input !== "\r\n" && input !== "\r" && input !== "\n") + return false; + + var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens; + + if (!tokens) + return false; + do { + var last = tokens.pop(); + } while (last && (last.type == "comment" || (last.type == "text" && last.value.match(/^\s+$/)))); + + if (!last) + return false; + + return (last.type == "keyword" && outdents[last.value]); + }; + + this.autoOutdent = function(state, doc, row) { + + row += 1; + var indent = this.$getIndent(doc.getLine(row)); + var tab = doc.getTabString(); + if (indent.slice(-tab.length) == tab) + doc.remove(new Range(row, indent.length-tab.length, row, indent.length)); + }; + + this.$id = "ace/mode/sh"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-sjs.js b/src/libs/ace/mode-sjs.js new file mode 100755 index 0000000..6bcd0bc --- /dev/null +++ b/src/libs/ace/mode-sjs.js @@ -0,0 +1,1006 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/sjs_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/javascript_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SJSHighlightRules = function() { + var parent = new JavaScriptHighlightRules({noES6: true}); + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + var contextAware = function(f) { + f.isContextAware = true; + return f; + }; + + var ctxBegin = function(opts) { + return { + token: opts.token, + regex: opts.regex, + next: contextAware(function(currentState, stack) { + if (stack.length === 0) + stack.unshift(currentState); + stack.unshift(opts.next); + return opts.next; + }) + }; + }; + + var ctxEnd = function(opts) { + return { + token: opts.token, + regex: opts.regex, + next: contextAware(function(currentState, stack) { + stack.shift(); + return stack[0] || "start"; + }) + }; + }; + + this.$rules = parent.$rules; + this.$rules.no_regex = [ + { + token: "keyword", + regex: "(waitfor|or|and|collapse|spawn|retract)\\b" + }, + { + token: "keyword.operator", + regex: "(->|=>|\\.\\.)" + }, + { + token: "variable.language", + regex: "(hold|default)\\b" + }, + ctxBegin({ + token: "string", + regex: "`", + next: "bstring" + }), + ctxBegin({ + token: "string", + regex: '"', + next: "qqstring" + }), + ctxBegin({ + token: "string", + regex: '"', + next: "qqstring" + }), + { + token: ["paren.lparen", "text", "paren.rparen"], + regex: "(\\{)(\\s*)(\\|)", + next: "block_arguments" + } + + ].concat(this.$rules.no_regex); + + this.$rules.block_arguments = [ + { + token: "paren.rparen", + regex: "\\|", + next: "no_regex" + } + ].concat(this.$rules.function_arguments); + + this.$rules.bstring = [ + { + token : "constant.language.escape", + regex : escapedRe + }, + { + token : "string", + regex : "\\\\$", + next: "bstring" + }, + ctxBegin({ + token : "paren.lparen", + regex : "\\$\\{", + next: "string_interp" + }), + ctxBegin({ + token : "paren.lparen", + regex : "\\$", + next: "bstring_interp_single" + }), + ctxEnd({ + token : "string", + regex : "`" + }), + { + defaultToken: "string" + } + ]; + + this.$rules.qqstring = [ + { + token : "constant.language.escape", + regex : escapedRe + }, + { + token : "string", + regex : "\\\\$", + next: "qqstring" + }, + ctxBegin({ + token : "paren.lparen", + regex : "#\\{", + next: "string_interp" + }), + ctxEnd({ + token : "string", + regex : '"' + }), + { + defaultToken: "string" + } + ]; + var embeddableRules = []; + for (var i=0; i < this.$rules.no_regex.length; i++) { + var rule = this.$rules.no_regex[i]; + var token = String(rule.token); + if (token.indexOf('paren') == -1 && (!rule.next || rule.next.isContextAware)) { + embeddableRules.push(rule); + } + } + + this.$rules.string_interp = [ + ctxEnd({ + token: "paren.rparen", + regex: "\\}" + }), + ctxBegin({ + token: "paren.lparen", + regex: '{', + next: "string_interp" + }) + ].concat(embeddableRules); + this.$rules.bstring_interp_single = [ + { + token: ["identifier", "paren.lparen"], + regex: '(\\w+)(\\()', + next: 'bstring_interp_single_call' + }, + ctxEnd({ + token : "identifier", + regex : "\\w*" + }) + ]; + this.$rules.bstring_interp_single_call = [ + ctxBegin({ + token: "paren.lparen", + regex: "\\(", + next: "bstring_interp_single_call" + }), + ctxEnd({ + token: "paren.rparen", + regex: "\\)" + }) + ].concat(embeddableRules); +} +oop.inherits(SJSHighlightRules, TextHighlightRules); + +exports.SJSHighlightRules = SJSHighlightRules; +}); + +ace.define("ace/mode/sjs",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/sjs_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; +var oop = require("../lib/oop"); +var JSMode = require("./javascript").Mode; +var SJSHighlightRules = require("./sjs_highlight_rules").SJSHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = SJSHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, JSMode); +(function() { + this.createWorker = function(session) { + return null; + } + this.$id = "ace/mode/sjs"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-smarty.js b/src/libs/ace/mode-smarty.js new file mode 100755 index 0000000..448ced3 --- /dev/null +++ b/src/libs/ace/mode-smarty.js @@ -0,0 +1,2606 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/smarty_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + +var SmartyHighlightRules = function() { + HtmlHighlightRules.call(this); + var smartyRules = { start: + [ { include: '#comments' }, + { include: '#blocks' } ], + '#blocks': + [ { token: 'punctuation.section.embedded.begin.smarty', + regex: '\\{%?', + push: + [ { token: 'punctuation.section.embedded.end.smarty', + regex: '%?\\}', + next: 'pop' }, + { include: '#strings' }, + { include: '#variables' }, + { include: '#lang' }, + { defaultToken: 'source.smarty' } ] } ], + '#comments': + [ { token: + [ 'punctuation.definition.comment.smarty', + 'comment.block.smarty' ], + regex: '(\\{%?)(\\*)', + push: + [ { token: 'comment.block.smarty', regex: '\\*%?\\}', next: 'pop' }, + { defaultToken: 'comment.block.smarty' } ] } ], + '#lang': + [ { token: 'keyword.operator.smarty', + regex: '(?:!=|!|<=|>=|<|>|===|==|%|&&|\\|\\|)|\\b(?:and|or|eq|neq|ne|gte|gt|ge|lte|lt|le|not|mod)\\b' }, + { token: 'constant.language.smarty', + regex: '\\b(?:TRUE|FALSE|true|false)\\b' }, + { token: 'keyword.control.smarty', + regex: '\\b(?:if|else|elseif|foreach|foreachelse|section|switch|case|break|default)\\b' }, + { token: 'variable.parameter.smarty', regex: '\\b[a-zA-Z]+=' }, + { token: 'support.function.built-in.smarty', + regex: '\\b(?:capture|config_load|counter|cycle|debug|eval|fetch|include_php|include|insert|literal|math|strip|rdelim|ldelim|assign|constant|block|html_[a-z_]*)\\b' }, + { token: 'support.function.variable-modifier.smarty', + regex: '\\|(?:capitalize|cat|count_characters|count_paragraphs|count_sentences|count_words|date_format|default|escape|indent|lower|nl2br|regex_replace|replace|spacify|string_format|strip_tags|strip|truncate|upper|wordwrap)' } ], + '#strings': + [ { token: 'punctuation.definition.string.begin.smarty', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.smarty', + regex: '\'', + next: 'pop' }, + { token: 'constant.character.escape.smarty', regex: '\\\\.' }, + { defaultToken: 'string.quoted.single.smarty' } ] }, + { token: 'punctuation.definition.string.begin.smarty', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.smarty', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.smarty', regex: '\\\\.' }, + { defaultToken: 'string.quoted.double.smarty' } ] } ], + '#variables': + [ { token: + [ 'punctuation.definition.variable.smarty', + 'variable.other.global.smarty' ], + regex: '\\b(\\$)(Smarty\\.)' }, + { token: + [ 'punctuation.definition.variable.smarty', + 'variable.other.smarty' ], + regex: '(\\$)([a-zA-Z_][a-zA-Z0-9_]*)\\b' }, + { token: [ 'keyword.operator.smarty', 'variable.other.property.smarty' ], + regex: '(->)([a-zA-Z_][a-zA-Z0-9_]*)\\b' }, + { token: + [ 'keyword.operator.smarty', + 'meta.function-call.object.smarty', + 'punctuation.definition.variable.smarty', + 'variable.other.smarty', + 'punctuation.definition.variable.smarty' ], + regex: '(->)([a-zA-Z_][a-zA-Z0-9_]*)(\\()(.*?)(\\))' } ] } + + var smartyStart = smartyRules.start; + + for (var rule in this.$rules) { + this.$rules[rule].unshift.apply(this.$rules[rule], smartyStart); + } + + Object.keys(smartyRules).forEach(function(x) { + if (!this.$rules[x]) + this.$rules[x] = smartyRules[x]; + }, this); + + this.normalizeRules(); +}; + +SmartyHighlightRules.metaData = { fileTypes: [ 'tpl' ], + foldingStartMarker: '\\{%?', + foldingStopMarker: '%?\\}', + name: 'Smarty', + scopeName: 'text.html.smarty' } + + +oop.inherits(SmartyHighlightRules, HtmlHighlightRules); + +exports.SmartyHighlightRules = SmartyHighlightRules; +}); + +ace.define("ace/mode/smarty",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/smarty_highlight_rules"], function(require, exports, module) { + "use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var SmartyHighlightRules = require("./smarty_highlight_rules").SmartyHighlightRules; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = SmartyHighlightRules; +}; + +oop.inherits(Mode, HtmlMode); + +(function() { + + this.$id = "ace/mode/smarty"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-snippets.js b/src/libs/ace/mode-snippets.js new file mode 100755 index 0000000..a528501 --- /dev/null +++ b/src/libs/ace/mode-snippets.js @@ -0,0 +1,199 @@ +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/snippets",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SnippetHighlightRules = function() { + + var builtins = "SELECTION|CURRENT_WORD|SELECTED_TEXT|CURRENT_LINE|LINE_INDEX|" + + "LINE_NUMBER|SOFT_TABS|TAB_SIZE|FILENAME|FILEPATH|FULLNAME"; + + this.$rules = { + "start" : [ + {token:"constant.language.escape", regex: /\\[\$}`\\]/}, + {token:"keyword", regex: "\\$(?:TM_)?(?:" + builtins + ")\\b"}, + {token:"variable", regex: "\\$\\w+"}, + {onMatch: function(value, state, stack) { + if (stack[1]) + stack[1]++; + else + stack.unshift(state, 1); + return this.tokenName; + }, tokenName: "markup.list", regex: "\\${", next: "varDecl"}, + {onMatch: function(value, state, stack) { + if (!stack[1]) + return "text"; + stack[1]--; + if (!stack[1]) + stack.splice(0,2); + return this.tokenName; + }, tokenName: "markup.list", regex: "}"}, + {token: "doc.comment", regex:/^\${2}-{5,}$/} + ], + "varDecl" : [ + {regex: /\d+\b/, token: "constant.numeric"}, + {token:"keyword", regex: "(?:TM_)?(?:" + builtins + ")\\b"}, + {token:"variable", regex: "\\w+"}, + {regex: /:/, token: "punctuation.operator", next: "start"}, + {regex: /\//, token: "string.regex", next: "regexp"}, + {regex: "", next: "start"} + ], + "regexp" : [ + {regex: /\\./, token: "escape"}, + {regex: /\[/, token: "regex.start", next: "charClass"}, + {regex: "/", token: "string.regex", next: "format"}, + {"token": "string.regex", regex:"."} + ], + charClass : [ + {regex: "\\.", token: "escape"}, + {regex: "\\]", token: "regex.end", next: "regexp"}, + {"token": "string.regex", regex:"."} + ], + "format" : [ + {regex: /\\[ulULE]/, token: "keyword"}, + {regex: /\$\d+/, token: "variable"}, + {regex: "/[gim]*:?", token: "string.regex", next: "start"}, + {"token": "string", regex:"."} + ] + }; +}; +oop.inherits(SnippetHighlightRules, TextHighlightRules); + +exports.SnippetHighlightRules = SnippetHighlightRules; + +var SnippetGroupHighlightRules = function() { + this.$rules = { + "start" : [ + {token: "text", regex: "^\\t", next: "sn-start"}, + {token:"invalid", regex: /^ \s*/}, + {token:"comment", regex: /^#.*/}, + {token:"constant.language.escape", regex: "^regex ", next: "regex"}, + {token:"constant.language.escape", regex: "^(trigger|endTrigger|name|snippet|guard|endGuard|tabTrigger|key)\\b"} + ], + "regex" : [ + {token:"text", regex: "\\."}, + {token:"keyword", regex: "/"}, + {token:"empty", regex: "$", next: "start"} + ] + }; + this.embedRules(SnippetHighlightRules, "sn-", [ + {token: "text", regex: "^\\t", next: "sn-start"}, + {onMatch: function(value, state, stack) { + stack.splice(stack.length); + return this.tokenName; + }, tokenName: "text", regex: "^(?!\t)", next: "start"} + ]) + +}; + +oop.inherits(SnippetGroupHighlightRules, TextHighlightRules); + +exports.SnippetGroupHighlightRules = SnippetGroupHighlightRules; + +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = SnippetGroupHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$indentWithTabs = true; + this.lineCommentStart = "#"; + this.$id = "ace/mode/snippets"; +}).call(Mode.prototype); +exports.Mode = Mode; + + +}); diff --git a/src/libs/ace/mode-soy_template.js b/src/libs/ace/mode-soy_template.js new file mode 100755 index 0000000..df831bb --- /dev/null +++ b/src/libs/ace/mode-soy_template.js @@ -0,0 +1,2819 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/soy_template_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + +var SoyTemplateHighlightRules = function() { + HtmlHighlightRules.call(this); + + var soyRules = { start: + [ { include: '#template' }, + { include: '#if' }, + { include: '#comment-line' }, + { include: '#comment-block' }, + { include: '#comment-doc' }, + { include: '#call' }, + { include: '#css' }, + { include: '#param' }, + { include: '#print' }, + { include: '#msg' }, + { include: '#for' }, + { include: '#foreach' }, + { include: '#switch' }, + { include: '#tag' }, + { include: 'text.html.basic' } ], + '#call': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.call.soy' ], + regex: '(\\{/?)(\\s*)(?=call|delcall)', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { include: '#string-quoted-single' }, + { include: '#string-quoted-double' }, + { token: ['entity.name.tag.soy', 'variable.parameter.soy'], + regex: '(call|delcall)(\\s+[\\.\\w]+)'}, + { token: + [ 'entity.other.attribute-name.soy', + 'text', + 'keyword.operator.soy' ], + regex: '\\b(data)(\\s*)(=)' }, + { defaultToken: 'meta.tag.call.soy' } ] } ], + '#comment-line': + [ { token: + [ 'comment.line.double-slash.soy', + 'comment.line.double-slash.soy' ], + regex: '(//)(.*$)' } ], + '#comment-block': + [ { token: 'punctuation.definition.comment.begin.soy', + regex: '/\\*(?!\\*)', + push: + [ { token: 'punctuation.definition.comment.end.soy', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.soy' } ] } ], + '#comment-doc': + [ { token: 'punctuation.definition.comment.begin.soy', + regex: '/\\*\\*(?!/)', + push: + [ { token: 'punctuation.definition.comment.end.soy', + regex: '\\*/', + next: 'pop' }, + { token: [ 'support.type.soy', 'text', 'variable.parameter.soy' ], + regex: '(@param|@param\\?)(\\s+)(\\w+)' }, + { defaultToken: 'comment.block.documentation.soy' } ] } ], + '#css': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.css.soy', + 'entity.name.tag.soy' ], + regex: '(\\{/?)(\\s*)(css)\\b', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { token: 'support.constant.soy', + regex: '\\b(?:LITERAL|REFERENCE|BACKEND_SPECIFIC|GOOG)\\b' }, + { defaultToken: 'meta.tag.css.soy' } ] } ], + '#for': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.for.soy', + 'entity.name.tag.soy' ], + regex: '(\\{/?)(\\s*)(for)\\b', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { token: 'keyword.operator.soy', regex: '\\bin\\b' }, + { token: 'support.function.soy', regex: '\\brange\\b' }, + { include: '#variable' }, + { include: '#number' }, + { include: '#primitive' }, + { defaultToken: 'meta.tag.for.soy' } ] } ], + '#foreach': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.foreach.soy', + 'entity.name.tag.soy' ], + regex: '(\\{/?)(\\s*)(foreach)\\b', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { token: 'keyword.operator.soy', regex: '\\bin\\b' }, + { include: '#variable' }, + { defaultToken: 'meta.tag.foreach.soy' } ] } ], + '#function': + [ { token: 'support.function.soy', + regex: '\\b(?:isFirst|isLast|index|hasData|length|keys|round|floor|ceiling|min|max|randomInt)\\b' } ], + '#if': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.if.soy', + 'entity.name.tag.soy' ], + regex: '(\\{/?)(\\s*)(if|elseif)\\b', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { include: '#variable' }, + { include: '#operator' }, + { include: '#function' }, + { include: '#string-quoted-single' }, + { include: '#string-quoted-double' }, + { defaultToken: 'meta.tag.if.soy' } ] } ], + '#namespace': + [ { token: [ 'entity.name.tag.soy', 'text', 'variable.parameter.soy' ], + regex: '(namespace|delpackage)(\\s+)([\\w\\.]+)' } ], + '#number': [ { token: 'constant.numeric', regex: '[\\d]+' } ], + '#operator': + [ { token: 'keyword.operator.soy', + regex: '==|!=|\\band\\b|\\bor\\b|\\bnot\\b|-|\\+|/|\\?:' } ], + '#param': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.param.soy', + 'entity.name.tag.soy' ], + regex: '(\\{/?)(\\s*)(param)', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { include: '#variable' }, + { token: + [ 'entity.other.attribute-name.soy', + 'text', + 'keyword.operator.soy' ], + regex: '\\b([\\w]+)(\\s*)((?::)?)' }, + { defaultToken: 'meta.tag.param.soy' } ] } ], + '#primitive': + [ { token: 'constant.language.soy', + regex: '\\b(?:null|false|true)\\b' } ], + '#msg': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.msg.soy', + 'entity.name.tag.soy' ], + regex: '(\\{/?)(\\s*)(msg)\\b', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { include: '#string-quoted-single' }, + { include: '#string-quoted-double' }, + { token: + [ 'entity.other.attribute-name.soy', + 'text', + 'keyword.operator.soy' ], + regex: '\\b(meaning|desc)(\\s*)(=)' }, + { defaultToken: 'meta.tag.msg.soy' } ] } ], + '#print': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.print.soy', + 'entity.name.tag.soy' ], + regex: '(\\{/?)(\\s*)(print)\\b', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { include: '#variable' }, + { include: '#print-parameter' }, + { include: '#number' }, + { include: '#primitive' }, + { include: '#attribute-lookup' }, + { defaultToken: 'meta.tag.print.soy' } ] } ], + '#print-parameter': + [ { token: 'keyword.operator.soy', regex: '\\|' }, + { token: 'variable.parameter.soy', + regex: 'noAutoescape|id|escapeHtml|escapeJs|insertWorkBreaks|truncate' } ], + '#special-character': + [ { token: 'support.constant.soy', + regex: '\\bsp\\b|\\bnil\\b|\\\\r|\\\\n|\\\\t|\\blb\\b|\\brb\\b' } ], + '#string-quoted-double': [ { token: 'string.quoted.double', regex: '"[^"]*"' } ], + '#string-quoted-single': [ { token: 'string.quoted.single', regex: '\'[^\']*\'' } ], + '#switch': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.switch.soy', + 'entity.name.tag.soy' ], + regex: '(\\{/?)(\\s*)(switch|case)\\b', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { include: '#variable' }, + { include: '#function' }, + { include: '#number' }, + { include: '#string-quoted-single' }, + { include: '#string-quoted-double' }, + { defaultToken: 'meta.tag.switch.soy' } ] } ], + '#attribute-lookup': + [ { token: 'punctuation.definition.attribute-lookup.begin.soy', + regex: '\\[', + push: + [ { token: 'punctuation.definition.attribute-lookup.end.soy', + regex: '\\]', + next: 'pop' }, + { include: '#variable' }, + { include: '#function' }, + { include: '#operator' }, + { include: '#number' }, + { include: '#primitive' }, + { include: '#string-quoted-single' }, + { include: '#string-quoted-double' } ] } ], + '#tag': + [ { token: 'punctuation.definition.tag.begin.soy', + regex: '\\{', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { include: '#namespace' }, + { include: '#variable' }, + { include: '#special-character' }, + { include: '#tag-simple' }, + { include: '#function' }, + { include: '#operator' }, + { include: '#attribute-lookup' }, + { include: '#number' }, + { include: '#primitive' }, + { include: '#print-parameter' } ] } ], + '#tag-simple': + [ { token: 'entity.name.tag.soy', + regex: '{{\\s*(?:literal|else|ifempty|default)\\s*(?=\\})'} ], + '#template': + [ { token: + [ 'punctuation.definition.tag.begin.soy', + 'meta.tag.template.soy' ], + regex: '(\\{/?)(\\s*)(?=template|deltemplate)', + push: + [ { token: 'punctuation.definition.tag.end.soy', + regex: '\\}', + next: 'pop' }, + { token: ['entity.name.tag.soy', 'text', 'entity.name.function.soy' ], + regex: '(template|deltemplate)(\\s+)([\\.\\w]+)', + originalRegex: '(?<=template|deltemplate)\\s+([\\.\\w]+)' }, + { token: + [ 'entity.other.attribute-name.soy', + 'text', + 'keyword.operator.soy', + 'text', + 'string.quoted.double.soy' ], + regex: '\\b(private)(\\s*)(=)(\\s*)("true"|"false")' }, + { token: + [ 'entity.other.attribute-name.soy', + 'text', + 'keyword.operator.soy', + 'text', + 'string.quoted.single.soy' ], + regex: '\\b(private)(\\s*)(=)(\\s*)(\'true\'|\'false\')' }, + { token: + [ 'entity.other.attribute-name.soy', + 'text', + 'keyword.operator.soy', + 'text', + 'string.quoted.double.soy' ], + regex: '\\b(autoescape)(\\s*)(=)(\\s*)("true"|"false"|"contextual")' }, + { token: + [ 'entity.other.attribute-name.soy', + 'text', + 'keyword.operator.soy', + 'text', + 'string.quoted.single.soy' ], + regex: '\\b(autoescape)(\\s*)(=)(\\s*)(\'true\'|\'false\'|\'contextual\')' }, + { defaultToken: 'meta.tag.template.soy' } ] } ], + '#variable': [ { token: 'variable.other.soy', regex: '\\$[\\w\\.]+' } ] } + + + for (var i in soyRules) { + if (this.$rules[i]) { + this.$rules[i].unshift.apply(this.$rules[i], soyRules[i]); + } else { + this.$rules[i] = soyRules[i]; + } + } + + this.normalizeRules(); +}; + +SoyTemplateHighlightRules.metaData = { comment: 'SoyTemplate', + fileTypes: [ 'soy' ], + firstLineMatch: '\\{\\s*namespace\\b', + foldingStartMarker: '\\{\\s*template\\s+[^\\}]*\\}', + foldingStopMarker: '\\{\\s*/\\s*template\\s*\\}', + name: 'SoyTemplate', + scopeName: 'source.soy' } + + +oop.inherits(SoyTemplateHighlightRules, HtmlHighlightRules); + +exports.SoyTemplateHighlightRules = SoyTemplateHighlightRules; +}); + +ace.define("ace/mode/soy_template",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/soy_template_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var SoyTemplateHighlightRules = require("./soy_template_highlight_rules").SoyTemplateHighlightRules; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = SoyTemplateHighlightRules; +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$id = "ace/mode/soy_template"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-space.js b/src/libs/ace/mode-space.js new file mode 100755 index 0000000..5bbeb48 --- /dev/null +++ b/src/libs/ace/mode-space.js @@ -0,0 +1,160 @@ +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/space_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SpaceHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "empty_line", + regex : / */, + next : "key" + }, + { + token : "empty_line", + regex : /$/, + next : "key" + } + ], + "key" : [ + { + token : "variable", + regex : /\S+/ + }, + { + token : "empty_line", + regex : /$/, + next : "start" + },{ + token : "keyword.operator", + regex : / /, + next : "value" + } + ], + "value" : [ + { + token : "keyword.operator", + regex : /$/, + next : "start" + }, + { + token : "string", + regex : /[^$]/ + } + ] + }; + +}; + +oop.inherits(SpaceHighlightRules, TextHighlightRules); + +exports.SpaceHighlightRules = SpaceHighlightRules; +}); + +ace.define("ace/mode/space",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/folding/coffee","ace/mode/space_highlight_rules"], function(require, exports, module) { +"use strict"; +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var FoldMode = require("./folding/coffee").FoldMode; +var SpaceHighlightRules = require("./space_highlight_rules").SpaceHighlightRules; +var Mode = function() { + this.HighlightRules = SpaceHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); +(function() { + + this.$id = "ace/mode/space"; +}).call(Mode.prototype); +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-sparql.js b/src/libs/ace/mode-sparql.js new file mode 100755 index 0000000..e5a5854 --- /dev/null +++ b/src/libs/ace/mode-sparql.js @@ -0,0 +1,313 @@ +ace.define("ace/mode/sparql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SPARQLHighlightRules = function() { + + this.$rules = { + start: [{ + include: "#comments" + }, { + include: "#strings" + }, { + include: "#string-language-suffixes" + }, { + include: "#string-datatype-suffixes" + }, { + include: "#logic-operators" + }, { + include: "#relative-urls" + }, { + include: "#xml-schema-types" + }, { + include: "#rdf-schema-types" + }, { + include: "#owl-types" + }, { + include: "#qnames" + }, { + include: "#keywords" + }, { + include: "#built-in-functions" + }, { + include: "#variables" + }, { + include: "#boolean-literal" + }, { + include: "#punctuation-operators" + }], + "#boolean-literal": [{ + token: "constant.language.boolean.sparql", + regex: /true|false/ + }], + "#built-in-functions": [{ + token: "support.function.sparql", + regex: /[Aa][Bb][Ss]|[Aa][Vv][Gg]|[Bb][Nn][Oo][Dd][Ee]|[Bb][Oo][Uu][Nn][Dd]|[Cc][Ee][Ii][Ll]|[Cc][Oo][Aa][Ll][Ee][Ss][Cc][Ee]|[Cc][Oo][Nn][Cc][Aa][Tt]|[Cc][Oo][Nn][Tt][Aa][Ii][Nn][Ss]|[Cc][Oo][Uu][Nn][Tt]|[Dd][Aa][Tt][Aa][Tt][Yy][Pp][Ee]|[Dd][Aa][Yy]|[Ee][Nn][Cc][Oo][Dd][Ee]_[Ff][Oo][Rr]_[Uu][Rr][Ii]|[Ee][Xx][Ii][Ss][Tt][Ss]|[Ff][Ll][Oo][Oo][Rr]|[Gg][Rr][Oo][Uu][Pp]_[Cc][Oo][Nn][Cc][Aa][Tt]|[Hh][Oo][Uu][Rr][Ss]|[Ii][Ff]|[Ii][Rr][Ii]|[Ii][Ss][Bb][Ll][Aa][Nn][Kk]|[Ii][Ss][Ii][Rr][Ii]|[Ii][Ss][Ll][Ii][Tt][Ee][Rr][Aa][Ll]|[Ii][Ss][Nn][Uu][Mm][Ee][Rr][Ii][Cc]|[Ii][Ss][Uu][Rr][Ii]|[Ll][Aa][Nn][Gg]|[Ll][Aa][Nn][Gg][Mm][Aa][Tt][Cc][Hh][Ee][Ss]|[Ll][Cc][Aa][Ss][Ee]|[Mm][Aa][Xx]|[Mm][Dd]5|[Mm][Ii][Nn]|[Mm][Ii][Nn][Uu][Tt][Ee][Ss]|[Mm][Oo][Nn][Tt][Hh]|[Nn][Oo][Ww]|[Rr][Aa][Nn][Dd]|[Rr][Ee][Gg][Ee][Xx]|[Rr][Ee][Pp][Ll][Aa][Cc][Ee]|[Rr][Oo][Uu][Nn][Dd]|[Ss][Aa][Mm][Ee][Tt][Ee][Rr][Mm]|[Ss][Aa][Mm][Pp][Ll][Ee]|[Ss][Ee][Cc][Oo][Nn][Dd][Ss]|[Ss][Ee][Pp][Aa][Rr][Aa][Tt][Oo][Rr]|[Ss][Hh][Aa](?:1|256|384|512)|[Ss][Tt][Rr]|[Ss][Tt][Rr][Aa][Ff][Tt][Ee][Rr]|[Ss][Tt][Rr][Bb][Ee][Ff][Oo][Rr][Ee]|[Ss][Tt][Rr][Dd][Tt]|[Ss][Tt][Rr][Ee][Nn][Dd][Ss]|[Ss][Tt][Rr][Ll][Aa][Nn][Gg]|[Ss][Tt][Rr][Ll][Ee][Nn]|[Ss][Tt][Rr][Ss][Tt][Aa][Rr][Tt][Ss]|[Ss][Tt][Rr][Uu][Uu][Ii][Dd]|[Ss][Uu][Bb][Ss][Tt][Rr]|[Ss][Uu][Mm]|[Tt][Ii][Mm][Ee][Zz][Oo][Nn][Ee]|[Tt][Zz]|[Uu][Cc][Aa][Ss][Ee]|[Uu][Rr][Ii]|[Uu][Uu][Ii][Dd]|[Yy][Ee][Aa][Rr]/ + }], + "#comments": [{ + token: [ + "punctuation.definition.comment.sparql", + "comment.line.hash.sparql" + ], + regex: /(#)(.*$)/ + }], + "#keywords": [{ + token: "keyword.other.sparql", + regex: /[Aa][Dd][Dd]|[Aa][Ll][Ll]|[Aa][Ss]|[As][Ss][Cc]|[Aa][Ss][Kk]|[Bb][Aa][Ss][Ee]|[Bb][Ii][Nn][Dd]|[Bb][Yy]|[Cc][Ll][Ee][Aa][Rr]|[Cc][Oo][Nn][Ss][Tt][Rr][Uu][Cc][Tt]|[Cc][Oo][Pp][Yy]|[Cc][Rr][Ee][Aa][Tt][Ee]|[Dd][Aa][Tt][Aa]|[Dd][Ee][Ff][Aa][Uu][Ll][Tt]|[Dd][Ee][Ll][Ee][Tt][Ee]|[Dd][Ee][Sc][Cc]|[Dd][Ee][Ss][Cc][Rr][Ii][Bb][Ee]|[Dd][Ii][Ss][Tt][Ii][Nn][Cc][Tt]|[Dd][Rr][Oo][Pp]|[Ff][Ii][Ll][Tt][Ee][Rr]|[Ff][Rr][Oo][Mm]|[Gg][Rr][Aa][Pp][Hh]|[Gg][Rr][Oo][Uu][Pp]|[Hh][Aa][Vv][Ii][Nn][Gg]|[Ii][Nn][Ss][Ee][Rr][Tt]|[Ll][Ii][Mm][Ii][Tt]|[Ll][Oo][Aa][Dd]|[Mm][Ii][Nn][Uu][Ss]|[Mm][Oo][Vv][Ee]|[Nn][Aa][Mm][Ee][Dd]|[Oo][Ff][Ff][Ss][Ee][Tt]|[Oo][Pp][Tt][Ii][Oo][Nn][Aa][Ll]|[Oo][Rr][Dd][Ee][Rr]|[Pp][Rr][Ee][Ff][Ii][Xx]|[Rr][Ee][Dd][Uu][Cc][Ee][Dd]|[Ss][Ee][Ll][Ee][Cc][Tt]|[Ss][Ee][Pp][Aa][Rr][Aa][Tt][Oo][Rr]|[Ss][Ee][Rr][Vv][Ii][Cc][Ee]|[Ss][Ii][Ll][Ee][Nn][Tt]|[Tt][Oo]|[Uu][Nn][Dd][Ee][Ff]|[Uu][Nn][Ii][Oo][Nn]|[Uu][Ss][Ii][Nn][Gg]|[Vv][Aa][Ll][Uu][Ee][Ss]|[Ww][He][Ee][Rr][Ee]|[Ww][Ii][Tt][Hh]/ + }], + "#logic-operators": [{ + token: "keyword.operator.logical.sparql", + regex: /\|\||&&|=|!=|<|>|<=|>=|(?:^|!?\s)IN(?:!?\s|$)|(?:^|!?\s)NOT(?:!?\s|$)|-|\+|\*|\/|\!/ + }], + "#owl-types": [{ + token: "support.type.datatype.owl.sparql", + regex: /owl:[a-zA-Z]+/ + }], + "#punctuation-operators": [{ + token: "keyword.operator.punctuation.sparql", + regex: /;|,|\.|\(|\)|\{|\}|\|/ + }], + "#qnames": [{ + token: "entity.name.other.qname.sparql", + regex: /(?:[a-zA-Z][-_a-zA-Z0-9]*)?:(?:[_a-zA-Z][-_a-zA-Z0-9]*)?/ + }], + "#rdf-schema-types": [{ + token: "support.type.datatype.rdf.schema.sparql", + regex: /rdfs?:[a-zA-Z]+|(?:^|\s)a(?:\s|$)/ + }], + "#relative-urls": [{ + token: "string.quoted.other.relative.url.sparql", + regex: //, + next: "pop" + }, { + defaultToken: "string.quoted.other.relative.url.sparql" + }] + }], + "#string-datatype-suffixes": [{ + token: "keyword.operator.datatype.suffix.sparql", + regex: /\^\^/ + }], + "#string-language-suffixes": [{ + token: [ + "keyword.operator.language.suffix.sparql", + "constant.language.suffix.sparql" + ], + regex: /(?!")(@)([a-z]+(?:\-[a-z0-9]+)*)/ + }], + "#strings": [{ + token: "string.quoted.triple.sparql", + regex: /"""/, + push: [{ + token: "string.quoted.triple.sparql", + regex: /"""/, + next: "pop" + }, { + defaultToken: "string.quoted.triple.sparql" + }] + }, { + token: "string.quoted.double.sparql", + regex: /"/, + push: [{ + token: "string.quoted.double.sparql", + regex: /"/, + next: "pop" + }, { + token: "invalid.string.newline", + regex: /$/ + }, { + token: "constant.character.escape.sparql", + regex: /\\./ + }, { + defaultToken: "string.quoted.double.sparql" + }] + }], + "#variables": [{ + token: "variable.other.sparql", + regex: /(?:\?|\$)[-_a-zA-Z0-9]+/ + }], + "#xml-schema-types": [{ + token: "support.type.datatype.schema.sparql", + regex: /xsd?:[a-z][a-zA-Z]+/ + }] + } + + this.normalizeRules(); +}; + +SPARQLHighlightRules.metaData = { + fileTypes: ["rq", "sparql"], + name: "SPARQL", + scopeName: "source.sparql" +} + + +oop.inherits(SPARQLHighlightRules, TextHighlightRules); + +exports.SPARQLHighlightRules = SPARQLHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/sparql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sparql_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var SPARQLHighlightRules = require("./sparql_highlight_rules").SPARQLHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = SPARQLHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/sparql" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-sql.js b/src/libs/ace/mode-sql.js new file mode 100755 index 0000000..9678787 --- /dev/null +++ b/src/libs/ace/mode-sql.js @@ -0,0 +1,103 @@ +ace.define("ace/mode/sql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SqlHighlightRules = function() { + + var keywords = ( + "select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|" + + "when|else|end|type|left|right|join|on|outer|desc|asc|union|create|table|primary|key|if|" + + "foreign|not|references|default|null|inner|cross|natural|database|drop|grant" + ); + + var builtinConstants = ( + "true|false" + ); + + var builtinFunctions = ( + "avg|count|first|last|max|min|sum|ucase|lcase|mid|len|round|rank|now|format|" + + "coalesce|ifnull|isnull|nvl" + ); + + var dataTypes = ( + "int|numeric|decimal|date|varchar|char|bigint|float|double|bit|binary|text|set|timestamp|" + + "money|real|number|integer" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants, + "storage.type": dataTypes + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "--.*$" + }, { + token : "comment", + start : "/\\*", + end : "\\*/" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "string", // ` string (apache drill) + regex : "`.*?`" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; + this.normalizeRules(); +}; + +oop.inherits(SqlHighlightRules, TextHighlightRules); + +exports.SqlHighlightRules = SqlHighlightRules; +}); + +ace.define("ace/mode/sql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sql_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var SqlHighlightRules = require("./sql_highlight_rules").SqlHighlightRules; + +var Mode = function() { + this.HighlightRules = SqlHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + + this.$id = "ace/mode/sql"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-sqlserver.js b/src/libs/ace/mode-sqlserver.js new file mode 100755 index 0000000..59e9b90 --- /dev/null +++ b/src/libs/ace/mode-sqlserver.js @@ -0,0 +1,437 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/sqlserver_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SqlServerHighlightRules = function() { + var logicalOperators = "ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|SOME"; + logicalOperators += "|NULL|IS|APPLY|INNER|OUTER|LEFT|RIGHT|JOIN|CROSS"; //SSMS colors these gray too + + + var builtinFunctions = ( + "OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|" + + "AVG|CHECKSUM_AGG|COUNT|COUNT_BIG|GROUPING|GROUPING_ID|MAX|MIN|STDEV|STDEVP|SUM|VAR|VARP|" + + "DENSE_RANK|NTILE|RANK|ROW_NUMBER" + + "@@DATEFIRST|@@DBTS|@@LANGID|@@LANGUAGE|@@LOCK_TIMEOUT|@@MAX_CONNECTIONS|@@MAX_PRECISION|@@NESTLEVEL|@@OPTIONS|@@REMSERVER|@@SERVERNAME|@@SERVICENAME|@@SPID|@@TEXTSIZE|@@VERSION|" + + "CAST|CONVERT|PARSE|TRY_CAST|TRY_CONVERT|TRY_PARSE" + + "@@CURSOR_ROWS|@@FETCH_STATUS|CURSOR_STATUS|" + + "@@DATEFIRST|@@LANGUAGE|CURRENT_TIMESTAMP|DATEADD|DATEDIFF|DATEFROMPARTS|DATENAME|DATEPART|DATETIME2FROMPARTS|DATETIMEFROMPARTS|DATETIMEOFFSETFROMPARTS|DAY|EOMONTH|GETDATE|GETUTCDATE|ISDATE|MONTH|SET DATEFIRST|SET DATEFORMAT|SET LANGUAGE|SMALLDATETIMEFROMPARTS|SP_HELPLANGUAGE|SWITCHOFFSET|SYSDATETIME|SYSDATETIMEOFFSET|SYSUTCDATETIME|TIMEFROMPARTS|TODATETIMEOFFSET|YEAR|" + + "CHOOSE|IIF|" + + "ABS|ACOS|ASIN|ATAN|ATN2|CEILING|COS|COT|DEGREES|EXP|FLOOR|LOG|LOG10|PI|POWER|RADIANS|RAND|ROUND|SIGN|SIN|SQRT|SQUARE|TAN|" + + "@@PROCID|APPLOCK_MODE|APPLOCK_TEST|APP_NAME|ASSEMBLYPROPERTY|COLUMNPROPERTY|COL_LENGTH|COL_NAME|DATABASEPROPERTYEX|DATABASE_PRINCIPAL_ID|DB_ID|DB_NAME|FILEGROUPPROPERTY|FILEGROUP_ID|FILEGROUP_NAME|FILEPROPERTY|FILE_ID|FILE_IDEX|FILE_NAME|FULLTEXTCATALOGPROPERTY|FULLTEXTSERVICEPROPERTY|INDEXKEY_PROPERTY|INDEXPROPERTY|INDEX_COL|OBJECTPROPERTY|OBJECTPROPERTYEX|OBJECT_DEFINITION|OBJECT_ID|OBJECT_NAME|OBJECT_SCHEMA_NAME|ORIGINAL_DB_NAME|PARSENAME|SCHEMA_ID|SCHEMA_NAME|SCOPE_IDENTITY|SERVERPROPERTY|STATS_DATE|TYPEPROPERTY|TYPE_ID|TYPE_NAME|" + + "CERTENCODED|CERTPRIVATEKEY|CURRENT_USER|DATABASE_PRINCIPAL_ID|HAS_PERMS_BY_NAME|IS_MEMBER|IS_ROLEMEMBER|IS_SRVROLEMEMBER|ORIGINAL_LOGIN|PERMISSIONS|PWDCOMPARE|PWDENCRYPT|SCHEMA_ID|SCHEMA_NAME|SESSION_USER|SUSER_ID|SUSER_NAME|SUSER_SID|SUSER_SNAME|SYS.FN_BUILTIN_PERMISSIONS|SYS.FN_GET_AUDIT_FILE|SYS.FN_MY_PERMISSIONS|SYSTEM_USER|USER_ID|USER_NAME|" + + "ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER|" + + "$PARTITION|@@ERROR|@@IDENTITY|@@PACK_RECEIVED|@@ROWCOUNT|@@TRANCOUNT|BINARY_CHECKSUM|CHECKSUM|CONNECTIONPROPERTY|CONTEXT_INFO|CURRENT_REQUEST_ID|ERROR_LINE|ERROR_MESSAGE|ERROR_NUMBER|ERROR_PROCEDURE|ERROR_SEVERITY|ERROR_STATE|FORMATMESSAGE|GETANSINULL|GET_FILESTREAM_TRANSACTION_CONTEXT|HOST_ID|HOST_NAME|ISNULL|ISNUMERIC|MIN_ACTIVE_ROWVERSION|NEWID|NEWSEQUENTIALID|ROWCOUNT_BIG|XACT_STATE|" + + "@@CONNECTIONS|@@CPU_BUSY|@@IDLE|@@IO_BUSY|@@PACKET_ERRORS|@@PACK_RECEIVED|@@PACK_SENT|@@TIMETICKS|@@TOTAL_ERRORS|@@TOTAL_READ|@@TOTAL_WRITE|FN_VIRTUALFILESTATS|" + + "PATINDEX|TEXTPTR|TEXTVALID|" + + "COALESCE|NULLIF" + ); + var dataTypes = ("BIGINT|BINARY|BIT|CHAR|CURSOR|DATE|DATETIME|DATETIME2|DATETIMEOFFSET|DECIMAL|FLOAT|HIERARCHYID|IMAGE|INTEGER|INT|MONEY|NCHAR|NTEXT|NUMERIC|NVARCHAR|REAL|SMALLDATETIME|SMALLINT|SMALLMONEY|SQL_VARIANT|TABLE|TEXT|TIME|TIMESTAMP|TINYINT|UNIQUEIDENTIFIER|VARBINARY|VARCHAR|XML"); + var builtInStoredProcedures = "sp_addextendedproc|sp_addextendedproperty|sp_addmessage|sp_addtype|sp_addumpdevice|sp_add_data_file_recover_suspect_db|sp_add_log_file_recover_suspect_db|sp_altermessage|sp_attach_db|sp_attach_single_file_db|sp_autostats|sp_bindefault|sp_bindrule|sp_bindsession|sp_certify_removable|sp_clean_db_file_free_space|sp_clean_db_free_space|sp_configure|sp_control_plan_guide|sp_createstats|sp_create_plan_guide|sp_create_plan_guide_from_handle|sp_create_removable|sp_cycle_errorlog|sp_datatype_info|sp_dbcmptlevel|sp_dbmmonitoraddmonitoring|sp_dbmmonitorchangealert|sp_dbmmonitorchangemonitoring|sp_dbmmonitordropalert|sp_dbmmonitordropmonitoring|sp_dbmmonitorhelpalert|sp_dbmmonitorhelpmonitoring|sp_dbmmonitorresults|sp_db_increased_partitions|sp_delete_backuphistory|sp_depends|sp_describe_first_result_set|sp_describe_undeclared_parameters|sp_detach_db|sp_dropdevice|sp_dropextendedproc|sp_dropextendedproperty|sp_dropmessage|sp_droptype|sp_execute|sp_executesql|sp_getapplock|sp_getbindtoken|sp_help|sp_helpconstraint|sp_helpdb|sp_helpdevice|sp_helpextendedproc|sp_helpfile|sp_helpfilegroup|sp_helpindex|sp_helplanguage|sp_helpserver|sp_helpsort|sp_helpstats|sp_helptext|sp_helptrigger|sp_indexoption|sp_invalidate_textptr|sp_lock|sp_monitor|sp_prepare|sp_prepexec|sp_prepexecrpc|sp_procoption|sp_recompile|sp_refreshview|sp_releaseapplock|sp_rename|sp_renamedb|sp_resetstatus|sp_sequence_get_range|sp_serveroption|sp_setnetname|sp_settriggerorder|sp_spaceused|sp_tableoption|sp_unbindefault|sp_unbindrule|sp_unprepare|sp_updateextendedproperty|sp_updatestats|sp_validname|sp_who|sys.sp_merge_xtp_checkpoint_files|sys.sp_xtp_bind_db_resource_pool|sys.sp_xtp_checkpoint_force_garbage_collection|sys.sp_xtp_control_proc_exec_stats|sys.sp_xtp_control_query_exec_stats|sys.sp_xtp_unbind_db_resource_pool"; + var keywords = "ABSOLUTE|ACTION|ADA|ADD|ADMIN|AFTER|AGGREGATE|ALIAS|ALL|ALLOCATE|ALTER|AND|ANY|ARE|ARRAY|AS|ASC|ASENSITIVE|ASSERTION|ASYMMETRIC|AT|ATOMIC|AUTHORIZATION|BACKUP|BEFORE|BEGIN|BETWEEN|BIT_LENGTH|BLOB|BOOLEAN|BOTH|BREADTH|BREAK|BROWSE|BULK|BY|CALL|CALLED|CARDINALITY|CASCADE|CASCADED|CASE|CATALOG|CHARACTER|CHARACTER_LENGTH|CHAR_LENGTH|CHECK|CHECKPOINT|CLASS|CLOB|CLOSE|CLUSTERED|COALESCE|COLLATE|COLLATION|COLLECT|COLUMN|COMMIT|COMPLETION|COMPUTE|CONDITION|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONSTRUCTOR|CONTAINS|CONTAINSTABLE|CONTINUE|CORR|CORRESPONDING|COVAR_POP|COVAR_SAMP|CREATE|CROSS|CUBE|CUME_DIST|CURRENT|CURRENT_CATALOG|CURRENT_DATE|CURRENT_DEFAULT_TRANSFORM_GROUP|CURRENT_PATH|CURRENT_ROLE|CURRENT_SCHEMA|CURRENT_TIME|CURRENT_TRANSFORM_GROUP_FOR_TYPE|CYCLE|DATA|DATABASE|DBCC|DEALLOCATE|DEC|DECLARE|DEFAULT|DEFERRABLE|DEFERRED|DELETE|DENY|DEPTH|DEREF|DESC|DESCRIBE|DESCRIPTOR|DESTROY|DESTRUCTOR|DETERMINISTIC|DIAGNOSTICS|DICTIONARY|DISCONNECT|DISK|DISTINCT|DISTRIBUTED|DOMAIN|DOUBLE|DROP|DUMP|DYNAMIC|EACH|ELEMENT|ELSE|END|END-EXEC|EQUALS|ERRLVL|ESCAPE|EVERY|EXCEPT|EXCEPTION|EXEC|EXECUTE|EXISTS|EXIT|EXTERNAL|EXTRACT|FETCH|FILE|FILLFACTOR|FILTER|FIRST|FOR|FOREIGN|FORTRAN|FOUND|FREE|FREETEXT|FREETEXTTABLE|FROM|FULL|FULLTEXTTABLE|FUNCTION|FUSION|GENERAL|GET|GLOBAL|GO|GOTO|GRANT|GROUP|HAVING|HOLD|HOLDLOCK|HOST|HOUR|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IGNORE|IMMEDIATE|IN|INCLUDE|INDEX|INDICATOR|INITIALIZE|INITIALLY|INNER|INOUT|INPUT|INSENSITIVE|INSERT|INTEGER|INTERSECT|INTERSECTION|INTERVAL|INTO|IS|ISOLATION|ITERATE|JOIN|KEY|KILL|LANGUAGE|LARGE|LAST|LATERAL|LEADING|LESS|LEVEL|LIKE|LIKE_REGEX|LIMIT|LINENO|LN|LOAD|LOCAL|LOCALTIME|LOCALTIMESTAMP|LOCATOR|MAP|MATCH|MEMBER|MERGE|METHOD|MINUTE|MOD|MODIFIES|MODIFY|MODULE|MULTISET|NAMES|NATIONAL|NATURAL|NCLOB|NEW|NEXT|NO|NOCHECK|NONCLUSTERED|NONE|NORMALIZE|NOT|NULL|NULLIF|OBJECT|OCCURRENCES_REGEX|OCTET_LENGTH|OF|OFF|OFFSETS|OLD|ON|ONLY|OPEN|OPERATION|OPTION|OR|ORDER|ORDINALITY|OUT|OUTER|OUTPUT|OVER|OVERLAPS|OVERLAY|PAD|PARAMETER|PARAMETERS|PARTIAL|PARTITION|PASCAL|PATH|PERCENT|PERCENTILE_CONT|PERCENTILE_DISC|PERCENT_RANK|PIVOT|PLAN|POSITION|POSITION_REGEX|POSTFIX|PRECISION|PREFIX|PREORDER|PREPARE|PRESERVE|PRIMARY|PRINT|PRIOR|PRIVILEGES|PROC|PROCEDURE|PUBLIC|RAISERROR|RANGE|READ|READS|READTEXT|RECONFIGURE|RECURSIVE|REF|REFERENCES|REFERENCING|REGR_AVGX|REGR_AVGY|REGR_COUNT|REGR_INTERCEPT|REGR_R2|REGR_SLOPE|REGR_SXX|REGR_SXY|REGR_SYY|RELATIVE|RELEASE|REPLICATION|RESTORE|RESTRICT|RESULT|RETURN|RETURNS|REVERT|REVOKE|ROLE|ROLLBACK|ROLLUP|ROUTINE|ROW|ROWCOUNT|ROWGUIDCOL|ROWS|RULE|SAVE|SAVEPOINT|SCHEMA|SCOPE|SCROLL|SEARCH|SECOND|SECTION|SECURITYAUDIT|SELECT|SEMANTICKEYPHRASETABLE|SEMANTICSIMILARITYDETAILSTABLE|SEMANTICSIMILARITYTABLE|SENSITIVE|SEQUENCE|SESSION|SET|SETS|SETUSER|SHUTDOWN|SIMILAR|SIZE|SOME|SPECIFIC|SPECIFICTYPE|SQL|SQLCA|SQLCODE|SQLERROR|SQLEXCEPTION|SQLSTATE|SQLWARNING|START|STATE|STATEMENT|STATIC|STATISTICS|STDDEV_POP|STDDEV_SAMP|STRUCTURE|SUBMULTISET|SUBSTRING_REGEX|SYMMETRIC|SYSTEM|TABLESAMPLE|TEMPORARY|TERMINATE|TEXTSIZE|THAN|THEN|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TOP|TRAILING|TRAN|TRANSACTION|TRANSLATE|TRANSLATE_REGEX|TRANSLATION|TREAT|TRIGGER|TRIM|TRUNCATE|TSEQUAL|UESCAPE|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNPIVOT|UPDATE|UPDATETEXT|USAGE|USE|USER|USING|VALUE|VALUES|VARIABLE|VARYING|VAR_POP|VAR_SAMP|VIEW|WAITFOR|WHEN|WHENEVER|WHERE|WHILE|WIDTH_BUCKET|WINDOW|WITH|WITHIN|WITHIN GROUP|WITHOUT|WORK|WRITE|WRITETEXT|XMLAGG|XMLATTRIBUTES|XMLBINARY|XMLCAST|XMLCOMMENT|XMLCONCAT|XMLDOCUMENT|XMLELEMENT|XMLEXISTS|XMLFOREST|XMLITERATE|XMLNAMESPACES|XMLPARSE|XMLPI|XMLQUERY|XMLSERIALIZE|XMLTABLE|XMLTEXT|XMLVALIDATE|ZONE"; + keywords += "|KEEPIDENTITY|KEEPDEFAULTS|IGNORE_CONSTRAINTS|IGNORE_TRIGGERS|XLOCK|FORCESCAN|FORCESEEK|HOLDLOCK|NOLOCK|NOWAIT|PAGLOCK|READCOMMITTED|READCOMMITTEDLOCK|READPAST|READUNCOMMITTED|REPEATABLEREAD|ROWLOCK|SERIALIZABLE|SNAPSHOT|SPATIAL_WINDOW_MAX_CELLS|TABLOCK|TABLOCKX|UPDLOCK|XLOCK|IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX|EXPAND|VIEWS|FAST|FORCE|KEEP|KEEPFIXED|MAXDOP|MAXRECURSION|OPTIMIZE|PARAMETERIZATION|SIMPLE|FORCED|RECOMPILE|ROBUST|PLAN|SPATIAL_WINDOW_MAX_CELLS|NOEXPAND|HINT"; + keywords += "|LOOP|HASH|MERGE|REMOTE"; + keywords += "|TRY|CATCH|THROW"; + keywords += "|TYPE"; + keywords = keywords.split('|'); + keywords = keywords.filter(function(value, index, self) { + return logicalOperators.split('|').indexOf(value) === -1 && builtinFunctions.split('|').indexOf(value) === -1 && dataTypes.split('|').indexOf(value) === -1; + }); + keywords = keywords.sort().join('|'); + + + var keywordMapper = this.createKeywordMapper({ + "constant.language": logicalOperators, + "storage.type": dataTypes, + "support.function": builtinFunctions, + "support.storedprocedure": builtInStoredProcedures, + "keyword": keywords + }, "identifier", true); + var setStatements = "SET ANSI_DEFAULTS|SET ANSI_NULLS|SET ANSI_NULL_DFLT_OFF|SET ANSI_NULL_DFLT_ON|SET ANSI_PADDING|SET ANSI_WARNINGS|SET ARITHABORT|SET ARITHIGNORE|SET CONCAT_NULL_YIELDS_NULL|SET CURSOR_CLOSE_ON_COMMIT|SET DATEFIRST|SET DATEFORMAT|SET DEADLOCK_PRIORITY|SET FIPS_FLAGGER|SET FMTONLY|SET FORCEPLAN|SET IDENTITY_INSERT|SET IMPLICIT_TRANSACTIONS|SET LANGUAGE|SET LOCK_TIMEOUT|SET NOCOUNT|SET NOEXEC|SET NUMERIC_ROUNDABORT|SET OFFSETS|SET PARSEONLY|SET QUERY_GOVERNOR_COST_LIMIT|SET QUOTED_IDENTIFIER|SET REMOTE_PROC_TRANSACTIONS|SET ROWCOUNT|SET SHOWPLAN_ALL|SET SHOWPLAN_TEXT|SET SHOWPLAN_XML|SET STATISTICS IO|SET STATISTICS PROFILE|SET STATISTICS TIME|SET STATISTICS XML|SET TEXTSIZE|SET XACT_ABORT".split('|'); + var isolationLevels = "READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SNAPSHOP|SERIALIZABLE".split('|'); + for (var i = 0; i < isolationLevels.length; i++) { + setStatements.push('SET TRANSACTION ISOLATION LEVEL ' + isolationLevels[i]); + } + + + this.$rules = { + start: [{ + token: "string.start", + regex: "'", + next: [{ + token: "constant.language.escape", + regex: /''/ + }, { + token: "string.end", + next: "start", + regex: "'" + }, { + defaultToken: "string" + }] + }, + DocCommentHighlightRules.getStartRule("doc-start"), { + token: "comment", + regex: "--.*$" + }, { + token: "comment", + start: "/\\*", + end: "\\*/" + }, { + token: "constant.numeric", // float + regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token: keywordMapper, + regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b(?!])" //up to 2 @symbols for some built in functions + }, { + token: "constant.class", + regex: "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token: "keyword.operator", + regex: "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=|\\*" + }, { + token: "paren.lparen", + regex: "[\\(]" + }, { + token: "paren.rparen", + regex: "[\\)]" + }, { + token: "punctuation", + regex: ",|;" + }, { + token: "text", + regex: "\\s+" + }], + comment: [ + DocCommentHighlightRules.getTagRule(), { + token: "comment", + regex: "\\*\\/", + next: "no_regex" + }, { + defaultToken: "comment", + caseInsensitive: true + }] + }; + for (var i = 0; i < setStatements.length; i++) { + this.$rules.start.unshift({ + token: "set.statement", + regex: setStatements[i] + }); + } + + this.embedRules(DocCommentHighlightRules, "doc-", [DocCommentHighlightRules.getEndRule("start")]); + this.normalizeRules(); + var completions = []; + var addCompletions = function(arr, meta) { + arr.forEach(function(v) { + completions.push({ + name: v, + value: v, + score: 0, + meta: meta + }); + }); + }; + addCompletions(builtInStoredProcedures.split('|'), 'procedure'); + addCompletions(logicalOperators.split('|'), 'operator'); + addCompletions(builtinFunctions.split('|'), 'function'); + addCompletions(dataTypes.split('|'), 'type'); + addCompletions(setStatements, 'statement'); + addCompletions(keywords.split('|'), 'keyword'); + + this.completions = completions; +}; + +oop.inherits(SqlServerHighlightRules, TextHighlightRules); + +exports.SqlHighlightRules = SqlServerHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/sqlserver",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function() {}; + +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\bCASE\b|\bBEGIN\b)|^\s*(\/\*)/i; + this.startRegionRe = /^\s*(\/\*|--)#?region\b/; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + if (match[1]) return this.getBeginEndBlock(session, row, i, match[1]); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } + else if (foldStyle != "all") range = null; + } + + return range; + } + + if (foldStyle === "markbegin") return; + return; + }; + this.getBeginEndBlock = function(session, row, column, matchSequence) { + var start = { + row: row, + column: column + matchSequence.length + }; + var maxRow = session.getLength(); + var line; + + var depth = 1; + var re = /(\bCASE\b|\bBEGIN\b)|(\bEND\b)/i; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth++; + else depth--; + + if (!depth) break; + } + var endRow = row; + if (endRow > start.row) { + return new Range(start.row, start.column, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/sqlserver",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sqlserver_highlight_rules","ace/mode/folding/sqlserver"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var SqlServerHighlightRules = require("./sqlserver_highlight_rules").SqlHighlightRules; +var SqlServerFoldMode = require("./folding/sqlserver").FoldMode; + +var Mode = function() { + this.HighlightRules = SqlServerHighlightRules; + this.foldingRules = new SqlServerFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "/*", end: "*/"}; + this.getCompletions = function(state, session, pos, prefix) { + return session.$mode.$highlightRules.completions; + }; + + this.$id = "ace/mode/sql"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-stylus.js b/src/libs/ace/mode-stylus.js new file mode 100755 index 0000000..fed3f82 --- /dev/null +++ b/src/libs/ace/mode-stylus.js @@ -0,0 +1,462 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/stylus_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules","ace/mode/css_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CssHighlightRules = require("./css_highlight_rules"); + +var StylusHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.type": CssHighlightRules.supportType, + "support.function": CssHighlightRules.supportFunction, + "support.constant": CssHighlightRules.supportConstant, + "support.constant.color": CssHighlightRules.supportConstantColor, + "support.constant.fonts": CssHighlightRules.supportConstantFonts + }, "text", true); + + this.$rules = { + start: [ + { + token : "comment", + regex : /\/\/.*$/ + }, + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, + { + token: ["entity.name.function.stylus", "text"], + regex: "^([-a-zA-Z_][-\\w]*)?(\\()" + }, + { + token: ["entity.other.attribute-name.class.stylus"], + regex: "\\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*" + }, + { + token: ["entity.language.stylus"], + regex: "^ *&" + }, + { + token: ["variable.language.stylus"], + regex: "(arguments)" + }, + { + token: ["keyword.stylus"], + regex: "@[-\\w]+" + }, + { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : CssHighlightRules.pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : CssHighlightRules.pseudoClasses + }, + { + token: ["entity.name.tag.stylus"], + regex: "(?:\\b)(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|(?:h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)(?:\\b)" + }, + { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, + { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, + { + token: ["punctuation.definition.entity.stylus", "entity.other.attribute-name.id.stylus"], + regex: "(#)([a-zA-Z][a-zA-Z0-9_-]*)" + }, + { + token: "meta.vendor-prefix.stylus", + regex: "-webkit-|-moz\\-|-ms-|-o-" + }, + { + token: "keyword.control.stylus", + regex: "(?:!important|for|in|return|true|false|null|if|else|unless|return)\\b" + }, + { + token: "keyword.operator.stylus", + regex: "!|~|\\+|-|(?:\\*)?\\*|\\/|%|(?:\\.)\\.\\.|<|>|(?:=|:|\\?|\\+|-|\\*|\\/|%|<|>)?=|!=" + }, + { + token: "keyword.operator.stylus", + regex: "(?:in|is(?:nt)?|not)\\b" + }, + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, + { + token : "constant.numeric", + regex : CssHighlightRules.numRe + }, + { + token : "keyword", + regex : "(?:ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\\b" + }, + { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : "\\*\\/", + next : "start" + }, { + defaultToken : "comment" + } + ], + "qqstring" : [ + { + token : "string", + regex : '[^"\\\\]+' + }, + { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, + { + token : "string", + regex : '"|$', + next : "start" + } + ], + "qstring" : [ + { + token : "string", + regex : "[^'\\\\]+" + }, + { + token : "string", + regex : "\\\\$", + next : "qstring" + }, + { + token : "string", + regex : "'|$", + next : "start" + } + ] +} + +}; + +oop.inherits(StylusHighlightRules, TextHighlightRules); + +exports.StylusHighlightRules = StylusHighlightRules; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/stylus",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/stylus_highlight_rules","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var StylusHighlightRules = require("./stylus_highlight_rules").StylusHighlightRules; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = StylusHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.$id = "ace/mode/stylus"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-svg.js b/src/libs/ace/mode-svg.js new file mode 100755 index 0000000..25d879b --- /dev/null +++ b/src/libs/ace/mode-svg.js @@ -0,0 +1,1568 @@ +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/xml_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/xml","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var XmlFoldMode = require("./folding/xml").FoldMode; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.HighlightRules = XmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.foldingRules = new XmlFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.voidElements = lang.arrayToMap([]); + + this.blockComment = {start: ""}; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/xml_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/xml"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/svg_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var SvgHighlightRules = function() { + XmlHighlightRules.call(this); + + this.embedTagRules(JavaScriptHighlightRules, "js-", "script"); + + this.normalizeRules(); +}; + +oop.inherits(SvgHighlightRules, XmlHighlightRules); + +exports.SvgHighlightRules = SvgHighlightRules; +}); + +ace.define("ace/mode/folding/mixed",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(defaultMode, subModes) { + this.defaultMode = defaultMode; + this.subModes = subModes; +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + + this.$getMode = function(state) { + if (typeof state != "string") + state = state[0]; + for (var key in this.subModes) { + if (state.indexOf(key) === 0) + return this.subModes[key]; + } + return null; + }; + + this.$tryMode = function(state, session, foldStyle, row) { + var mode = this.$getMode(state); + return (mode ? mode.getFoldWidget(session, foldStyle, row) : ""); + }; + + this.getFoldWidget = function(session, foldStyle, row) { + return ( + this.$tryMode(session.getState(row-1), session, foldStyle, row) || + this.$tryMode(session.getState(row), session, foldStyle, row) || + this.defaultMode.getFoldWidget(session, foldStyle, row) + ); + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var mode = this.$getMode(session.getState(row-1)); + + if (!mode || !mode.getFoldWidget(session, foldStyle, row)) + mode = this.$getMode(session.getState(row)); + + if (!mode || !mode.getFoldWidget(session, foldStyle, row)) + mode = this.defaultMode; + + return mode.getFoldWidgetRange(session, foldStyle, row); + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/svg",["require","exports","module","ace/lib/oop","ace/mode/xml","ace/mode/javascript","ace/mode/svg_highlight_rules","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var XmlMode = require("./xml").Mode; +var JavaScriptMode = require("./javascript").Mode; +var SvgHighlightRules = require("./svg_highlight_rules").SvgHighlightRules; +var MixedFoldMode = require("./folding/mixed").FoldMode; +var XmlFoldMode = require("./folding/xml").FoldMode; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + XmlMode.call(this); + + this.HighlightRules = SvgHighlightRules; + + this.createModeDelegates({ + "js-": JavaScriptMode + }); + + this.foldingRules = new MixedFoldMode(new XmlFoldMode(), { + "js-": new CStyleFoldMode() + }); +}; + +oop.inherits(Mode, XmlMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + + this.$id = "ace/mode/svg"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-swift.js b/src/libs/ace/mode-swift.js new file mode 100755 index 0000000..dc5a430 --- /dev/null +++ b/src/libs/ace/mode-swift.js @@ -0,0 +1,382 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/swift_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SwiftHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "variable.language": "", + "keyword": "__COLUMN__|__FILE__|__FUNCTION__|__LINE__" + + "|as|associativity|break|case|class|continue|default|deinit|didSet" + + "|do|dynamicType|else|enum|extension|fallthrough|for|func|get|if|import" + + "|in|infix|init|inout|is|left|let|let|mutating|new|none|nonmutating" + + "|operator|override|postfix|precedence|prefix|protocol|return|right" + + "|safe|Self|self|set|struct|subscript|switch|Type|typealias" + + "|unowned|unsafe|var|weak|where|while|willSet" + + "|convenience|dynamic|final|infix|lazy|mutating|nonmutating|optional|override|postfix" + + "|prefix|required|static|guard|defer", + "storage.type": "bool|double|Double" + + "|extension|float|Float|int|Int|private|public|string|String", + "constant.language": + "false|Infinity|NaN|nil|no|null|null|off|on|super|this|true|undefined|yes", + "support.function": + "" + }, "identifier"); + + function string(start, options) { + var nestable = options.nestable || options.interpolation; + var interpStart = options.interpolation && options.interpolation.nextState || "start"; + var mainRule = { + regex: start + (options.multiline ? "" : "(?=.)"), + token: "string.start" + }; + var nextState = [ + options.escape && { + regex: options.escape, + token: "character.escape" + }, + options.interpolation && { + token : "paren.quasi.start", + regex : lang.escapeRegExp(options.interpolation.lead + options.interpolation.open), + push : interpStart + }, + options.error && { + regex: options.error, + token: "error.invalid" + }, + { + regex: start + (options.multiline ? "" : "|$"), + token: "string.end", + next: nestable ? "pop" : "start" + }, { + defaultToken: "string" + } + ].filter(Boolean); + + if (nestable) + mainRule.push = nextState; + else + mainRule.next = nextState; + + if (!options.interpolation) + return mainRule; + + var open = options.interpolation.open; + var close = options.interpolation.close; + var counter = { + regex: "[" + lang.escapeRegExp(open + close) + "]", + onMatch: function(val, state, stack) { + this.next = val == open ? this.nextState : ""; + if (val == open && stack.length) { + stack.unshift("start", state); + return "paren"; + } + if (val == close && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1) + return "paren.quasi.end"; + } + return val == open ? "paren.lparen" : "paren.rparen"; + }, + nextState: interpStart + } + return [counter, mainRule]; + } + + function comments() { + return [{ + token : "comment", + regex : "\\/\\/(?=.)", + next : [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next: "start"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment.start", + regex : /\/\*/, + stateName: "nested_comment", + push : [ + DocCommentHighlightRules.getTagRule(), + {token : "comment.start", regex : /\/\*/, push: "nested_comment"}, + {token : "comment.end", regex : "\\*\\/", next : "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; + } + + + this.$rules = { + start: [ + string('"', { + escape: /\\(?:[0\\tnr"']|u{[a-fA-F1-9]{0,8}})/, + interpolation: {lead: "\\", open: "(", close: ")"}, + error: /\\./, + multiline: false + }), + comments({type: "c", nestable: true}), + { + regex: /@[a-zA-Z_$][a-zA-Z_$\d\u0080-\ufffe]*/, + token: "variable.parameter" + }, + { + regex: /[a-zA-Z_$][a-zA-Z_$\d\u0080-\ufffe]*/, + token: keywordMapper + }, + { + token : "constant.numeric", + regex : /[+-]?(?:0(?:b[01]+|o[0-7]+|x[\da-fA-F])|\d+(?:(?:\.\d*)?(?:[PpEe][+-]?\d+)?)\b)/ + }, { + token : "keyword.operator", + regex : /--|\+\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + } + + ] + }; + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); + + this.normalizeRules(); +}; + + +oop.inherits(SwiftHighlightRules, TextHighlightRules); + +exports.HighlightRules = SwiftHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/swift",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/swift_highlight_rules","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var HighlightRules = require("./swift_highlight_rules").HighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = HighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = new CstyleBehaviour(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/", nestable: true}; + + this.$id = "ace/mode/swift" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-swig.js b/src/libs/ace/mode-swig.js new file mode 100755 index 0000000..2b20617 --- /dev/null +++ b/src/libs/ace/mode-swig.js @@ -0,0 +1,1099 @@ +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+)|(?:[0-9]*\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + push : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + push: "ruleset" + }, { + token: "string", + regex: "@.*?{", + push: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media" : [{ + token : "comment", // multi line comment + regex : "\\/\\*", + push : "comment" + }, { + token: "paren.lparen", + regex: "\\{", + push: "ruleset" + }, { + token: "string", + regex: "\\}", + next: "pop" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "comment" : [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }], + + "ruleset" : [ + { + token : "paren.rparen", + regex : "\\}", + next: "pop" + }, { + token : "comment", // multi line comment + regex : "\\/\\*", + push : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + token : ["support.function", "string", "support.function"], + regex : "(url\\()(.*)(\\))" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }] + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-6][0-7]?|" + // oct + "37[0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + { + token : "comment", + regex : "\\/\\/", + next : "line_comment" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : /\/\*/, + next : "comment" + }, { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hex + regex : /0[xX][0-9a-fA-F]+\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment_regex_allowed" + }, { + token : "comment", + regex : "\\/\\/", + next : "line_comment_regex_allowed" + }, { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "comment_regex_allowed" : [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : "start"}, + {defaultToken : "comment", caseInsensitive: true} + ], + "comment" : [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : "no_regex"}, + {defaultToken : "comment", caseInsensitive: true} + ], + "line_comment_regex_allowed" : [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : "start"}, + {defaultToken : "comment", caseInsensitive: true} + ], + "line_comment" : [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : "no_regex"}, + {defaultToken : "comment", caseInsensitive: true} + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + return "paren"; + } + if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || !options.noJSX) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + jsxJsRule, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + jsxJsRule, + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.xml-decl.xml", "keyword.xml-decl.xml"], + regex : "(<\\?)(xml)(?=[\\s])", next : "xml_decl", caseInsensitive: true + }, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction", + }, + {token : "comment.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + processing_instruction : [ + {token : "punctuation.instruction.xml", regex : "\\?>", next : "start"}, + {defaultToken : "instruction.xml"} + ], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : "(?:" + tagRegex + ":)?" + tagRegex + "" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ], + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({noJSX: true}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/swig",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/html_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SwigHighlightRules = function() { + HtmlHighlightRules.call(this); + + var tags = "autoescape|block|else|elif|extends|filter|for|if|import|include|macro|parent|raw|set|spaceless"; + tags = tags + "|end" + tags.replace(/\|/g, "|end"); + var filters = "addslashes|capitalize|date|default|escape|first|groupBy|join|json|last|lower|raw|replace|reverse|safe|sort|striptags|title|uniq|upper|url_encode|url_decode"; + var special = "first|last|index|index0|revindex|revindex0|key" + var constants = "null|none|true|false|loop"; + var operators = "in|is|and|or|not|as|with|only"; + + var keywordMapper = this.createKeywordMapper({ + "keyword.control.swig": tags, + "support.function.swig": filters+"|"+special, + "keyword.operator.swig": operators, + "constant.language.swig": constants, + }, "identifier"); + for (var rule in this.$rules) { + this.$rules[rule].unshift({ + token : "variable.other.readwrite.local.swig", + regex : "\\{\\{-?", + push : "swig-start" + }, { + token : "meta.tag.swig", + regex : "\\{%-?", + push : "swig-start" + }, { + token : "comment.block.swig", + regex : "\\{#-?", + push : "swig-comment" + }); + } + this.$rules["swig-comment"] = [{ + token : "comment.block.swig", + regex : ".*-?#}", + next : "pop" + }]; + + this.$rules["swig-start"] = [{ + token : "variable.other.readwrite.local.swig", + regex : "-?\\}\\}", + next : "pop" + }, { + token : "meta.tag.swig", + regex : "-?%\\}", + next : "pop" + }, { + token : "string", + regex : "'", + next : "swig-qstring" + }, { + token : "string", + regex : '"', + next : "swig-qqstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator.assignment", + regex : "=|~" + }, { + token : "keyword.operator.comparison", + regex : "==|!=|<|>|>=|<=|===" + }, { + token : "keyword.operator.arithmetic", + regex : "\\+|-|/|%|//|\\*|\\*\\*" + }, { + token : "keyword.operator.other", + regex : "\\.\\.|\\|" + }, { + token : "punctuation.operator", + regex : /\?|\:|\,|\;|\./ + }, { + token : "paren.lparen", + regex : /[\[\({]/ + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "text", + regex : "\\s+" + } ]; + + this.$rules["swig-qqstring"] = [{ + token : "constant.language.escape", + regex : /\\[\\"$#ntr]|#{[^"}]*}/ + }, { + token : "string", + regex : '"', + next : "swig-start" + }, { + defaultToken : "string" + } + ]; + + this.$rules["swig-qstring"] = [{ + token : "constant.language.escape", + regex : /\\[\\'ntr]}/ + }, { + token : "string", + regex : "'", + next : "swig-start" + }, { + defaultToken : "string" + } + ]; + + this.normalizeRules(); +}; + +oop.inherits(SwigHighlightRules, TextHighlightRules); + +exports.SwigHighlightRules = SwigHighlightRules; +}); diff --git a/src/libs/ace/mode-tcl.js b/src/libs/ace/mode-tcl.js new file mode 100755 index 0000000..1f878c3 --- /dev/null +++ b/src/libs/ace/mode-tcl.js @@ -0,0 +1,376 @@ +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/tcl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TclHighlightRules = function() { + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*\\\\$", + next : "commentfollow" + }, { + token : "comment", + regex : "#.*$" + }, { + token : "support.function", + regex : '[\\\\]$', + next : "splitlineStart" + }, { + token : "text", + regex : /\\(?:["{}\[\]$\\])/ + }, { + token : "text", // last value before command + regex : '^|[^{][;][^}]|[/\r/]', + next : "commandItem" + }, { + token : "string", // single line + regex : '[ ]*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line """ string start + regex : '[ ]*["]', + next : "qqstring" + }, { + token : "variable.instance", + regex : "[$]", + next : "variable" + }, { + token : "support.function", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|{\\*}|;|::" + }, { + token : "identifier", + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "paren.lparen", + regex : "[[{]", + next : "commandItem" + }, { + token : "paren.lparen", + regex : "[(]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "commandItem" : [ + { + token : "comment", + regex : "#.*\\\\$", + next : "commentfollow" + }, { + token : "comment", + regex : "#.*$", + next : "start" + }, { + token : "string", // single line + regex : '[ ]*["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "variable.instance", + regex : "[$]", + next : "variable" + }, { + token : "support.function", + regex : "(?:[:][:])[a-zA-Z0-9_/]+(?:[:][:])", + next : "commandItem" + }, { + token : "support.function", + regex : "[a-zA-Z0-9_/]+(?:[:][:])", + next : "commandItem" + }, { + token : "support.function", + regex : "(?:[:][:])", + next : "commandItem" + }, { + token : "paren.rparen", + regex : "[\\])}]" + }, { + token : "support.function", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|{\\*}|;|::" + }, { + token : "keyword", + regex : "[a-zA-Z0-9_/]+", + next : "start" + } ], + "commentfollow" : [ + { + token : "comment", + regex : ".*\\\\$", + next : "commentfollow" + }, { + token : "comment", + regex : '.+', + next : "start" + } ], + "splitlineStart" : [ + { + token : "text", + regex : "^.", + next : "start" + }], + "variable" : [ + { + token : "variable.instance", // variable tcl + regex : "[a-zA-Z_\\d]+(?:[(][a-zA-Z_\\d]+[)])?", + next : "start" + }, { + token : "variable.instance", // variable tcl with braces + regex : "{?[a-zA-Z_\\d]+}?", + next : "start" + }], + "qqstring" : [ { + token : "string", // multi line """ string end + regex : '(?:[^\\\\]|\\\\.)*?["]', + next : "start" + }, { + token : "string", + regex : '.+' + } ] + }; +}; + +oop.inherits(TclHighlightRules, TextHighlightRules); + +exports.TclHighlightRules = TclHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/tcl",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/folding/cstyle","ace/mode/tcl_highlight_rules","ace/mode/matching_brace_outdent","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var TclHighlightRules = require("./tcl_highlight_rules").TclHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = TclHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new CStyleFoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/tcl"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-tex.js b/src/libs/ace/mode-tex.js new file mode 100755 index 0000000..f4f13ba --- /dev/null +++ b/src/libs/ace/mode-tex.js @@ -0,0 +1,152 @@ +ace.define("ace/mode/tex_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TexHighlightRules = function(textClass) { + + if (!textClass) + textClass = "text"; + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "%.*$" + }, { + token : textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b", + next : "nospell" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])}]" + }, { + token : textClass, + regex : "\\s+" + } + ], + "nospell" : [ + { + token : "comment", + regex : "%.*$", + next : "start" + }, { + token : "nospell." + textClass, // non-command + regex : "\\\\[$&%#\\{\\}]" + }, { + token : "keyword", // command + regex : "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b" + }, { + token : "keyword", // command + regex : "\\\\(?:[a-zA-Z0-9]+|[^a-zA-Z0-9])", + next : "start" + }, { + token : "paren.keyword.operator", + regex : "[[({]" + }, { + token : "paren.keyword.operator", + regex : "[\\])]" + }, { + token : "paren.keyword.operator", + regex : "}", + next : "start" + }, { + token : "nospell." + textClass, + regex : "\\s+" + }, { + token : "nospell." + textClass, + regex : "\\w+" + } + ] + }; +}; + +oop.inherits(TexHighlightRules, TextHighlightRules); + +exports.TexHighlightRules = TexHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/tex",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/tex_highlight_rules","ace/mode/matching_brace_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function(suppressHighlighting) { + if (suppressHighlighting) + this.HighlightRules = TextHighlightRules; + else + this.HighlightRules = TexHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "%"; + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.allowAutoInsert = function() { + return false; + }; + this.$id = "ace/mode/tex"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-text.js b/src/libs/ace/mode-text.js new file mode 100755 index 0000000..8b13789 --- /dev/null +++ b/src/libs/ace/mode-text.js @@ -0,0 +1 @@ + diff --git a/src/libs/ace/mode-textile.js b/src/libs/ace/mode-textile.js new file mode 100755 index 0000000..94ed5c7 --- /dev/null +++ b/src/libs/ace/mode-textile.js @@ -0,0 +1,142 @@ +ace.define("ace/mode/textile_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TextileHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : function(value) { + if (value.charAt(0) == "h") + return "markup.heading." + value.charAt(1); + else + return "markup.heading"; + }, + regex : "h1|h2|h3|h4|h5|h6|bq|p|bc|pre", + next : "blocktag" + }, + { + token : "keyword", + regex : "[\\*]+|[#]+" + }, + { + token : "text", + regex : ".+" + } + ], + "blocktag" : [ + { + token : "keyword", + regex : "\\. ", + next : "start" + }, + { + token : "keyword", + regex : "\\(", + next : "blocktagproperties" + } + ], + "blocktagproperties" : [ + { + token : "keyword", + regex : "\\)", + next : "blocktag" + }, + { + token : "string", + regex : "[a-zA-Z0-9\\-_]+" + }, + { + token : "keyword", + regex : "#" + } + ] + }; +}; + +oop.inherits(TextileHighlightRules, TextHighlightRules); + +exports.TextileHighlightRules = TextileHighlightRules; + +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/textile",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/textile_highlight_rules","ace/mode/matching_brace_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var TextileHighlightRules = require("./textile_highlight_rules").TextileHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + this.HighlightRules = TextileHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.type = "text"; + this.getNextLineIndent = function(state, line, tab) { + if (state == "intag") + return tab; + + return ""; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.$id = "ace/mode/textile"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-toml.js b/src/libs/ace/mode-toml.js new file mode 100755 index 0000000..2f34893 --- /dev/null +++ b/src/libs/ace/mode-toml.js @@ -0,0 +1,146 @@ +ace.define("ace/mode/toml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TomlHighlightRules = function() { + var keywordMapper = this.createKeywordMapper({ + "constant.language.boolean": "true|false" + }, "identifier"); + + var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b"; + + this.$rules = { + "start": [ + { + token: "comment.toml", + regex: /#.*$/ + }, + { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, + { + token: ["variable.keygroup.toml"], + regex: "(?:^\\s*)(\\[\\[([^\\]]+)\\]\\])" + }, + { + token: ["variable.keygroup.toml"], + regex: "(?:^\\s*)(\\[([^\\]]+)\\])" + }, + { + token : keywordMapper, + regex : identifierRe + }, + { + token : "support.date.toml", + regex: "\\d{4}-\\d{2}-\\d{2}(T)\\d{2}:\\d{2}:\\d{2}(Z)" + }, + { + token: "constant.numeric.toml", + regex: "-?\\d+(\\.?\\d+)?" + } + ], + "qqstring" : [ + { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, + { + token : "constant.language.escape", + regex : '\\\\[0tnr"\\\\]' + }, + { + token : "string", + regex : '"|$', + next : "start" + }, + { + defaultToken: "string" + } + ] + } + +}; + +oop.inherits(TomlHighlightRules, TextHighlightRules); + +exports.TomlHighlightRules = TomlHighlightRules; +}); + +ace.define("ace/mode/folding/ini",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function() { +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /^\s*\[([^\])]*)]\s*(?:$|[;#])/; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var re = this.foldingStartMarker; + var line = session.getLine(row); + + var m = line.match(re); + + if (!m) return; + + var startName = m[1] + "."; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + if (/^\s*$/.test(line)) + continue; + m = line.match(re); + if (m && m[1].lastIndexOf(startName, 0) !== 0) + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/toml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/toml_highlight_rules","ace/mode/folding/ini"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var TomlHighlightRules = require("./toml_highlight_rules").TomlHighlightRules; +var FoldMode = require("./folding/ini").FoldMode; + +var Mode = function() { + this.HighlightRules = TomlHighlightRules; + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "#"; + this.$id = "ace/mode/toml"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-tsx.js b/src/libs/ace/mode-tsx.js new file mode 100755 index 0000000..9db47ac --- /dev/null +++ b/src/libs/ace/mode-tsx.js @@ -0,0 +1,891 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/typescript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/javascript_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +var TypeScriptHighlightRules = function(options) { + + var tsRules = [ + { + token: ["keyword.operator.ts", "text", "variable.parameter.function.ts", "text"], + regex: "\\b(module)(\\s*)([a-zA-Z0-9_?.$][\\w?.$]*)(\\s*\\{)" + }, + { + token: ["storage.type.variable.ts", "text", "keyword.other.ts", "text"], + regex: "(super)(\\s*\\()([a-zA-Z0-9,_?.$\\s]+\\s*)(\\))" + }, + { + token: ["entity.name.function.ts","paren.lparen", "paren.rparen"], + regex: "([a-zA-Z_?.$][\\w?.$]*)(\\()(\\))" + }, + { + token: ["variable.parameter.function.ts", "text", "variable.parameter.function.ts"], + regex: "([a-zA-Z0-9_?.$][\\w?.$]*)(\\s*:\\s*)([a-zA-Z0-9_?.$][\\w?.$]*)" + }, + { + token: ["keyword.operator.ts"], + regex: "(?:\\b(constructor|declare|interface|as|AS|public|private|class|extends|export|super)\\b)" + }, + { + token: ["storage.type.variable.ts"], + regex: "(?:\\b(this\\.|string\\b|bool\\b|number)\\b)" + }, + { + token: ["keyword.operator.ts", "storage.type.variable.ts", "keyword.operator.ts", "storage.type.variable.ts"], + regex: "(class)(\\s+[a-zA-Z0-9_?.$][\\w?.$]*\\s+)(extends)(\\s+[a-zA-Z0-9_?.$][\\w?.$]*\\s+)?" + }, + { + token: "keyword", + regex: "(?:super|export|class|extends|import)\\b" + } + ]; + + var JSRules = new JavaScriptHighlightRules({jsx: (options && options.jsx) == true}).getRules(); + + JSRules.start = tsRules.concat(JSRules.start); + this.$rules = JSRules; +}; + +oop.inherits(TypeScriptHighlightRules, JavaScriptHighlightRules); + +exports.TypeScriptHighlightRules = TypeScriptHighlightRules; +}); + +ace.define("ace/mode/typescript",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/typescript_highlight_rules","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/mode/matching_brace_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var jsMode = require("./javascript").Mode; +var TypeScriptHighlightRules = require("./typescript_highlight_rules").TypeScriptHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + this.HighlightRules = TypeScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, jsMode); + +(function() { + this.createWorker = function(session) { + return null; + }; + this.$id = "ace/mode/typescript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/tsx",["require","exports","module","ace/lib/oop","ace/mode/typescript"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var tsMode = require("./typescript").Mode; + +var Mode = function() { + tsMode.call(this); + this.$highlightRuleConfig = {jsx: true}; +}; +oop.inherits(Mode, tsMode); + +(function() { + this.$id = "ace/mode/tsx"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-turtle.js b/src/libs/ace/mode-turtle.js new file mode 100755 index 0000000..4eef543 --- /dev/null +++ b/src/libs/ace/mode-turtle.js @@ -0,0 +1,289 @@ +ace.define("ace/mode/turtle_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TurtleHighlightRules = function() { + + this.$rules = { + start: [{ + include: "#comments" + }, { + include: "#strings" + }, { + include: "#base-prefix-declarations" + }, { + include: "#string-language-suffixes" + }, { + include: "#string-datatype-suffixes" + }, { + include: "#relative-urls" + }, { + include: "#xml-schema-types" + }, { + include: "#rdf-schema-types" + }, { + include: "#owl-types" + }, { + include: "#qnames" + }, { + include: "#punctuation-operators" + }], + "#base-prefix-declarations": [{ + token: "keyword.other.prefix.turtle", + regex: /@(?:base|prefix)/ + }], + "#comments": [{ + token: [ + "punctuation.definition.comment.turtle", + "comment.line.hash.turtle" + ], + regex: /(#)(.*$)/ + }], + "#owl-types": [{ + token: "support.type.datatype.owl.turtle", + regex: /owl:[a-zA-Z]+/ + }], + "#punctuation-operators": [{ + token: "keyword.operator.punctuation.turtle", + regex: /;|,|\.|\(|\)|\[|\]/ + }], + "#qnames": [{ + token: "entity.name.other.qname.turtle", + regex: /(?:[a-zA-Z][-_a-zA-Z0-9]*)?:(?:[_a-zA-Z][-_a-zA-Z0-9]*)?/ + }], + "#rdf-schema-types": [{ + token: "support.type.datatype.rdf.schema.turtle", + regex: /rdfs?:[a-zA-Z]+|(?:^|\s)a(?:\s|$)/ + }], + "#relative-urls": [{ + token: "string.quoted.other.relative.url.turtle", + regex: //, + next: "pop" + }, { + defaultToken: "string.quoted.other.relative.url.turtle" + }] + }], + "#string-datatype-suffixes": [{ + token: "keyword.operator.datatype.suffix.turtle", + regex: /\^\^/ + }], + "#string-language-suffixes": [{ + token: [ + "keyword.operator.language.suffix.turtle", + "constant.language.suffix.turtle" + ], + regex: /(?!")(@)([a-z]+(?:\-[a-z0-9]+)*)/ + }], + "#strings": [{ + token: "string.quoted.triple.turtle", + regex: /"""/, + push: [{ + token: "string.quoted.triple.turtle", + regex: /"""/, + next: "pop" + }, { + defaultToken: "string.quoted.triple.turtle" + }] + }, { + token: "string.quoted.double.turtle", + regex: /"/, + push: [{ + token: "string.quoted.double.turtle", + regex: /"/, + next: "pop" + }, { + token: "invalid.string.newline", + regex: /$/ + }, { + token: "constant.character.escape.turtle", + regex: /\\./ + }, { + defaultToken: "string.quoted.double.turtle" + }] + }], + "#xml-schema-types": [{ + token: "support.type.datatype.xml.schema.turtle", + regex: /xsd?:[a-z][a-zA-Z]+/ + }] + } + + this.normalizeRules(); +}; + +TurtleHighlightRules.metaData = { + fileTypes: ["ttl", "nt"], + name: "Turtle", + scopeName: "source.turtle" +} + + +oop.inherits(TurtleHighlightRules, TextHighlightRules); + +exports.TurtleHighlightRules = TurtleHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/turtle",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/turtle_highlight_rules","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var TurtleHighlightRules = require("./turtle_highlight_rules").TurtleHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = TurtleHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.$id = "ace/mode/turtle" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-twig.js b/src/libs/ace/mode-twig.js new file mode 100755 index 0000000..557c124 --- /dev/null +++ b/src/libs/ace/mode-twig.js @@ -0,0 +1,2664 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/twig_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/html_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var TwigHighlightRules = function() { + HtmlHighlightRules.call(this); + + var tags = "autoescape|block|do|embed|extends|filter|flush|for|from|if|import|include|macro|sandbox|set|spaceless|use|verbatim"; + tags = tags + "|end" + tags.replace(/\|/g, "|end"); + var filters = "abs|batch|capitalize|convert_encoding|date|date_modify|default|e|escape|first|format|join|json_encode|keys|last|length|lower|merge|nl2br|number_format|raw|replace|reverse|slice|sort|split|striptags|title|trim|upper|url_encode"; + var functions = "attribute|constant|cycle|date|dump|parent|random|range|template_from_string"; + var tests = "constant|divisibleby|sameas|defined|empty|even|iterable|odd"; + var constants = "null|none|true|false"; + var operators = "b-and|b-xor|b-or|in|is|and|or|not" + + var keywordMapper = this.createKeywordMapper({ + "keyword.control.twig": tags, + "support.function.twig": [filters, functions, tests].join("|"), + "keyword.operator.twig": operators, + "constant.language.twig": constants + }, "identifier"); + for (var rule in this.$rules) { + this.$rules[rule].unshift({ + token : "variable.other.readwrite.local.twig", + regex : "\\{\\{-?", + push : "twig-start" + }, { + token : "meta.tag.twig", + regex : "\\{%-?", + push : "twig-start" + }, { + token : "comment.block.twig", + regex : "\\{#-?", + push : "twig-comment" + }); + } + this.$rules["twig-comment"] = [{ + token : "comment.block.twig", + regex : ".*-?#\\}", + next : "pop" + }]; + + this.$rules["twig-start"] = [{ + token : "variable.other.readwrite.local.twig", + regex : "-?\\}\\}", + next : "pop" + }, { + token : "meta.tag.twig", + regex : "-?%\\}", + next : "pop" + }, { + token : "string", + regex : "'", + next : "twig-qstring" + }, { + token : "string", + regex : '"', + next : "twig-qqstring" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator.assignment", + regex : "=|~" + }, { + token : "keyword.operator.comparison", + regex : "==|!=|<|>|>=|<=|===" + }, { + token : "keyword.operator.arithmetic", + regex : "\\+|-|/|%|//|\\*|\\*\\*" + }, { + token : "keyword.operator.other", + regex : "\\.\\.|\\|" + }, { + token : "punctuation.operator", + regex : /\?|:|,|;|\./ + }, { + token : "paren.lparen", + regex : /[\[\({]/ + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token : "text", + regex : "\\s+" + } ]; + + this.$rules["twig-qqstring"] = [{ + token : "constant.language.escape", + regex : /\\[\\"$#ntr]|#{[^"}]*}/ + }, { + token : "string", + regex : '"', + next : "twig-start" + }, { + defaultToken : "string" + } + ]; + + this.$rules["twig-qstring"] = [{ + token : "constant.language.escape", + regex : /\\[\\'ntr]}/ + }, { + token : "string", + regex : "'", + next : "twig-start" + }, { + defaultToken : "string" + } + ]; + + this.normalizeRules(); +}; + +oop.inherits(TwigHighlightRules, TextHighlightRules); + +exports.TwigHighlightRules = TwigHighlightRules; +}); + +ace.define("ace/mode/twig",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/twig_highlight_rules","ace/mode/matching_brace_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var TwigHighlightRules = require("./twig_highlight_rules").TwigHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = TwigHighlightRules; + this.$outdent = new MatchingBraceOutdent(); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.blockComment = {start: "{#", end: "#}"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + this.$id = "ace/mode/twig"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-typescript.js b/src/libs/ace/mode-typescript.js new file mode 100755 index 0000000..1c1b697 --- /dev/null +++ b/src/libs/ace/mode-typescript.js @@ -0,0 +1,872 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/typescript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/javascript_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; + +var TypeScriptHighlightRules = function(options) { + + var tsRules = [ + { + token: ["keyword.operator.ts", "text", "variable.parameter.function.ts", "text"], + regex: "\\b(module)(\\s*)([a-zA-Z0-9_?.$][\\w?.$]*)(\\s*\\{)" + }, + { + token: ["storage.type.variable.ts", "text", "keyword.other.ts", "text"], + regex: "(super)(\\s*\\()([a-zA-Z0-9,_?.$\\s]+\\s*)(\\))" + }, + { + token: ["entity.name.function.ts","paren.lparen", "paren.rparen"], + regex: "([a-zA-Z_?.$][\\w?.$]*)(\\()(\\))" + }, + { + token: ["variable.parameter.function.ts", "text", "variable.parameter.function.ts"], + regex: "([a-zA-Z0-9_?.$][\\w?.$]*)(\\s*:\\s*)([a-zA-Z0-9_?.$][\\w?.$]*)" + }, + { + token: ["keyword.operator.ts"], + regex: "(?:\\b(constructor|declare|interface|as|AS|public|private|class|extends|export|super)\\b)" + }, + { + token: ["storage.type.variable.ts"], + regex: "(?:\\b(this\\.|string\\b|bool\\b|number)\\b)" + }, + { + token: ["keyword.operator.ts", "storage.type.variable.ts", "keyword.operator.ts", "storage.type.variable.ts"], + regex: "(class)(\\s+[a-zA-Z0-9_?.$][\\w?.$]*\\s+)(extends)(\\s+[a-zA-Z0-9_?.$][\\w?.$]*\\s+)?" + }, + { + token: "keyword", + regex: "(?:super|export|class|extends|import)\\b" + } + ]; + + var JSRules = new JavaScriptHighlightRules({jsx: (options && options.jsx) == true}).getRules(); + + JSRules.start = tsRules.concat(JSRules.start); + this.$rules = JSRules; +}; + +oop.inherits(TypeScriptHighlightRules, JavaScriptHighlightRules); + +exports.TypeScriptHighlightRules = TypeScriptHighlightRules; +}); + +ace.define("ace/mode/typescript",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/typescript_highlight_rules","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/mode/matching_brace_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var jsMode = require("./javascript").Mode; +var TypeScriptHighlightRules = require("./typescript_highlight_rules").TypeScriptHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + this.HighlightRules = TypeScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, jsMode); + +(function() { + this.createWorker = function(session) { + return null; + }; + this.$id = "ace/mode/typescript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-vala.js b/src/libs/ace/mode-vala.js new file mode 100755 index 0000000..75340fb --- /dev/null +++ b/src/libs/ace/mode-vala.js @@ -0,0 +1,669 @@ +ace.define("ace/mode/vala_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var ValaHighlightRules = function() { + + this.$rules = { start: + [ { token: + [ 'meta.using.vala', + 'keyword.other.using.vala', + 'meta.using.vala', + 'storage.modifier.using.vala', + 'meta.using.vala', + 'punctuation.terminator.vala' ], + regex: '^(\\s*)(using)\\b(?:(\\s*)([^ ;$]+)(\\s*)((?:;)?))?' }, + { include: '#code' } ], + '#all-types': + [ { include: '#primitive-arrays' }, + { include: '#primitive-types' }, + { include: '#object-types' } ], + '#annotations': + [ { token: + [ 'storage.type.annotation.vala', + 'punctuation.definition.annotation-arguments.begin.vala' ], + regex: '(@[^ (]+)(\\()', + push: + [ { token: 'punctuation.definition.annotation-arguments.end.vala', + regex: '\\)', + next: 'pop' }, + { token: + [ 'constant.other.key.vala', + 'text', + 'keyword.operator.assignment.vala' ], + regex: '(\\w*)(\\s*)(=)' }, + { include: '#code' }, + { token: 'punctuation.seperator.property.vala', regex: ',' }, + { defaultToken: 'meta.declaration.annotation.vala' } ] }, + { token: 'storage.type.annotation.vala', regex: '@\\w*' } ], + '#anonymous-classes-and-new': + [ { token: 'keyword.control.new.vala', + regex: '\\bnew\\b', + push_disabled: + [ { token: 'text', + regex: '(?<=\\)|\\])(?!\\s*{)|(?<=})|(?=;)', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?<=\\)|\\])(?!\\s*{)|(?<=})|(?=;)', + next: 'pop' }, + { token: [ 'storage.type.vala', 'text' ], + regex: '(\\w+)(\\s*)(?=\\[)', + push: + [ { token: 'text', regex: '}|(?=;|\\))', next: 'pop' }, + { token: 'text', + regex: '\\[', + push: + [ { token: 'text', regex: '\\]', next: 'pop' }, + { include: '#code' } ] }, + { token: 'text', + regex: '{', + push: + [ { token: 'text', regex: '(?=})', next: 'pop' }, + { include: '#code' } ] } ] }, + { token: 'text', + regex: '(?=\\w.*\\()', + push: + [ { token: 'text', + regex: '(?<=\\))', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '(?<=\\))', + next: 'pop' }, + { include: '#object-types' }, + { token: 'text', + regex: '\\(', + push: + [ { token: 'text', regex: '\\)', next: 'pop' }, + { include: '#code' } ] } ] }, + { token: 'meta.inner-class.vala', + regex: '{', + push: + [ { token: 'meta.inner-class.vala', regex: '}', next: 'pop' }, + { include: '#class-body' }, + { defaultToken: 'meta.inner-class.vala' } ] } ] } ], + '#assertions': + [ { token: + [ 'keyword.control.assert.vala', + 'meta.declaration.assertion.vala' ], + regex: '\\b(assert|requires|ensures)(\\s)', + push: + [ { token: 'meta.declaration.assertion.vala', + regex: '$', + next: 'pop' }, + { token: 'keyword.operator.assert.expression-seperator.vala', + regex: ':' }, + { include: '#code' }, + { defaultToken: 'meta.declaration.assertion.vala' } ] } ], + '#class': + [ { token: 'meta.class.vala', + regex: '(?=\\w?[\\w\\s]*(?:class|(?:@)?interface|enum|struct|namespace)\\s+\\w+)', + push: + [ { token: 'paren.vala', + regex: '}', + next: 'pop' }, + { include: '#storage-modifiers' }, + { include: '#comments' }, + { token: + [ 'storage.modifier.vala', + 'meta.class.identifier.vala', + 'entity.name.type.class.vala' ], + regex: '(class|(?:@)?interface|enum|struct|namespace)(\\s+)([\\w\\.]+)' }, + { token: 'storage.modifier.extends.vala', + regex: ':', + push: + [ { token: 'meta.definition.class.inherited.classes.vala', + regex: '(?={|,)', + next: 'pop' }, + { include: '#object-types-inherited' }, + { include: '#comments' }, + { defaultToken: 'meta.definition.class.inherited.classes.vala' } ] }, + { token: + [ 'storage.modifier.implements.vala', + 'meta.definition.class.implemented.interfaces.vala' ], + regex: '(,)(\\s)', + push: + [ { token: 'meta.definition.class.implemented.interfaces.vala', + regex: '(?=\\{)', + next: 'pop' }, + { include: '#object-types-inherited' }, + { include: '#comments' }, + { defaultToken: 'meta.definition.class.implemented.interfaces.vala' } ] }, + { token: 'paren.vala', + regex: '{', + push: + [ { token: 'paren.vala', regex: '(?=})', next: 'pop' }, + { include: '#class-body' }, + { defaultToken: 'meta.class.body.vala' } ] }, + { defaultToken: 'meta.class.vala' } ], + comment: 'attempting to put namespace in here.' } ], + '#class-body': + [ { include: '#comments' }, + { include: '#class' }, + { include: '#enums' }, + { include: '#methods' }, + { include: '#annotations' }, + { include: '#storage-modifiers' }, + { include: '#code' } ], + '#code': + [ { include: '#comments' }, + { include: '#class' }, + { token: 'text', + regex: '{', + push: + [ { token: 'text', regex: '}', next: 'pop' }, + { include: '#code' } ] }, + { include: '#assertions' }, + { include: '#parens' }, + { include: '#constants-and-special-vars' }, + { include: '#anonymous-classes-and-new' }, + { include: '#keywords' }, + { include: '#storage-modifiers' }, + { include: '#strings' }, + { include: '#all-types' } ], + '#comments': + [ { token: 'punctuation.definition.comment.vala', + regex: '/\\*\\*/' }, + { include: 'text.html.javadoc' }, + { include: '#comments-inline' } ], + '#comments-inline': + [ { token: 'punctuation.definition.comment.vala', + regex: '/\\*', + push: + [ { token: 'punctuation.definition.comment.vala', + regex: '\\*/', + next: 'pop' }, + { defaultToken: 'comment.block.vala' } ] }, + { token: + [ 'text', + 'punctuation.definition.comment.vala', + 'comment.line.double-slash.vala' ], + regex: '(\\s*)(//)(.*$)' } ], + '#constants-and-special-vars': + [ { token: 'constant.language.vala', + regex: '\\b(?:true|false|null)\\b' }, + { token: 'variable.language.vala', + regex: '\\b(?:this|base)\\b' }, + { token: 'constant.numeric.vala', + regex: '\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\.?[0-9]*|\\.[0-9]+)(?:(?:e|E)(?:\\+|-)?[0-9]+)?)(?:[LlFfUuDd]|UL|ul)?\\b' }, + { token: [ 'keyword.operator.dereference.vala', 'constant.other.vala' ], + regex: '((?:\\.)?)\\b([A-Z][A-Z0-9_]+)(?!<|\\.class|\\s*\\w+\\s*=)\\b' } ], + '#enums': + [ { token: 'text', + regex: '^(?=\\s*[A-Z0-9_]+\\s*(?:{|\\(|,))', + push: + [ { token: 'text', regex: '(?=;|})', next: 'pop' }, + { token: 'constant.other.enum.vala', + regex: '\\w+', + push: + [ { token: 'meta.enum.vala', regex: '(?=,|;|})', next: 'pop' }, + { include: '#parens' }, + { token: 'text', + regex: '{', + push: + [ { token: 'text', regex: '}', next: 'pop' }, + { include: '#class-body' } ] }, + { defaultToken: 'meta.enum.vala' } ] } ] } ], + '#keywords': + [ { token: 'keyword.control.catch-exception.vala', + regex: '\\b(?:try|catch|finally|throw)\\b' }, + { token: 'keyword.control.vala', regex: '\\?|:|\\?\\?' }, + { token: 'keyword.control.vala', + regex: '\\b(?:return|break|case|continue|default|do|while|for|foreach|switch|if|else|in|yield|get|set|value)\\b' }, + { token: 'keyword.operator.vala', + regex: '\\b(?:typeof|is|as)\\b' }, + { token: 'keyword.operator.comparison.vala', + regex: '==|!=|<=|>=|<>|<|>' }, + { token: 'keyword.operator.assignment.vala', regex: '=' }, + { token: 'keyword.operator.increment-decrement.vala', + regex: '\\-\\-|\\+\\+' }, + { token: 'keyword.operator.arithmetic.vala', + regex: '\\-|\\+|\\*|\\/|%' }, + { token: 'keyword.operator.logical.vala', regex: '!|&&|\\|\\|' }, + { token: 'keyword.operator.dereference.vala', + regex: '\\.(?=\\S)', + originalRegex: '(?<=\\S)\\.(?=\\S)' }, + { token: 'punctuation.terminator.vala', regex: ';' }, + { token: 'keyword.operator.ownership', regex: 'owned|unowned' } ], + '#methods': + [ { token: 'meta.method.vala', + regex: '(?!new)(?=\\w.*\\s+)(?=[^=]+\\()', + push: + [ { token: 'paren.vala', regex: '}|(?=;)', next: 'pop' }, + { include: '#storage-modifiers' }, + { token: [ 'entity.name.function.vala', 'meta.method.identifier.vala' ], + regex: '([\\~\\w\\.]+)(\\s*\\()', + push: + [ { token: 'meta.method.identifier.vala', + regex: '\\)', + next: 'pop' }, + { include: '#parameters' }, + { defaultToken: 'meta.method.identifier.vala' } ] }, + { token: 'meta.method.return-type.vala', + regex: '(?=\\w.*\\s+\\w+\\s*\\()', + push: + [ { token: 'meta.method.return-type.vala', + regex: '(?=\\w+\\s*\\()', + next: 'pop' }, + { include: '#all-types' }, + { defaultToken: 'meta.method.return-type.vala' } ] }, + { include: '#throws' }, + { token: 'paren.vala', + regex: '{', + push: + [ { token: 'paren.vala', regex: '(?=})', next: 'pop' }, + { include: '#code' }, + { defaultToken: 'meta.method.body.vala' } ] }, + { defaultToken: 'meta.method.vala' } ] } ], + '#namespace': + [ { token: 'text', + regex: '^(?=\\s*[A-Z0-9_]+\\s*(?:{|\\(|,))', + push: + [ { token: 'text', regex: '(?=;|})', next: 'pop' }, + { token: 'constant.other.namespace.vala', + regex: '\\w+', + push: + [ { token: 'meta.namespace.vala', regex: '(?=,|;|})', next: 'pop' }, + { include: '#parens' }, + { token: 'text', + regex: '{', + push: + [ { token: 'text', regex: '}', next: 'pop' }, + { include: '#code' } ] }, + { defaultToken: 'meta.namespace.vala' } ] } ], + comment: 'This is not quite right. See the class grammar right now' } ], + '#object-types': + [ { token: 'storage.type.generic.vala', + regex: '\\b(?:[a-z]\\w*\\.)*[A-Z]+\\w*<', + push: + [ { token: 'storage.type.generic.vala', + regex: '>|[^\\w\\s,\\?<\\[()\\]]', + TODO: 'FIXME: regexp doesn\'t have js equivalent', + originalRegex: '>|[^\\w\\s,\\?<\\[(?:[,]+)\\]]', + next: 'pop' }, + { include: '#object-types' }, + { token: 'storage.type.generic.vala', + regex: '<', + push: + [ { token: 'storage.type.generic.vala', + regex: '>|[^\\w\\s,\\[\\]<]', + next: 'pop' }, + { defaultToken: 'storage.type.generic.vala' } ], + comment: 'This is just to support <>\'s with no actual type prefix' }, + { defaultToken: 'storage.type.generic.vala' } ] }, + { token: 'storage.type.object.array.vala', + regex: '\\b(?:[a-z]\\w*\\.)*[A-Z]+\\w*(?=\\[)', + push: + [ { token: 'storage.type.object.array.vala', + regex: '(?=[^\\]\\s])', + next: 'pop' }, + { token: 'text', + regex: '\\[', + push: + [ { token: 'text', regex: '\\]', next: 'pop' }, + { include: '#code' } ] }, + { defaultToken: 'storage.type.object.array.vala' } ] }, + { token: + [ 'storage.type.vala', + 'keyword.operator.dereference.vala', + 'storage.type.vala' ], + regex: '\\b(?:([a-z]\\w*)(\\.))*([A-Z]+\\w*\\b)' } ], + '#object-types-inherited': + [ { token: 'entity.other.inherited-class.vala', + regex: '\\b(?:[a-z]\\w*\\.)*[A-Z]+\\w*<', + push: + [ { token: 'entity.other.inherited-class.vala', + regex: '>|[^\\w\\s,<]', + next: 'pop' }, + { include: '#object-types' }, + { token: 'storage.type.generic.vala', + regex: '<', + push: + [ { token: 'storage.type.generic.vala', + regex: '>|[^\\w\\s,<]', + next: 'pop' }, + { defaultToken: 'storage.type.generic.vala' } ], + comment: 'This is just to support <>\'s with no actual type prefix' }, + { defaultToken: 'entity.other.inherited-class.vala' } ] }, + { token: + [ 'entity.other.inherited-class.vala', + 'keyword.operator.dereference.vala', + 'entity.other.inherited-class.vala' ], + regex: '\\b(?:([a-z]\\w*)(\\.))*([A-Z]+\\w*)' } ], + '#parameters': + [ { token: 'storage.modifier.vala', regex: 'final' }, + { include: '#primitive-arrays' }, + { include: '#primitive-types' }, + { include: '#object-types' }, + { token: 'variable.parameter.vala', regex: '\\w+' } ], + '#parens': + [ { token: 'text', + regex: '\\(', + push: + [ { token: 'text', regex: '\\)', next: 'pop' }, + { include: '#code' } ] } ], + '#primitive-arrays': + [ { token: 'storage.type.primitive.array.vala', + regex: '\\b(?:bool|byte|sbyte|char|decimal|double|float|int|uint|long|ulong|object|short|ushort|string|void|int8|int16|int32|int64|uint8|uint16|uint32|uint64)(?:\\[\\])*\\b' } ], + '#primitive-types': + [ { token: 'storage.type.primitive.vala', + regex: '\\b(?:var|bool|byte|sbyte|char|decimal|double|float|int|uint|long|ulong|object|short|ushort|string|void|signal|int8|int16|int32|int64|uint8|uint16|uint32|uint64)\\b', + comment: 'var is not really a primitive, but acts like one in most cases' } ], + '#storage-modifiers': + [ { token: 'storage.modifier.vala', + regex: '\\b(?:public|private|protected|internal|static|final|sealed|virtual|override|abstract|readonly|volatile|dynamic|async|unsafe|out|ref|weak|owned|unowned|const)\\b', + comment: 'Not sure about unsafe and readonly' } ], + '#strings': + [ { token: 'punctuation.definition.string.begin.vala', + regex: '@"', + push: + [ { token: 'punctuation.definition.string.end.vala', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.vala', + regex: '\\\\.|%[\\w\\.\\-]+|\\$(?:\\w+|\\([\\w\\s\\+\\-\\*\\/]+\\))' }, + { defaultToken: 'string.quoted.interpolated.vala' } ] }, + { token: 'punctuation.definition.string.begin.vala', + regex: '"', + push: + [ { token: 'punctuation.definition.string.end.vala', + regex: '"', + next: 'pop' }, + { token: 'constant.character.escape.vala', regex: '\\\\.' }, + { token: 'constant.character.escape.vala', + regex: '%[\\w\\.\\-]+' }, + { defaultToken: 'string.quoted.double.vala' } ] }, + { token: 'punctuation.definition.string.begin.vala', + regex: '\'', + push: + [ { token: 'punctuation.definition.string.end.vala', + regex: '\'', + next: 'pop' }, + { token: 'constant.character.escape.vala', regex: '\\\\.' }, + { defaultToken: 'string.quoted.single.vala' } ] }, + { token: 'punctuation.definition.string.begin.vala', + regex: '"""', + push: + [ { token: 'punctuation.definition.string.end.vala', + regex: '"""', + next: 'pop' }, + { token: 'constant.character.escape.vala', + regex: '%[\\w\\.\\-]+' }, + { defaultToken: 'string.quoted.triple.vala' } ] } ], + '#throws': + [ { token: 'storage.modifier.vala', + regex: 'throws', + push: + [ { token: 'meta.throwables.vala', regex: '(?={|;)', next: 'pop' }, + { include: '#object-types' }, + { defaultToken: 'meta.throwables.vala' } ] } ], + '#values': + [ { include: '#strings' }, + { include: '#object-types' }, + { include: '#constants-and-special-vars' } ] } + + this.normalizeRules(); +}; + +ValaHighlightRules.metaData = { + comment: 'Based heavily on the Java bundle\'s language syntax. TODO:\n* Closures\n* Delegates\n* Properties: Better support for properties.\n* Annotations\n* Error domains\n* Named arguments\n* Array slicing, negative indexes, multidimensional\n* construct blocks\n* lock blocks?\n* regex literals\n* DocBlock syntax highlighting. (Currently importing javadoc)\n* Folding rule for comments.\n', + fileTypes: [ 'vala' ], + foldingStartMarker: '(\\{\\s*(//.*)?$|^\\s*// \\{\\{\\{)', + foldingStopMarker: '^\\s*(\\}|// \\}\\}\\}$)', + name: 'Vala', + scopeName: 'source.vala' } + + +oop.inherits(ValaHighlightRules, TextHighlightRules); + +exports.ValaHighlightRules = ValaHighlightRules; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/vala",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/vala_highlight_rules","ace/mode/folding/cstyle","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/mode/matching_brace_outdent"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var ValaHighlightRules = require("./vala_highlight_rules").ValaHighlightRules; +var FoldMode = require("./folding/cstyle").FoldMode; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; + +var Mode = function() { + this.HighlightRules = ValaHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + this.$id = "ace/mode/vala" +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-vbscript.js b/src/libs/ace/mode-vbscript.js new file mode 100755 index 0000000..010be5b --- /dev/null +++ b/src/libs/ace/mode-vbscript.js @@ -0,0 +1,199 @@ +ace.define("ace/mode/vbscript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var VBScriptHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "keyword.control.asp": "If|Then|Else|ElseIf|End|While|Wend|For|To|Each|Case|Select|Return" + + "|Continue|Do|Until|Loop|Next|With|Exit|Function|Property|Type|Enum|Sub|IIf", + "storage.type.asp": "Dim|Call|Class|Const|Dim|Redim|Set|Let|Get|New|Randomize|Option|Explicit", + "storage.modifier.asp": "Private|Public|Default", + "keyword.operator.asp": "Mod|And|Not|Or|Xor|as", + "constant.language.asp": "Empty|False|Nothing|Null|True", + "support.class.asp": "Application|ObjectContext|Request|Response|Server|Session", + "support.class.collection.asp": "Contents|StaticObjects|ClientCertificate|Cookies|Form|QueryString|ServerVariables", + "support.constant.asp": "TotalBytes|Buffer|CacheControl|Charset|ContentType|Expires|ExpiresAbsolute" + + "|IsClientConnected|PICS|Status|ScriptTimeout|CodePage|LCID|SessionID|Timeout", + "support.function.asp": "Lock|Unlock|SetAbort|SetComplete|BinaryRead|AddHeader|AppendToLog" + + "|BinaryWrite|Clear|Flush|Redirect|Write|CreateObject|HTMLEncode|MapPath|URLEncode|Abandon|Convert|Regex", + "support.function.event.asp": "Application_OnEnd|Application_OnStart" + + "|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart", + "support.function.vb.asp": "Array|Add|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng" + + "|Conversions|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial" + + "|DateValue|Day|Derived|Math|Escape|Eval|Exists|Exp|Filter|FormatCurrency" + + "|FormatDateTime|FormatNumber|FormatPercent|GetLocale|GetObject|GetRef|Hex" + + "|Hour|InputBox|InStr|InStrRev|Int|Fix|IsArray|IsDate|IsEmpty|IsNull|IsNumeric" + + "|IsObject|Item|Items|Join|Keys|LBound|LCase|Left|Len|LoadPicture|Log|LTrim|RTrim" + + "|Trim|Maths|Mid|Minute|Month|MonthName|MsgBox|Now|Oct|Remove|RemoveAll|Replace" + + "|RGB|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion" + + "|ScriptEngineMinorVersion|Second|SetLocale|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse" + + "|Tan|Time|Timer|TimeSerial|TimeValue|TypeName|UBound|UCase|Unescape|VarType|Weekday|WeekdayName|Year", + "support.type.vb.asp": "vbtrue|vbfalse|vbcr|vbcrlf|vbformfeed|vblf|vbnewline|vbnullchar|vbnullstring|" + + "int32|vbtab|vbverticaltab|vbbinarycompare|vbtextcomparevbsunday|vbmonday|vbtuesday|vbwednesday" + + "|vbthursday|vbfriday|vbsaturday|vbusesystemdayofweek|vbfirstjan1|vbfirstfourdays|vbfirstfullweek" + + "|vbgeneraldate|vblongdate|vbshortdate|vblongtime|vbshorttime|vbobjecterror|vbEmpty|vbNull|vbInteger" + + "|vbLong|vbSingle|vbDouble|vbCurrency|vbDate|vbString|vbObject|vbError|vbBoolean|vbVariant" + + "|vbDataObject|vbDecimal|vbByte|vbArray" + }, "identifier", true); + + this.$rules = { + "start": [ + { + token: [ + "meta.ending-space" + ], + regex: "$" + }, + { + token: [null], + regex: "^(?=\\t)", + next: "state_3" + }, + { + token: [null], + regex: "^(?= )", + next: "state_4" + }, + { + token: [ + "text", + "storage.type.function.asp", + "text", + "entity.name.function.asp", + "text", + "punctuation.definition.parameters.asp", + "variable.parameter.function.asp", + "punctuation.definition.parameters.asp" + ], + regex: "^(\\s*)(Function|Sub)(\\s+)([a-zA-Z_]\\w*)(\\s*)(\\()([^)]*)(\\))" + }, + { + token: "punctuation.definition.comment.asp", + regex: "'|REM(?=\\s|$)", + next: "comment", + caseInsensitive: true + }, + { + token: "storage.type.asp", + regex: "On Error Resume Next|On Error GoTo", + caseInsensitive: true + }, + { + token: "punctuation.definition.string.begin.asp", + regex: '"', + next: "string" + }, + { + token: [ + "punctuation.definition.variable.asp" + ], + regex: "(\\$)[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*?\\b\\s*" + }, + { + token: "constant.numeric.asp", + regex: "-?\\b(?:(?:0(?:x|X)[0-9a-fA-F]*)|(?:(?:[0-9]+\\.?[0-9]*)|(?:\\.[0-9]+))(?:(?:e|E)(?:\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\b" + }, + { + regex: "\\w+", + token: keywordMapper + }, + { + token: ["entity.name.function.asp"], + regex: "(?:(\\b[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*?\\b)(?=\\(\\)?))" + }, + { + token: ["keyword.operator.asp"], + regex: "\\-|\\+|\\*\\/|\\>|\\<|\\=|\\&" + } + ], + "state_3": [ + { + token: [ + "meta.odd-tab.tabs", + "meta.even-tab.tabs" + ], + regex: "(\\t)(\\t)?" + }, + { + token: "meta.leading-space", + regex: "(?=[^\\t])", + next: "start" + }, + { + token: "meta.leading-space", + regex: ".", + next: "state_3" + } + ], + "state_4": [ + { + token: ["meta.odd-tab.spaces", "meta.even-tab.spaces"], + regex: "( )( )?" + }, + { + token: "meta.leading-space", + regex: "(?=[^ ])", + next: "start" + }, + { + defaultToken: "meta.leading-space" + } + ], + "comment": [ + { + token: "comment.line.apostrophe.asp", + regex: "$|(?=(?:%>))", + next: "start" + }, + { + defaultToken: "comment.line.apostrophe.asp" + } + ], + "string": [ + { + token: "constant.character.escape.apostrophe.asp", + regex: '""' + }, + { + token: "string.quoted.double.asp", + regex: '"', + next: "start" + }, + { + defaultToken: "string.quoted.double.asp" + } + ] +} + +}; + +oop.inherits(VBScriptHighlightRules, TextHighlightRules); + +exports.VBScriptHighlightRules = VBScriptHighlightRules; +}); + +ace.define("ace/mode/vbscript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/vbscript_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var VBScriptHighlightRules = require("./vbscript_highlight_rules").VBScriptHighlightRules; + +var Mode = function() { + this.HighlightRules = VBScriptHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = ["'", "REM"]; + + this.$id = "ace/mode/vbscript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-velocity.js b/src/libs/ace/mode-velocity.js new file mode 100755 index 0000000..2a420b6 --- /dev/null +++ b/src/libs/ace/mode-velocity.js @@ -0,0 +1,2762 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/css_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var supportType = exports.supportType = "align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|min-height|min-width|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index"; +var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters"; +var supportConstant = exports.supportConstant = "absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero"; +var supportConstantColor = exports.supportConstantColor = "aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen"; +var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace"; + +var numRe = exports.numRe = "\\-?(?:(?:[0-9]+(?:\\.[0-9]+)?)|(?:\\.[0-9]+))"; +var pseudoElements = exports.pseudoElements = "(\\:+)\\b(after|before|first-letter|first-line|moz-selection|selection)\\b"; +var pseudoClasses = exports.pseudoClasses = "(:)\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\b"; + +var CssHighlightRules = function() { + + var keywordMapper = this.createKeywordMapper({ + "support.function": supportFunction, + "support.constant": supportConstant, + "support.type": supportType, + "support.constant.color": supportConstantColor, + "support.constant.fonts": supportConstantFonts + }, "text", true); + + this.$rules = { + "start" : [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "ruleset" + }, { + token: "paren.rparen", + regex: "\\}" + }, { + token: "string", + regex: "@", + next: "media" + }, { + token: "keyword", + regex: "#[a-z0-9-_]+" + }, { + token: "keyword", + regex: "%" + }, { + token: "variable", + regex: "\\.[a-z0-9-_]+" + }, { + token: "string", + regex: ":[a-z0-9-_]+" + }, { + token : "constant.numeric", + regex : numRe + }, { + token: "constant", + regex: "[a-z0-9-_]+" + }, { + caseInsensitive: true + }], + + "media": [{ + include : ["strings", "url", "comments"] + }, { + token: "paren.lparen", + regex: "\\{", + next: "start" + }, { + token: "paren.rparen", + regex: "\\}", + next: "start" + }, { + token: "string", + regex: ";", + next: "start" + }, { + token: "keyword", + regex: "(?:media|supports|document|charset|import|namespace|media|supports|document" + + "|page|font|keyframes|viewport|counter-style|font-feature-values" + + "|swash|ornaments|annotation|stylistic|styleset|character-variant)" + }], + + "comments" : [{ + token: "comment", // multi line comment + regex: "\\/\\*", + push: [{ + token : "comment", + regex : "\\*\\/", + next : "pop" + }, { + defaultToken : "comment" + }] + }], + + "ruleset" : [{ + regex : "-(webkit|ms|moz|o)-", + token : "text" + }, { + token : "paren.rparen", + regex : "\\}", + next : "start" + }, { + include : ["strings", "url", "comments"] + }, { + token : ["constant.numeric", "keyword"], + regex : "(" + numRe + ")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)" + }, { + token : "constant.numeric", + regex : numRe + }, { + token : "constant.numeric", // hex6 color + regex : "#[a-f0-9]{6}" + }, { + token : "constant.numeric", // hex3 color + regex : "#[a-f0-9]{3}" + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"], + regex : pseudoElements + }, { + token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"], + regex : pseudoClasses + }, { + include: "url" + }, { + token : keywordMapper, + regex : "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*" + }, { + caseInsensitive: true + }], + + url: [{ + token : "support.function", + regex : "(?:url(:?-prefix)?|domain|regexp)\\(", + push: [{ + token : "support.function", + regex : "\\)", + next : "pop" + }, { + defaultToken: "string" + }] + }], + + strings: [{ + token : "string.start", + regex : "'", + push : [{ + token : "string.end", + regex : "'|$", + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }, { + token : "string.start", + regex : '"', + push : [{ + token : "string.end", + regex : '"|$', + next: "pop" + }, { + include : "escapes" + }, { + token : "constant.language.escape", + regex : /\\$/, + consumeLineEnd: true + }, { + defaultToken: "string" + }] + }], + escapes: [{ + token : "constant.language.escape", + regex : /\\([a-fA-F\d]{1,6}|[^a-fA-F\d])/ + }] + + }; + + this.normalizeRules(); +}; + +oop.inherits(CssHighlightRules, TextHighlightRules); + +exports.CssHighlightRules = CssHighlightRules; + +}); + +ace.define("ace/mode/css_completions",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var propertyMap = { + "background": {"#$0": 1}, + "background-color": {"#$0": 1, "transparent": 1, "fixed": 1}, + "background-image": {"url('/$0')": 1}, + "background-repeat": {"repeat": 1, "repeat-x": 1, "repeat-y": 1, "no-repeat": 1, "inherit": 1}, + "background-position": {"bottom":2, "center":2, "left":2, "right":2, "top":2, "inherit":2}, + "background-attachment": {"scroll": 1, "fixed": 1}, + "background-size": {"cover": 1, "contain": 1}, + "background-clip": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "background-origin": {"border-box": 1, "padding-box": 1, "content-box": 1}, + "border": {"solid $0": 1, "dashed $0": 1, "dotted $0": 1, "#$0": 1}, + "border-color": {"#$0": 1}, + "border-style": {"solid":2, "dashed":2, "dotted":2, "double":2, "groove":2, "hidden":2, "inherit":2, "inset":2, "none":2, "outset":2, "ridged":2}, + "border-collapse": {"collapse": 1, "separate": 1}, + "bottom": {"px": 1, "em": 1, "%": 1}, + "clear": {"left": 1, "right": 1, "both": 1, "none": 1}, + "color": {"#$0": 1, "rgb(#$00,0,0)": 1}, + "cursor": {"default": 1, "pointer": 1, "move": 1, "text": 1, "wait": 1, "help": 1, "progress": 1, "n-resize": 1, "ne-resize": 1, "e-resize": 1, "se-resize": 1, "s-resize": 1, "sw-resize": 1, "w-resize": 1, "nw-resize": 1}, + "display": {"none": 1, "block": 1, "inline": 1, "inline-block": 1, "table-cell": 1}, + "empty-cells": {"show": 1, "hide": 1}, + "float": {"left": 1, "right": 1, "none": 1}, + "font-family": {"Arial":2,"Comic Sans MS":2,"Consolas":2,"Courier New":2,"Courier":2,"Georgia":2,"Monospace":2,"Sans-Serif":2, "Segoe UI":2,"Tahoma":2,"Times New Roman":2,"Trebuchet MS":2,"Verdana": 1}, + "font-size": {"px": 1, "em": 1, "%": 1}, + "font-weight": {"bold": 1, "normal": 1}, + "font-style": {"italic": 1, "normal": 1}, + "font-variant": {"normal": 1, "small-caps": 1}, + "height": {"px": 1, "em": 1, "%": 1}, + "left": {"px": 1, "em": 1, "%": 1}, + "letter-spacing": {"normal": 1}, + "line-height": {"normal": 1}, + "list-style-type": {"none": 1, "disc": 1, "circle": 1, "square": 1, "decimal": 1, "decimal-leading-zero": 1, "lower-roman": 1, "upper-roman": 1, "lower-greek": 1, "lower-latin": 1, "upper-latin": 1, "georgian": 1, "lower-alpha": 1, "upper-alpha": 1}, + "margin": {"px": 1, "em": 1, "%": 1}, + "margin-right": {"px": 1, "em": 1, "%": 1}, + "margin-left": {"px": 1, "em": 1, "%": 1}, + "margin-top": {"px": 1, "em": 1, "%": 1}, + "margin-bottom": {"px": 1, "em": 1, "%": 1}, + "max-height": {"px": 1, "em": 1, "%": 1}, + "max-width": {"px": 1, "em": 1, "%": 1}, + "min-height": {"px": 1, "em": 1, "%": 1}, + "min-width": {"px": 1, "em": 1, "%": 1}, + "overflow": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-x": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "overflow-y": {"hidden": 1, "visible": 1, "auto": 1, "scroll": 1}, + "padding": {"px": 1, "em": 1, "%": 1}, + "padding-top": {"px": 1, "em": 1, "%": 1}, + "padding-right": {"px": 1, "em": 1, "%": 1}, + "padding-bottom": {"px": 1, "em": 1, "%": 1}, + "padding-left": {"px": 1, "em": 1, "%": 1}, + "page-break-after": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "page-break-before": {"auto": 1, "always": 1, "avoid": 1, "left": 1, "right": 1}, + "position": {"absolute": 1, "relative": 1, "fixed": 1, "static": 1}, + "right": {"px": 1, "em": 1, "%": 1}, + "table-layout": {"fixed": 1, "auto": 1}, + "text-decoration": {"none": 1, "underline": 1, "line-through": 1, "blink": 1}, + "text-align": {"left": 1, "right": 1, "center": 1, "justify": 1}, + "text-transform": {"capitalize": 1, "uppercase": 1, "lowercase": 1, "none": 1}, + "top": {"px": 1, "em": 1, "%": 1}, + "vertical-align": {"top": 1, "bottom": 1}, + "visibility": {"hidden": 1, "visible": 1}, + "white-space": {"nowrap": 1, "normal": 1, "pre": 1, "pre-line": 1, "pre-wrap": 1}, + "width": {"px": 1, "em": 1, "%": 1}, + "word-spacing": {"normal": 1}, + "filter": {"alpha(opacity=$0100)": 1}, + + "text-shadow": {"$02px 2px 2px #777": 1}, + "text-overflow": {"ellipsis-word": 1, "clip": 1, "ellipsis": 1}, + "-moz-border-radius": 1, + "-moz-border-radius-topright": 1, + "-moz-border-radius-bottomright": 1, + "-moz-border-radius-topleft": 1, + "-moz-border-radius-bottomleft": 1, + "-webkit-border-radius": 1, + "-webkit-border-top-right-radius": 1, + "-webkit-border-top-left-radius": 1, + "-webkit-border-bottom-right-radius": 1, + "-webkit-border-bottom-left-radius": 1, + "-moz-box-shadow": 1, + "-webkit-box-shadow": 1, + "transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-moz-transform": {"rotate($00deg)": 1, "skew($00deg)": 1}, + "-webkit-transform": {"rotate($00deg)": 1, "skew($00deg)": 1 } +}; + +var CssCompletions = function() { + +}; + +(function() { + + this.completionsDefined = false; + + this.defineCompletions = function() { + if (document) { + var style = document.createElement('c').style; + + for (var i in style) { + if (typeof style[i] !== 'string') + continue; + + var name = i.replace(/[A-Z]/g, function(x) { + return '-' + x.toLowerCase(); + }); + + if (!propertyMap.hasOwnProperty(name)) + propertyMap[name] = 1; + } + } + + this.completionsDefined = true; + } + + this.getCompletions = function(state, session, pos, prefix) { + if (!this.completionsDefined) { + this.defineCompletions(); + } + + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (state==='ruleset'){ + var line = session.getLine(pos.row).substr(0, pos.column); + if (/:[^;]+$/.test(line)) { + /([\w\-]+):[^:]*$/.test(line); + + return this.getPropertyValueCompletions(state, session, pos, prefix); + } else { + return this.getPropertyCompletions(state, session, pos, prefix); + } + } + + return []; + }; + + this.getPropertyCompletions = function(state, session, pos, prefix) { + var properties = Object.keys(propertyMap); + return properties.map(function(property){ + return { + caption: property, + snippet: property + ': $0', + meta: "property", + score: Number.MAX_VALUE + }; + }); + }; + + this.getPropertyValueCompletions = function(state, session, pos, prefix) { + var line = session.getLine(pos.row).substr(0, pos.column); + var property = (/([\w\-]+):[^:]*$/.exec(line) || {})[1]; + + if (!property) + return []; + var values = []; + if (property in propertyMap && typeof propertyMap[property] === "object") { + values = Object.keys(propertyMap[property]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "property value", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(CssCompletions.prototype); + +exports.CssCompletions = CssCompletions; +}); + +ace.define("ace/mode/behaviour/css",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/mode/behaviour/cstyle","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var CstyleBehaviour = require("./cstyle").CstyleBehaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; + +var CssBehaviour = function () { + + this.inherit(CstyleBehaviour); + + this.add("colon", "insertion", function (state, action, editor, session, text) { + if (text === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ':') { + return { + text: '', + selection: [1, 1] + } + } + if (!line.substring(cursor.column).match(/^\s*;/)) { + return { + text: ':;', + selection: [1, 1] + } + } + } + } + }); + + this.add("colon", "deletion", function (state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected === ':') { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + if (token && token.value.match(/\s+/)) { + token = iterator.stepBackward(); + } + if (token && token.type === 'support.type') { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar === ';') { + range.end.column ++; + return range; + } + } + } + }); + + this.add("semicolon", "insertion", function (state, action, editor, session, text) { + if (text === ';') { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === ';') { + return { + text: '', + selection: [1, 1] + } + } + } + }); + +} +oop.inherits(CssBehaviour, CstyleBehaviour); + +exports.CssBehaviour = CssBehaviour; +}); + +ace.define("ace/mode/css",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/css_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/css_completions","ace/mode/behaviour/css","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CssCompletions = require("./css_completions").CssCompletions; +var CssBehaviour = require("./behaviour/css").CssBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = CssHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CssBehaviour(); + this.$completer = new CssCompletions(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.foldingRules = "cStyle"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var tokens = this.getTokenizer().getLineTokens(line, state).tokens; + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + var match = line.match(/^.*\{\s*$/); + if (match) { + indent += tab; + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/css"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); + +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/html_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/css_highlight_rules","ace/mode/javascript_highlight_rules","ace/mode/xml_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; + +var tagMap = lang.createMap({ + a : 'anchor', + button : 'form', + form : 'form', + img : 'image', + input : 'form', + label : 'form', + option : 'form', + script : 'script', + select : 'form', + textarea : 'form', + style : 'style', + table : 'table', + tbody : 'table', + td : 'table', + tfoot : 'table', + th : 'table', + tr : 'table' +}); + +var HtmlHighlightRules = function() { + XmlHighlightRules.call(this); + + this.addRules({ + attributes: [{ + include : "tag_whitespace" + }, { + token : "entity.other.attribute-name.xml", + regex : "[-_a-zA-Z0-9:.]+" + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=", + push : [{ + include: "tag_whitespace" + }, { + token : "string.unquoted.attribute-value.html", + regex : "[^<>='\"`\\s]+", + next : "pop" + }, { + token : "empty", + regex : "", + next : "pop" + }] + }, { + include : "attribute_value" + }], + tag: [{ + token : function(start, tag) { + var group = tagMap[tag]; + return ["meta.tag.punctuation." + (start == "<" ? "" : "end-") + "tag-open.xml", + "meta.tag" + (group ? "." + group : "") + ".tag-name.xml"]; + }, + regex : "(", next : "start"} + ] + }); + + this.embedTagRules(CssHighlightRules, "css-", "style"); + this.embedTagRules(new JavaScriptHighlightRules({jsx: false}).getRules(), "js-", "script"); + + if (this.constructor === HtmlHighlightRules) + this.normalizeRules(); +}; + +oop.inherits(HtmlHighlightRules, XmlHighlightRules); + +exports.HtmlHighlightRules = HtmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/folding/html",["require","exports","module","ace/lib/oop","ace/mode/folding/mixed","ace/mode/folding/xml","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var MixedFoldMode = require("./mixed").FoldMode; +var XmlFoldMode = require("./xml").FoldMode; +var CStyleFoldMode = require("./cstyle").FoldMode; + +var FoldMode = exports.FoldMode = function(voidElements, optionalTags) { + MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), { + "js-": new CStyleFoldMode(), + "css-": new CStyleFoldMode() + }); +}; + +oop.inherits(FoldMode, MixedFoldMode); + +}); + +ace.define("ace/mode/html_completions",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; + +var commonAttributes = [ + "accesskey", + "class", + "contenteditable", + "contextmenu", + "dir", + "draggable", + "dropzone", + "hidden", + "id", + "inert", + "itemid", + "itemprop", + "itemref", + "itemscope", + "itemtype", + "lang", + "spellcheck", + "style", + "tabindex", + "title", + "translate" +]; + +var eventAttributes = [ + "onabort", + "onblur", + "oncancel", + "oncanplay", + "oncanplaythrough", + "onchange", + "onclick", + "onclose", + "oncontextmenu", + "oncuechange", + "ondblclick", + "ondrag", + "ondragend", + "ondragenter", + "ondragleave", + "ondragover", + "ondragstart", + "ondrop", + "ondurationchange", + "onemptied", + "onended", + "onerror", + "onfocus", + "oninput", + "oninvalid", + "onkeydown", + "onkeypress", + "onkeyup", + "onload", + "onloadeddata", + "onloadedmetadata", + "onloadstart", + "onmousedown", + "onmousemove", + "onmouseout", + "onmouseover", + "onmouseup", + "onmousewheel", + "onpause", + "onplay", + "onplaying", + "onprogress", + "onratechange", + "onreset", + "onscroll", + "onseeked", + "onseeking", + "onselect", + "onshow", + "onstalled", + "onsubmit", + "onsuspend", + "ontimeupdate", + "onvolumechange", + "onwaiting" +]; + +var globalAttributes = commonAttributes.concat(eventAttributes); + +var attributeMap = { + "html": {"manifest": 1}, + "head": {}, + "title": {}, + "base": {"href": 1, "target": 1}, + "link": {"href": 1, "hreflang": 1, "rel": {"stylesheet": 1, "icon": 1}, "media": {"all": 1, "screen": 1, "print": 1}, "type": {"text/css": 1, "image/png": 1, "image/jpeg": 1, "image/gif": 1}, "sizes": 1}, + "meta": {"http-equiv": {"content-type": 1}, "name": {"description": 1, "keywords": 1}, "content": {"text/html; charset=UTF-8": 1}, "charset": 1}, + "style": {"type": 1, "media": {"all": 1, "screen": 1, "print": 1}, "scoped": 1}, + "script": {"charset": 1, "type": {"text/javascript": 1}, "src": 1, "defer": 1, "async": 1}, + "noscript": {"href": 1}, + "body": {"onafterprint": 1, "onbeforeprint": 1, "onbeforeunload": 1, "onhashchange": 1, "onmessage": 1, "onoffline": 1, "onpopstate": 1, "onredo": 1, "onresize": 1, "onstorage": 1, "onundo": 1, "onunload": 1}, + "section": {}, + "nav": {}, + "article": {"pubdate": 1}, + "aside": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "header": {}, + "footer": {}, + "address": {}, + "main": {}, + "p": {}, + "hr": {}, + "pre": {}, + "blockquote": {"cite": 1}, + "ol": {"start": 1, "reversed": 1}, + "ul": {}, + "li": {"value": 1}, + "dl": {}, + "dt": {}, + "dd": {}, + "figure": {}, + "figcaption": {}, + "div": {}, + "a": {"href": 1, "target": {"_blank": 1, "top": 1}, "ping": 1, "rel": {"nofollow": 1, "alternate": 1, "author": 1, "bookmark": 1, "help": 1, "license": 1, "next": 1, "noreferrer": 1, "prefetch": 1, "prev": 1, "search": 1, "tag": 1}, "media": 1, "hreflang": 1, "type": 1}, + "em": {}, + "strong": {}, + "small": {}, + "s": {}, + "cite": {}, + "q": {"cite": 1}, + "dfn": {}, + "abbr": {}, + "data": {}, + "time": {"datetime": 1}, + "code": {}, + "var": {}, + "samp": {}, + "kbd": {}, + "sub": {}, + "sup": {}, + "i": {}, + "b": {}, + "u": {}, + "mark": {}, + "ruby": {}, + "rt": {}, + "rp": {}, + "bdi": {}, + "bdo": {}, + "span": {}, + "br": {}, + "wbr": {}, + "ins": {"cite": 1, "datetime": 1}, + "del": {"cite": 1, "datetime": 1}, + "img": {"alt": 1, "src": 1, "height": 1, "width": 1, "usemap": 1, "ismap": 1}, + "iframe": {"name": 1, "src": 1, "height": 1, "width": 1, "sandbox": {"allow-same-origin": 1, "allow-top-navigation": 1, "allow-forms": 1, "allow-scripts": 1}, "seamless": {"seamless": 1}}, + "embed": {"src": 1, "height": 1, "width": 1, "type": 1}, + "object": {"param": 1, "data": 1, "type": 1, "height" : 1, "width": 1, "usemap": 1, "name": 1, "form": 1, "classid": 1}, + "param": {"name": 1, "value": 1}, + "video": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "width": 1, "height": 1, "poster": 1, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1}}, + "audio": {"src": 1, "autobuffer": 1, "autoplay": {"autoplay": 1}, "loop": {"loop": 1}, "controls": {"controls": 1}, "muted": {"muted": 1}, "preload": {"auto": 1, "metadata": 1, "none": 1 }}, + "source": {"src": 1, "type": 1, "media": 1}, + "track": {"kind": 1, "src": 1, "srclang": 1, "label": 1, "default": 1}, + "canvas": {"width": 1, "height": 1}, + "map": {"name": 1}, + "area": {"shape": 1, "coords": 1, "href": 1, "hreflang": 1, "alt": 1, "target": 1, "media": 1, "rel": 1, "ping": 1, "type": 1}, + "svg": {}, + "math": {}, + "table": {"summary": 1}, + "caption": {}, + "colgroup": {"span": 1}, + "col": {"span": 1}, + "tbody": {}, + "thead": {}, + "tfoot": {}, + "tr": {}, + "td": {"headers": 1, "rowspan": 1, "colspan": 1}, + "th": {"headers": 1, "rowspan": 1, "colspan": 1, "scope": 1}, + "form": {"accept-charset": 1, "action": 1, "autocomplete": 1, "enctype": {"multipart/form-data": 1, "application/x-www-form-urlencoded": 1}, "method": {"get": 1, "post": 1}, "name": 1, "novalidate": 1, "target": {"_blank": 1, "top": 1}}, + "fieldset": {"disabled": 1, "form": 1, "name": 1}, + "legend": {}, + "label": {"form": 1, "for": 1}, + "input": { + "type": {"text": 1, "password": 1, "hidden": 1, "checkbox": 1, "submit": 1, "radio": 1, "file": 1, "button": 1, "reset": 1, "image": 31, "color": 1, "date": 1, "datetime": 1, "datetime-local": 1, "email": 1, "month": 1, "number": 1, "range": 1, "search": 1, "tel": 1, "time": 1, "url": 1, "week": 1}, + "accept": 1, "alt": 1, "autocomplete": {"on": 1, "off": 1}, "autofocus": {"autofocus": 1}, "checked": {"checked": 1}, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": {"application/x-www-form-urlencoded": 1, "multipart/form-data": 1, "text/plain": 1}, "formmethod": {"get": 1, "post": 1}, "formnovalidate": {"formnovalidate": 1}, "formtarget": {"_blank": 1, "_self": 1, "_parent": 1, "_top": 1}, "height": 1, "list": 1, "max": 1, "maxlength": 1, "min": 1, "multiple": {"multiple": 1}, "name": 1, "pattern": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "size": 1, "src": 1, "step": 1, "width": 1, "files": 1, "value": 1}, + "button": {"autofocus": 1, "disabled": {"disabled": 1}, "form": 1, "formaction": 1, "formenctype": 1, "formmethod": 1, "formnovalidate": 1, "formtarget": 1, "name": 1, "value": 1, "type": {"button": 1, "submit": 1}}, + "select": {"autofocus": 1, "disabled": 1, "form": 1, "multiple": {"multiple": 1}, "name": 1, "size": 1, "readonly":{"readonly": 1}}, + "datalist": {}, + "optgroup": {"disabled": 1, "label": 1}, + "option": {"disabled": 1, "selected": 1, "label": 1, "value": 1}, + "textarea": {"autofocus": {"autofocus": 1}, "disabled": {"disabled": 1}, "form": 1, "maxlength": 1, "name": 1, "placeholder": 1, "readonly": {"readonly": 1}, "required": {"required": 1}, "rows": 1, "cols": 1, "wrap": {"on": 1, "off": 1, "hard": 1, "soft": 1}}, + "keygen": {"autofocus": 1, "challenge": {"challenge": 1}, "disabled": {"disabled": 1}, "form": 1, "keytype": {"rsa": 1, "dsa": 1, "ec": 1}, "name": 1}, + "output": {"for": 1, "form": 1, "name": 1}, + "progress": {"value": 1, "max": 1}, + "meter": {"value": 1, "min": 1, "max": 1, "low": 1, "high": 1, "optimum": 1}, + "details": {"open": 1}, + "summary": {}, + "command": {"type": 1, "label": 1, "icon": 1, "disabled": 1, "checked": 1, "radiogroup": 1, "command": 1}, + "menu": {"type": 1, "label": 1}, + "dialog": {"open": 1} +}; + +var elements = Object.keys(attributeMap); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +function findTagName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "tag-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +function findAttributeName(session, pos) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + while (token && !is(token, "attribute-name")){ + token = iterator.stepBackward(); + } + if (token) + return token.value; +} + +var HtmlCompletions = function() { + +}; + +(function() { + + this.getCompletions = function(state, session, pos, prefix) { + var token = session.getTokenAt(pos.row, pos.column); + + if (!token) + return []; + if (is(token, "tag-name") || is(token, "tag-open") || is(token, "end-tag-open")) + return this.getTagCompletions(state, session, pos, prefix); + if (is(token, "tag-whitespace") || is(token, "attribute-name")) + return this.getAttributeCompletions(state, session, pos, prefix); + if (is(token, "attribute-value")) + return this.getAttributeValueCompletions(state, session, pos, prefix); + var line = session.getLine(pos.row).substr(0, pos.column); + if (/&[a-z]*$/i.test(line)) + return this.getHTMLEntityCompletions(state, session, pos, prefix); + + return []; + }; + + this.getTagCompletions = function(state, session, pos, prefix) { + return elements.map(function(element){ + return { + value: element, + meta: "tag", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + if (!tagName) + return []; + var attributes = globalAttributes; + if (tagName in attributeMap) { + attributes = attributes.concat(Object.keys(attributeMap[tagName])); + } + return attributes.map(function(attribute){ + return { + caption: attribute, + snippet: attribute + '="$0"', + meta: "attribute", + score: Number.MAX_VALUE + }; + }); + }; + + this.getAttributeValueCompletions = function(state, session, pos, prefix) { + var tagName = findTagName(session, pos); + var attributeName = findAttributeName(session, pos); + + if (!tagName) + return []; + var values = []; + if (tagName in attributeMap && attributeName in attributeMap[tagName] && typeof attributeMap[tagName][attributeName] === "object") { + values = Object.keys(attributeMap[tagName][attributeName]); + } + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "attribute value", + score: Number.MAX_VALUE + }; + }); + }; + + this.getHTMLEntityCompletions = function(state, session, pos, prefix) { + var values = ['Aacute;', 'aacute;', 'Acirc;', 'acirc;', 'acute;', 'AElig;', 'aelig;', 'Agrave;', 'agrave;', 'alefsym;', 'Alpha;', 'alpha;', 'amp;', 'and;', 'ang;', 'Aring;', 'aring;', 'asymp;', 'Atilde;', 'atilde;', 'Auml;', 'auml;', 'bdquo;', 'Beta;', 'beta;', 'brvbar;', 'bull;', 'cap;', 'Ccedil;', 'ccedil;', 'cedil;', 'cent;', 'Chi;', 'chi;', 'circ;', 'clubs;', 'cong;', 'copy;', 'crarr;', 'cup;', 'curren;', 'Dagger;', 'dagger;', 'dArr;', 'darr;', 'deg;', 'Delta;', 'delta;', 'diams;', 'divide;', 'Eacute;', 'eacute;', 'Ecirc;', 'ecirc;', 'Egrave;', 'egrave;', 'empty;', 'emsp;', 'ensp;', 'Epsilon;', 'epsilon;', 'equiv;', 'Eta;', 'eta;', 'ETH;', 'eth;', 'Euml;', 'euml;', 'euro;', 'exist;', 'fnof;', 'forall;', 'frac12;', 'frac14;', 'frac34;', 'frasl;', 'Gamma;', 'gamma;', 'ge;', 'gt;', 'hArr;', 'harr;', 'hearts;', 'hellip;', 'Iacute;', 'iacute;', 'Icirc;', 'icirc;', 'iexcl;', 'Igrave;', 'igrave;', 'image;', 'infin;', 'int;', 'Iota;', 'iota;', 'iquest;', 'isin;', 'Iuml;', 'iuml;', 'Kappa;', 'kappa;', 'Lambda;', 'lambda;', 'lang;', 'laquo;', 'lArr;', 'larr;', 'lceil;', 'ldquo;', 'le;', 'lfloor;', 'lowast;', 'loz;', 'lrm;', 'lsaquo;', 'lsquo;', 'lt;', 'macr;', 'mdash;', 'micro;', 'middot;', 'minus;', 'Mu;', 'mu;', 'nabla;', 'nbsp;', 'ndash;', 'ne;', 'ni;', 'not;', 'notin;', 'nsub;', 'Ntilde;', 'ntilde;', 'Nu;', 'nu;', 'Oacute;', 'oacute;', 'Ocirc;', 'ocirc;', 'OElig;', 'oelig;', 'Ograve;', 'ograve;', 'oline;', 'Omega;', 'omega;', 'Omicron;', 'omicron;', 'oplus;', 'or;', 'ordf;', 'ordm;', 'Oslash;', 'oslash;', 'Otilde;', 'otilde;', 'otimes;', 'Ouml;', 'ouml;', 'para;', 'part;', 'permil;', 'perp;', 'Phi;', 'phi;', 'Pi;', 'pi;', 'piv;', 'plusmn;', 'pound;', 'Prime;', 'prime;', 'prod;', 'prop;', 'Psi;', 'psi;', 'quot;', 'radic;', 'rang;', 'raquo;', 'rArr;', 'rarr;', 'rceil;', 'rdquo;', 'real;', 'reg;', 'rfloor;', 'Rho;', 'rho;', 'rlm;', 'rsaquo;', 'rsquo;', 'sbquo;', 'Scaron;', 'scaron;', 'sdot;', 'sect;', 'shy;', 'Sigma;', 'sigma;', 'sigmaf;', 'sim;', 'spades;', 'sub;', 'sube;', 'sum;', 'sup;', 'sup1;', 'sup2;', 'sup3;', 'supe;', 'szlig;', 'Tau;', 'tau;', 'there4;', 'Theta;', 'theta;', 'thetasym;', 'thinsp;', 'THORN;', 'thorn;', 'tilde;', 'times;', 'trade;', 'Uacute;', 'uacute;', 'uArr;', 'uarr;', 'Ucirc;', 'ucirc;', 'Ugrave;', 'ugrave;', 'uml;', 'upsih;', 'Upsilon;', 'upsilon;', 'Uuml;', 'uuml;', 'weierp;', 'Xi;', 'xi;', 'Yacute;', 'yacute;', 'yen;', 'Yuml;', 'yuml;', 'Zeta;', 'zeta;', 'zwj;', 'zwnj;']; + + return values.map(function(value){ + return { + caption: value, + snippet: value, + meta: "html entity", + score: Number.MAX_VALUE + }; + }); + }; + +}).call(HtmlCompletions.prototype); + +exports.HtmlCompletions = HtmlCompletions; +}); + +ace.define("ace/mode/html",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/javascript","ace/mode/css","ace/mode/html_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/html","ace/mode/html_completions","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var JavaScriptMode = require("./javascript").Mode; +var CssMode = require("./css").Mode; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var HtmlFoldMode = require("./folding/html").FoldMode; +var HtmlCompletions = require("./html_completions").HtmlCompletions; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var voidElements = ["area", "base", "br", "col", "embed", "hr", "img", "input", "keygen", "link", "meta", "menuitem", "param", "source", "track", "wbr"]; +var optionalEndTags = ["li", "dt", "dd", "p", "rt", "rp", "optgroup", "option", "colgroup", "td", "th"]; + +var Mode = function(options) { + this.fragmentContext = options && options.fragmentContext; + this.HighlightRules = HtmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.$completer = new HtmlCompletions(); + + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); + + this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags)); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.blockComment = {start: ""}; + + this.voidElements = lang.arrayToMap(voidElements); + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.getCompletions = function(state, session, pos, prefix) { + return this.$completer.getCompletions(state, session, pos, prefix); + }; + + this.createWorker = function(session) { + if (this.constructor != Mode) + return; + var worker = new WorkerClient(["ace"], "ace/mode/html_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + if (this.fragmentContext) + worker.call("setOptions", [{context: this.fragmentContext}]); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/html"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/velocity_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules","ace/mode/html_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules; + +var VelocityHighlightRules = function() { + HtmlHighlightRules.call(this); + + var builtinConstants = lang.arrayToMap( + ('true|false|null').split('|') + ); + + var builtinFunctions = lang.arrayToMap( + ("_DateTool|_DisplayTool|_EscapeTool|_FieldTool|_MathTool|_NumberTool|_SerializerTool|_SortTool|_StringTool|_XPathTool").split('|') + ); + + var builtinVariables = lang.arrayToMap( + ('$contentRoot|$foreach').split('|') + ); + + var keywords = lang.arrayToMap( + ("#set|#macro|#include|#parse|" + + "#if|#elseif|#else|#foreach|" + + "#break|#end|#stop" + ).split('|') + ); + + this.$rules.start.push( + { + token : "comment", + regex : "##.*$" + },{ + token : "comment.block", // multi line comment + regex : "#\\*", + next : "vm_comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : function(value) { + if (keywords.hasOwnProperty(value)) + return "keyword"; + else if (builtinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (builtinVariables.hasOwnProperty(value)) + return "variable.language"; + else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1))) + return "support.function"; + else if (value == "debugger") + return "invalid.deprecated"; + else + if(value.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*)$/)) + return "variable"; + return "identifier"; + }, + regex : "[a-zA-Z$#][a-zA-Z0-9_]*\\b" + }, { + token : "keyword.operator", + regex : "!|&|\\*|\\-|\\+|=|!=|<=|>=|<|>|&&|\\|\\|" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ); + + this.$rules["vm_comment"] = [ + { + token : "comment", // closing comment + regex : "\\*#|-->", + next : "start" + }, { + defaultToken: "comment" + } + ]; + + this.$rules["vm_start"] = [ + { + token: "variable", + regex: "}", + next: "pop" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : function(value) { + if (keywords.hasOwnProperty(value)) + return "keyword"; + else if (builtinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (builtinVariables.hasOwnProperty(value)) + return "variable.language"; + else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1))) + return "support.function"; + else if (value == "debugger") + return "invalid.deprecated"; + else + if(value.match(/^(\$[a-zA-Z_$][a-zA-Z0-9_]*)$/)) + return "variable"; + return "identifier"; + }, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|&|\\*|\\-|\\+|=|!=|<=|>=|<|>|&&|\\|\\|" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ]; + + for (var i in this.$rules) { + this.$rules[i].unshift({ + token: "variable", + regex: "\\${", + push: "vm_start" + }); + } + + this.normalizeRules(); +}; + +oop.inherits(VelocityHighlightRules, TextHighlightRules); + +exports.VelocityHighlightRules = VelocityHighlightRules; +}); + +ace.define("ace/mode/folding/velocity",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "##") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "##") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "##" && next[indent] == "##") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "##" && prev[indent] == "##") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/velocity",["require","exports","module","ace/lib/oop","ace/mode/html","ace/mode/velocity_highlight_rules","ace/mode/folding/velocity"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var HtmlMode = require("./html").Mode; +var VelocityHighlightRules = require("./velocity_highlight_rules").VelocityHighlightRules; +var FoldMode = require("./folding/velocity").FoldMode; + +var Mode = function() { + HtmlMode.call(this); + this.HighlightRules = VelocityHighlightRules; + this.foldingRules = new FoldMode(); +}; +oop.inherits(Mode, HtmlMode); + +(function() { + this.lineCommentStart = "##"; + this.blockComment = {start: "#*", end: "*#"}; + this.$id = "ace/mode/velocity"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-verilog.js b/src/libs/ace/mode-verilog.js new file mode 100755 index 0000000..7def13b --- /dev/null +++ b/src/libs/ace/mode-verilog.js @@ -0,0 +1,104 @@ +ace.define("ace/mode/verilog_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var VerilogHighlightRules = function() { +var keywords = "always|and|assign|automatic|begin|buf|bufif0|bufif1|case|casex|casez|cell|cmos|config|" + + "deassign|default|defparam|design|disable|edge|else|end|endcase|endconfig|endfunction|endgenerate|endmodule|" + + "endprimitive|endspecify|endtable|endtask|event|for|force|forever|fork|function|generate|genvar|highz0|" + + "highz1|if|ifnone|incdir|include|initial|inout|input|instance|integer|join|large|liblist|library|localparam|" + + "macromodule|medium|module|nand|negedge|nmos|nor|noshowcancelled|not|notif0|notif1|or|output|parameter|pmos|" + + "posedge|primitive|pull0|pull1|pulldown|pullup|pulsestyle_onevent|pulsestyle_ondetect|rcmos|real|realtime|" + + "reg|release|repeat|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|showcancelled|signed|small|specify|specparam|" + + "strong0|strong1|supply0|supply1|table|task|time|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|" + + "unsigned|use|vectored|wait|wand|weak0|weak1|while|wire|wor|xnor|xor" + + "begin|bufif0|bufif1|case|casex|casez|config|else|end|endcase|endconfig|endfunction|" + + "endgenerate|endmodule|endprimitive|endspecify|endtable|endtask|for|forever|function|generate|if|ifnone|" + + "macromodule|module|primitive|repeat|specify|table|task|while"; + + var builtinConstants = ( + "true|false|null" + ); + + var builtinFunctions = ( + "count|min|max|avg|sum|rank|now|coalesce|main" + ); + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "//.*$" + }, { + token : "comment.start", + regex : "/\\*", + next : [ + { token : "comment.end", regex : "\\*/", next: "start" }, + { defaultToken : "comment" } + ] + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; + this.normalizeRules(); +}; + +oop.inherits(VerilogHighlightRules, TextHighlightRules); + +exports.VerilogHighlightRules = VerilogHighlightRules; +}); + +ace.define("ace/mode/verilog",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/verilog_highlight_rules","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var VerilogHighlightRules = require("./verilog_highlight_rules").VerilogHighlightRules; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = VerilogHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.$id = "ace/mode/verilog"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-vhdl.js b/src/libs/ace/mode-vhdl.js new file mode 100755 index 0000000..41dab57 --- /dev/null +++ b/src/libs/ace/mode-vhdl.js @@ -0,0 +1,110 @@ +ace.define("ace/mode/vhdl_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var VHDLHighlightRules = function() { + + + + var keywords = "access|after|ailas|all|architecture|assert|attribute|"+ + "begin|block|buffer|bus|case|component|configuration|"+ + "disconnect|downto|else|elsif|end|entity|file|for|function|"+ + "generate|generic|guarded|if|impure|in|inertial|inout|is|"+ + "label|linkage|literal|loop|mapnew|next|of|on|open|"+ + "others|out|port|process|pure|range|record|reject|"+ + "report|return|select|shared|subtype|then|to|transport|"+ + "type|unaffected|united|until|wait|when|while|with"; + + var storageType = "bit|bit_vector|boolean|character|integer|line|natural|"+ + "positive|real|register|severity|signal|signed|"+ + "std_logic|std_logic_vector|string||text|time|unsigned|"+ + "variable"; + + var storageModifiers = "array|constant"; + + var keywordOperators = "abs|and|mod|nand|nor|not|rem|rol|ror|sla|sll|sra"+ + "srl|xnor|xor"; + + var builtinConstants = ( + "true|false|null" + ); + + + var keywordMapper = this.createKeywordMapper({ + "keyword.operator": keywordOperators, + "keyword": keywords, + "constant.language": builtinConstants, + "storage.modifier": storageModifiers, + "storage.type": storageType + }, "identifier", true); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "--.*$" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "keyword", // pre-compiler directives + regex : "\\s*(?:library|package|use)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "&|\\*|\\+|\\-|\\/|<|=|>|\\||=>|\\*\\*|:=|\\/=|>=|<=|<>" + }, { + token : "punctuation.operator", + regex : "\\'|\\:|\\,|\\;|\\." + },{ + token : "paren.lparen", + regex : "[[(]" + }, { + token : "paren.rparen", + regex : "[\\])]" + }, { + token : "text", + regex : "\\s+" + } ] + + + }; +}; + +oop.inherits(VHDLHighlightRules, TextHighlightRules); + +exports.VHDLHighlightRules = VHDLHighlightRules; +}); + +ace.define("ace/mode/vhdl",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/vhdl_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var VHDLHighlightRules = require("./vhdl_highlight_rules").VHDLHighlightRules; + +var Mode = function() { + this.HighlightRules = VHDLHighlightRules; + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "--"; + + this.$id = "ace/mode/vhdl"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/mode-wollok.js b/src/libs/ace/mode-wollok.js new file mode 100755 index 0000000..22c64ac --- /dev/null +++ b/src/libs/ace/mode-wollok.js @@ -0,0 +1,905 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var DocCommentHighlightRules = function() { + this.$rules = { + "start" : [ { + token : "comment.doc.tag", + regex : "@[\\w\\d_]+" // TODO: fix email addresses + }, + DocCommentHighlightRules.getTagRule(), + { + defaultToken : "comment.doc", + caseInsensitive: true + }] + }; +}; + +oop.inherits(DocCommentHighlightRules, TextHighlightRules); + +DocCommentHighlightRules.getTagRule = function(start) { + return { + token : "comment.doc.tag.storage.type", + regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b" + }; +} + +DocCommentHighlightRules.getStartRule = function(start) { + return { + token : "comment.doc", // doc comment + regex : "\\/\\*(?=\\*)", + next : start + }; +}; + +DocCommentHighlightRules.getEndRule = function (start) { + return { + token : "comment.doc", // closing comment + regex : "\\*\\/", + next : start + }; +}; + + +exports.DocCommentHighlightRules = DocCommentHighlightRules; + +}); + +ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*"; + +var JavaScriptHighlightRules = function(options) { + var keywordMapper = this.createKeywordMapper({ + "variable.language": + "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors + "Namespace|QName|XML|XMLList|" + // E4X + "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" + + "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" + + "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors + "SyntaxError|TypeError|URIError|" + + "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions + "isNaN|parseFloat|parseInt|" + + "JSON|Math|" + // Other + "this|arguments|prototype|window|document" , // Pseudo + "keyword": + "const|yield|import|get|set|async|await|" + + "break|case|catch|continue|default|delete|do|else|finally|for|function|" + + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + + "__parent__|__count__|escape|unescape|with|__proto__|" + + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static", + "storage.type": + "const|let|var|function", + "constant.language": + "null|Infinity|NaN|undefined", + "support.function": + "alert", + "constant.language.boolean": "true|false" + }, "identifier"); + var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; + + var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex + "u[0-9a-fA-F]{4}|" + // unicode + "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode + "[0-2][0-7]{0,2}|" + // oct + "3[0-7][0-7]?|" + // oct + "[4-7][0-7]?|" + //oct + ".)"; + + this.$rules = { + "no_regex" : [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("no_regex"), + { + token : "string", + regex : "'(?=.)", + next : "qstring" + }, { + token : "string", + regex : '"(?=.)', + next : "qqstring" + }, { + token : "constant.numeric", // hexadecimal, octal and binary + regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/ + }, { + token : "constant.numeric", // decimal integers and floats + regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/ + }, { + token : [ + "storage.type", "punctuation.operator", "support.function", + "punctuation.operator", "entity.name.function", "text","keyword.operator" + ], + regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "keyword.operator", "text", "storage.type", + "text", "paren.lparen" + ], + regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "entity.name.function", "text", "punctuation.operator", + "text", "storage.type", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : [ + "text", "text", "storage.type", "text", "paren.lparen" + ], + regex : "(:)(\\s*)(function)(\\s*)(\\()", + next: "function_arguments" + }, { + token : "keyword", + regex : "from(?=\\s*('|\"))" + }, { + token : "keyword", + regex : "(?:" + kwBeforeRe + ")\\b", + next : "start" + }, { + token : ["support.constant"], + regex : /that\b/ + }, { + token : ["storage.type", "punctuation.operator", "support.function.firebug"], + regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/ + }, { + token : keywordMapper, + regex : identifierRe + }, { + token : "punctuation.operator", + regex : /[.](?![.])/, + next : "property" + }, { + token : "storage.type", + regex : /=>/ + }, { + token : "keyword.operator", + regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + consumeLineEnd : true + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || options.jsx != false) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + this.$quotes = {'"': '"', "'": "'", "`": "`"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/mode/wollok_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var WollokHighlightRules = function() { + var keywords = ( + "test|package|inherits|false|import|else|or|class|and|not|native|override|program|this|try|val|var|catch|object|super|throw|if|null|return|true|new|method" + ); + + var buildinConstants = ("null|assert|console"); + + + var langClasses = ( + "Object|Pair|String|Boolean|Number|Integer|Double|Collection|Set|List|Exception|Range" + + "|StackTraceElement" + ); + + var keywordMapper = this.createKeywordMapper({ + "variable.language": "this", + "keyword": keywords, + "constant.language": buildinConstants, + "support.function": langClasses + }, "identifier"); + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + DocCommentHighlightRules.getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + next : "comment" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : /0(?:[xX][0-9a-fA-F][0-9a-fA-F_]*|[bB][01][01_]*)[LlSsDdFfYy]?\b/ + }, { + token : "constant.numeric", // float + regex : /[+-]?\d[\d_]*(?:(?:\.[\d_]*)?(?:[eE][+-]?[\d_]+)?)?[LlSsDdFfYy]?\b/ + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "===|&&|\\*=|\\.\\.|\\*\\*|#|!|%|\\*|\\?:|\\+|\\/|,|\\+=|\\-|\\.\\.<|!==|:|\\/=|\\?\\.|\\+\\+|>|=|<|>=|=>|==|\\]|\\[|\\-=|\\->|\\||\\-\\-|<>|!=|%=|\\|" + }, { + token : "lparen", + regex : "[[({]" + }, { + token : "rparen", + regex : "[\\])}]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("start") ]); +}; + +oop.inherits(WollokHighlightRules, TextHighlightRules); + +exports.WollokHighlightRules = WollokHighlightRules; +}); + +ace.define("ace/mode/wollok",["require","exports","module","ace/lib/oop","ace/mode/javascript","ace/mode/wollok_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var JavaScriptMode = require("./javascript").Mode; +var WollokHighlightRules = require("./wollok_highlight_rules").WollokHighlightRules; + +var Mode = function() { + JavaScriptMode.call(this); + this.HighlightRules = WollokHighlightRules; +}; +oop.inherits(Mode, JavaScriptMode); + +(function() { + + this.createWorker = function(session) { + return null; + }; + + this.$id = "ace/mode/wollok"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-xml.js b/src/libs/ace/mode-xml.js new file mode 100755 index 0000000..f5f840a --- /dev/null +++ b/src/libs/ace/mode-xml.js @@ -0,0 +1,664 @@ +ace.define("ace/mode/xml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var XmlHighlightRules = function(normalize) { + var tagRegex = "[_:a-zA-Z\xc0-\uffff][-_:.a-zA-Z0-9\xc0-\uffff]*"; + + this.$rules = { + start : [ + {token : "string.cdata.xml", regex : "<\\!\\[CDATA\\[", next : "cdata"}, + { + token : ["punctuation.instruction.xml", "keyword.instruction.xml"], + regex : "(<\\?)(" + tagRegex + ")", next : "processing_instruction" + }, + {token : "comment.start.xml", regex : "<\\!--", next : "comment"}, + { + token : ["xml-pe.doctype.xml", "xml-pe.doctype.xml"], + regex : "(<\\!)(DOCTYPE)(?=[\\s])", next : "doctype", caseInsensitive: true + }, + {include : "tag"}, + {token : "text.end-tag-open.xml", regex: "", + next : "start" + }], + + doctype : [ + {include : "whitespace"}, + {include : "string"}, + {token : "xml-pe.doctype.xml", regex : ">", next : "start"}, + {token : "xml-pe.xml", regex : "[-_a-zA-Z0-9:]+"}, + {token : "punctuation.int-subset", regex : "\\[", push : "int_subset"} + ], + + int_subset : [{ + token : "text.xml", + regex : "\\s+" + }, { + token: "punctuation.int-subset.xml", + regex: "]", + next: "pop" + }, { + token : ["punctuation.markup-decl.xml", "keyword.markup-decl.xml"], + regex : "(<\\!)(" + tagRegex + ")", + push : [{ + token : "text", + regex : "\\s+" + }, + { + token : "punctuation.markup-decl.xml", + regex : ">", + next : "pop" + }, + {include : "string"}] + }], + + cdata : [ + {token : "string.cdata.xml", regex : "\\]\\]>", next : "start"}, + {token : "text.xml", regex : "\\s+"}, + {token : "text.xml", regex : "(?:[^\\]]|\\](?!\\]>))+"} + ], + + comment : [ + {token : "comment.end.xml", regex : "-->", next : "start"}, + {defaultToken : "comment.xml"} + ], + + reference : [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + attr_reference : [{ + token : "constant.language.escape.reference.attribute-value.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }], + + tag : [{ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag.punctuation.end-tag-open.xml", "meta.tag.tag-name.xml"], + regex : "(?:(<)|(", next : "start"} + ] + }], + + tag_whitespace : [ + {token : "text.tag-whitespace.xml", regex : "\\s+"} + ], + whitespace : [ + {token : "text.whitespace.xml", regex : "\\s+"} + ], + string: [{ + token : "string.xml", + regex : "'", + push : [ + {token : "string.xml", regex: "'", next: "pop"}, + {defaultToken : "string.xml"} + ] + }, { + token : "string.xml", + regex : '"', + push : [ + {token : "string.xml", regex: '"', next: "pop"}, + {defaultToken : "string.xml"} + ] + }], + + attributes: [{ + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + include: "tag_whitespace" + }, { + include: "attribute_value" + }], + + attribute_value: [{ + token : "string.attribute-value.xml", + regex : "'", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "attr_reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }] + }; + + if (this.constructor === XmlHighlightRules) + this.normalizeRules(); +}; + + +(function() { + + this.embedTagRules = function(HighlightRules, prefix, tag){ + this.$rules.tag.unshift({ + token : ["meta.tag.punctuation.tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(<)(" + tag + "(?=\\s|>|$))", + next: [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next : prefix + "start"} + ] + }); + + this.$rules[tag + "-end"] = [ + {include : "attributes"}, + {token : "meta.tag.punctuation.tag-close.xml", regex : "/?>", next: "start", + onMatch : function(value, currentState, stack) { + stack.splice(0); + return this.token; + }} + ] + + this.embedRules(HighlightRules, prefix, [{ + token: ["meta.tag.punctuation.end-tag-open.xml", "meta.tag." + tag + ".tag-name.xml"], + regex : "(|$))", + next: tag + "-end" + }, { + token: "string.cdata.xml", + regex : "<\\!\\[CDATA\\[" + }, { + token: "string.cdata.xml", + regex : "\\]\\]>" + }]); + }; + +}).call(TextHighlightRules.prototype); + +oop.inherits(XmlHighlightRules, TextHighlightRules); + +exports.XmlHighlightRules = XmlHighlightRules; +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === " -1; +} + +(function() { + + this.getFoldWidget = function(session, foldStyle, row) { + var tag = this._getFirstTagInLine(session, row); + + if (!tag) + return this.getCommentFoldWidget(session, row); + + if (tag.closing || (!tag.tagName && tag.selfClosing)) + return foldStyle == "markbeginend" ? "end" : ""; + + if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())) + return ""; + + if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) + return ""; + + return "start"; + }; + + this.getCommentFoldWidget = function(session, row) { + if (/comment/.test(session.getState(row)) && /'; + break; + } + } + return tag; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == '/>'; + return tag; + } + tag.start.column += token.value.length; + } + + return null; + }; + + this._findEndTagInLine = function(session, row, tagName, startColumn) { + var tokens = session.getTokens(row); + var column = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + column += token.value.length; + if (column < startColumn) + continue; + if (is(token, "end-tag-open")) { + token = tokens[i + 1]; + if (token && token.value == tagName) + return true; + } + } + return false; + }; + this._readTagForward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator.stepForward(); + return tag; + } + } while(token = iterator.stepForward()); + + return null; + }; + + this._readTagBackward = function(iterator) { + var token = iterator.getCurrentToken(); + if (!token) + return null; + + var tag = new Tag(); + do { + if (is(token, "tag-open")) { + tag.closing = is(token, "end-tag-open"); + tag.start.row = iterator.getCurrentTokenRow(); + tag.start.column = iterator.getCurrentTokenColumn(); + iterator.stepBackward(); + return tag; + } else if (is(token, "tag-name")) { + tag.tagName = token.value; + } else if (is(token, "tag-close")) { + tag.selfClosing = token.value == "/>"; + tag.end.row = iterator.getCurrentTokenRow(); + tag.end.column = iterator.getCurrentTokenColumn() + token.value.length; + } + } while(token = iterator.stepBackward()); + + return null; + }; + + this._pop = function(stack, tag) { + while (stack.length) { + + var top = stack[stack.length-1]; + if (!tag || top.tagName == tag.tagName) { + return stack.pop(); + } + else if (this.optionalEndTags.hasOwnProperty(top.tagName)) { + stack.pop(); + continue; + } else { + return null; + } + } + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var firstTag = this._getFirstTagInLine(session, row); + + if (!firstTag) { + return this.getCommentFoldWidget(session, row) + && session.getCommentFoldRange(row, session.getLine(row).length); + } + + var isBackward = firstTag.closing || firstTag.selfClosing; + var stack = []; + var tag; + + if (!isBackward) { + var iterator = new TokenIterator(session, row, firstTag.start.column); + var start = { + row: row, + column: firstTag.start.column + firstTag.tagName.length + 2 + }; + if (firstTag.start.row == firstTag.end.row) + start.column = firstTag.end.column; + while (tag = this._readTagForward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) + return Range.fromPoints(start, tag.start); + } + else { + stack.push(tag); + } + } + } + else { + var iterator = new TokenIterator(session, row, firstTag.end.column); + var end = { + row: row, + column: firstTag.start.column + }; + + while (tag = this._readTagBackward(iterator)) { + if (tag.selfClosing) { + if (!stack.length) { + tag.start.column += tag.tagName.length + 2; + tag.end.column -= 2; + return Range.fromPoints(tag.start, tag.end); + } else + continue; + } + + if (!tag.closing) { + this._pop(stack, tag); + if (stack.length == 0) { + tag.start.column += tag.tagName.length + 2; + if (tag.start.row == tag.end.row && tag.start.column < tag.end.column) + tag.start.column = tag.end.column; + return Range.fromPoints(tag.start, end); + } + } + else { + stack.push(tag); + } + } + } + + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/xml",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text","ace/mode/xml_highlight_rules","ace/mode/behaviour/xml","ace/mode/folding/xml","ace/worker/worker_client"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var TextMode = require("./text").Mode; +var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules; +var XmlBehaviour = require("./behaviour/xml").XmlBehaviour; +var XmlFoldMode = require("./folding/xml").FoldMode; +var WorkerClient = require("../worker/worker_client").WorkerClient; + +var Mode = function() { + this.HighlightRules = XmlHighlightRules; + this.$behaviour = new XmlBehaviour(); + this.foldingRules = new XmlFoldMode(); +}; + +oop.inherits(Mode, TextMode); + +(function() { + + this.voidElements = lang.arrayToMap([]); + + this.blockComment = {start: ""}; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/xml_worker", "Worker"); + worker.attachToDocument(session.getDocument()); + + worker.on("error", function(e) { + session.setAnnotations(e.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/xml"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-xquery.js b/src/libs/ace/mode-xquery.js new file mode 100755 index 0000000..3de4ec0 --- /dev/null +++ b/src/libs/ace/mode-xquery.js @@ -0,0 +1,2631 @@ +ace.define("ace/mode/xquery/xquery_lexer",["require","exports","module"], function(require, exports, module) { +module.exports = (function outer (modules, cache, entry) { + var previousRequire = typeof require == "function" && require; + function newRequire(name, jumped){ + if(!cache[name]) { + if(!modules[name]) { + var currentRequire = typeof require == "function" && require; + if (!jumped && currentRequire) return currentRequire(name, true); + if (previousRequire) return previousRequire(name, true); + var err = new Error('Cannot find module \'' + name + '\''); + err.code = 'MODULE_NOT_FOUND'; + throw err; + } + var m = cache[name] = {exports:{}}; + modules[name][0].call(m.exports, function(x){ + var id = modules[name][1][x]; + return newRequire(id ? id : x); + },m,m.exports,outer,modules,cache,entry); + } + return cache[name].exports; + } + for(var i=0;i= 0 ? XQueryTokenizer.TOKEN[o] : null; + }; + + this.getExpectedTokenSet = function(e) + { + var expected; + if (e.getExpected() < 0) + { + expected = XQueryTokenizer.getTokenSet(- e.getState()); + } + else + { + expected = [XQueryTokenizer.TOKEN[e.getExpected()]]; + } + return expected; + }; + + this.getErrorMessage = function(e) + { + var tokenSet = this.getExpectedTokenSet(e); + var found = this.getOffendingToken(e); + var prefix = input.substring(0, e.getBegin()); + var lines = prefix.split("\n"); + var line = lines.length; + var column = lines[line - 1].length + 1; + var size = e.getEnd() - e.getBegin(); + return e.getMessage() + + (found == null ? "" : ", found " + found) + + "\nwhile expecting " + + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) + + "\n" + + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + + "at line " + line + ", column " + column + ":\n..." + + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64)) + + "..."; + }; + + this.parse_start = function() + { + eventHandler.startNonterminal("start", e0); + lookahead1W(14); // ModuleDecl | Annotation | OptionDecl | Operator | Variable | Tag | AttrTest | + switch (l1) + { + case 55: // '' | '=' | '>' + switch (l1) + { + case 58: // '>' + shift(58); // '>' + break; + case 50: // '/>' + shift(50); // '/>' + break; + case 27: // QName + shift(27); // QName + break; + case 57: // '=' + shift(57); // '=' + break; + case 35: // '"' + shift(35); // '"' + break; + case 38: // "'" + shift(38); // "'" + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("StartTag", e0); + }; + + this.parse_TagContent = function() + { + eventHandler.startNonterminal("TagContent", e0); + lookahead1(11); // Tag | EndTag | PredefinedEntityRef | ElementContentChar | CharRef | EOF | + switch (l1) + { + case 23: // ElementContentChar + shift(23); // ElementContentChar + break; + case 6: // Tag + shift(6); // Tag + break; + case 7: // EndTag + shift(7); // EndTag + break; + case 55: // '' + switch (l1) + { + case 11: // CDataSectionContents + shift(11); // CDataSectionContents + break; + case 64: // ']]>' + shift(64); // ']]>' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("CData", e0); + }; + + this.parse_XMLComment = function() + { + eventHandler.startNonterminal("XMLComment", e0); + lookahead1(0); // DirCommentContents | EOF | '-->' + switch (l1) + { + case 9: // DirCommentContents + shift(9); // DirCommentContents + break; + case 47: // '-->' + shift(47); // '-->' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("XMLComment", e0); + }; + + this.parse_PI = function() + { + eventHandler.startNonterminal("PI", e0); + lookahead1(3); // DirPIContents | EOF | '?' | '?>' + switch (l1) + { + case 10: // DirPIContents + shift(10); // DirPIContents + break; + case 59: // '?' + shift(59); // '?' + break; + case 60: // '?>' + shift(60); // '?>' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("PI", e0); + }; + + this.parse_Pragma = function() + { + eventHandler.startNonterminal("Pragma", e0); + lookahead1(2); // PragmaContents | EOF | '#' | '#)' + switch (l1) + { + case 8: // PragmaContents + shift(8); // PragmaContents + break; + case 36: // '#' + shift(36); // '#' + break; + case 37: // '#)' + shift(37); // '#)' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("Pragma", e0); + }; + + this.parse_Comment = function() + { + eventHandler.startNonterminal("Comment", e0); + lookahead1(4); // CommentContents | EOF | '(:' | ':)' + switch (l1) + { + case 52: // ':)' + shift(52); // ':)' + break; + case 41: // '(:' + shift(41); // '(:' + break; + case 30: // CommentContents + shift(30); // CommentContents + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("Comment", e0); + }; + + this.parse_CommentDoc = function() + { + eventHandler.startNonterminal("CommentDoc", e0); + lookahead1(5); // DocTag | DocCommentContents | EOF | '(:' | ':)' + switch (l1) + { + case 31: // DocTag + shift(31); // DocTag + break; + case 32: // DocCommentContents + shift(32); // DocCommentContents + break; + case 52: // ':)' + shift(52); // ':)' + break; + case 41: // '(:' + shift(41); // '(:' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("CommentDoc", e0); + }; + + this.parse_QuotString = function() + { + eventHandler.startNonterminal("QuotString", e0); + lookahead1(6); // PredefinedEntityRef | EscapeQuot | QuotChar | CharRef | EOF | '"' + switch (l1) + { + case 18: // PredefinedEntityRef + shift(18); // PredefinedEntityRef + break; + case 29: // CharRef + shift(29); // CharRef + break; + case 19: // EscapeQuot + shift(19); // EscapeQuot + break; + case 21: // QuotChar + shift(21); // QuotChar + break; + case 35: // '"' + shift(35); // '"' + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("QuotString", e0); + }; + + this.parse_AposString = function() + { + eventHandler.startNonterminal("AposString", e0); + lookahead1(7); // PredefinedEntityRef | EscapeApos | AposChar | CharRef | EOF | "'" + switch (l1) + { + case 18: // PredefinedEntityRef + shift(18); // PredefinedEntityRef + break; + case 29: // CharRef + shift(29); // CharRef + break; + case 20: // EscapeApos + shift(20); // EscapeApos + break; + case 22: // AposChar + shift(22); // AposChar + break; + case 38: // "'" + shift(38); // "'" + break; + default: + shift(33); // EOF + } + eventHandler.endNonterminal("AposString", e0); + }; + + this.parse_Prefix = function() + { + eventHandler.startNonterminal("Prefix", e0); + lookahead1W(13); // NCName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | + whitespace(); + parse_NCName(); + eventHandler.endNonterminal("Prefix", e0); + }; + + this.parse__EQName = function() + { + eventHandler.startNonterminal("_EQName", e0); + lookahead1W(12); // EQName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | + whitespace(); + parse_EQName(); + eventHandler.endNonterminal("_EQName", e0); + }; + + function parse_EQName() + { + eventHandler.startNonterminal("EQName", e0); + switch (l1) + { + case 77: // 'attribute' + shift(77); // 'attribute' + break; + case 91: // 'comment' + shift(91); // 'comment' + break; + case 115: // 'document-node' + shift(115); // 'document-node' + break; + case 116: // 'element' + shift(116); // 'element' + break; + case 119: // 'empty-sequence' + shift(119); // 'empty-sequence' + break; + case 140: // 'function' + shift(140); // 'function' + break; + case 147: // 'if' + shift(147); // 'if' + break; + case 160: // 'item' + shift(160); // 'item' + break; + case 180: // 'namespace-node' + shift(180); // 'namespace-node' + break; + case 186: // 'node' + shift(186); // 'node' + break; + case 211: // 'processing-instruction' + shift(211); // 'processing-instruction' + break; + case 221: // 'schema-attribute' + shift(221); // 'schema-attribute' + break; + case 222: // 'schema-element' + shift(222); // 'schema-element' + break; + case 238: // 'switch' + shift(238); // 'switch' + break; + case 239: // 'text' + shift(239); // 'text' + break; + case 248: // 'typeswitch' + shift(248); // 'typeswitch' + break; + default: + parse_FunctionName(); + } + eventHandler.endNonterminal("EQName", e0); + } + + function parse_FunctionName() + { + eventHandler.startNonterminal("FunctionName", e0); + switch (l1) + { + case 14: // EQName^Token + shift(14); // EQName^Token + break; + case 65: // 'after' + shift(65); // 'after' + break; + case 68: // 'ancestor' + shift(68); // 'ancestor' + break; + case 69: // 'ancestor-or-self' + shift(69); // 'ancestor-or-self' + break; + case 70: // 'and' + shift(70); // 'and' + break; + case 74: // 'as' + shift(74); // 'as' + break; + case 75: // 'ascending' + shift(75); // 'ascending' + break; + case 79: // 'before' + shift(79); // 'before' + break; + case 83: // 'case' + shift(83); // 'case' + break; + case 84: // 'cast' + shift(84); // 'cast' + break; + case 85: // 'castable' + shift(85); // 'castable' + break; + case 88: // 'child' + shift(88); // 'child' + break; + case 89: // 'collation' + shift(89); // 'collation' + break; + case 98: // 'copy' + shift(98); // 'copy' + break; + case 100: // 'count' + shift(100); // 'count' + break; + case 103: // 'declare' + shift(103); // 'declare' + break; + case 104: // 'default' + shift(104); // 'default' + break; + case 105: // 'delete' + shift(105); // 'delete' + break; + case 106: // 'descendant' + shift(106); // 'descendant' + break; + case 107: // 'descendant-or-self' + shift(107); // 'descendant-or-self' + break; + case 108: // 'descending' + shift(108); // 'descending' + break; + case 113: // 'div' + shift(113); // 'div' + break; + case 114: // 'document' + shift(114); // 'document' + break; + case 117: // 'else' + shift(117); // 'else' + break; + case 118: // 'empty' + shift(118); // 'empty' + break; + case 121: // 'end' + shift(121); // 'end' + break; + case 123: // 'eq' + shift(123); // 'eq' + break; + case 124: // 'every' + shift(124); // 'every' + break; + case 126: // 'except' + shift(126); // 'except' + break; + case 129: // 'first' + shift(129); // 'first' + break; + case 130: // 'following' + shift(130); // 'following' + break; + case 131: // 'following-sibling' + shift(131); // 'following-sibling' + break; + case 132: // 'for' + shift(132); // 'for' + break; + case 141: // 'ge' + shift(141); // 'ge' + break; + case 143: // 'group' + shift(143); // 'group' + break; + case 145: // 'gt' + shift(145); // 'gt' + break; + case 146: // 'idiv' + shift(146); // 'idiv' + break; + case 148: // 'import' + shift(148); // 'import' + break; + case 154: // 'insert' + shift(154); // 'insert' + break; + case 155: // 'instance' + shift(155); // 'instance' + break; + case 157: // 'intersect' + shift(157); // 'intersect' + break; + case 158: // 'into' + shift(158); // 'into' + break; + case 159: // 'is' + shift(159); // 'is' + break; + case 165: // 'last' + shift(165); // 'last' + break; + case 167: // 'le' + shift(167); // 'le' + break; + case 169: // 'let' + shift(169); // 'let' + break; + case 173: // 'lt' + shift(173); // 'lt' + break; + case 175: // 'mod' + shift(175); // 'mod' + break; + case 176: // 'modify' + shift(176); // 'modify' + break; + case 177: // 'module' + shift(177); // 'module' + break; + case 179: // 'namespace' + shift(179); // 'namespace' + break; + case 181: // 'ne' + shift(181); // 'ne' + break; + case 193: // 'only' + shift(193); // 'only' + break; + case 195: // 'or' + shift(195); // 'or' + break; + case 196: // 'order' + shift(196); // 'order' + break; + case 197: // 'ordered' + shift(197); // 'ordered' + break; + case 201: // 'parent' + shift(201); // 'parent' + break; + case 207: // 'preceding' + shift(207); // 'preceding' + break; + case 208: // 'preceding-sibling' + shift(208); // 'preceding-sibling' + break; + case 213: // 'rename' + shift(213); // 'rename' + break; + case 214: // 'replace' + shift(214); // 'replace' + break; + case 215: // 'return' + shift(215); // 'return' + break; + case 219: // 'satisfies' + shift(219); // 'satisfies' + break; + case 224: // 'self' + shift(224); // 'self' + break; + case 230: // 'some' + shift(230); // 'some' + break; + case 231: // 'stable' + shift(231); // 'stable' + break; + case 232: // 'start' + shift(232); // 'start' + break; + case 243: // 'to' + shift(243); // 'to' + break; + case 244: // 'treat' + shift(244); // 'treat' + break; + case 245: // 'try' + shift(245); // 'try' + break; + case 249: // 'union' + shift(249); // 'union' + break; + case 251: // 'unordered' + shift(251); // 'unordered' + break; + case 255: // 'validate' + shift(255); // 'validate' + break; + case 261: // 'where' + shift(261); // 'where' + break; + case 265: // 'with' + shift(265); // 'with' + break; + case 269: // 'xquery' + shift(269); // 'xquery' + break; + case 67: // 'allowing' + shift(67); // 'allowing' + break; + case 76: // 'at' + shift(76); // 'at' + break; + case 78: // 'base-uri' + shift(78); // 'base-uri' + break; + case 80: // 'boundary-space' + shift(80); // 'boundary-space' + break; + case 81: // 'break' + shift(81); // 'break' + break; + case 86: // 'catch' + shift(86); // 'catch' + break; + case 93: // 'construction' + shift(93); // 'construction' + break; + case 96: // 'context' + shift(96); // 'context' + break; + case 97: // 'continue' + shift(97); // 'continue' + break; + case 99: // 'copy-namespaces' + shift(99); // 'copy-namespaces' + break; + case 101: // 'decimal-format' + shift(101); // 'decimal-format' + break; + case 120: // 'encoding' + shift(120); // 'encoding' + break; + case 127: // 'exit' + shift(127); // 'exit' + break; + case 128: // 'external' + shift(128); // 'external' + break; + case 136: // 'ft-option' + shift(136); // 'ft-option' + break; + case 149: // 'in' + shift(149); // 'in' + break; + case 150: // 'index' + shift(150); // 'index' + break; + case 156: // 'integrity' + shift(156); // 'integrity' + break; + case 166: // 'lax' + shift(166); // 'lax' + break; + case 187: // 'nodes' + shift(187); // 'nodes' + break; + case 194: // 'option' + shift(194); // 'option' + break; + case 198: // 'ordering' + shift(198); // 'ordering' + break; + case 217: // 'revalidation' + shift(217); // 'revalidation' + break; + case 220: // 'schema' + shift(220); // 'schema' + break; + case 223: // 'score' + shift(223); // 'score' + break; + case 229: // 'sliding' + shift(229); // 'sliding' + break; + case 235: // 'strict' + shift(235); // 'strict' + break; + case 246: // 'tumbling' + shift(246); // 'tumbling' + break; + case 247: // 'type' + shift(247); // 'type' + break; + case 252: // 'updating' + shift(252); // 'updating' + break; + case 256: // 'value' + shift(256); // 'value' + break; + case 257: // 'variable' + shift(257); // 'variable' + break; + case 258: // 'version' + shift(258); // 'version' + break; + case 262: // 'while' + shift(262); // 'while' + break; + case 92: // 'constraint' + shift(92); // 'constraint' + break; + case 171: // 'loop' + shift(171); // 'loop' + break; + default: + shift(216); // 'returning' + } + eventHandler.endNonterminal("FunctionName", e0); + } + + function parse_NCName() + { + eventHandler.startNonterminal("NCName", e0); + switch (l1) + { + case 26: // NCName^Token + shift(26); // NCName^Token + break; + case 65: // 'after' + shift(65); // 'after' + break; + case 70: // 'and' + shift(70); // 'and' + break; + case 74: // 'as' + shift(74); // 'as' + break; + case 75: // 'ascending' + shift(75); // 'ascending' + break; + case 79: // 'before' + shift(79); // 'before' + break; + case 83: // 'case' + shift(83); // 'case' + break; + case 84: // 'cast' + shift(84); // 'cast' + break; + case 85: // 'castable' + shift(85); // 'castable' + break; + case 89: // 'collation' + shift(89); // 'collation' + break; + case 100: // 'count' + shift(100); // 'count' + break; + case 104: // 'default' + shift(104); // 'default' + break; + case 108: // 'descending' + shift(108); // 'descending' + break; + case 113: // 'div' + shift(113); // 'div' + break; + case 117: // 'else' + shift(117); // 'else' + break; + case 118: // 'empty' + shift(118); // 'empty' + break; + case 121: // 'end' + shift(121); // 'end' + break; + case 123: // 'eq' + shift(123); // 'eq' + break; + case 126: // 'except' + shift(126); // 'except' + break; + case 132: // 'for' + shift(132); // 'for' + break; + case 141: // 'ge' + shift(141); // 'ge' + break; + case 143: // 'group' + shift(143); // 'group' + break; + case 145: // 'gt' + shift(145); // 'gt' + break; + case 146: // 'idiv' + shift(146); // 'idiv' + break; + case 155: // 'instance' + shift(155); // 'instance' + break; + case 157: // 'intersect' + shift(157); // 'intersect' + break; + case 158: // 'into' + shift(158); // 'into' + break; + case 159: // 'is' + shift(159); // 'is' + break; + case 167: // 'le' + shift(167); // 'le' + break; + case 169: // 'let' + shift(169); // 'let' + break; + case 173: // 'lt' + shift(173); // 'lt' + break; + case 175: // 'mod' + shift(175); // 'mod' + break; + case 176: // 'modify' + shift(176); // 'modify' + break; + case 181: // 'ne' + shift(181); // 'ne' + break; + case 193: // 'only' + shift(193); // 'only' + break; + case 195: // 'or' + shift(195); // 'or' + break; + case 196: // 'order' + shift(196); // 'order' + break; + case 215: // 'return' + shift(215); // 'return' + break; + case 219: // 'satisfies' + shift(219); // 'satisfies' + break; + case 231: // 'stable' + shift(231); // 'stable' + break; + case 232: // 'start' + shift(232); // 'start' + break; + case 243: // 'to' + shift(243); // 'to' + break; + case 244: // 'treat' + shift(244); // 'treat' + break; + case 249: // 'union' + shift(249); // 'union' + break; + case 261: // 'where' + shift(261); // 'where' + break; + case 265: // 'with' + shift(265); // 'with' + break; + case 68: // 'ancestor' + shift(68); // 'ancestor' + break; + case 69: // 'ancestor-or-self' + shift(69); // 'ancestor-or-self' + break; + case 77: // 'attribute' + shift(77); // 'attribute' + break; + case 88: // 'child' + shift(88); // 'child' + break; + case 91: // 'comment' + shift(91); // 'comment' + break; + case 98: // 'copy' + shift(98); // 'copy' + break; + case 103: // 'declare' + shift(103); // 'declare' + break; + case 105: // 'delete' + shift(105); // 'delete' + break; + case 106: // 'descendant' + shift(106); // 'descendant' + break; + case 107: // 'descendant-or-self' + shift(107); // 'descendant-or-self' + break; + case 114: // 'document' + shift(114); // 'document' + break; + case 115: // 'document-node' + shift(115); // 'document-node' + break; + case 116: // 'element' + shift(116); // 'element' + break; + case 119: // 'empty-sequence' + shift(119); // 'empty-sequence' + break; + case 124: // 'every' + shift(124); // 'every' + break; + case 129: // 'first' + shift(129); // 'first' + break; + case 130: // 'following' + shift(130); // 'following' + break; + case 131: // 'following-sibling' + shift(131); // 'following-sibling' + break; + case 140: // 'function' + shift(140); // 'function' + break; + case 147: // 'if' + shift(147); // 'if' + break; + case 148: // 'import' + shift(148); // 'import' + break; + case 154: // 'insert' + shift(154); // 'insert' + break; + case 160: // 'item' + shift(160); // 'item' + break; + case 165: // 'last' + shift(165); // 'last' + break; + case 177: // 'module' + shift(177); // 'module' + break; + case 179: // 'namespace' + shift(179); // 'namespace' + break; + case 180: // 'namespace-node' + shift(180); // 'namespace-node' + break; + case 186: // 'node' + shift(186); // 'node' + break; + case 197: // 'ordered' + shift(197); // 'ordered' + break; + case 201: // 'parent' + shift(201); // 'parent' + break; + case 207: // 'preceding' + shift(207); // 'preceding' + break; + case 208: // 'preceding-sibling' + shift(208); // 'preceding-sibling' + break; + case 211: // 'processing-instruction' + shift(211); // 'processing-instruction' + break; + case 213: // 'rename' + shift(213); // 'rename' + break; + case 214: // 'replace' + shift(214); // 'replace' + break; + case 221: // 'schema-attribute' + shift(221); // 'schema-attribute' + break; + case 222: // 'schema-element' + shift(222); // 'schema-element' + break; + case 224: // 'self' + shift(224); // 'self' + break; + case 230: // 'some' + shift(230); // 'some' + break; + case 238: // 'switch' + shift(238); // 'switch' + break; + case 239: // 'text' + shift(239); // 'text' + break; + case 245: // 'try' + shift(245); // 'try' + break; + case 248: // 'typeswitch' + shift(248); // 'typeswitch' + break; + case 251: // 'unordered' + shift(251); // 'unordered' + break; + case 255: // 'validate' + shift(255); // 'validate' + break; + case 257: // 'variable' + shift(257); // 'variable' + break; + case 269: // 'xquery' + shift(269); // 'xquery' + break; + case 67: // 'allowing' + shift(67); // 'allowing' + break; + case 76: // 'at' + shift(76); // 'at' + break; + case 78: // 'base-uri' + shift(78); // 'base-uri' + break; + case 80: // 'boundary-space' + shift(80); // 'boundary-space' + break; + case 81: // 'break' + shift(81); // 'break' + break; + case 86: // 'catch' + shift(86); // 'catch' + break; + case 93: // 'construction' + shift(93); // 'construction' + break; + case 96: // 'context' + shift(96); // 'context' + break; + case 97: // 'continue' + shift(97); // 'continue' + break; + case 99: // 'copy-namespaces' + shift(99); // 'copy-namespaces' + break; + case 101: // 'decimal-format' + shift(101); // 'decimal-format' + break; + case 120: // 'encoding' + shift(120); // 'encoding' + break; + case 127: // 'exit' + shift(127); // 'exit' + break; + case 128: // 'external' + shift(128); // 'external' + break; + case 136: // 'ft-option' + shift(136); // 'ft-option' + break; + case 149: // 'in' + shift(149); // 'in' + break; + case 150: // 'index' + shift(150); // 'index' + break; + case 156: // 'integrity' + shift(156); // 'integrity' + break; + case 166: // 'lax' + shift(166); // 'lax' + break; + case 187: // 'nodes' + shift(187); // 'nodes' + break; + case 194: // 'option' + shift(194); // 'option' + break; + case 198: // 'ordering' + shift(198); // 'ordering' + break; + case 217: // 'revalidation' + shift(217); // 'revalidation' + break; + case 220: // 'schema' + shift(220); // 'schema' + break; + case 223: // 'score' + shift(223); // 'score' + break; + case 229: // 'sliding' + shift(229); // 'sliding' + break; + case 235: // 'strict' + shift(235); // 'strict' + break; + case 246: // 'tumbling' + shift(246); // 'tumbling' + break; + case 247: // 'type' + shift(247); // 'type' + break; + case 252: // 'updating' + shift(252); // 'updating' + break; + case 256: // 'value' + shift(256); // 'value' + break; + case 258: // 'version' + shift(258); // 'version' + break; + case 262: // 'while' + shift(262); // 'while' + break; + case 92: // 'constraint' + shift(92); // 'constraint' + break; + case 171: // 'loop' + shift(171); // 'loop' + break; + default: + shift(216); // 'returning' + } + eventHandler.endNonterminal("NCName", e0); + } + + function shift(t) + { + if (l1 == t) + { + whitespace(); + eventHandler.terminal(XQueryTokenizer.TOKEN[l1], b1, e1 > size ? size : e1); + b0 = b1; e0 = e1; l1 = 0; + } + else + { + error(b1, e1, 0, l1, t); + } + } + + function whitespace() + { + if (e0 != b1) + { + b0 = e0; + e0 = b1; + eventHandler.whitespace(b0, e0); + } + } + + function matchW(set) + { + var code; + for (;;) + { + code = match(set); + if (code != 28) // S^WS + { + break; + } + } + return code; + } + + function lookahead1W(set) + { + if (l1 == 0) + { + l1 = matchW(set); + b1 = begin; + e1 = end; + } + } + + function lookahead1(set) + { + if (l1 == 0) + { + l1 = match(set); + b1 = begin; + e1 = end; + } + } + + function error(b, e, s, l, t) + { + throw new self.ParseException(b, e, s, l, t); + } + + var lk, b0, e0; + var l1, b1, e1; + var eventHandler; + + var input; + var size; + var begin; + var end; + + function match(tokenSetId) + { + var nonbmp = false; + begin = end; + var current = end; + var result = XQueryTokenizer.INITIAL[tokenSetId]; + var state = 0; + + for (var code = result & 4095; code != 0; ) + { + var charclass; + var c0 = current < size ? input.charCodeAt(current) : 0; + ++current; + if (c0 < 0x80) + { + charclass = XQueryTokenizer.MAP0[c0]; + } + else if (c0 < 0xd800) + { + var c1 = c0 >> 4; + charclass = XQueryTokenizer.MAP1[(c0 & 15) + XQueryTokenizer.MAP1[(c1 & 31) + XQueryTokenizer.MAP1[c1 >> 5]]]; + } + else + { + if (c0 < 0xdc00) + { + var c1 = current < size ? input.charCodeAt(current) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) + { + ++current; + c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000; + nonbmp = true; + } + } + var lo = 0, hi = 5; + for (var m = 3; ; m = (hi + lo) >> 1) + { + if (XQueryTokenizer.MAP2[m] > c0) hi = m - 1; + else if (XQueryTokenizer.MAP2[6 + m] < c0) lo = m + 1; + else {charclass = XQueryTokenizer.MAP2[12 + m]; break;} + if (lo > hi) {charclass = 0; break;} + } + } + + state = code; + var i0 = (charclass << 12) + code - 1; + code = XQueryTokenizer.TRANSITION[(i0 & 15) + XQueryTokenizer.TRANSITION[i0 >> 4]]; + + if (code > 4095) + { + result = code; + code &= 4095; + end = current; + } + } + + result >>= 12; + if (result == 0) + { + end = current - 1; + var c1 = end < size ? input.charCodeAt(end) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) --end; + return error(begin, end, state, -1, -1); + } + + if (nonbmp) + { + for (var i = result >> 9; i > 0; --i) + { + --end; + var c1 = end < size ? input.charCodeAt(end) : 0; + if (c1 >= 0xdc00 && c1 < 0xe000) --end; + } + } + else + { + end -= result >> 9; + } + + return (result & 511) - 1; + } +} + +XQueryTokenizer.getTokenSet = function(tokenSetId) +{ + var set = []; + var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095; + for (var i = 0; i < 276; i += 32) + { + var j = i; + var i0 = (i >> 5) * 2062 + s - 1; + var i1 = i0 >> 2; + var i2 = i1 >> 2; + var f = XQueryTokenizer.EXPECTED[(i0 & 3) + XQueryTokenizer.EXPECTED[(i1 & 3) + XQueryTokenizer.EXPECTED[(i2 & 3) + XQueryTokenizer.EXPECTED[i2 >> 2]]]]; + for ( ; f != 0; f >>>= 1, ++j) + { + if ((f & 1) != 0) + { + set.push(XQueryTokenizer.TOKEN[j]); + } + } + } + return set; +}; + +XQueryTokenizer.MAP0 = +[ 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35 +]; + +XQueryTokenizer.MAP1 = +[ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 347, 363, 379, 416, 416, 416, 408, 331, 323, 331, 323, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 433, 433, 433, 433, 433, 433, 433, 316, 331, 331, 331, 331, 331, 331, 331, 331, 394, 416, 416, 417, 415, 416, 416, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 35, 35, 35, 35, 35, 35, 35, 65, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65 +]; + +XQueryTokenizer.MAP2 = +[ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 35, 31, 35, 31, 31, 35 +]; + +XQueryTokenizer.INITIAL = +[ 1, 2, 36867, 45060, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +]; + +XQueryTokenizer.TRANSITION = +[ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22908, 18836, 17152, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17365, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 17470, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18157, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 17848, 17880, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18023, 36545, 18621, 18039, 18056, 18072, 18117, 18143, 18173, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17687, 18805, 18421, 18437, 18101, 17393, 18489, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18579, 21711, 17152, 19008, 19233, 20367, 19008, 28684, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17365, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 17470, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18157, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 17848, 17880, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18023, 36545, 18621, 18039, 18056, 18072, 18117, 18143, 18173, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17687, 18805, 18421, 18437, 18101, 17393, 18489, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20116, 18836, 18637, 19008, 19233, 21267, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18763, 18778, 18794, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18821, 22923, 18906, 19008, 19233, 17431, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18937, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 19054, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 18953, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21843, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21696, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22429, 20131, 18720, 19008, 19233, 20367, 19008, 17173, 23559, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 18087, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 21242, 19111, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19024, 18836, 18609, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19081, 22444, 18987, 19008, 19233, 20367, 19008, 19065, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21992, 22007, 18987, 19008, 19233, 20367, 19008, 18690, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22414, 18836, 18987, 19008, 19233, 30651, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 19138, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 19280, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 19172, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21783, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 19218, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21651, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19249, 19265, 19307, 18888, 27857, 30536, 24401, 31444, 23357, 18888, 19351, 18888, 18890, 27211, 19370, 27211, 27211, 19392, 24401, 31911, 24401, 24401, 25467, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19440, 24401, 24401, 24401, 24401, 24036, 17994, 24060, 18888, 18888, 18888, 18890, 19468, 27211, 27211, 27211, 27211, 19484, 35367, 19520, 24401, 24401, 24401, 19628, 18888, 29855, 18888, 18888, 23086, 27211, 19538, 27211, 27211, 30756, 24012, 24401, 19560, 24401, 24401, 26750, 18888, 18888, 19327, 27855, 27211, 27211, 19580, 17590, 24017, 24401, 24401, 19600, 25665, 18888, 18888, 28518, 27211, 27212, 24016, 19620, 19868, 28435, 25722, 18889, 19644, 27211, 32888, 35852, 19868, 31018, 19694, 19376, 19717, 22215, 19735, 22098, 19751, 35203, 19776, 19797, 19817, 19840, 25783, 31738, 24135, 19701, 19856, 31015, 23516, 31008, 28311, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21768, 18836, 19307, 18888, 27857, 27904, 24401, 29183, 28015, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 19888, 24401, 24401, 24401, 24401, 22953, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19440, 24401, 24401, 24401, 24401, 24036, 18881, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22399, 18836, 19918, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21666, 18836, 19307, 18888, 27857, 27525, 24401, 29183, 21467, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 19946, 24401, 24401, 24401, 24401, 32382, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19998, 24401, 24401, 24401, 24401, 31500, 18467, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 20021, 24401, 24401, 24401, 24401, 24401, 34271, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 32926, 29908, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 20050, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20101, 19039, 20191, 20412, 20903, 17569, 20309, 20872, 25633, 20623, 20505, 20218, 20242, 17189, 17208, 17281, 20355, 20265, 20306, 20328, 20383, 22490, 20796, 20619, 21354, 20654, 20410, 20956, 21232, 20765, 17421, 20535, 17192, 18127, 22459, 20312, 25531, 22470, 20309, 20428, 18964, 20466, 20491, 21342, 21070, 20521, 20682, 17714, 18326, 17543, 17559, 17585, 22497, 20559, 19504, 20279, 20575, 20290, 20475, 20604, 20639, 20226, 20670, 17661, 21190, 17703, 21176, 17730, 19494, 20698, 20711, 22480, 21046, 21116, 18971, 21130, 20727, 20755, 17675, 17753, 17832, 17590, 25518, 20394, 20781, 20831, 20202, 20847, 21401, 17292, 17934, 17979, 18549, 20863, 20588, 25542, 20888, 20919, 18072, 18117, 20935, 20972, 21032, 21062, 21086, 18239, 21102, 18563, 21146, 21162, 21206, 18351, 20949, 20902, 18340, 21222, 21258, 21283, 18360, 20249, 17405, 21295, 21311, 21327, 20739, 20343, 21370, 21386, 21417, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21977, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 21452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 21504, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 36501, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 28674, 21946, 17617, 36473, 18223, 17237, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 21575, 21534, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 21560, 30628, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21798, 18836, 21612, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21636, 18836, 18987, 19008, 19233, 17902, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21753, 19096, 21903, 19008, 19233, 20367, 19008, 19291, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17379, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 21931, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18280, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21962, 18594, 18987, 19008, 19233, 22043, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21681, 21858, 18987, 19008, 19233, 20367, 19008, 21544, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 32319, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 22231, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 31678, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 33588, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 35019, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22248, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22324, 18836, 22059, 18888, 27857, 30501, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 34365, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22354, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 27086, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 19930, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22309, 22513, 18987, 19008, 19233, 20367, 19008, 19122, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 22544, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22608, 18836, 22988, 23004, 27585, 23020, 23036, 23067, 22087, 18888, 18888, 18888, 23083, 27211, 27211, 27211, 23102, 22121, 24401, 24401, 24401, 23122, 31386, 26154, 19674, 18888, 28119, 28232, 19424, 23705, 27211, 27211, 23142, 23173, 23189, 23212, 24401, 24401, 23246, 34427, 31693, 23262, 18888, 23290, 23308, 27783, 27620, 23327, 35263, 35107, 33383, 23346, 18193, 23393, 32748, 23968, 24401, 23414, 35153, 23463, 18888, 33913, 23442, 23482, 27211, 27211, 23532, 23552, 21431, 23575, 24401, 24401, 23604, 26095, 23635, 23657, 18888, 33482, 23685, 33251, 27211, 22187, 18851, 23721, 35536, 24401, 18887, 23750, 32641, 27211, 23769, 23787, 20080, 33012, 24384, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 23803, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 28224, 31826, 23823, 26917, 34978, 23850, 26493, 25782, 23878, 23914, 23516, 31008, 22105, 19419, 27963, 19659, 29781, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22623, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 28909, 25783, 27211, 27211, 27211, 34048, 23933, 22164, 24401, 24401, 24401, 28409, 23949, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 26583, 18888, 18888, 18888, 35585, 23984, 27211, 27211, 27211, 24005, 22201, 24033, 24401, 24401, 24401, 24052, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 26496, 24076, 24126, 24151, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22638, 18836, 22059, 19678, 27857, 24185, 24401, 24201, 24217, 26592, 18888, 18888, 18890, 24252, 24268, 27211, 27211, 22121, 24287, 24303, 24401, 24401, 30613, 19781, 35432, 36007, 32649, 18888, 25783, 24322, 28966, 23771, 27211, 35072, 22164, 24358, 32106, 26829, 24400, 31500, 31693, 18888, 18888, 18888, 24801, 18890, 27211, 27211, 27211, 27211, 24418, 19484, 24401, 24401, 24401, 24401, 20167, 31181, 18888, 18888, 18888, 27833, 23086, 27211, 27211, 33540, 27211, 30756, 21431, 24401, 24401, 22972, 24401, 26095, 18888, 36131, 18888, 27855, 27211, 24440, 27211, 22187, 22968, 24401, 24459, 24401, 31699, 28454, 18888, 34528, 34570, 35779, 24478, 24402, 24494, 25659, 18888, 36228, 27211, 27211, 24515, 30981, 23734, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 24538, 31017, 27856, 31741, 30059, 23377, 24563, 19837, 25782, 19760, 31015, 23516, 25374, 22105, 19419, 29793, 24579, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22653, 18836, 22059, 25756, 19982, 34097, 23196, 29183, 24614, 24110, 23641, 24673, 26103, 24697, 24443, 24713, 28558, 22121, 24748, 24462, 24764, 23398, 30613, 18888, 18888, 18888, 18888, 24798, 25783, 27211, 27211, 27211, 34232, 35072, 22164, 24401, 24401, 24401, 33302, 31500, 22559, 24106, 24232, 18888, 18888, 34970, 24817, 30411, 27211, 27211, 32484, 19484, 29750, 35127, 24401, 24401, 19872, 31181, 24852, 18888, 18888, 24871, 29221, 27211, 27211, 32072, 27211, 30756, 34441, 24401, 24401, 31571, 24401, 26095, 33141, 27802, 27011, 27855, 25295, 25607, 24888, 22187, 22968, 19195, 34593, 24906, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 33663, 27211, 27211, 24924, 24947, 23588, 31018, 18890, 27211, 31833, 22135, 19447, 23086, 23330, 19828, 30904, 31042, 24972, 19840, 25000, 31738, 30898, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 25016, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22668, 18836, 25041, 25057, 31320, 25073, 25089, 25105, 22087, 34796, 24236, 36138, 34870, 34125, 25121, 23106, 35497, 22248, 36613, 25137, 30671, 27365, 30613, 25153, 26447, 25199, 25233, 22574, 23274, 25249, 25265, 25281, 25318, 25344, 25360, 25400, 25428, 25452, 26731, 25504, 31693, 23669, 25558, 27407, 25575, 28599, 25934, 25599, 27211, 28180, 27304, 25623, 25839, 25649, 24401, 34820, 25681, 25698, 22586, 27775, 30190, 25745, 25778, 25799, 25817, 28995, 33569, 30756, 21518, 33443, 25837, 25855, 25893, 26095, 31254, 26677, 30136, 27855, 25930, 25950, 27211, 22187, 22968, 25966, 25986, 24401, 23428, 27763, 36330, 26959, 26002, 26029, 26045, 26085, 26119, 26170, 26203, 26222, 26239, 30527, 26372, 26274, 28404, 31018, 33757, 27211, 34262, 26316, 36729, 26345, 26366, 35337, 31017, 26388, 26407, 30954, 26350, 33861, 26434, 26463, 26479, 26512, 23516, 33189, 26531, 26547, 27963, 31293, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22683, 18836, 26568, 26181, 26608, 34097, 26643, 29183, 22087, 26669, 18888, 18888, 18890, 26693, 27211, 27211, 27211, 22121, 26720, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 26774, 25783, 27211, 27211, 27211, 26619, 35072, 22164, 24401, 24401, 24401, 21596, 31500, 31693, 18888, 18888, 33978, 18888, 18890, 27211, 27211, 25801, 27211, 27211, 19484, 24401, 24401, 24401, 26792, 24401, 31181, 18888, 18888, 18888, 35464, 23086, 27211, 27211, 27211, 26809, 30756, 21431, 24401, 24401, 24401, 26828, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 31948, 18889, 35707, 27211, 19719, 26845, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 26905, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 24984, 31088, 19419, 26945, 27651, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22698, 18836, 26999, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 23051, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 27033, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 27056, 18888, 18890, 27211, 27211, 30320, 27211, 27211, 27075, 24401, 24401, 29032, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 33986, 27855, 27211, 27211, 27102, 17590, 24017, 24401, 24401, 27123, 27144, 36254, 27162, 27210, 27228, 28500, 18187, 34842, 33426, 27244, 35980, 27277, 27302, 27320, 36048, 34013, 20999, 31882, 21478, 27895, 27356, 30287, 27381, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 26329, 30087, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 27406, 27423, 27445, 35294, 27461, 22087, 18888, 18888, 30140, 18890, 27211, 27211, 27989, 27211, 22121, 24401, 24401, 25682, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 34042, 27211, 27211, 27211, 27211, 29700, 22164, 24401, 24401, 24401, 24401, 27128, 31693, 27477, 18888, 18888, 18888, 18890, 27194, 27211, 27211, 27211, 27211, 19484, 35299, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 27059, 23086, 27211, 27211, 27211, 33366, 30756, 24012, 24401, 24401, 24401, 35044, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 20815, 27211, 30818, 19960, 33969, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22713, 18836, 22059, 27496, 27516, 27541, 35231, 27557, 22087, 29662, 26292, 23292, 27573, 24836, 27601, 27211, 27636, 22121, 35544, 27686, 24401, 27721, 18866, 18888, 27799, 18888, 27818, 22071, 27853, 32260, 27211, 26013, 27873, 27920, 22164, 29419, 24401, 29946, 33413, 26742, 27751, 26881, 18888, 18888, 27261, 36776, 27936, 27211, 27211, 27211, 27988, 28005, 28031, 28052, 24401, 24401, 28069, 28088, 28135, 25488, 28152, 26069, 28167, 27211, 28340, 24657, 28196, 30756, 31523, 24401, 28212, 34176, 36174, 24956, 28248, 28266, 28290, 21488, 33077, 28327, 28356, 17590, 20986, 23126, 28391, 28425, 28102, 28451, 28470, 28490, 28516, 28534, 20034, 33728, 25868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 30241, 28274, 28553, 28574, 19406, 28590, 23086, 23330, 19828, 19452, 28615, 28660, 26147, 25783, 31738, 19837, 25782, 19760, 29613, 35958, 29276, 22105, 19419, 27963, 23157, 28700, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 22528, 18888, 18888, 18888, 18888, 18890, 27333, 27211, 27211, 27211, 27211, 19484, 30853, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22728, 18836, 28747, 28782, 28817, 28841, 28857, 28880, 28896, 24161, 28943, 32011, 36261, 27340, 28961, 29492, 28982, 29011, 24522, 29027, 25436, 29048, 23051, 27500, 29090, 29110, 30713, 18888, 23512, 29130, 25183, 27211, 29155, 28927, 27033, 29173, 23230, 24401, 29199, 35373, 31693, 18888, 18888, 25583, 32629, 29218, 27211, 27211, 31461, 30692, 29237, 27075, 24401, 24401, 24401, 29262, 29302, 19628, 18888, 34329, 18888, 18888, 23086, 27211, 29329, 27211, 27211, 30756, 24012, 35933, 24401, 24401, 24401, 27705, 31612, 18888, 18888, 29346, 29374, 27211, 35650, 17590, 21436, 29393, 24401, 25970, 18887, 33895, 18888, 27211, 32528, 27212, 24016, 32769, 19868, 25659, 18888, 26889, 27211, 27211, 29412, 23889, 24371, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31768, 19840, 25783, 31738, 19837, 29435, 29508, 31102, 29550, 29606, 22105, 30300, 29462, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22743, 18836, 22059, 29629, 29473, 34097, 33285, 29183, 29651, 27254, 18888, 29678, 33329, 32535, 27211, 29694, 29716, 22121, 19202, 24401, 32742, 29741, 18866, 26776, 33921, 28474, 18888, 18888, 25783, 29766, 27211, 29809, 27211, 35072, 22164, 35825, 24401, 29828, 24401, 24036, 36769, 25217, 18888, 18888, 29848, 18890, 27211, 29871, 27211, 26258, 27211, 29894, 24401, 29929, 24401, 36587, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 29725, 29962, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18473, 18888, 18888, 19584, 27211, 27212, 24016, 29982, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19902, 19447, 32052, 19544, 19828, 29998, 30097, 30031, 19840, 25783, 30047, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 30075, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22758, 18836, 30121, 30156, 30206, 30257, 30273, 30336, 22087, 35624, 32837, 25762, 18890, 29878, 34934, 26812, 27211, 22121, 24931, 23223, 29202, 24401, 18866, 34373, 30352, 18888, 18888, 18888, 23447, 24828, 27211, 27211, 27211, 35072, 30370, 35052, 24401, 24401, 24401, 24036, 29523, 18888, 18888, 27146, 18888, 31308, 30386, 27211, 27211, 30405, 30558, 19484, 30427, 24401, 24401, 29938, 35686, 19628, 28766, 30447, 34506, 35614, 23086, 28731, 30482, 30517, 30552, 30756, 24012, 20156, 30574, 30598, 30667, 26283, 33464, 28945, 27670, 30687, 32915, 33504, 25328, 17590, 23963, 20450, 33837, 21016, 32397, 26300, 30708, 30729, 27885, 30748, 21588, 36373, 30779, 26653, 24628, 33220, 32514, 30806, 31835, 25412, 25906, 26515, 18890, 28825, 31833, 26133, 19447, 28304, 31730, 23834, 26057, 30869, 30885, 32181, 30920, 30942, 32797, 25782, 30970, 31015, 23516, 31008, 30997, 31034, 27963, 19659, 29450, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22773, 18836, 31058, 31074, 32463, 31125, 31141, 31197, 22087, 18888, 29534, 35471, 36738, 27211, 24342, 31213, 24424, 22121, 24401, 20175, 31229, 31917, 27736, 31245, 34334, 27175, 18888, 29094, 27286, 27211, 31278, 31336, 27211, 31355, 31371, 24401, 31402, 31418, 24401, 31437, 31693, 18888, 31619, 32841, 18888, 18890, 27211, 27211, 31460, 31477, 27211, 19484, 24401, 24401, 31497, 36581, 24401, 33020, 18888, 18888, 18888, 18888, 30007, 27211, 27211, 27211, 27211, 31516, 32310, 24401, 24401, 24401, 24401, 31539, 18888, 28762, 18888, 24651, 35740, 27211, 27211, 28644, 31565, 35796, 24401, 24401, 19318, 32188, 18888, 24334, 28366, 27212, 29966, 29832, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 31587, 19868, 31635, 32435, 33693, 30105, 31663, 20005, 31715, 31757, 31784, 31812, 30015, 31851, 31878, 25783, 31898, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 31933, 30221, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22788, 18836, 22059, 25729, 30466, 31968, 24306, 31984, 32000, 32807, 35160, 27017, 29590, 34941, 19801, 29377, 33700, 22121, 27040, 30431, 29396, 28864, 29565, 18888, 18888, 18888, 32027, 18888, 25783, 27211, 27211, 23698, 27211, 35072, 22164, 24401, 24401, 30845, 24401, 24036, 32045, 18888, 26929, 18888, 18888, 18890, 27211, 31481, 32068, 27211, 27211, 32088, 24401, 33058, 32122, 24401, 24401, 33736, 18888, 18888, 33162, 18888, 23086, 27211, 27211, 29484, 27211, 28375, 32144, 24401, 24401, 33831, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 36704, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 33107, 22171, 33224, 24271, 32169, 31017, 27856, 31741, 19840, 25783, 31738, 30234, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 32204, 32232, 32252, 32677, 33295, 29074, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 23619, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 32276, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 32299, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 33886, 18889, 36065, 27211, 19719, 35326, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22803, 18836, 32335, 31647, 34666, 32351, 32367, 32417, 22087, 18888, 32433, 19335, 32451, 27211, 32479, 27107, 32500, 22121, 24401, 32551, 20085, 32572, 18866, 22287, 23753, 18888, 18888, 32602, 32665, 27211, 32693, 27211, 26972, 32713, 32729, 24401, 32764, 24401, 25877, 32785, 34768, 18888, 27390, 32823, 24594, 24855, 32857, 24890, 32878, 32904, 27211, 32942, 32977, 24401, 33000, 29313, 24401, 30790, 26206, 27666, 33904, 18888, 23086, 36353, 27211, 33036, 27211, 30756, 24012, 32153, 24401, 33056, 24401, 35861, 18888, 18888, 30354, 27972, 27211, 27211, 33800, 17590, 20145, 24401, 24401, 34638, 20811, 18888, 18888, 33074, 27211, 27212, 36167, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 34616, 24169, 33093, 33123, 33157, 27856, 31741, 23862, 26552, 34302, 19837, 25782, 19760, 31015, 23516, 31008, 33178, 19973, 27963, 23497, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22818, 18836, 33205, 28113, 33240, 34097, 33275, 29183, 22087, 33318, 35438, 18888, 18890, 33345, 26391, 33382, 27211, 22121, 33399, 28072, 33442, 24401, 18866, 22232, 18888, 33459, 18888, 18888, 33480, 33498, 25175, 27211, 27211, 26704, 22164, 24775, 35239, 24401, 24401, 25914, 29580, 18888, 18888, 31109, 25211, 33520, 33539, 27211, 27211, 33556, 36284, 19484, 33585, 24401, 24401, 33604, 32556, 19628, 18888, 18888, 31262, 33658, 23086, 27211, 27211, 33679, 27211, 30756, 24012, 24401, 24401, 33716, 24401, 26854, 27480, 18888, 33752, 27855, 33259, 34701, 27211, 17590, 32102, 24782, 23807, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 33773, 36105, 19868, 25659, 18888, 23368, 27211, 29157, 19719, 23889, 34454, 29286, 18890, 33794, 25302, 33816, 19447, 34079, 33853, 31862, 31017, 27856, 31741, 33877, 28920, 33937, 19837, 30461, 34002, 22276, 36041, 34029, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22833, 18836, 34064, 32616, 34113, 34141, 34157, 34192, 34208, 32216, 36013, 31549, 31952, 34224, 34248, 34287, 29330, 34350, 34389, 34413, 34481, 26793, 18866, 26187, 29635, 22293, 18888, 36654, 25783, 34522, 34544, 34566, 25821, 35072, 22164, 34586, 34609, 34632, 19604, 24036, 36644, 36674, 24681, 18888, 32401, 34654, 31339, 34682, 34698, 27211, 34717, 34753, 28053, 34812, 34836, 24401, 33619, 19628, 34858, 32236, 34906, 24598, 33523, 27612, 34890, 34922, 24732, 29246, 36717, 33634, 34465, 32984, 34168, 26750, 34957, 18888, 18888, 34994, 35010, 27211, 33040, 17590, 29913, 35035, 24401, 36304, 25482, 30171, 35883, 35068, 35088, 26627, 20441, 31173, 35123, 35143, 35176, 24640, 30492, 29358, 19719, 35192, 35219, 25384, 28801, 35255, 35279, 32586, 34496, 23086, 23330, 29061, 31017, 27856, 31741, 19840, 25783, 31738, 24547, 25164, 35315, 31796, 35353, 34316, 22105, 19419, 27963, 24091, 28630, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22848, 18836, 22059, 34782, 34088, 35389, 21008, 35405, 35421, 35454, 18888, 18888, 23466, 35487, 27211, 27211, 27211, 35513, 31154, 24401, 24401, 24401, 35560, 18888, 26863, 36664, 35601, 24872, 25783, 30389, 23536, 26250, 35647, 35666, 22164, 19522, 19564, 30582, 35682, 27697, 35575, 29114, 18888, 18888, 18888, 18890, 27211, 35702, 27211, 27211, 27211, 35723, 24401, 35527, 24401, 24401, 24401, 19628, 30184, 18888, 18888, 18888, 23086, 35739, 27211, 27211, 27211, 29139, 22938, 24401, 24401, 24401, 24401, 23898, 35756, 18888, 18888, 25025, 35778, 27211, 27211, 17590, 20064, 35795, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 23917, 18890, 34550, 31833, 22262, 19447, 23086, 23330, 26418, 31017, 27856, 31741, 19840, 25783, 35812, 19837, 27187, 35841, 33135, 23516, 31008, 22105, 22148, 28712, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22863, 18836, 22059, 35877, 28723, 34097, 31164, 29183, 22087, 26758, 18888, 22592, 18890, 23989, 27211, 29812, 27211, 22121, 33778, 24401, 31421, 24401, 18866, 18888, 18888, 26872, 18888, 18888, 25783, 27211, 30732, 27211, 27211, 35072, 22164, 24401, 24908, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22878, 18836, 22059, 27837, 27857, 35899, 24401, 35915, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31602, 18888, 18888, 18888, 18888, 26223, 27211, 27211, 27211, 27211, 27211, 19484, 35931, 24401, 24401, 24401, 24401, 19628, 18888, 28136, 18888, 18888, 35949, 27211, 32862, 27211, 32697, 30756, 24012, 24401, 32283, 24401, 32128, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22893, 18836, 22059, 35974, 34882, 34097, 33960, 29183, 35996, 18888, 23311, 18888, 36029, 27211, 27211, 36064, 36081, 22121, 24401, 24401, 36104, 33950, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 36121, 18888, 25559, 18888, 18888, 18890, 27211, 27211, 30313, 27211, 27211, 36154, 24401, 24401, 34397, 24401, 24401, 19628, 28250, 18888, 18888, 18888, 23086, 30926, 27211, 27211, 27211, 26983, 24012, 33642, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 19354, 27857, 36190, 24401, 36206, 22087, 18888, 18888, 18888, 18007, 27211, 27211, 27211, 24724, 22121, 24401, 24401, 24401, 30827, 18866, 18888, 36222, 18888, 28795, 18888, 25783, 35100, 27211, 27429, 27211, 35072, 22164, 30836, 24401, 24499, 24401, 24036, 31693, 18888, 36244, 18888, 18888, 18890, 27211, 36088, 27211, 27211, 27211, 19484, 24401, 28036, 24401, 24401, 24401, 19628, 18888, 18888, 35631, 18888, 35762, 27211, 27211, 36277, 27211, 34730, 24012, 24401, 24401, 36300, 24401, 36320, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 25712, 18888, 18888, 36346, 27211, 27212, 19184, 24402, 19868, 25659, 32029, 18889, 27211, 33359, 19719, 23889, 36369, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22384, 18836, 36389, 19008, 19233, 20367, 36434, 17173, 17595, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 36453, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20362, 21726, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22369, 18836, 18987, 19008, 19233, 20367, 19008, 21737, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21813, 18836, 36489, 19008, 19233, 20367, 19008, 17173, 17737, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17768, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20543, 22022, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 36517, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 19307, 18888, 27857, 30756, 24401, 29183, 28015, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 36567, 24401, 24401, 24401, 24401, 22953, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 36603, 24401, 24401, 24401, 24401, 24036, 18881, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 36629, 36690, 18720, 19008, 19233, 20367, 19008, 17454, 17595, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17223, 17308, 17327, 17346, 18918, 36754, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20362, 21726, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 0, 94242, 0, 118820, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2482176, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 2207744, 2404352, 2412544, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3104768, 2605056, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2678784, 2207744, 2695168, 2207744, 2703360, 2207744, 2711552, 2752512, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 139, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2158592, 2158592, 2158592, 2863104, 2891776, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2785280, 2207744, 2809856, 2207744, 2207744, 2842624, 2207744, 2207744, 2207744, 2899968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2473984, 2207744, 2207744, 2494464, 2207744, 2207744, 2207744, 2523136, 2158592, 2404352, 2412544, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2605056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2678784, 2158592, 2695168, 2158592, 2703360, 2158592, 2711552, 2752512, 2158592, 2158592, 2785280, 2158592, 2158592, 2785280, 2158592, 2809856, 2158592, 2158592, 2842624, 2158592, 2158592, 2158592, 2899968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 641, 0, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 32768, 0, 2158592, 0, 2158592, 2158592, 2158592, 2383872, 2158592, 2158592, 2158592, 2158592, 3006464, 2383872, 2207744, 2207744, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2572573, 2158877, 2158877, 0, 2207744, 2207744, 2596864, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2641920, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 167936, 0, 0, 2162688, 0, 0, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2146304, 2146304, 2224128, 2224128, 2232320, 2232320, 2232320, 641, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2531328, 2158592, 2158592, 2158592, 2158592, 2158592, 2617344, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2502656, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2699264, 2158592, 2158592, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2207744, 2863104, 2891776, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3018752, 2207744, 3043328, 2207744, 2207744, 2207744, 2207744, 3080192, 2207744, 2207744, 3112960, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 172310, 279, 0, 2162688, 0, 0, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2404352, 2412544, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2584576, 2158592, 2609152, 2158592, 2158592, 2629632, 2158592, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2158592, 2158592, 3170304, 3174400, 2158592, 2367488, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 0, 2207744, 2207744, 2207744, 2433024, 2207744, 2453504, 2461696, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2510848, 2207744, 2207744, 2207744, 2207744, 2207744, 2531328, 2207744, 2207744, 2207744, 2207744, 2207744, 2617344, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 1508, 2715648, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2867200, 2207744, 2904064, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2580480, 2207744, 2207744, 2207744, 2207744, 2621440, 2207744, 2207744, 2207744, 3149824, 2207744, 2207744, 3170304, 3174400, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 2158592, 2158592, 2158592, 2404352, 2412544, 2707456, 2732032, 2207744, 2207744, 2207744, 2822144, 2826240, 2207744, 2895872, 2207744, 2207744, 2924544, 2207744, 2207744, 2973696, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 285, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 0, 0, 2535424, 2543616, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2572288, 2981888, 2207744, 2207744, 3002368, 2207744, 3047424, 3063808, 3076096, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3203072, 2708960, 2732032, 2158592, 2158592, 2158592, 2822144, 2827748, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2981888, 2158592, 2158592, 3002368, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2981888, 2158592, 2158592, 3003876, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 20480, 0, 0, 0, 0, 0, 2162688, 20480, 0, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2908160, 2527232, 2207744, 2207744, 2576384, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2908160, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 0, 0, 2158592, 2158592, 2158592, 2158592, 2633728, 2658304, 0, 0, 2740224, 2744320, 0, 2834432, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 933, 45, 45, 45, 45, 442, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 2494464, 2158592, 2158592, 2158592, 2524757, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 1504, 2158592, 2498560, 2158592, 2158592, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 2736128, 2158592, 2158592, 0, 2158592, 2912256, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3108864, 2158592, 2158592, 3133440, 3145728, 3153920, 2375680, 2379776, 2207744, 2207744, 2420736, 2207744, 2449408, 2207744, 2207744, 2207744, 2498560, 2207744, 2207744, 2207744, 2207744, 2568192, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 551, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 2020, 2158592, 2592768, 2625536, 2207744, 2207744, 2674688, 2736128, 2207744, 2207744, 2207744, 2912256, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 542, 0, 544, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 641, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2498560, 2158592, 2158592, 1621, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 1608, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1107, 97, 97, 1110, 97, 97, 3133440, 3145728, 3153920, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3014656, 2158592, 2158592, 3051520, 2158592, 2158592, 3100672, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2416640, 2207744, 2465792, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2633728, 2658304, 2740224, 2744320, 2834432, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 32768, 0, 0, 0, 0, 0, 0, 2367488, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2158592, 2158592, 2478080, 2158592, 2158592, 2158592, 2535424, 2543616, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3117056, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 2699264, 2207744, 2207744, 2207744, 2207744, 2207744, 2748416, 2756608, 2777088, 2801664, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 0, 0, 2535709, 2543901, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2990365, 2158877, 2158877, 2158730, 2158730, 2158730, 2158730, 2158730, 2572426, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158592, 2158592, 2478080, 2207744, 2207744, 2990080, 2207744, 2207744, 2158592, 2158592, 2482176, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 0, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 3010560, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158592, 2428928, 2158592, 2514944, 0, 0, 2158592, 2588672, 2158592, 0, 2838528, 2158592, 2158592, 2158592, 3010560, 2158592, 2506752, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 0, 29315, 922, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1539, 45, 3006464, 2383872, 0, 2020, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158592, 2637824, 2953216, 2158592, 2539520, 2158592, 2539520, 2207744, 0, 0, 2539520, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 0, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2965504, 2965504, 2965504, 0, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2474269, 2158877, 2158877, 0, 0, 2158877, 2158877, 2158877, 2158877, 2634013, 2658589, 0, 0, 2740509, 2744605, 0, 2834717, 40976, 18, 36884, 45078, 24, 28, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 36884, 0, 0, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 86016, 0, 0, 2211840, 102439, 0, 0, 0, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 0, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 135, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2158592, 2158592, 2158592, 2596864, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2641920, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2494464, 2158592, 2158592, 2158592, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 0, 27, 27, 0, 2158592, 2498560, 2158592, 2158592, 0, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2494464, 2158592, 2158592, 2158592, 3006464, 2383872, 0, 0, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 40976, 18, 36884, 45078, 24, 27, 147488, 94242, 147456, 147488, 106538, 98347, 0, 0, 147456, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 81920, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2428928, 2158592, 2514944, 2158592, 2588672, 2158592, 2838528, 2158592, 2158592, 40976, 18, 151573, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1487, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 130, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3096576, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 644, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 1080, 0, 1084, 0, 1088, 0, 0, 0, 0, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2531466, 2158730, 2158730, 2158730, 2158730, 2158730, 2617482, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2158592, 2818048, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 159779, 159744, 102439, 159779, 98347, 0, 0, 159744, 40976, 18, 18, 36884, 0, 45078, 0, 2224253, 172032, 2224253, 2232448, 2232448, 172032, 2232448, 90143, 0, 0, 2170880, 0, 0, 550, 829, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 124, 124, 127, 127, 127, 40976, 18, 36884, 45078, 25, 29, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 163931, 40976, 18, 18, 36884, 0, 45078, 249856, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 0, 827, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 4243810, 4243810, 24, 24, 27, 27, 27, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 57344, 286, 2158592, 2158592, 2158592, 2158592, 2707456, 2732032, 2158592, 2158592, 2158592, 2822144, 2826240, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 53248, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1613, 97, 97, 97, 97, 97, 97, 1495, 97, 97, 97, 97, 97, 97, 97, 97, 97, 566, 97, 97, 97, 97, 97, 97, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 546, 0, 0, 0, 0, 286, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 17, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 120, 121, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 53248, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 196608, 18, 266240, 24, 24, 27, 27, 27, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 0, 45, 45, 45, 45, 45, 45, 45, 1535, 45, 45, 45, 45, 45, 45, 45, 1416, 45, 45, 45, 45, 45, 45, 45, 45, 424, 45, 45, 45, 45, 45, 45, 45, 45, 45, 405, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 199, 45, 45, 67, 67, 67, 67, 67, 491, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1766, 67, 67, 67, 1767, 67, 24850, 24850, 12564, 12564, 0, 0, 2166784, 546, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 743, 57889, 0, 2170880, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1856, 45, 1858, 1859, 67, 67, 67, 1009, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1021, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367773, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2699549, 2158877, 2158877, 2158877, 2158877, 2158877, 2748701, 2756893, 2777373, 2801949, 97, 1115, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 857, 97, 67, 67, 67, 67, 67, 1258, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1826, 67, 97, 97, 97, 97, 97, 97, 1338, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 870, 97, 97, 67, 67, 67, 1463, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1579, 67, 67, 97, 97, 97, 1518, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 904, 905, 97, 97, 97, 97, 1620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 1679, 67, 67, 67, 1682, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1690, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 189, 45, 45, 45, 1748, 45, 45, 45, 1749, 1750, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1959, 67, 67, 67, 67, 1768, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1791, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1802, 67, 1817, 67, 67, 67, 67, 67, 67, 1823, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 1848, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 659, 45, 45, 45, 45, 45, 45, 45, 1863, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 495, 67, 67, 67, 67, 67, 1878, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 1973, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1165, 97, 1167, 67, 24850, 24850, 12564, 12564, 0, 0, 2166784, 0, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1789, 97, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 136, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 229376, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 67, 24850, 24850, 12564, 12564, 0, 0, 280, 547, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 1788, 97, 97, 0, 97, 2024, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 235, 67, 67, 67, 67, 67, 57889, 547, 547, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1799, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1092, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1612, 97, 97, 97, 97, 1616, 97, 1297, 1472, 0, 0, 0, 0, 1303, 1474, 0, 0, 0, 0, 1309, 1476, 0, 0, 0, 0, 97, 97, 97, 1481, 97, 97, 97, 97, 97, 97, 1488, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 607, 97, 97, 97, 97, 40976, 18, 36884, 45078, 26, 30, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 213080, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 143448, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 0, 0, 0, 97, 97, 97, 97, 1482, 97, 1483, 97, 97, 97, 97, 97, 97, 1326, 97, 97, 1329, 1330, 97, 97, 97, 97, 97, 97, 1159, 1160, 97, 97, 97, 97, 97, 97, 97, 97, 590, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211974, 102439, 0, 0, 106538, 98347, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2474122, 2158730, 2158730, 2494602, 2158730, 2158730, 2158730, 2809994, 2158730, 2158730, 2842762, 2158730, 2158730, 2158730, 2900106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3014794, 2158730, 2158730, 3051658, 2158730, 2158730, 3100810, 2158730, 2158730, 2158730, 2158730, 3096714, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 2207744, 541, 541, 543, 543, 0, 0, 2166784, 0, 548, 549, 549, 0, 286, 2158877, 2158877, 2158877, 2863389, 2892061, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3186973, 2158877, 0, 0, 0, 0, 0, 0, 0, 0, 2367626, 2158877, 2404637, 2412829, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2564381, 2158877, 2158877, 2605341, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2679069, 2158877, 2695453, 2158877, 2703645, 2158877, 2711837, 2752797, 2158877, 0, 2158877, 2158877, 2158877, 2384010, 2158730, 2158730, 2158730, 2158730, 3006602, 2383872, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3096576, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 2158877, 2785565, 2158877, 2810141, 2158877, 2158877, 2842909, 2158877, 2158877, 2158877, 2900253, 2158877, 2158877, 2158877, 2158877, 2158877, 2531613, 2158877, 2158877, 2158877, 2158877, 2158877, 2617629, 2158877, 2158877, 2158877, 2158877, 2158730, 2818186, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3105053, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 0, 0, 97, 97, 97, 1611, 97, 97, 97, 97, 97, 97, 97, 1496, 97, 97, 1499, 97, 97, 97, 97, 97, 2441354, 2445450, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2502794, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2433162, 2158730, 2453642, 2461834, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2580618, 2158730, 2158730, 2158730, 2158730, 2621578, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2699402, 2158730, 2158730, 2158730, 2158730, 2678922, 2158730, 2695306, 2158730, 2703498, 2158730, 2711690, 2752650, 2158730, 2158730, 2785418, 2158730, 2158730, 2158730, 3113098, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3186826, 2158730, 2207744, 2207744, 2207744, 2207744, 2781184, 2793472, 2207744, 2818048, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 541, 0, 543, 2158877, 2502941, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2580765, 2158877, 2158877, 2158877, 2158877, 2621725, 2158877, 3019037, 2158877, 3043613, 2158877, 2158877, 2158877, 2158877, 3080477, 2158877, 2158877, 3113245, 2158877, 2158877, 2158877, 2158877, 0, 2158877, 2908445, 2158877, 2158877, 2158877, 2978077, 2158877, 2158877, 2158877, 2158877, 3039517, 2158877, 2158730, 2510986, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2584714, 2158730, 2609290, 2158730, 2158730, 2629770, 2158730, 2158730, 2158730, 2388106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2605194, 2158730, 2158730, 2158730, 2158730, 2687114, 2158730, 2715786, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2867338, 2158730, 2904202, 2158730, 2158730, 2158730, 2642058, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2781322, 2793610, 2158730, 3121290, 2158730, 2158730, 2158730, 3149962, 2158730, 2158730, 3170442, 3174538, 2158730, 2367488, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2441216, 2445312, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2502656, 2158877, 2433309, 2158877, 2453789, 2461981, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2511133, 2158877, 2158877, 2158877, 2158877, 2584861, 2158877, 2609437, 2158877, 2158877, 2629917, 2158877, 2158877, 2158877, 2687261, 2158877, 2715933, 2158877, 2158730, 2158730, 2973834, 2158730, 2982026, 2158730, 2158730, 3002506, 2158730, 3047562, 3063946, 3076234, 2158730, 2158730, 2158730, 2158730, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158877, 2507037, 0, 0, 2158877, 2158730, 2158730, 2158730, 3203210, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2564096, 2207744, 2207744, 2207744, 2707741, 2732317, 2158877, 2158877, 2158877, 2822429, 2826525, 2158877, 2896157, 2158877, 2158877, 2924829, 2158877, 2158877, 2973981, 2158877, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 642, 0, 2158592, 0, 45, 1529, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1755, 45, 67, 67, 2982173, 2158877, 2158877, 3002653, 2158877, 3047709, 3064093, 3076381, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3203357, 2523274, 2527370, 2158730, 2158730, 2576522, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2908298, 2494749, 2158877, 2158877, 2158877, 2523421, 2527517, 2158877, 2158877, 2576669, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 40976, 0, 18, 18, 4321280, 2224253, 2232448, 4329472, 2232448, 2158730, 2498698, 2158730, 2158730, 2158730, 2158730, 2568330, 2158730, 2592906, 2625674, 2158730, 2158730, 2674826, 2736266, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2158730, 2912394, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3109002, 2158730, 2158730, 3133578, 3145866, 3154058, 2375680, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375965, 2380061, 2158877, 2158877, 2421021, 2158877, 2449693, 2158877, 2158877, 2158877, 3117341, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3104906, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158877, 2498845, 2158877, 2158877, 0, 2158877, 2158877, 2568477, 2158877, 2593053, 2625821, 2158877, 2158877, 2674973, 0, 0, 0, 0, 97, 97, 1480, 97, 97, 97, 97, 97, 1485, 97, 97, 97, 0, 97, 97, 1729, 97, 1731, 97, 97, 97, 97, 97, 97, 97, 311, 97, 97, 97, 97, 97, 97, 97, 97, 1520, 97, 97, 1523, 97, 97, 1526, 97, 2736413, 2158877, 2158877, 0, 2158877, 2912541, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3109149, 2158877, 2158877, 3014941, 2158877, 2158877, 3051805, 2158877, 2158877, 3100957, 2158877, 2158877, 3121437, 2158877, 2158877, 2158877, 3150109, 3133725, 3146013, 3154205, 2158730, 2408586, 2416778, 2158730, 2465930, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3018890, 2158730, 3043466, 2158730, 2158730, 2158730, 2158730, 3080330, 2633866, 2658442, 2740362, 2744458, 2834570, 2949258, 2158730, 2986122, 2158730, 2998410, 2158730, 2158730, 2158730, 3129482, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158877, 2408733, 2416925, 2158877, 2466077, 2158877, 2158877, 3170589, 3174685, 2158877, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2424970, 2158730, 2158730, 2158730, 2158730, 2707594, 2732170, 2158730, 2158730, 2158730, 2822282, 2826378, 2158730, 2896010, 2158730, 2158730, 2924682, 2949405, 2158877, 2986269, 2158877, 2998557, 2158877, 2158877, 2158877, 3129629, 2158730, 2158730, 2478218, 2158730, 2158730, 2158730, 2535562, 2543754, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3117194, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 3014656, 2207744, 2207744, 3051520, 2207744, 2207744, 3100672, 2207744, 2207744, 3121152, 2207744, 2207744, 2207744, 2207744, 2207744, 2584576, 2207744, 2609152, 2207744, 2207744, 2629632, 2207744, 2207744, 2207744, 2686976, 2207744, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158877, 2158877, 2478365, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2158730, 2482314, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 823, 0, 825, 2158730, 2158730, 2158730, 2990218, 2158730, 2158730, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 135, 0, 2207744, 2207744, 2990080, 2207744, 2207744, 2158877, 2158877, 2482461, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2429066, 2158730, 2515082, 2158730, 2588810, 2158730, 2838666, 2158730, 2158730, 2158730, 3010698, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158877, 2429213, 2158877, 2515229, 0, 0, 2158877, 2588957, 2158877, 0, 2838813, 2158877, 2158877, 2158877, 3010845, 2158730, 2506890, 2158730, 2158730, 2158730, 2748554, 2756746, 2777226, 2801802, 2158730, 2158730, 2158730, 2863242, 2891914, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2564234, 2158730, 2158730, 2158730, 2158730, 2158730, 2597002, 2158730, 2158730, 2158730, 3006464, 2384157, 0, 0, 2158877, 2158877, 2158877, 2158877, 3006749, 2158730, 2637962, 2953354, 2158730, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158877, 2638109, 2953501, 2158877, 2539658, 2158730, 2539520, 2207744, 0, 0, 2539805, 2158877, 2158730, 2158730, 2158730, 2977930, 2158730, 2158730, 2158730, 2158730, 3039370, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3158154, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2965642, 2965504, 2965789, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1484, 97, 97, 97, 97, 2158592, 18, 0, 122880, 0, 0, 0, 77824, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 356, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1751, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1427, 67, 67, 67, 67, 67, 1432, 67, 67, 67, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 122880, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 1322, 550, 0, 286, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 4329472, 27, 27, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 542, 0, 0, 0, 542, 0, 544, 0, 0, 0, 544, 0, 550, 0, 0, 0, 0, 0, 97, 97, 1610, 97, 97, 97, 97, 97, 97, 97, 97, 898, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 237568, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 192512, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 94, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 96, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 12378, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 126, 126, 126, 126, 90143, 0, 0, 2170880, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 20480, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 241664, 102439, 106538, 98347, 0, 0, 20568, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 200797, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 0, 0, 44, 0, 0, 20575, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 41, 41, 41, 0, 0, 1126400, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 89, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 131201, 27, 27, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 208896, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 32768, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2433024, 2158592, 2453504, 2461696, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 245783, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 221184, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 180224, 40976, 18, 18, 36884, 155648, 45078, 0, 24, 24, 217088, 27, 27, 27, 217088, 90143, 0, 0, 2170880, 0, 0, 828, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 233472, 0, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 718, 45, 45, 45, 45, 45, 45, 45, 45, 45, 727, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 45, 1808, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 0, 0, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 1787, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2029, 45, 67, 67, 67, 67, 2033, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 1798, 45, 45, 1800, 45, 45, 0, 1472, 0, 0, 0, 0, 0, 1474, 0, 0, 0, 0, 0, 1476, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 1320, 97, 97, 0, 0, 97, 97, 97, 97, 1786, 97, 0, 0, 97, 97, 0, 1790, 1527, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 663, 67, 24850, 24850, 12564, 12564, 0, 57889, 281, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 1785, 97, 97, 0, 0, 97, 97, 0, 97, 97, 1979, 97, 97, 45, 45, 1983, 45, 1984, 45, 45, 45, 45, 45, 652, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 690, 45, 45, 694, 45, 45, 40976, 19, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 262144, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 46, 67, 98, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 45, 67, 97, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 258048, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 1122423, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 1114152, 1114152, 1114152, 0, 0, 1114112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 37, 102439, 106538, 98347, 0, 0, 204800, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 57436, 40976, 18, 36884, 45078, 24, 27, 33, 33, 0, 33, 33, 33, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 124, 124, 124, 127, 127, 127, 127, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158877, 2158877, 2158877, 2388253, 2158877, 2158877, 2158877, 2158877, 2158877, 2781469, 2793757, 2158877, 2818333, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2867485, 2158877, 2904349, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3096861, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2441501, 2445597, 2158877, 2158877, 2158877, 2158877, 2158877, 40976, 122, 123, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 936, 2158592, 4243810, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 935, 45, 45, 45, 715, 45, 45, 45, 45, 45, 45, 45, 723, 45, 45, 45, 45, 45, 1182, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 430, 45, 45, 45, 45, 45, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 47, 68, 99, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 48, 69, 100, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 49, 70, 101, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 50, 71, 102, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 51, 72, 103, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 52, 73, 104, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 53, 74, 105, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 54, 75, 106, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 55, 76, 107, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 56, 77, 108, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 57, 78, 109, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 58, 79, 110, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 59, 80, 111, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 60, 81, 112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 61, 82, 113, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 62, 83, 114, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 63, 84, 115, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 64, 85, 116, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 65, 86, 117, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 66, 87, 118, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 0, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1314, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1321, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1360, 97, 97, 131, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 145, 149, 45, 45, 45, 45, 45, 174, 45, 179, 45, 185, 45, 188, 45, 45, 202, 67, 255, 67, 67, 269, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 292, 296, 97, 97, 97, 97, 97, 321, 97, 326, 97, 332, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 646, 335, 97, 97, 349, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 437, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 523, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 511, 67, 67, 67, 97, 97, 97, 620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1501, 1502, 97, 793, 67, 67, 796, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 808, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 2052, 67, 67, 67, 67, 813, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 830, 97, 97, 97, 97, 97, 97, 97, 97, 97, 315, 97, 97, 97, 97, 97, 97, 841, 97, 97, 97, 97, 97, 97, 97, 97, 97, 854, 97, 97, 97, 97, 97, 97, 589, 97, 97, 97, 97, 97, 97, 97, 97, 97, 867, 97, 97, 97, 97, 97, 97, 97, 891, 97, 97, 894, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 906, 45, 937, 45, 45, 940, 45, 45, 45, 45, 45, 45, 948, 45, 45, 45, 45, 45, 734, 735, 67, 737, 67, 738, 67, 740, 67, 67, 67, 45, 967, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 435, 45, 45, 45, 980, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 415, 45, 45, 67, 67, 1024, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1081, 13112, 1085, 54074, 1089, 0, 0, 0, 0, 0, 0, 363, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1674, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1913, 67, 1914, 67, 67, 67, 1918, 67, 67, 97, 97, 97, 97, 1118, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 630, 97, 97, 97, 97, 97, 1169, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1534, 45, 45, 45, 45, 45, 1538, 45, 45, 45, 45, 1233, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 742, 67, 45, 45, 1191, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 454, 67, 67, 67, 67, 1243, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1251, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 2050, 0, 97, 97, 45, 45, 45, 732, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 67, 67, 67, 1284, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 772, 67, 67, 67, 1293, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 2158592, 2158592, 2158592, 2404352, 2412544, 1323, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1331, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1737, 97, 1364, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1373, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 647, 45, 45, 1387, 45, 45, 1391, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 410, 45, 45, 45, 45, 45, 1400, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1407, 45, 45, 45, 45, 45, 941, 45, 943, 45, 45, 45, 45, 45, 45, 951, 45, 67, 1438, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1447, 67, 67, 67, 67, 67, 67, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 756, 67, 67, 67, 67, 67, 67, 97, 1491, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1500, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1736, 97, 45, 45, 1541, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 677, 45, 45, 67, 1581, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 791, 792, 67, 67, 67, 67, 1598, 67, 1600, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 97, 97, 97, 1727, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1513, 97, 97, 67, 67, 97, 1879, 97, 1881, 97, 0, 1884, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 1842, 97, 97, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1928, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1903, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 1971, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 1381, 45, 45, 45, 45, 1976, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1747, 809, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 907, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1478, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1150, 97, 97, 97, 97, 67, 67, 67, 67, 1244, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 477, 67, 67, 67, 67, 67, 67, 1294, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1324, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1374, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 945, 45, 45, 45, 45, 45, 45, 45, 45, 1908, 45, 45, 1910, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1919, 67, 0, 0, 97, 97, 97, 97, 45, 2048, 67, 2049, 0, 0, 97, 2051, 45, 45, 45, 939, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 397, 45, 45, 45, 1921, 67, 67, 1923, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1947, 45, 1935, 0, 0, 0, 97, 1939, 97, 97, 1941, 97, 45, 45, 45, 45, 45, 45, 382, 389, 45, 45, 45, 45, 45, 45, 45, 45, 1810, 45, 45, 1812, 67, 67, 67, 67, 67, 256, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 336, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 371, 373, 45, 45, 45, 955, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 413, 45, 45, 45, 457, 459, 67, 67, 67, 67, 67, 67, 67, 67, 473, 67, 478, 67, 67, 482, 67, 67, 485, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 1828, 97, 554, 556, 97, 97, 97, 97, 97, 97, 97, 97, 570, 97, 575, 97, 97, 579, 97, 97, 582, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 330, 97, 97, 67, 746, 67, 67, 67, 67, 67, 67, 67, 67, 67, 758, 67, 67, 67, 67, 67, 67, 67, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 493, 67, 67, 67, 67, 67, 67, 67, 97, 97, 844, 97, 97, 97, 97, 97, 97, 97, 97, 97, 856, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1735, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1642, 97, 1644, 97, 97, 890, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 67, 67, 67, 67, 1065, 1066, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 532, 67, 67, 67, 67, 67, 67, 67, 1451, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 496, 67, 67, 97, 97, 1505, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 593, 97, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1617, 97, 97, 1635, 0, 1637, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 885, 97, 97, 97, 97, 67, 67, 1704, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 565, 572, 97, 97, 97, 97, 97, 97, 97, 97, 1832, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1946, 45, 45, 67, 67, 67, 67, 67, 97, 1926, 97, 1927, 97, 0, 0, 0, 97, 97, 1934, 2043, 0, 0, 97, 97, 97, 2047, 45, 45, 67, 67, 0, 1832, 97, 97, 45, 45, 45, 981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1227, 45, 45, 45, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 372, 45, 45, 45, 45, 1661, 1662, 45, 45, 45, 45, 45, 1666, 45, 45, 45, 45, 45, 1673, 45, 1675, 45, 45, 45, 45, 45, 45, 45, 67, 1426, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1275, 67, 67, 67, 67, 67, 45, 418, 45, 45, 420, 45, 45, 423, 45, 45, 45, 45, 45, 45, 45, 45, 959, 45, 45, 962, 45, 45, 45, 45, 458, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 483, 67, 67, 67, 67, 504, 67, 67, 506, 67, 67, 509, 67, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 555, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 580, 97, 97, 97, 97, 601, 97, 97, 603, 97, 97, 606, 97, 97, 97, 97, 97, 97, 848, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1498, 97, 97, 97, 97, 97, 97, 45, 45, 714, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 989, 990, 45, 67, 67, 67, 67, 67, 1011, 67, 67, 67, 67, 1015, 67, 67, 67, 67, 67, 67, 67, 753, 67, 67, 67, 67, 67, 67, 67, 67, 467, 67, 67, 67, 67, 67, 67, 67, 45, 45, 1179, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1003, 1004, 67, 1217, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 728, 67, 1461, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1034, 67, 97, 1516, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 871, 97, 67, 67, 67, 1705, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 567, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1715, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 1380, 45, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1887, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 2006, 45, 45, 1907, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1920, 67, 97, 0, 2035, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 1428, 67, 67, 67, 67, 67, 67, 1435, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 146, 45, 152, 45, 45, 165, 45, 175, 45, 180, 45, 45, 187, 190, 195, 45, 203, 254, 257, 262, 67, 270, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 97, 97, 97, 293, 97, 299, 97, 97, 312, 97, 322, 97, 327, 97, 97, 334, 337, 342, 97, 350, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 484, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 499, 97, 581, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 596, 648, 45, 650, 45, 651, 45, 653, 45, 45, 45, 657, 45, 45, 45, 45, 45, 45, 1954, 67, 67, 67, 1958, 67, 67, 67, 67, 67, 67, 67, 768, 67, 67, 67, 67, 67, 67, 67, 67, 769, 67, 67, 67, 67, 67, 67, 67, 680, 45, 45, 45, 45, 45, 45, 45, 45, 688, 689, 691, 45, 45, 45, 45, 45, 983, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 947, 45, 45, 45, 45, 952, 45, 45, 698, 699, 45, 45, 702, 703, 45, 45, 45, 45, 45, 45, 45, 711, 744, 67, 67, 67, 67, 67, 67, 67, 67, 67, 757, 67, 67, 67, 67, 761, 67, 67, 67, 67, 765, 67, 767, 67, 67, 67, 67, 67, 67, 67, 67, 775, 776, 778, 67, 67, 67, 67, 67, 67, 785, 786, 67, 67, 789, 790, 67, 67, 67, 67, 67, 67, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1775, 97, 97, 97, 67, 67, 67, 67, 67, 798, 67, 67, 67, 802, 67, 67, 67, 67, 67, 67, 67, 67, 1465, 67, 67, 1468, 67, 67, 1471, 67, 67, 810, 67, 67, 67, 67, 67, 67, 67, 67, 67, 821, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 833, 97, 835, 97, 836, 97, 838, 97, 97, 0, 0, 97, 97, 97, 2002, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1740, 45, 45, 45, 1744, 45, 45, 45, 97, 842, 97, 97, 97, 97, 97, 97, 97, 97, 97, 855, 97, 97, 97, 97, 0, 1717, 1718, 97, 97, 97, 97, 97, 1722, 97, 0, 0, 859, 97, 97, 97, 97, 863, 97, 865, 97, 97, 97, 97, 97, 97, 97, 97, 604, 97, 97, 97, 97, 97, 97, 97, 873, 874, 876, 97, 97, 97, 97, 97, 97, 883, 884, 97, 97, 887, 888, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 225280, 0, 365, 0, 367, 0, 45, 45, 45, 1531, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1199, 45, 45, 45, 45, 45, 97, 97, 908, 97, 97, 97, 97, 97, 97, 97, 97, 97, 919, 638, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2425117, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2597149, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2642205, 2158877, 2158877, 2158877, 2158877, 2158877, 3158301, 0, 2375818, 2379914, 2158730, 2158730, 2420874, 2158730, 2449546, 2158730, 2158730, 953, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 965, 978, 45, 45, 45, 45, 45, 45, 985, 45, 45, 45, 45, 45, 45, 45, 45, 971, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1027, 67, 1029, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1455, 67, 67, 67, 67, 67, 67, 67, 1077, 1078, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 139, 2158730, 2158730, 2158730, 2404490, 2412682, 1113, 97, 97, 97, 97, 97, 97, 1121, 97, 1123, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1540, 1155, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 615, 1168, 97, 97, 1171, 1172, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 1533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 45, 45, 1219, 45, 45, 45, 45, 45, 45, 45, 1226, 45, 45, 45, 45, 45, 168, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 427, 45, 45, 45, 45, 45, 45, 45, 1231, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1242, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1046, 67, 67, 1254, 67, 1256, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 806, 807, 67, 67, 97, 1336, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1111, 97, 97, 97, 97, 97, 1351, 97, 97, 97, 1354, 97, 97, 97, 1359, 97, 97, 97, 0, 97, 97, 97, 97, 1640, 97, 97, 97, 97, 97, 97, 97, 897, 97, 97, 97, 902, 97, 97, 97, 97, 97, 97, 97, 97, 1366, 97, 97, 97, 97, 97, 97, 97, 1371, 97, 97, 97, 0, 97, 97, 97, 1730, 97, 97, 97, 97, 97, 97, 97, 97, 915, 97, 97, 97, 97, 0, 360, 0, 67, 67, 67, 1440, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1017, 67, 1019, 67, 67, 67, 67, 67, 1453, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1459, 97, 97, 97, 1493, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1525, 97, 97, 97, 97, 97, 97, 1507, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1514, 67, 67, 67, 67, 1584, 67, 67, 67, 67, 67, 1590, 67, 67, 67, 67, 67, 67, 67, 783, 67, 67, 67, 788, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1599, 1601, 67, 67, 67, 1604, 67, 1606, 1607, 67, 1472, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 1614, 97, 97, 97, 97, 45, 45, 1850, 45, 45, 45, 45, 1855, 45, 45, 45, 45, 45, 1222, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1229, 97, 1618, 97, 97, 97, 97, 97, 97, 97, 1625, 97, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 447, 45, 45, 45, 45, 45, 67, 67, 1633, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1643, 1645, 97, 97, 0, 0, 97, 97, 1784, 97, 97, 97, 0, 0, 97, 97, 0, 97, 1894, 1895, 97, 1897, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 656, 45, 45, 45, 45, 45, 45, 97, 1648, 97, 1650, 1651, 97, 0, 45, 45, 45, 1654, 45, 45, 45, 45, 45, 169, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 658, 45, 45, 45, 45, 664, 45, 45, 1659, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1187, 45, 45, 1669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1005, 67, 67, 1681, 67, 67, 67, 67, 67, 67, 67, 1686, 67, 67, 67, 67, 67, 67, 67, 784, 67, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 1060, 67, 67, 97, 97, 1713, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1378, 45, 45, 45, 45, 45, 45, 45, 408, 45, 45, 45, 45, 45, 45, 45, 45, 1547, 45, 1549, 45, 45, 45, 45, 45, 97, 97, 1780, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 2027, 2028, 45, 45, 67, 67, 2031, 2032, 67, 45, 45, 1804, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1917, 67, 67, 67, 67, 67, 67, 67, 1819, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1708, 97, 97, 97, 97, 97, 45, 45, 1862, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 497, 67, 67, 67, 1877, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 1839, 0, 0, 97, 97, 97, 97, 1936, 0, 0, 97, 97, 97, 97, 97, 97, 1943, 1944, 1945, 45, 45, 45, 45, 670, 45, 45, 45, 45, 674, 45, 45, 45, 45, 678, 45, 1948, 45, 1950, 45, 45, 45, 45, 1955, 1956, 1957, 67, 67, 67, 1960, 67, 1962, 67, 67, 67, 67, 1967, 1968, 1969, 97, 0, 0, 0, 97, 97, 1974, 97, 0, 1936, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1906, 0, 1977, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1746, 45, 45, 45, 45, 2011, 67, 67, 2013, 67, 67, 67, 2017, 97, 97, 0, 0, 2021, 97, 8192, 97, 97, 2025, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1916, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 140, 45, 45, 45, 1180, 45, 45, 45, 45, 1184, 45, 45, 45, 45, 45, 45, 45, 387, 45, 392, 45, 45, 396, 45, 45, 399, 45, 45, 67, 207, 67, 67, 67, 67, 67, 67, 236, 67, 67, 67, 67, 67, 67, 67, 800, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 67, 67, 67, 67, 67, 0, 97, 97, 287, 97, 97, 97, 97, 97, 97, 316, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 1656, 1657, 45, 376, 45, 45, 45, 45, 45, 388, 45, 45, 45, 45, 45, 45, 45, 45, 1406, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 462, 67, 67, 67, 67, 67, 474, 67, 67, 67, 67, 67, 67, 67, 817, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 97, 97, 559, 97, 97, 97, 97, 97, 571, 97, 97, 97, 97, 97, 97, 896, 97, 97, 97, 900, 97, 97, 97, 97, 97, 97, 912, 914, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 391, 45, 45, 45, 45, 45, 45, 45, 45, 713, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 662, 45, 1140, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 636, 67, 67, 1283, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 513, 67, 67, 1363, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 889, 97, 97, 97, 1714, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 926, 45, 45, 45, 45, 45, 45, 45, 45, 672, 45, 45, 45, 45, 45, 45, 45, 45, 686, 45, 45, 45, 45, 45, 45, 45, 45, 944, 45, 45, 45, 45, 45, 45, 45, 45, 1676, 45, 45, 45, 45, 45, 45, 67, 97, 97, 97, 1833, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1902, 45, 45, 45, 45, 45, 957, 45, 45, 45, 45, 961, 45, 963, 45, 45, 45, 67, 97, 2034, 0, 97, 97, 97, 97, 97, 2040, 45, 45, 45, 2042, 67, 67, 67, 67, 67, 67, 1574, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 799, 67, 67, 67, 804, 67, 67, 67, 67, 67, 67, 67, 1298, 0, 0, 0, 1304, 0, 0, 0, 1310, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 1414, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 428, 45, 45, 45, 45, 45, 57889, 0, 0, 54074, 54074, 550, 831, 97, 97, 97, 97, 97, 97, 97, 97, 97, 568, 97, 97, 97, 97, 578, 97, 45, 45, 968, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1228, 45, 45, 67, 67, 67, 67, 67, 25398, 1082, 13112, 1086, 54074, 1090, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 67, 67, 67, 67, 1464, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 510, 67, 67, 67, 67, 97, 97, 97, 97, 1519, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 918, 97, 0, 0, 0, 0, 1528, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 976, 45, 1554, 45, 45, 45, 45, 45, 45, 45, 45, 1562, 45, 45, 1565, 45, 45, 45, 45, 683, 45, 45, 45, 687, 45, 45, 692, 45, 45, 45, 45, 45, 1953, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1014, 67, 67, 67, 67, 67, 67, 1568, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 67, 67, 67, 67, 67, 1585, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1594, 97, 97, 1649, 97, 97, 97, 0, 45, 45, 1653, 45, 45, 45, 45, 45, 45, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, 986, 45, 45, 45, 45, 45, 45, 45, 45, 1670, 45, 1672, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 736, 67, 67, 67, 67, 67, 741, 67, 67, 67, 1680, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1074, 67, 67, 67, 1692, 67, 67, 67, 67, 67, 67, 67, 1697, 67, 1699, 67, 67, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 468, 475, 67, 67, 67, 67, 67, 67, 1769, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 624, 97, 97, 97, 97, 97, 97, 634, 97, 97, 1792, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 958, 45, 45, 45, 45, 45, 45, 964, 45, 150, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 977, 204, 45, 67, 67, 67, 217, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 787, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 271, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 351, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 938, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1398, 45, 45, 45, 153, 45, 161, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 660, 661, 45, 45, 205, 45, 67, 67, 67, 67, 220, 67, 228, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 280, 94, 0, 0, 67, 67, 67, 67, 67, 272, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 352, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 439, 45, 45, 45, 45, 45, 445, 45, 45, 45, 452, 45, 45, 67, 67, 212, 216, 67, 67, 67, 67, 67, 241, 67, 246, 67, 252, 67, 67, 486, 67, 67, 67, 67, 67, 67, 67, 494, 67, 67, 67, 67, 67, 67, 67, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 1013, 67, 67, 1016, 67, 67, 67, 67, 67, 521, 67, 67, 525, 67, 67, 67, 67, 67, 531, 67, 67, 67, 538, 67, 0, 0, 2046, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1192, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1418, 45, 45, 1421, 97, 97, 583, 97, 97, 97, 97, 97, 97, 97, 591, 97, 97, 97, 97, 97, 97, 913, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 1384, 97, 618, 97, 97, 622, 97, 97, 97, 97, 97, 628, 97, 97, 97, 635, 97, 18, 131427, 0, 0, 0, 639, 0, 132, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 932, 45, 45, 45, 45, 45, 1544, 45, 45, 45, 45, 45, 1550, 45, 45, 45, 45, 45, 1194, 45, 1196, 45, 45, 45, 45, 45, 45, 45, 45, 999, 45, 45, 45, 45, 45, 67, 67, 45, 45, 667, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1408, 45, 45, 45, 696, 45, 45, 45, 701, 45, 45, 45, 45, 45, 45, 45, 45, 710, 45, 45, 45, 1220, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 194, 45, 45, 45, 729, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 797, 67, 67, 67, 67, 67, 67, 805, 67, 67, 67, 67, 67, 67, 67, 1587, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162968, 0, 0, 67, 67, 67, 67, 67, 814, 816, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1008, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1020, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1429, 67, 1430, 67, 67, 67, 67, 67, 1062, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 518, 1076, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1102, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1124, 97, 1126, 97, 97, 1114, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1112, 97, 97, 1156, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 594, 97, 97, 97, 97, 1170, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 1532, 45, 45, 45, 45, 1536, 45, 45, 45, 45, 45, 172, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 706, 45, 45, 709, 45, 45, 1177, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1202, 45, 1204, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1215, 45, 45, 45, 1232, 45, 45, 45, 45, 45, 45, 45, 67, 1237, 67, 67, 67, 67, 67, 67, 1053, 1054, 67, 67, 67, 67, 67, 67, 1061, 67, 67, 1282, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1289, 67, 67, 67, 1292, 97, 97, 97, 97, 1339, 97, 97, 97, 97, 97, 97, 1344, 97, 97, 97, 97, 45, 1849, 45, 1851, 45, 45, 45, 45, 45, 45, 45, 45, 721, 45, 45, 45, 45, 45, 726, 45, 1385, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1188, 45, 45, 1401, 1402, 45, 45, 45, 45, 1405, 45, 45, 45, 45, 45, 45, 45, 45, 1752, 45, 45, 45, 45, 45, 67, 67, 1410, 45, 45, 45, 1413, 45, 1415, 45, 45, 45, 45, 45, 45, 1419, 45, 45, 45, 45, 1806, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 2019, 0, 97, 67, 67, 67, 1452, 67, 67, 67, 67, 67, 67, 67, 67, 1457, 67, 67, 67, 67, 67, 67, 1259, 67, 67, 67, 67, 67, 67, 1264, 67, 67, 1460, 67, 1462, 67, 67, 67, 67, 67, 67, 1466, 67, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 67, 67, 0, 1300, 0, 0, 0, 1306, 0, 0, 0, 97, 97, 97, 1506, 97, 97, 97, 97, 97, 97, 97, 97, 1512, 97, 97, 97, 0, 1728, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 901, 97, 97, 97, 97, 1515, 97, 1517, 97, 97, 97, 97, 97, 97, 1521, 97, 97, 97, 97, 97, 97, 0, 45, 1652, 45, 45, 45, 1655, 45, 45, 45, 45, 45, 1542, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1552, 1553, 45, 45, 45, 1556, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 693, 45, 45, 45, 67, 67, 67, 67, 1572, 67, 67, 67, 67, 1576, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 67, 1605, 67, 67, 67, 0, 67, 1582, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1580, 67, 67, 1596, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 542, 0, 544, 67, 67, 67, 67, 1759, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 533, 67, 67, 67, 67, 67, 67, 67, 1770, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 1777, 97, 97, 97, 1793, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 998, 45, 45, 1001, 1002, 45, 45, 67, 67, 45, 1861, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1871, 67, 1873, 1874, 67, 0, 97, 45, 67, 0, 97, 45, 67, 16384, 97, 45, 67, 97, 0, 0, 0, 1473, 0, 1082, 0, 0, 0, 1475, 0, 1086, 0, 0, 0, 1477, 1876, 67, 97, 97, 97, 97, 97, 1883, 0, 1885, 97, 97, 97, 1889, 0, 0, 0, 286, 0, 0, 0, 286, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 126, 126, 126, 2053, 0, 2055, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 2039, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 226, 67, 67, 67, 67, 67, 67, 67, 67, 1246, 67, 67, 1249, 1250, 67, 67, 67, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 141, 45, 45, 45, 1403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1186, 45, 45, 1189, 45, 45, 155, 45, 45, 45, 45, 45, 45, 45, 45, 45, 191, 45, 45, 45, 45, 700, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1753, 45, 45, 45, 67, 67, 45, 45, 67, 208, 67, 67, 67, 222, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1764, 67, 67, 67, 67, 67, 67, 67, 258, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 288, 97, 97, 97, 302, 97, 97, 97, 97, 97, 97, 97, 97, 97, 627, 97, 97, 97, 97, 97, 97, 338, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 370, 45, 45, 45, 45, 716, 45, 45, 45, 45, 45, 722, 45, 45, 45, 45, 45, 45, 1912, 67, 67, 67, 67, 67, 67, 67, 67, 67, 819, 67, 67, 25398, 542, 13112, 544, 45, 403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1409, 45, 67, 67, 67, 67, 489, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 771, 67, 67, 67, 67, 520, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 534, 67, 67, 67, 67, 67, 67, 1271, 67, 67, 67, 1274, 67, 67, 67, 1279, 67, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 553, 97, 97, 97, 97, 586, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1138, 97, 97, 97, 97, 617, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 631, 97, 97, 97, 0, 1834, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 353, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 668, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 724, 45, 45, 45, 45, 45, 682, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 949, 45, 45, 45, 67, 67, 747, 748, 67, 67, 67, 67, 755, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 1302, 0, 0, 0, 1308, 0, 67, 794, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1701, 67, 97, 97, 97, 845, 846, 97, 97, 97, 97, 853, 97, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 97, 892, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 610, 97, 97, 45, 992, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1239, 67, 67, 67, 1063, 67, 67, 67, 67, 67, 1068, 67, 67, 67, 67, 67, 67, 67, 0, 0, 1301, 0, 0, 0, 1307, 0, 0, 97, 1141, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1152, 97, 97, 0, 0, 97, 97, 2001, 0, 97, 2003, 97, 97, 97, 45, 45, 45, 1739, 45, 45, 45, 1742, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1157, 97, 97, 97, 97, 97, 1162, 97, 97, 97, 97, 97, 97, 1145, 97, 97, 97, 97, 97, 1151, 97, 97, 97, 1253, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 539, 45, 1423, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1431, 67, 67, 67, 67, 67, 67, 67, 1695, 67, 67, 67, 67, 67, 1700, 67, 1702, 67, 67, 1439, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 514, 67, 67, 97, 97, 1492, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 611, 97, 97, 1703, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 852, 97, 97, 97, 97, 97, 97, 45, 1949, 45, 1951, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1961, 67, 0, 97, 45, 67, 0, 97, 2060, 2061, 0, 2062, 45, 67, 97, 0, 0, 2036, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 223, 67, 67, 237, 67, 67, 67, 67, 67, 67, 67, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 67, 67, 67, 67, 1963, 67, 67, 67, 97, 97, 97, 97, 0, 1972, 0, 97, 97, 97, 1975, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 931, 45, 45, 45, 45, 45, 407, 45, 45, 45, 45, 45, 45, 45, 45, 45, 417, 45, 45, 1989, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1996, 97, 18, 131427, 0, 0, 360, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 930, 45, 45, 45, 45, 45, 45, 444, 45, 45, 45, 45, 45, 45, 45, 67, 67, 97, 97, 1998, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1985, 45, 1986, 45, 45, 45, 156, 45, 45, 170, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 675, 45, 45, 45, 45, 679, 131427, 0, 358, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 381, 45, 45, 45, 45, 45, 45, 45, 45, 45, 400, 45, 45, 419, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 436, 67, 67, 67, 67, 67, 505, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 820, 67, 25398, 542, 13112, 544, 67, 67, 522, 67, 67, 67, 67, 67, 529, 67, 67, 67, 67, 67, 67, 67, 0, 1299, 0, 0, 0, 1305, 0, 0, 0, 97, 97, 619, 97, 97, 97, 97, 97, 626, 97, 97, 97, 97, 97, 97, 97, 1105, 97, 97, 97, 97, 1109, 97, 97, 97, 67, 67, 67, 67, 749, 67, 67, 67, 67, 67, 67, 67, 67, 67, 760, 67, 0, 97, 45, 67, 2058, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 2041, 67, 67, 67, 67, 67, 780, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 516, 67, 67, 97, 97, 97, 878, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1629, 97, 0, 45, 979, 45, 45, 45, 45, 984, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1198, 45, 45, 45, 45, 45, 45, 67, 1023, 67, 67, 67, 67, 1028, 67, 67, 67, 67, 67, 67, 67, 67, 67, 470, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1094, 0, 0, 0, 1092, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1486, 97, 1489, 97, 97, 97, 1117, 97, 97, 97, 97, 1122, 97, 97, 97, 97, 97, 97, 97, 1146, 97, 97, 97, 97, 97, 97, 97, 97, 881, 97, 97, 97, 886, 97, 97, 97, 1311, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1615, 97, 97, 97, 97, 97, 1619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1631, 97, 97, 1847, 97, 45, 45, 45, 45, 1852, 45, 45, 45, 45, 45, 45, 45, 1235, 45, 45, 45, 67, 67, 67, 67, 67, 1868, 67, 67, 67, 1872, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1882, 0, 0, 0, 97, 97, 97, 97, 0, 1891, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 1929, 0, 0, 97, 97, 97, 97, 97, 97, 45, 1900, 45, 1901, 45, 45, 45, 1905, 45, 67, 2054, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 2037, 2038, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1867, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1774, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 142, 45, 45, 45, 1412, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 432, 45, 45, 45, 45, 45, 157, 45, 45, 171, 45, 45, 45, 182, 45, 45, 45, 45, 200, 45, 45, 45, 1543, 45, 45, 45, 45, 45, 45, 45, 45, 1551, 45, 45, 45, 45, 1181, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1211, 45, 45, 45, 1214, 45, 45, 45, 67, 209, 67, 67, 67, 224, 67, 67, 238, 67, 67, 67, 249, 67, 0, 97, 2056, 2057, 0, 2059, 45, 67, 0, 97, 45, 67, 97, 0, 0, 1937, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1741, 45, 45, 45, 45, 45, 45, 67, 67, 67, 267, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 289, 97, 97, 97, 304, 97, 97, 318, 97, 97, 97, 329, 97, 97, 0, 0, 97, 1783, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 2026, 45, 45, 45, 45, 67, 2030, 67, 67, 67, 67, 67, 67, 1041, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1044, 67, 67, 67, 67, 67, 67, 97, 97, 347, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 666, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1420, 45, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 840, 67, 1007, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 759, 67, 67, 67, 67, 67, 67, 67, 1052, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1031, 67, 67, 67, 67, 67, 97, 97, 97, 1101, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 592, 97, 97, 97, 1190, 45, 45, 45, 45, 45, 1195, 45, 1197, 45, 45, 45, 45, 1201, 45, 45, 45, 45, 1952, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 250, 67, 67, 67, 1255, 67, 1257, 67, 67, 67, 67, 1261, 67, 67, 67, 67, 67, 67, 67, 67, 1685, 67, 67, 67, 67, 67, 67, 67, 0, 24851, 12565, 0, 0, 0, 0, 28809, 53532, 67, 67, 1267, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1696, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 1281, 67, 67, 67, 67, 1285, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1070, 67, 67, 67, 67, 67, 1335, 97, 1337, 97, 97, 97, 97, 1341, 97, 97, 97, 97, 97, 97, 97, 97, 882, 97, 97, 97, 97, 97, 97, 97, 1347, 97, 97, 97, 97, 97, 97, 1353, 97, 97, 97, 97, 97, 97, 1361, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 544, 0, 550, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 53530, 97, 97, 97, 1365, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 608, 97, 97, 97, 45, 45, 1424, 45, 1425, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1058, 67, 67, 67, 67, 45, 1555, 45, 45, 1557, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 707, 45, 45, 45, 45, 67, 67, 1570, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 773, 67, 67, 1595, 67, 67, 1597, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 97, 97, 97, 1636, 97, 97, 97, 1639, 97, 97, 1641, 97, 97, 97, 97, 97, 97, 1173, 0, 921, 0, 0, 0, 0, 0, 0, 45, 67, 67, 67, 1693, 67, 67, 67, 67, 67, 67, 67, 1698, 67, 67, 67, 67, 67, 67, 67, 1773, 67, 97, 97, 97, 97, 97, 97, 97, 625, 97, 97, 97, 97, 97, 97, 97, 97, 850, 97, 97, 97, 97, 97, 97, 97, 97, 880, 97, 97, 97, 97, 97, 97, 97, 97, 1106, 97, 97, 97, 97, 97, 97, 97, 1860, 45, 45, 67, 67, 1865, 67, 67, 67, 67, 1870, 67, 67, 67, 67, 1875, 67, 67, 97, 97, 1880, 97, 97, 0, 0, 0, 97, 97, 1888, 97, 0, 0, 0, 1938, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1854, 45, 45, 45, 45, 45, 45, 45, 1909, 45, 45, 1911, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1248, 67, 67, 67, 67, 67, 67, 1922, 67, 67, 1924, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 1898, 45, 45, 45, 45, 45, 45, 1904, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 16384, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1724, 2008, 2009, 45, 45, 67, 67, 67, 2014, 2015, 67, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2022, 0, 2023, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1869, 67, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 147, 151, 154, 45, 162, 45, 45, 176, 178, 181, 45, 45, 45, 192, 196, 45, 45, 45, 45, 2012, 67, 67, 67, 67, 67, 67, 2018, 97, 0, 0, 97, 1978, 97, 97, 97, 1982, 45, 45, 45, 45, 45, 45, 45, 45, 45, 972, 973, 45, 45, 45, 45, 45, 67, 259, 263, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 294, 298, 301, 97, 309, 97, 97, 323, 325, 328, 97, 97, 97, 97, 97, 560, 97, 97, 97, 569, 97, 97, 97, 97, 97, 97, 306, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1624, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 339, 343, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 67, 503, 67, 67, 67, 67, 67, 67, 67, 67, 67, 512, 67, 67, 519, 97, 97, 600, 97, 97, 97, 97, 97, 97, 97, 97, 97, 609, 97, 97, 616, 45, 649, 45, 45, 45, 45, 45, 654, 45, 45, 45, 45, 45, 45, 45, 45, 1393, 45, 45, 45, 45, 45, 45, 45, 45, 1209, 45, 45, 45, 45, 45, 45, 45, 67, 763, 67, 67, 67, 67, 67, 67, 67, 67, 770, 67, 67, 67, 774, 67, 0, 2045, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 994, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 213, 67, 219, 67, 67, 232, 67, 242, 67, 247, 67, 67, 67, 779, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1018, 67, 67, 67, 67, 811, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 834, 97, 97, 97, 97, 97, 839, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 645, 97, 97, 861, 97, 97, 97, 97, 97, 97, 97, 97, 868, 97, 97, 97, 872, 97, 97, 877, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 613, 97, 97, 97, 97, 97, 909, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 18, 18, 24, 24, 27, 27, 27, 1036, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1047, 67, 67, 67, 1050, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1033, 67, 67, 67, 97, 97, 1130, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 67, 67, 67, 1295, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 1317, 97, 97, 97, 97, 97, 97, 1375, 97, 97, 97, 0, 0, 0, 45, 1379, 45, 45, 45, 45, 45, 45, 422, 45, 45, 45, 429, 431, 45, 45, 45, 45, 0, 1090, 0, 0, 97, 1479, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1357, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1716, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1723, 0, 921, 29315, 0, 0, 0, 0, 45, 929, 45, 45, 45, 45, 45, 45, 45, 1392, 45, 45, 45, 45, 45, 45, 45, 45, 45, 960, 45, 45, 45, 45, 45, 45, 97, 97, 97, 1738, 45, 45, 45, 45, 45, 45, 45, 1743, 45, 45, 45, 45, 166, 45, 45, 45, 45, 184, 186, 45, 45, 197, 45, 45, 97, 1779, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 640, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1537, 45, 45, 45, 45, 45, 1803, 45, 45, 45, 45, 45, 1809, 45, 45, 45, 67, 67, 67, 1814, 67, 67, 67, 67, 67, 67, 1821, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 67, 67, 67, 1818, 67, 67, 67, 67, 67, 1824, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1890, 0, 1829, 97, 97, 0, 0, 97, 97, 1836, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1987, 1845, 97, 97, 97, 45, 45, 45, 45, 45, 1853, 45, 45, 45, 1857, 45, 45, 45, 67, 1864, 67, 1866, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 1710, 1711, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1886, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1838, 0, 0, 0, 97, 1843, 97, 0, 1893, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1745, 45, 45, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 1931, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 67, 2044, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1660, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 453, 45, 455, 67, 67, 67, 67, 268, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 348, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 359, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 421, 45, 45, 45, 45, 45, 45, 45, 434, 45, 45, 695, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1667, 45, 0, 921, 29315, 0, 925, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1811, 45, 67, 67, 67, 67, 67, 67, 1037, 67, 1039, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1277, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1095, 0, 0, 0, 1096, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 869, 97, 97, 97, 97, 97, 97, 1131, 97, 1133, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1370, 97, 97, 97, 97, 97, 1312, 0, 0, 0, 0, 1096, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1327, 97, 97, 97, 97, 97, 1332, 97, 97, 97, 1830, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1896, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1548, 45, 45, 45, 45, 45, 45, 133, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 380, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 401, 45, 45, 158, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1200, 45, 45, 45, 45, 206, 67, 67, 67, 67, 67, 225, 67, 67, 67, 67, 67, 67, 67, 67, 754, 67, 67, 67, 67, 67, 67, 67, 57889, 0, 0, 54074, 54074, 550, 832, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1342, 97, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1083, 13112, 1087, 54074, 1091, 0, 0, 0, 0, 0, 0, 1316, 0, 831, 97, 97, 97, 97, 97, 97, 97, 1174, 921, 0, 1175, 0, 0, 0, 0, 45, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 148, 67, 67, 264, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 295, 97, 97, 97, 97, 313, 97, 97, 97, 97, 331, 333, 97, 18, 131427, 356, 638, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 45, 45, 1530, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 988, 45, 45, 45, 97, 344, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 402, 404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1756, 67, 438, 45, 45, 45, 45, 45, 45, 45, 45, 449, 450, 45, 45, 45, 67, 67, 214, 218, 221, 67, 229, 67, 67, 243, 245, 248, 67, 67, 67, 67, 67, 488, 490, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1071, 67, 1073, 67, 67, 67, 67, 67, 524, 67, 67, 67, 67, 67, 67, 67, 67, 535, 536, 67, 67, 67, 67, 67, 67, 1683, 1684, 67, 67, 67, 67, 1688, 1689, 67, 67, 67, 67, 67, 67, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 97, 97, 97, 585, 587, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1163, 97, 97, 97, 97, 97, 97, 97, 621, 97, 97, 97, 97, 97, 97, 97, 97, 632, 633, 97, 97, 0, 0, 1782, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 712, 45, 45, 45, 717, 45, 45, 45, 45, 45, 45, 45, 45, 725, 45, 45, 45, 163, 167, 173, 177, 45, 45, 45, 45, 45, 193, 45, 45, 45, 45, 982, 45, 45, 45, 45, 45, 45, 987, 45, 45, 45, 45, 45, 1558, 45, 1560, 45, 45, 45, 45, 45, 45, 45, 45, 704, 705, 45, 45, 45, 45, 45, 45, 45, 45, 731, 45, 45, 45, 67, 67, 67, 67, 67, 739, 67, 67, 67, 67, 67, 67, 273, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 67, 67, 67, 764, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1290, 67, 67, 67, 67, 67, 67, 812, 67, 67, 67, 67, 818, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 837, 97, 97, 97, 97, 97, 602, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1137, 97, 97, 97, 97, 97, 97, 97, 97, 97, 862, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1627, 97, 97, 97, 0, 97, 97, 97, 97, 910, 97, 97, 97, 97, 916, 97, 97, 97, 0, 0, 0, 97, 97, 1940, 97, 97, 1942, 45, 45, 45, 45, 45, 45, 385, 45, 45, 45, 45, 395, 45, 45, 45, 45, 966, 45, 969, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 975, 45, 45, 45, 406, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 974, 45, 45, 45, 67, 67, 67, 67, 1010, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1262, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1040, 67, 1042, 67, 1045, 67, 67, 67, 67, 67, 67, 67, 97, 1706, 97, 97, 97, 1709, 97, 97, 97, 67, 67, 67, 67, 1051, 67, 67, 67, 67, 67, 1057, 67, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 1446, 67, 67, 67, 67, 67, 67, 67, 1297, 0, 0, 0, 1303, 0, 0, 0, 1309, 67, 67, 67, 67, 1079, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 1098, 97, 97, 97, 97, 97, 1104, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1356, 97, 97, 97, 97, 97, 97, 1128, 97, 97, 97, 97, 97, 97, 1134, 97, 1136, 97, 1139, 97, 97, 97, 97, 97, 97, 1622, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 1176, 0, 646, 45, 67, 67, 67, 1268, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1469, 67, 67, 67, 97, 1348, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1127, 97, 67, 1569, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1448, 1449, 67, 1816, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1825, 67, 67, 1827, 97, 97, 0, 1781, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 1831, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1980, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1395, 45, 45, 45, 45, 45, 97, 1846, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1212, 45, 45, 45, 45, 45, 45, 2010, 45, 67, 67, 67, 67, 67, 2016, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 2007, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 143, 45, 45, 45, 1671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1813, 67, 67, 1815, 45, 45, 67, 210, 67, 67, 67, 67, 67, 67, 239, 67, 67, 67, 67, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1445, 67, 67, 67, 67, 67, 67, 97, 97, 290, 97, 97, 97, 97, 97, 97, 319, 97, 97, 97, 97, 97, 97, 303, 97, 97, 317, 97, 97, 97, 97, 97, 97, 305, 97, 97, 97, 97, 97, 97, 97, 97, 97, 899, 97, 97, 97, 97, 97, 97, 375, 45, 45, 45, 379, 45, 45, 390, 45, 45, 394, 45, 45, 45, 45, 45, 443, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 461, 67, 67, 67, 465, 67, 67, 476, 67, 67, 480, 67, 67, 67, 67, 67, 67, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1288, 67, 67, 67, 67, 67, 67, 500, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1075, 97, 97, 97, 558, 97, 97, 97, 562, 97, 97, 573, 97, 97, 577, 97, 97, 97, 97, 97, 895, 97, 97, 97, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 1638, 97, 97, 97, 97, 97, 97, 97, 97, 1646, 597, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1334, 45, 681, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1396, 45, 45, 1399, 45, 45, 730, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1434, 67, 67, 67, 67, 67, 67, 750, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1456, 67, 67, 67, 67, 67, 45, 45, 993, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1238, 67, 67, 1006, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1280, 1048, 1049, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1059, 67, 67, 67, 67, 67, 67, 1286, 67, 67, 67, 67, 67, 67, 67, 1291, 67, 97, 97, 1100, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 920, 97, 97, 1142, 1143, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1153, 97, 97, 97, 97, 97, 1158, 97, 97, 97, 1161, 97, 97, 97, 97, 1166, 97, 97, 97, 97, 97, 1325, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1328, 97, 97, 97, 97, 97, 97, 97, 45, 1218, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1678, 45, 45, 45, 67, 67, 67, 67, 67, 1269, 67, 67, 67, 67, 67, 67, 67, 67, 1278, 67, 67, 67, 67, 67, 67, 1761, 67, 67, 67, 67, 67, 67, 67, 67, 67, 530, 67, 67, 67, 67, 67, 67, 97, 97, 1349, 97, 97, 97, 97, 97, 97, 97, 97, 1358, 97, 97, 97, 97, 97, 97, 1623, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 926, 0, 0, 0, 45, 45, 1411, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1754, 45, 45, 67, 67, 1301, 0, 1307, 0, 1313, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 21054, 97, 97, 97, 97, 67, 1757, 67, 67, 67, 1760, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1467, 67, 67, 67, 67, 67, 1778, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 1820, 67, 1822, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1933, 97, 1892, 97, 97, 97, 97, 97, 97, 1899, 45, 45, 45, 45, 45, 45, 45, 45, 1664, 45, 45, 45, 45, 45, 45, 45, 45, 1546, 45, 45, 45, 45, 45, 45, 45, 45, 1208, 45, 45, 45, 45, 45, 45, 45, 45, 1224, 45, 45, 45, 45, 45, 45, 45, 45, 673, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1925, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 623, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 307, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1796, 97, 45, 45, 45, 45, 45, 45, 45, 970, 45, 45, 45, 45, 45, 45, 45, 45, 1417, 45, 45, 45, 45, 45, 45, 45, 67, 1964, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1721, 97, 97, 0, 0, 1997, 97, 0, 0, 2000, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 733, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 803, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 144, 45, 45, 45, 1805, 45, 1807, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 231, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 45, 45, 67, 211, 67, 67, 67, 67, 230, 234, 240, 244, 67, 67, 67, 67, 67, 67, 464, 67, 67, 67, 67, 67, 67, 479, 67, 67, 67, 260, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 291, 97, 97, 97, 97, 310, 314, 320, 324, 97, 97, 97, 97, 97, 97, 1367, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1355, 97, 97, 97, 97, 97, 97, 1362, 340, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 360, 0, 362, 0, 365, 28809, 367, 139, 369, 45, 45, 45, 374, 67, 67, 460, 67, 67, 67, 67, 466, 67, 67, 67, 67, 67, 67, 67, 67, 801, 67, 67, 67, 67, 67, 67, 67, 67, 67, 487, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 498, 67, 67, 67, 67, 67, 67, 1772, 67, 67, 97, 97, 97, 97, 97, 97, 97, 0, 921, 922, 1175, 0, 0, 0, 0, 45, 67, 502, 67, 67, 67, 67, 67, 67, 67, 508, 67, 67, 67, 515, 517, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1932, 97, 97, 0, 1999, 97, 97, 97, 0, 97, 97, 2004, 2005, 97, 45, 45, 45, 45, 1193, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 676, 45, 45, 45, 45, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 552, 97, 97, 97, 97, 97, 1377, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 45, 45, 97, 97, 557, 97, 97, 97, 97, 563, 97, 97, 97, 97, 97, 97, 97, 97, 1135, 97, 97, 97, 97, 97, 97, 97, 97, 97, 584, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 595, 97, 97, 97, 97, 97, 911, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 1319, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1733, 97, 97, 97, 97, 97, 97, 1340, 97, 97, 97, 1343, 97, 97, 1345, 97, 1346, 97, 599, 97, 97, 97, 97, 97, 97, 97, 605, 97, 97, 97, 612, 614, 97, 97, 97, 97, 97, 1794, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1207, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 745, 67, 67, 67, 67, 751, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1577, 67, 67, 67, 67, 67, 762, 67, 67, 67, 67, 766, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1765, 67, 67, 67, 67, 67, 777, 67, 67, 781, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1592, 1593, 67, 67, 97, 843, 97, 97, 97, 97, 849, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1510, 97, 97, 97, 97, 97, 97, 97, 860, 97, 97, 97, 97, 864, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1797, 45, 45, 45, 45, 1801, 45, 97, 875, 97, 97, 879, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1522, 97, 97, 97, 97, 97, 991, 45, 45, 45, 45, 996, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 215, 67, 67, 67, 67, 233, 67, 67, 67, 67, 251, 253, 1022, 67, 67, 67, 1026, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1035, 67, 67, 1038, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1458, 67, 67, 67, 67, 67, 1064, 67, 67, 67, 1067, 67, 67, 67, 67, 1072, 67, 67, 67, 67, 67, 67, 1296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 1096, 0, 921, 29315, 0, 0, 0, 0, 928, 45, 45, 45, 45, 45, 934, 45, 45, 45, 164, 45, 45, 45, 45, 45, 45, 45, 45, 45, 198, 45, 45, 45, 378, 45, 45, 45, 45, 45, 45, 393, 45, 45, 45, 398, 45, 97, 97, 1116, 97, 97, 97, 1120, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1147, 1148, 97, 97, 97, 97, 97, 97, 97, 1129, 97, 97, 1132, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1626, 97, 97, 97, 97, 0, 45, 1178, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1185, 45, 45, 45, 45, 441, 45, 45, 45, 45, 45, 45, 451, 45, 45, 67, 67, 67, 67, 67, 227, 67, 67, 67, 67, 67, 67, 67, 67, 1260, 67, 67, 67, 1263, 67, 67, 1265, 1203, 45, 45, 1205, 45, 1206, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1216, 67, 1266, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1276, 67, 67, 67, 67, 67, 67, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 481, 67, 45, 1386, 45, 1389, 45, 45, 45, 45, 1394, 45, 45, 45, 1397, 45, 45, 45, 45, 995, 45, 997, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1915, 67, 67, 67, 67, 67, 1422, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1433, 67, 1436, 67, 67, 67, 67, 1441, 67, 67, 67, 1444, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 97, 97, 97, 97, 1494, 97, 97, 97, 1497, 97, 97, 97, 97, 97, 97, 97, 1368, 97, 97, 97, 97, 97, 97, 97, 97, 851, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1571, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1583, 67, 67, 67, 67, 67, 67, 67, 67, 1591, 67, 67, 67, 67, 67, 67, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 67, 97, 1634, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1125, 97, 97, 97, 1647, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 1658, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1668, 1712, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 1835, 97, 97, 97, 97, 0, 0, 0, 97, 97, 1844, 97, 97, 1726, 0, 97, 97, 97, 97, 97, 1732, 97, 1734, 97, 97, 97, 97, 97, 300, 97, 308, 97, 97, 97, 97, 97, 97, 97, 97, 866, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1758, 67, 67, 67, 1762, 67, 67, 67, 67, 67, 67, 67, 67, 1043, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1771, 67, 67, 67, 97, 97, 97, 97, 97, 1776, 97, 97, 97, 97, 297, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 67, 67, 67, 1966, 97, 97, 97, 1970, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 1720, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1837, 97, 0, 1840, 1841, 97, 97, 97, 1988, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1994, 1995, 67, 97, 97, 97, 97, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 917, 97, 97, 0, 0, 0, 67, 67, 265, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 345, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 361, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 411, 45, 45, 414, 45, 45, 45, 45, 377, 45, 45, 45, 386, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1223, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 433, 45, 45, 45, 67, 67, 67, 67, 67, 463, 67, 67, 67, 472, 67, 67, 67, 67, 67, 67, 67, 527, 67, 67, 67, 67, 67, 67, 537, 67, 540, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 97, 97, 97, 1119, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1509, 97, 97, 97, 97, 97, 97, 97, 97, 564, 97, 97, 97, 97, 97, 97, 97, 637, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 927, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1234, 45, 45, 45, 45, 67, 67, 67, 67, 1240, 45, 697, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 708, 45, 45, 45, 45, 1221, 45, 45, 45, 45, 1225, 45, 45, 45, 45, 45, 45, 384, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1210, 45, 45, 45, 45, 45, 45, 67, 67, 795, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1470, 67, 67, 67, 67, 67, 67, 67, 815, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 97, 893, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1164, 97, 97, 97, 67, 67, 67, 1025, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1687, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 1097, 1241, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1450, 45, 45, 1388, 45, 1390, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1236, 67, 67, 67, 67, 67, 1437, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 1490, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1503, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 1930, 0, 97, 97, 97, 97, 97, 847, 97, 97, 97, 97, 97, 97, 97, 97, 97, 858, 67, 67, 1965, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 1719, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 1382, 45, 1383, 45, 45, 45, 159, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1563, 45, 45, 45, 45, 45, 67, 261, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 341, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 1099, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1333, 97, 1230, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1992, 67, 1993, 67, 67, 67, 97, 97, 45, 45, 160, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1665, 45, 45, 45, 45, 45, 131427, 357, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 684, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 412, 45, 45, 45, 416, 45, 45, 45, 440, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1990, 67, 1991, 67, 67, 67, 67, 67, 67, 67, 97, 97, 1707, 97, 97, 97, 97, 97, 97, 501, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1691, 67, 67, 67, 67, 67, 526, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1030, 67, 1032, 67, 67, 67, 67, 598, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1632, 0, 921, 29315, 923, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 425, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1093, 0, 0, 0, 0, 0, 97, 1609, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1369, 97, 97, 97, 1372, 97, 97, 67, 67, 266, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 346, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 665, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1677, 45, 45, 45, 45, 67, 45, 45, 954, 45, 956, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 67, 456, 67, 67, 67, 67, 67, 1270, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1069, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1350, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1524, 97, 97, 97, 97, 97, 97, 97, 1376, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 1559, 1561, 45, 45, 45, 1564, 45, 1566, 1567, 45, 67, 67, 67, 67, 67, 1573, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1247, 67, 67, 67, 67, 67, 1252, 97, 1725, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1628, 97, 1630, 0, 0, 94242, 0, 0, 0, 2211840, 0, 1118208, 0, 0, 0, 0, 2158592, 2158731, 2158592, 2158592, 2158592, 3117056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3018752, 2158592, 3043328, 2158592, 2158592, 2158592, 2158592, 3080192, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158878, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2605056, 2158592, 2158592, 2207744, 0, 542, 0, 544, 0, 0, 2166784, 0, 0, 0, 550, 0, 0, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2867200, 2158592, 2904064, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 0, 0, 1130496, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 139, 0, 0, 0, 139, 0, 2367488, 2207744, 0, 0, 0, 0, 176128, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 1508, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 67, 24850, 24850, 12564, 12564, 0, 0, 0, 0, 0, 53531, 53531, 0, 286, 97, 97, 97, 97, 97, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 1154, 57889, 0, 0, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 561, 97, 97, 97, 97, 97, 97, 576, 97, 97, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 0, 0, 139264, 0, 921, 29315, 0, 0, 926, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 719, 720, 45, 45, 45, 45, 45, 45, 45, 45, 685, 45, 45, 45, 45, 45, 45, 45, 45, 45, 942, 45, 45, 946, 45, 45, 45, 950, 45, 45, 0, 2146304, 2146304, 0, 0, 0, 0, 2224128, 2224128, 2224128, 2232320, 2232320, 2232320, 2232320, 0, 0, 1301, 0, 0, 0, 0, 0, 1307, 0, 0, 0, 0, 0, 1313, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1318, 97, 97, 97, 97, 97, 97, 1795, 97, 97, 45, 45, 45, 45, 45, 45, 45, 446, 45, 45, 45, 45, 45, 45, 67, 67, 2158592, 2146304, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 924, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1000, 45, 45, 45, 45, 67, 67 +]; + +XQueryTokenizer.EXPECTED = +[ 290, 300, 304, 353, 296, 309, 305, 319, 315, 324, 328, 352, 354, 334, 338, 330, 320, 345, 349, 293, 358, 362, 341, 366, 312, 370, 374, 378, 382, 386, 390, 394, 398, 737, 402, 634, 439, 604, 634, 634, 634, 634, 408, 634, 634, 634, 404, 634, 634, 634, 457, 634, 634, 963, 634, 634, 413, 634, 634, 634, 634, 634, 634, 634, 663, 418, 422, 903, 902, 426, 431, 548, 634, 437, 521, 919, 443, 615, 409, 449, 455, 624, 731, 751, 634, 461, 465, 672, 470, 469, 474, 481, 485, 477, 489, 493, 629, 542, 497, 505, 603, 602, 991, 648, 510, 804, 634, 515, 958, 526, 525, 530, 768, 634, 546, 552, 711, 710, 593, 558, 562, 618, 566, 570, 574, 578, 582, 586, 590, 608, 612, 660, 822, 821, 634, 622, 596, 444, 628, 533, 724, 633, 640, 653, 647, 652, 536, 1008, 451, 450, 445, 657, 670, 676, 685, 689, 693, 697, 701, 704, 707, 715, 719, 798, 815, 634, 723, 762, 996, 634, 728, 969, 730, 735, 908, 634, 741, 679, 889, 511, 747, 634, 750, 755, 499, 666, 499, 501, 759, 772, 776, 780, 634, 787, 784, 797, 802, 809, 808, 427, 814, 1006, 517, 634, 519, 853, 634, 813, 850, 793, 634, 819, 826, 833, 832, 837, 843, 847, 857, 861, 863, 867, 871, 875, 879, 883, 643, 887, 539, 980, 979, 634, 893, 944, 634, 900, 896, 634, 907, 933, 506, 912, 917, 828, 433, 636, 635, 554, 961, 923, 930, 927, 937, 941, 634, 634, 634, 974, 948, 952, 985, 913, 968, 967, 743, 634, 973, 839, 634, 978, 599, 634, 984, 989, 765, 444, 995, 1000, 634, 1003, 790, 955, 1012, 681, 634, 634, 634, 634, 634, 414, 1016, 1020, 1024, 1085, 1027, 1090, 1090, 1046, 1080, 1137, 1108, 1215, 1049, 1032, 1039, 1085, 1085, 1085, 1085, 1058, 1062, 1068, 1085, 1086, 1090, 1090, 1091, 1072, 1064, 1107, 1090, 1090, 1090, 1118, 1123, 1138, 1078, 1074, 1084, 1085, 1085, 1085, 1087, 1090, 1062, 1052, 1060, 1114, 1062, 1104, 1085, 1085, 1090, 1090, 1028, 1122, 1063, 1128, 1139, 1127, 1158, 1085, 1085, 1151, 1090, 1090, 1090, 1095, 1090, 1132, 1073, 1136, 1143, 1061, 1150, 1085, 1155, 1098, 1101, 1146, 1162, 1169, 1101, 1185, 1151, 1090, 1110, 1173, 1054, 1087, 1109, 1177, 1165, 1089, 1204, 1184, 1107, 1189, 1193, 1088, 1197, 1180, 1201, 1208, 1042, 1212, 1219, 1223, 1227, 1231, 1235, 1245, 1777, 1527, 1686, 1686, 1238, 1686, 1254, 1686, 1686, 1686, 1294, 1669, 1686, 1686, 1686, 1322, 1625, 1534, 1268, 1624, 1275, 1281, 1443, 1292, 1300, 1686, 1686, 1686, 1350, 1826, 1306, 1686, 1686, 1240, 2032, 1317, 1321, 1686, 1686, 1253, 1686, 1326, 1686, 1686, 1686, 1418, 1709, 1446, 1686, 1686, 1686, 1492, 1686, 1295, 1447, 1686, 1686, 1258, 1686, 1736, 1686, 1686, 1520, 1355, 1686, 1288, 1348, 1361, 1686, 1359, 1686, 1364, 1498, 1368, 1302, 1362, 1381, 1389, 1395, 1486, 1686, 1371, 1377, 1370, 1686, 1375, 1382, 1384, 1402, 1408, 1385, 1383, 1619, 1413, 1423, 1428, 1433, 1686, 1686, 1270, 1686, 1338, 1686, 1440, 1686, 1686, 1686, 1499, 1465, 1686, 1686, 1686, 1639, 1473, 1884, 1686, 1686, 1293, 1864, 1686, 1686, 1296, 1321, 1483, 1686, 1686, 1686, 1646, 1686, 1748, 1496, 1686, 1418, 1675, 1686, 1418, 1702, 1686, 1418, 1981, 1686, 1429, 1409, 1427, 1504, 1692, 1686, 1686, 1313, 1448, 1651, 1508, 1686, 1686, 1340, 1686, 1903, 1686, 1686, 1435, 1513, 1686, 1283, 1287, 1519, 1686, 1524, 1363, 1568, 1938, 1539, 1566, 1579, 1479, 1533, 1538, 1553, 1544, 1552, 1557, 1563, 1574, 1557, 1583, 1589, 1590, 1759, 1594, 1603, 1607, 1611, 1686, 1436, 1514, 1686, 1434, 1656, 1686, 1434, 1680, 1686, 1453, 1686, 1686, 1686, 1559, 1617, 1686, 1770, 1418, 1623, 1769, 1629, 1686, 1515, 1335, 1686, 1285, 1686, 1671, 1921, 1650, 1686, 1686, 1344, 1308, 1666, 1686, 1686, 1686, 1659, 1685, 1686, 1686, 1686, 1686, 1241, 1686, 1686, 1844, 1691, 1686, 1630, 1977, 1970, 1362, 1686, 1686, 1686, 1693, 1698, 1686, 1686, 1686, 1697, 1686, 1764, 1715, 1686, 1634, 1638, 1686, 1599, 1585, 1686, 1271, 1686, 1269, 1686, 1721, 1686, 1686, 1354, 1686, 1801, 1686, 1799, 1686, 1640, 1686, 1686, 1461, 1686, 1686, 1732, 1686, 1944, 1686, 1740, 1686, 1746, 1415, 1396, 1686, 1598, 1547, 1417, 1597, 1416, 1577, 1546, 1397, 1577, 1547, 1548, 1570, 1398, 1753, 1686, 1652, 1509, 1686, 1686, 1686, 1757, 1686, 1419, 1686, 1763, 1418, 1768, 1781, 1686, 1686, 1686, 1705, 1686, 2048, 1792, 1686, 1686, 1686, 1735, 1686, 1797, 1686, 1686, 1404, 1686, 1639, 1815, 1686, 1686, 1418, 2017, 1820, 1686, 1686, 1803, 1686, 1686, 1686, 1736, 1489, 1686, 1686, 1825, 1338, 1260, 1263, 1686, 1686, 1785, 1686, 1686, 1728, 1686, 1686, 1749, 1497, 1830, 1830, 1262, 1248, 1261, 1329, 1260, 1264, 1329, 1248, 1249, 1259, 1540, 1849, 1842, 1686, 1686, 1835, 1686, 1686, 1816, 1686, 1686, 1831, 1882, 1848, 1686, 1686, 1686, 1774, 2071, 1854, 1686, 1686, 1469, 1884, 1686, 1821, 1859, 1686, 1686, 1350, 1883, 1686, 1686, 1686, 1781, 1391, 1875, 1686, 1686, 1613, 1644, 1686, 1686, 1889, 1686, 1686, 1662, 1884, 1686, 1885, 1890, 1686, 1686, 1686, 1894, 1686, 1686, 1678, 1686, 1907, 1686, 1686, 1529, 1914, 1686, 1838, 1686, 1686, 1881, 1686, 1686, 1872, 1876, 1836, 1919, 1686, 1837, 1692, 1910, 1686, 1925, 1928, 1742, 1686, 1811, 1811, 1930, 1810, 1929, 1935, 1928, 1900, 1942, 1867, 1868, 1931, 1035, 1788, 1948, 1952, 1956, 1960, 1964, 1686, 1976, 1686, 1686, 1686, 2065, 1686, 1992, 2037, 1686, 1686, 1998, 2009, 1972, 2002, 1686, 1686, 1686, 2077, 1300, 2023, 1686, 1686, 1686, 1807, 2031, 1686, 1686, 1686, 1860, 1500, 2032, 1686, 1686, 1686, 2083, 1686, 2036, 1686, 1277, 1276, 2042, 1877, 1686, 1686, 2041, 1686, 1686, 2027, 2037, 2012, 1686, 2012, 1855, 1850, 1686, 2046, 1686, 1686, 2054, 1996, 1686, 1897, 1309, 2059, 2052, 1686, 2058, 1686, 1686, 2081, 1686, 1717, 1477, 1686, 1331, 1686, 1686, 1687, 1686, 1860, 1681, 1686, 1686, 1686, 1966, 1724, 1686, 1686, 1686, 1984, 2015, 1686, 1686, 1686, 1988, 1686, 2063, 1686, 1686, 1686, 2005, 1686, 1727, 1686, 1686, 1711, 1457, 2069, 1686, 1686, 1686, 2019, 2075, 1686, 1686, 1915, 1686, 1686, 1793, 1874, 1686, 1686, 1491, 1362, 1449, 1686, 1686, 1460, 2098, 2087, 2091, 2095, 2184, 2102, 2113, 2780, 2117, 2134, 2142, 2281, 2146, 2146, 2146, 2304, 2296, 2181, 2639, 2591, 2872, 2592, 2873, 2313, 2195, 2200, 2281, 2146, 2273, 2226, 2204, 2152, 2219, 2276, 2167, 2177, 2276, 2235, 2276, 2276, 2230, 2281, 2276, 2296, 2276, 2293, 2276, 2276, 2276, 2276, 2234, 2276, 2311, 2314, 2210, 2199, 2217, 2222, 2276, 2276, 2276, 2240, 2276, 2294, 2276, 2276, 2173, 2276, 2198, 2281, 2281, 2281, 2281, 2282, 2146, 2146, 2146, 2146, 2205, 2146, 2204, 2248, 2276, 2235, 2276, 2297, 2276, 2276, 2276, 2277, 2256, 2281, 2283, 2146, 2146, 2146, 2275, 2276, 2295, 2276, 2276, 2293, 2146, 2304, 2264, 2269, 2221, 2276, 2276, 2276, 2293, 2295, 2276, 2276, 2276, 2295, 2263, 2205, 2268, 2220, 2172, 2276, 2276, 2276, 2296, 2276, 2276, 2296, 2294, 2276, 2276, 2278, 2281, 2281, 2280, 2281, 2281, 2281, 2283, 2206, 2223, 2276, 2276, 2279, 2281, 2281, 2146, 2273, 2276, 2276, 2281, 2281, 2281, 2276, 2292, 2276, 2298, 2225, 2276, 2298, 2169, 2224, 2292, 2298, 2171, 2229, 2281, 2281, 2171, 2236, 2281, 2281, 2281, 2146, 2275, 2225, 2292, 2299, 2276, 2229, 2281, 2146, 2276, 2290, 2297, 2283, 2146, 2146, 2274, 2224, 2227, 2298, 2225, 2297, 2276, 2230, 2170, 2230, 2282, 2146, 2147, 2151, 2156, 2288, 2276, 2230, 2303, 2308, 2236, 2284, 2228, 2318, 2318, 2318, 2326, 2335, 2339, 2343, 2349, 2416, 2693, 2357, 2592, 2109, 2592, 2592, 2162, 2943, 2823, 2646, 2592, 2361, 2592, 2122, 2592, 2592, 2122, 2470, 2592, 2592, 2592, 2109, 2107, 2592, 2592, 2592, 2123, 2592, 2592, 2592, 2125, 2592, 2413, 2592, 2592, 2592, 2127, 2592, 2592, 2414, 2592, 2592, 2592, 2130, 2952, 2592, 2594, 2592, 2592, 2212, 2609, 2252, 2592, 2592, 2592, 2446, 2434, 2592, 2592, 2592, 2212, 2446, 2450, 2456, 2431, 2435, 2592, 2592, 2243, 2478, 2448, 2439, 2946, 2592, 2592, 2592, 2368, 2809, 2813, 2450, 2441, 2212, 2812, 2449, 2440, 2947, 2592, 2592, 2592, 2345, 2451, 2457, 2948, 2592, 2124, 2592, 2592, 2650, 2823, 2449, 2455, 2946, 2592, 2128, 2592, 2592, 2649, 2952, 2592, 2810, 2448, 2461, 2991, 2467, 2592, 2592, 2329, 2817, 2474, 2990, 2466, 2592, 2592, 2373, 2447, 2992, 2469, 2592, 2592, 2592, 2373, 2447, 2477, 2468, 2592, 2592, 2353, 2469, 2592, 2495, 2592, 2592, 2415, 2483, 2592, 2415, 2496, 2592, 2592, 2352, 2592, 2592, 2352, 2352, 2469, 2592, 2592, 2363, 2331, 2494, 2592, 2592, 2592, 2375, 2592, 2375, 2415, 2504, 2592, 2592, 2367, 2372, 2503, 2592, 2592, 2592, 2389, 2418, 2415, 2592, 2592, 2373, 2592, 2592, 2592, 2593, 2732, 2417, 2415, 2592, 2417, 2520, 2592, 2592, 2592, 2390, 2521, 2521, 2592, 2592, 2592, 2401, 2599, 2585, 2526, 2531, 2120, 2592, 2212, 2426, 2450, 2463, 2948, 2592, 2592, 2592, 2213, 2389, 2527, 2532, 2121, 2542, 2551, 2105, 2592, 2213, 2592, 2592, 2592, 2558, 2538, 2544, 2553, 2557, 2537, 2543, 2552, 2421, 2572, 2576, 2546, 2543, 2547, 2592, 2592, 2373, 2615, 2575, 2545, 2105, 2592, 2244, 2479, 2592, 2129, 2592, 2592, 2628, 2690, 2469, 2562, 2566, 2592, 2592, 2592, 2415, 2928, 2934, 2401, 2570, 2574, 2564, 2572, 2585, 2590, 2592, 2592, 2585, 2965, 2592, 2592, 2592, 2445, 2251, 2592, 2592, 2592, 2474, 2592, 2609, 2892, 2592, 2362, 2592, 2592, 2138, 2851, 2159, 2592, 2592, 2592, 2509, 2888, 2892, 2592, 2592, 2592, 2490, 2418, 2891, 2592, 2592, 2376, 2592, 2592, 2374, 2592, 2889, 2388, 2592, 2373, 2373, 2890, 2592, 2592, 2387, 2592, 2887, 2505, 2892, 2592, 2373, 2610, 2388, 2592, 2592, 2376, 2373, 2592, 2887, 2891, 2592, 2374, 2592, 2592, 2608, 2159, 2614, 2620, 2592, 2592, 2394, 2594, 2887, 2399, 2592, 2887, 2397, 2508, 2374, 2507, 2592, 2375, 2592, 2592, 2592, 2595, 2508, 2506, 2592, 2506, 2505, 2505, 2592, 2507, 2637, 2505, 2592, 2592, 2401, 2661, 2592, 2643, 2592, 2592, 2417, 2592, 2655, 2592, 2592, 2592, 2510, 2414, 2656, 2592, 2592, 2592, 2516, 2592, 2593, 2660, 2665, 2880, 2592, 2592, 2592, 2522, 2767, 2666, 2881, 2592, 2592, 2420, 2571, 2696, 2592, 2592, 2592, 2580, 2572, 2686, 2632, 2698, 2592, 2383, 2514, 2592, 2163, 2932, 2465, 2685, 2631, 2697, 2592, 2388, 2592, 2592, 2212, 2604, 2671, 2632, 2678, 2592, 2401, 2405, 2409, 2592, 2592, 2592, 2679, 2592, 2592, 2592, 2592, 2108, 2677, 2591, 2592, 2592, 2592, 2419, 2592, 2683, 2187, 2191, 2469, 2671, 2189, 2467, 2592, 2401, 2629, 2633, 2702, 2468, 2592, 2592, 2421, 2536, 2703, 2469, 2592, 2592, 2422, 2573, 2593, 2672, 2467, 2592, 2402, 2406, 2592, 2402, 2979, 2592, 2592, 2626, 2673, 2467, 2592, 2446, 2259, 2947, 2592, 2377, 2709, 2592, 2592, 2522, 2862, 2713, 2468, 2592, 2592, 2581, 2572, 2562, 2374, 2374, 2592, 2376, 2721, 2724, 2592, 2592, 2624, 2373, 2731, 2592, 2592, 2592, 2626, 2732, 2592, 2592, 2592, 2755, 2656, 2726, 2736, 2741, 2592, 2486, 2593, 2381, 2592, 2727, 2737, 2742, 2715, 2747, 2753, 2592, 2498, 2469, 2873, 2743, 2592, 2592, 2592, 2791, 2759, 2763, 2592, 2592, 2627, 2704, 2592, 2592, 2522, 2789, 2593, 2761, 2753, 2592, 2498, 2863, 2592, 2592, 2767, 2592, 2592, 2592, 2792, 2789, 2592, 2592, 2592, 2803, 2126, 2592, 2592, 2592, 2811, 2122, 2592, 2592, 2592, 2834, 2777, 2592, 2592, 2592, 2848, 2936, 2591, 2489, 2797, 2592, 2592, 2670, 2631, 2490, 2798, 2592, 2592, 2592, 2963, 2807, 2592, 2592, 2592, 2965, 2838, 2592, 2592, 2592, 2975, 2330, 2818, 2829, 2592, 2498, 2939, 2592, 2498, 2592, 2791, 2331, 2819, 2830, 2592, 2592, 2592, 2982, 2834, 2817, 2828, 2106, 2592, 2592, 2592, 2405, 2405, 2817, 2828, 2592, 2592, 2415, 2849, 2842, 2592, 2522, 2773, 2592, 2522, 2868, 2592, 2580, 2600, 2586, 2137, 2850, 2843, 2592, 2592, 2855, 2937, 2844, 2592, 2592, 2592, 2987, 2936, 2591, 2592, 2592, 2684, 2630, 2592, 2856, 2938, 2592, 2592, 2860, 2939, 2592, 2592, 2872, 2592, 2861, 2591, 2592, 2592, 2887, 2616, 2592, 2867, 2592, 2592, 2708, 2592, 2498, 2469, 2498, 2497, 2785, 2773, 2499, 2783, 2770, 2877, 2877, 2877, 2772, 2592, 2592, 2345, 2885, 2592, 2592, 2592, 2715, 2762, 2515, 2896, 2592, 2592, 2715, 2917, 2516, 2897, 2592, 2592, 2592, 2901, 2906, 2911, 2592, 2592, 2956, 2960, 2715, 2902, 2907, 2912, 2593, 2916, 2920, 2820, 2922, 2822, 2592, 2592, 2715, 2927, 2921, 2821, 2106, 2592, 2592, 2974, 2408, 2321, 2821, 2106, 2592, 2592, 2983, 2592, 2593, 2404, 2408, 2592, 2592, 2717, 2749, 2716, 2928, 2322, 2822, 2593, 2926, 2919, 2820, 2934, 2823, 2592, 2592, 2592, 2651, 2824, 2592, 2592, 2592, 2130, 2952, 2592, 2592, 2592, 2592, 2964, 2592, 2592, 2716, 2748, 2592, 2969, 2592, 2592, 2716, 2918, 2368, 2970, 2592, 2592, 2592, 2403, 2407, 2592, 2592, 2787, 2211, 2404, 2409, 2592, 2592, 2802, 2837, 2987, 2592, 2592, 2592, 2809, 2427, 2592, 2793, 2592, 2592, 2809, 2447, 1073741824, 0x80000000, 539754496, 542375936, 402653184, 554434560, 571736064, 545521856, 268451840, 335544320, 268693630, 512, 2048, 256, 1024, 0, 1024, 0, 1073741824, 0x80000000, 0, 0, 0, 8388608, 0, 0, 1073741824, 1073741824, 0, 0x80000000, 537133056, 4194304, 1048576, 268435456, -1073741824, 0, 0, 0, 1048576, 0, 0, 0, 1572864, 0, 0, 0, 4194304, 0, 134217728, 16777216, 0, 0, 32, 64, 98304, 0, 33554432, 8388608, 192, 67108864, 67108864, 67108864, 67108864, 16, 32, 4, 0, 8192, 196608, 196608, 229376, 80, 4096, 524288, 8388608, 0, 0, 32, 128, 256, 24576, 24600, 24576, 24576, 2, 24576, 24576, 24576, 24584, 24592, 24576, 24578, 24576, 24578, 24576, 24576, 16, 512, 2048, 2048, 256, 4096, 32768, 1048576, 4194304, 67108864, 134217728, 268435456, 262144, 134217728, 0, 128, 128, 64, 16384, 16384, 16384, 67108864, 32, 32, 4, 4, 4096, 262144, 134217728, 0, 0, 0, 2, 0, 8192, 131072, 131072, 4096, 4096, 4096, 4096, 24576, 24576, 24576, 8, 8, 24576, 24576, 16384, 16384, 16384, 24576, 24584, 24576, 24576, 24576, 16384, 24576, 536870912, 262144, 0, 0, 32, 2048, 8192, 4, 4096, 4096, 4096, 786432, 8388608, 16777216, 0, 128, 16384, 16384, 16384, 32768, 65536, 2097152, 32, 32, 32, 32, 4, 4, 4, 4, 4, 4096, 67108864, 67108864, 67108864, 24576, 24576, 24576, 24576, 0, 16384, 16384, 16384, 16384, 67108864, 67108864, 8, 67108864, 24576, 8, 8, 8, 24576, 24576, 24576, 24578, 24576, 24576, 24576, 2, 2, 2, 16384, 67108864, 67108864, 67108864, 32, 67108864, 8, 8, 24576, 2048, 0x80000000, 536870912, 262144, 262144, 262144, 67108864, 8, 24576, 16384, 32768, 1048576, 4194304, 25165824, 67108864, 24576, 32770, 2, 4, 112, 512, 98304, 524288, 50, 402653186, 1049090, 1049091, 10, 66, 100925514, 10, 66, 12582914, 0, 0, -1678194207, -1678194207, -1041543218, 0, 32768, 0, 0, 32, 65536, 268435456, 1, 1, 513, 1048577, 0, 12582912, 0, 0, 0, 4, 1792, 0, 0, 0, 7, 29360128, 0, 0, 0, 8, 0, 0, 0, 12, 1, 1, 0, 0, -604102721, -604102721, 4194304, 8388608, 0, 0, 0, 31, 925600, 997981306, 997981306, 997981306, 0, 0, 2048, 8388608, 0, 0, 1, 2, 4, 32, 64, 512, 8192, 0, 0, 0, 245760, 997720064, 0, 0, 0, 32, 0, 0, 0, 3, 12, 16, 32, 8, 112, 3072, 12288, 16384, 32768, 65536, 131072, 7864320, 16777216, 973078528, 0, 0, 65536, 131072, 3670016, 4194304, 16777216, 33554432, 2, 8, 48, 2048, 8192, 16384, 32768, 65536, 131072, 524288, 131072, 524288, 3145728, 4194304, 16777216, 33554432, 65536, 131072, 2097152, 4194304, 16777216, 33554432, 134217728, 268435456, 536870912, 0, 0, 0, 1024, 0, 8, 48, 2048, 8192, 65536, 33554432, 268435456, 536870912, 65536, 268435456, 536870912, 0, 0, 32768, 0, 0, 126, 623104, 65011712, 0, 32, 65536, 536870912, 0, 0, 65536, 524288, 0, 32, 65536, 0, 0, 0, 2048, 0, 0, 0, 15482, 245760, -604102721, 0, 0, 0, 18913, 33062912, 925600, -605028352, 0, 0, 0, 65536, 31, 8096, 131072, 786432, 3145728, 3145728, 12582912, 50331648, 134217728, 268435456, 160, 256, 512, 7168, 131072, 786432, 131072, 786432, 1048576, 2097152, 12582912, 16777216, 268435456, 1073741824, 0x80000000, 12582912, 16777216, 33554432, 268435456, 1073741824, 0x80000000, 3, 12, 16, 160, 256, 7168, 786432, 1048576, 12582912, 16777216, 268435456, 1073741824, 0, 8, 16, 32, 128, 256, 512, 7168, 786432, 1048576, 2097152, 0, 1, 2, 8, 16, 7168, 786432, 1048576, 8388608, 16777216, 16777216, 1073741824, 0, 0, 0, 0, 1, 0, 0, 8, 32, 128, 256, 7168, 8, 32, 0, 3072, 0, 8, 32, 3072, 4096, 524288, 8, 32, 0, 0, 3072, 4096, 0, 2048, 524288, 8388608, 8, 2048, 0, 0, 1, 12, 256, 4096, 32768, 262144, 1048576, 4194304, 67108864, 0, 2048, 0, 2048, 2048, 1073741824, -58805985, -58805985, -58805985, 0, 0, 262144, 0, 0, 32, 4194304, 16777216, 134217728, 4382, 172032, -58982400, 0, 0, 2, 28, 256, 4096, 8192, 8192, 32768, 131072, 262144, 524288, 1, 2, 12, 256, 4096, 0, 0, 4194304, 67108864, 134217728, 805306368, 1073741824, 0, 0, 1, 2, 12, 16, 256, 4096, 1048576, 67108864, 134217728, 268435456, 0, 512, 1048576, 4194304, 201326592, 1879048192, 0, 0, 12, 256, 4096, 134217728, 268435456, 536870912, 12, 256, 268435456, 536870912, 0, 12, 256, 0, 0, 1, 32, 64, 512, 0, 0, 205236961, 205236961, 0, 0, 0, 1, 96, 640, 1, 10976, 229376, 204996608, 0, 640, 2048, 8192, 229376, 1572864, 1572864, 2097152, 201326592, 0, 0, 0, 64, 512, 2048, 229376, 1572864, 201326592, 1572864, 201326592, 0, 0, 1, 4382, 0, 1, 32, 2048, 65536, 131072, 1572864, 201326592, 131072, 1572864, 134217728, 0, 0, 524288, 524288, 0, 0, 0, -68582786, -68582786, -68582786, 0, 0, 2097152, 524288, 0, 524288, 0, 0, 65536, 131072, 1572864, 0, 0, 2, 4, 0, 0, 65011712, -134217728, 0, 0, 0, 0, 2, 4, 120, 512, -268435456, 0, 0, 0, 2, 8, 48, 64, 2048, 8192, 98304, 524288, 2097152, 4194304, 25165824, 33554432, 134217728, 268435456, 0x80000000, 0, 0, 25165824, 33554432, 134217728, 1879048192, 0x80000000, 0, 0, 4, 112, 512, 622592, 65011712, 134217728, -268435456, 16777216, 33554432, 134217728, 1610612736, 0, 0, 0, 64, 98304, 524288, 4194304, 16777216, 33554432, 0, 98304, 524288, 16777216, 33554432, 0, 65536, 524288, 33554432, 536870912, 1073741824, 0, 65536, 524288, 536870912, 1073741824, 0, 0, 65536, 524288, 536870912, 0, 524288, 0, 524288, 524288, 1048576, 2086666240, 0x80000000, 0, -1678194207, 0, 0, 0, 8, 32, 2048, 524288, 8388608, 0, 0, 33062912, 436207616, 0x80000000, 0, 0, 32, 64, 2432, 16384, 32768, 32768, 524288, 3145728, 4194304, 25165824, 25165824, 167772160, 268435456, 0x80000000, 0, 32, 64, 384, 2048, 16384, 32768, 1048576, 2097152, 4194304, 25165824, 32, 64, 128, 256, 2048, 16384, 2048, 16384, 1048576, 4194304, 16777216, 33554432, 134217728, 536870912, 1073741824, 0, 0, 2048, 16384, 4194304, 16777216, 33554432, 134217728, 805306368, 0, 0, 16777216, 134217728, 268435456, 0x80000000, 0, 622592, 622592, 622592, 8807, 8807, 434791, 0, 0, 16777216, 0, 0, 0, 7, 608, 8192, 0, 0, 0, 3, 4, 96, 512, 32, 64, 8192, 0, 0, 16777216, 134217728, 0, 0, 2, 4, 8192, 16384, 65536, 2097152, 33554432, 268435456 +]; + +XQueryTokenizer.TOKEN = +[ + "(0)", + "ModuleDecl", + "Annotation", + "OptionDecl", + "Operator", + "Variable", + "Tag", + "EndTag", + "PragmaContents", + "DirCommentContents", + "DirPIContents", + "CDataSectionContents", + "AttrTest", + "Wildcard", + "EQName", + "IntegerLiteral", + "DecimalLiteral", + "DoubleLiteral", + "PredefinedEntityRef", + "'\"\"'", + "EscapeApos", + "QuotChar", + "AposChar", + "ElementContentChar", + "QuotAttrContentChar", + "AposAttrContentChar", + "NCName", + "QName", + "S", + "CharRef", + "CommentContents", + "DocTag", + "DocCommentContents", + "EOF", + "'!'", + "'\"'", + "'#'", + "'#)'", + "''''", + "'('", + "'(#'", + "'(:'", + "'(:~'", + "')'", + "'*'", + "'*'", + "','", + "'-->'", + "'.'", + "'/'", + "'/>'", + "':'", + "':)'", + "';'", + "''), token: xmlcomment, next: function(stack){ stack.pop(); } } + ], + CData: [ + { name: 'CDataSectionContents', token: cdata }, + { name: n(']]>'), token: cdata, next: function(stack){ stack.pop(); } } + ], + PI: [ + { name: 'DirPIContents', token: pi }, + { name: n('?'), token: pi }, + { name: n('?>'), token: pi, next: function(stack){ stack.pop(); } } + ], + AposString: [ + { name: n('\'\''), token: 'string', next: function(stack){ stack.pop(); } }, + { name: 'PredefinedEntityRef', token: 'constant.language.escape' }, + { name: 'CharRef', token: 'constant.language.escape' }, + { name: 'EscapeApos', token: 'constant.language.escape' }, + { name: 'AposChar', token: 'string' } + ], + QuotString: [ + { name: n('"'), token: 'string', next: function(stack){ stack.pop(); } }, + { name: 'PredefinedEntityRef', token: 'constant.language.escape' }, + { name: 'CharRef', token: 'constant.language.escape' }, + { name: 'EscapeQuot', token: 'constant.language.escape' }, + { name: 'QuotChar', token: 'string' } + ] +}; + +exports.XQueryLexer = function(){ return new Lexer(XQueryTokenizer, Rules); }; +},{"./XQueryTokenizer":"/node_modules/xqlint/lib/lexers/XQueryTokenizer.js","./lexer":"/node_modules/xqlint/lib/lexers/lexer.js"}]},{},["/node_modules/xqlint/lib/lexers/xquery_lexer.js"]); + +}); + +ace.define("ace/mode/behaviour/xml",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +function is(token, type) { + return token.type.lastIndexOf(type + ".xml") > -1; +} + +var XmlBehaviour = function () { + + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { + if (text == '"' || text == "'") { + var quote = text; + var selected = session.doc.getTextRange(editor.getSelectionRange()); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return { + text: quote + selected + quote, + selection: false + }; + } + + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (rightChar == quote && (is(token, "attribute-value") || is(token, "string"))) { + return { + text: "", + selection: [1, 1] + }; + } + + if (!token) + token = iterator.stepBackward(); + + if (!token) + return; + + while (is(token, "tag-whitespace") || is(token, "whitespace")) { + token = iterator.stepBackward(); + } + var rightSpace = !rightChar || rightChar.match(/\s/); + if (is(token, "attribute-equals") && (rightSpace || rightChar == '>') || (is(token, "decl-attribute-equals") && (rightSpace || rightChar == '?'))) { + return { + text: quote + quote, + selection: [1, 1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + + this.add("autoclosing", "insertion", function (state, action, editor, session, text) { + if (text == '>') { + var position = editor.getSelectionRange().start; + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken() || iterator.stepBackward(); + if (!token || !(is(token, "tag-name") || is(token, "tag-whitespace") || is(token, "attribute-name") || is(token, "attribute-equals") || is(token, "attribute-value"))) + return; + if (is(token, "reference.attribute-value")) + return; + if (is(token, "attribute-value")) { + var firstChar = token.value.charAt(0); + if (firstChar == '"' || firstChar == "'") { + var lastChar = token.value.charAt(token.value.length - 1); + var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length; + if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar) + return; + } + } + while (!is(token, "tag-name")) { + token = iterator.stepBackward(); + if (token.value == "<") { + token = iterator.stepForward(); + break; + } + } + + var tokenRow = iterator.getCurrentTokenRow(); + var tokenColumn = iterator.getCurrentTokenColumn(); + if (is(iterator.stepBackward(), "end-tag-open")) + return; + + var element = token.value; + if (tokenRow == position.row) + element = element.substring(0, position.column - tokenColumn); + + if (this.voidElements.hasOwnProperty(element.toLowerCase())) + return; + + return { + text: ">" + "", + selection: [1, 1] + }; + } + }); + + this.add("autoindent", "insertion", function (state, action, editor, session, text) { + if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.getLine(cursor.row); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + if (token && token.type.indexOf("tag-close") !== -1) { + if (token.value == "/>") + return; + while (token && token.type.indexOf("tag-name") === -1) { + token = iterator.stepBackward(); + } + + if (!token) { + return; + } + + var tag = token.value; + var row = iterator.getCurrentTokenRow(); + token = iterator.stepBackward(); + if (!token || token.type.indexOf("end-tag") !== -1) { + return; + } + + if (this.voidElements && !this.voidElements[tag]) { + var nextToken = session.getTokenAt(cursor.row, cursor.column+1); + var line = session.getLine(row); + var nextIndent = this.$getIndent(line); + var indent = nextIndent + session.getTabString(); + + if (nextToken && nextToken.value === "') { + var position = editor.getCursorPosition(); + var iterator = new TokenIterator(session, position.row, position.column); + var token = iterator.getCurrentToken(); + var atCursor = false; + var state = JSON.parse(state).pop(); + if ((token && token.value === '>') || state !== "StartTag") return; + if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){ + do { + token = iterator.stepBackward(); + } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text'))); + } else { + atCursor = true; + } + var previous = iterator.stepBackward(); + if (!token || !hasType(token, 'meta.tag') || (previous !== null && previous.value.match('/'))) { + return + } + var tag = token.value.substring(1); + if (atCursor){ + var tag = tag.substring(0, position.column - token.start); + } + + return { + text: '>' + '', + selection: [1, 1] + } + } + }); + + } + oop.inherits(XQueryBehaviour, Behaviour); + + exports.XQueryBehaviour = XQueryBehaviour; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/xquery",["require","exports","module","ace/worker/worker_client","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/xquery/xquery_lexer","ace/range","ace/mode/behaviour/xquery","ace/mode/folding/cstyle","ace/anchor"], function(require, exports, module) { +"use strict"; + +var WorkerClient = require("../worker/worker_client").WorkerClient; +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var XQueryLexer = require("./xquery/xquery_lexer").XQueryLexer; +var Range = require("../range").Range; +var XQueryBehaviour = require("./behaviour/xquery").XQueryBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; +var Anchor = require("../anchor").Anchor; + +var Mode = function() { + this.$tokenizer = new XQueryLexer(); + this.$behaviour = new XQueryBehaviour(); + this.foldingRules = new CStyleFoldMode(); + this.$highlightRules = new TextHighlightRules(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.completer = { + getCompletions: function(editor, session, pos, prefix, callback) { + if (!session.$worker) + return callback(); + session.$worker.emit("complete", { data: { pos: pos, prefix: prefix } }); + session.$worker.on("complete", function(e){ + callback(null, e.data); + }); + } + }; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + var match = line.match(/\s*(?:then|else|return|[{\(]|<\w+>)\s*$/); + if (match) + indent += tab; + return indent; + }; + + this.checkOutdent = function(state, line, input) { + if (! /^\s+$/.test(line)) + return false; + + return (/^\s*[\}\)]/).test(input); + }; + + this.autoOutdent = function(state, doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*[\}\)])/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var i, line; + var outdent = true; + var re = /^\s*\(:(.*):\)/; + + for (i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + var range = new Range(0, 0, 0, 0); + for (i=startRow; i<= endRow; i++) { + line = doc.getLine(i); + range.start.row = i; + range.end.row = i; + range.end.column = line.length; + + doc.replace(range, outdent ? line.match(re)[1] : "(:" + line + ":)"); + } + }; + + this.createWorker = function(session) { + + var worker = new WorkerClient(["ace"], "ace/mode/xquery_worker", "XQueryWorker"); + var that = this; + + worker.attachToDocument(session.getDocument()); + + worker.on("ok", function(e) { + session.clearAnnotations(); + }); + + worker.on("markers", function(e) { + session.clearAnnotations(); + that.addMarkers(e.data, session); + }); + + worker.on("highlight", function(tokens) { + that.$tokenizer.tokens = tokens.data.tokens; + that.$tokenizer.lines = session.getDocument().getAllLines(); + + var rows = Object.keys(that.$tokenizer.tokens); + for(var i=0; i < rows.length; i++) { + var row = parseInt(rows[i]); + delete session.bgTokenizer.lines[row]; + delete session.bgTokenizer.states[row]; + session.bgTokenizer.fireUpdateEvent(row, row); + } + }); + + return worker; + }; + + this.removeMarkers = function(session) { + var markers = session.getMarkers(false); + for (var id in markers) { + if (markers[id].clazz.indexOf('language_highlight_') === 0) { + session.removeMarker(id); + } + } + for (var i = 0; i < session.markerAnchors.length; i++) { + session.markerAnchors[i].detach(); + } + session.markerAnchors = []; + }; + + this.addMarkers = function(annos, mySession) { + var _self = this; + + if (!mySession.markerAnchors) mySession.markerAnchors = []; + this.removeMarkers(mySession); + mySession.languageAnnos = []; + annos.forEach(function(anno) { + var anchor = new Anchor(mySession.getDocument(), anno.pos.sl, anno.pos.sc || 0); + mySession.markerAnchors.push(anchor); + var markerId; + var colDiff = anno.pos.ec - anno.pos.sc; + var rowDiff = anno.pos.el - anno.pos.sl; + var gutterAnno = { + guttertext: anno.message, + type: anno.level || "warning", + text: anno.message + }; + + function updateFloat(single) { + if (markerId) + mySession.removeMarker(markerId); + gutterAnno.row = anchor.row; + if (anno.pos.sc !== undefined && anno.pos.ec !== undefined) { + var range = new Range(anno.pos.sl, anno.pos.sc, anno.pos.el, anno.pos.ec); + markerId = mySession.addMarker(range, "language_highlight_" + (anno.type ? anno.type : "default")); + } + if (single) mySession.setAnnotations(mySession.languageAnnos); + } + updateFloat(); + anchor.on("change", function() { + updateFloat(true); + }); + if (anno.message) mySession.languageAnnos.push(gutterAnno); + }); + mySession.setAnnotations(mySession.languageAnnos); + }; + + this.$id = "ace/mode/xquery"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/src/libs/ace/mode-yaml.js b/src/libs/ace/mode-yaml.js new file mode 100755 index 0000000..8fbc403 --- /dev/null +++ b/src/libs/ace/mode-yaml.js @@ -0,0 +1,289 @@ +ace.define("ace/mode/yaml_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var YamlHighlightRules = function() { + this.$rules = { + "start" : [ + { + token : "comment", + regex : "#.*$" + }, { + token : "list.markup", + regex : /^(?:-{3}|\.{3})\s*(?=#|$)/ + }, { + token : "list.markup", + regex : /^\s*[\-?](?:$|\s)/ + }, { + token: "constant", + regex: "!![\\w//]+" + }, { + token: "constant.language", + regex: "[&\\*][a-zA-Z0-9-_]+" + }, { + token: ["meta.tag", "keyword"], + regex: /^(\s*\w.*?)(:(?:\s+|$))/ + },{ + token: ["meta.tag", "keyword"], + regex: /(\w+?)(\s*:(?:\s+|$))/ + }, { + token : "keyword.operator", + regex : "<<\\w*:\\w*" + }, { + token : "keyword.operator", + regex : "-\\s*(?=[{])" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // multi line string start + regex : /[|>][-+\d\s]*$/, + onMatch: function(val, state, stack, line) { + var indent = /^\s*/.exec(line)[0]; + if (stack.length < 1) { + stack.push(this.next); + } else { + stack[0] = "mlString"; + } + + if (stack.length < 2) { + stack.push(indent.length); + } + else { + stack[1] = indent.length; + } + return this.token; + }, + next : "mlString" + }, { + token : "string", // single quoted string + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // float + regex : /(\b|[+\-\.])[\d_]+(?:(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)/ + }, { + token : "constant.numeric", // other number + regex : /[+\-]?\.inf\b|NaN\b|0x[\dA-Fa-f_]+|0b[10_]+/ + }, { + token : "constant.language.boolean", + regex : "\\b(?:true|false|TRUE|FALSE|True|False|yes|no)\\b" + }, { + token : "paren.lparen", + regex : "[[({]" + }, { + token : "paren.rparen", + regex : "[\\])}]" + } + ], + "mlString" : [ + { + token : "indent", + regex : /^\s*$/ + }, { + token : "indent", + regex : /^\s*/, + onMatch: function(val, state, stack) { + var curIndent = stack[1]; + + if (curIndent >= val.length) { + this.next = "start"; + stack.splice(0); + } + else { + this.next = "mlString"; + } + return this.token; + }, + next : "mlString" + }, { + token : "string", + regex : '.+' + } + ]}; + this.normalizeRules(); + +}; + +oop.inherits(YamlHighlightRules, TextHighlightRules); + +exports.YamlHighlightRules = YamlHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/folding/coffee",["require","exports","module","ace/lib/oop","ace/mode/folding/fold_mode","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var BaseFoldMode = require("./fold_mode").FoldMode; +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.getFoldWidgetRange = function(session, foldStyle, row) { + var range = this.indentationBlock(session, row); + if (range) + return range; + + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1 || line[startLevel] != "#") + return; + + var startColumn = line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + line = session.getLine(row); + var level = line.search(re); + + if (level == -1) + continue; + + if (line[level] != "#") + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + var indent = line.search(/\S/); + var next = session.getLine(row + 1); + var prev = session.getLine(row - 1); + var prevIndent = prev.search(/\S/); + var nextIndent = next.search(/\S/); + + if (indent == -1) { + session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : ""; + return ""; + } + if (prevIndent == -1) { + if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") { + session.foldWidgets[row - 1] = ""; + session.foldWidgets[row + 1] = ""; + return "start"; + } + } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") { + if (session.getLine(row - 2).search(/\S/) == -1) { + session.foldWidgets[row - 1] = "start"; + session.foldWidgets[row + 1] = ""; + return ""; + } + } + + if (prevIndent!= -1 && prevIndent < indent) + session.foldWidgets[row - 1] = "start"; + else + session.foldWidgets[row - 1] = ""; + + if (indent < nextIndent) + return "start"; + else + return ""; + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/yaml",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/yaml_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var YamlHighlightRules = require("./yaml_highlight_rules").YamlHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var FoldMode = require("./folding/coffee").FoldMode; + +var Mode = function() { + this.HighlightRules = YamlHighlightRules; + this.$outdent = new MatchingBraceOutdent(); + this.foldingRules = new FoldMode(); + this.$behaviour = this.$defaultBehaviour; +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "#"; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + + this.$id = "ace/mode/yaml"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/src/libs/ace/snippets/abap.js b/src/libs/ace/snippets/abap.js new file mode 100755 index 0000000..0ef2911 --- /dev/null +++ b/src/libs/ace/snippets/abap.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/abap",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "abap"; + +}); diff --git a/src/libs/ace/snippets/abc.js b/src/libs/ace/snippets/abc.js new file mode 100755 index 0000000..1703076 --- /dev/null +++ b/src/libs/ace/snippets/abc.js @@ -0,0 +1,38 @@ +ace.define("ace/snippets/abc",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "\n\ +snippet zupfnoter.print\n\ + %%%%hn.print {\"startpos\": ${1:pos_y}, \"t\":\"${2:title}\", \"v\":[${3:voices}], \"s\":[[${4:syncvoices}1,2]], \"f\":[${5:flowlines}], \"sf\":[${6:subflowlines}], \"j\":[${7:jumplines}]}\n\ +\n\ +snippet zupfnoter.note\n\ + %%%%hn.note {\"pos\": [${1:pos_x},${2:pos_y}], \"text\": \"${3:text}\", \"style\": \"${4:style}\"}\n\ +\n\ +snippet zupfnoter.annotation\n\ + %%%%hn.annotation {\"id\": \"${1:id}\", \"pos\": [${2:pos}], \"text\": \"${3:text}\"}\n\ +\n\ +snippet zupfnoter.lyrics\n\ + %%%%hn.lyrics {\"pos\": [${1:x_pos},${2:y_pos}]}\n\ +\n\ +snippet zupfnoter.legend\n\ + %%%%hn.legend {\"pos\": [${1:x_pos},${2:y_pos}]}\n\ +\n\ +\n\ +\n\ +snippet zupfnoter.target\n\ + \"^:${1:target}\"\n\ +\n\ +snippet zupfnoter.goto\n\ + \"^@${1:target}@${2:distance}\"\n\ +\n\ +snippet zupfnoter.annotationref\n\ + \"^#${1:target}\"\n\ +\n\ +snippet zupfnoter.annotation\n\ + \"^!${1:text}@${2:x_offset},${3:y_offset}\"\n\ +\n\ +\n\ +"; +exports.scope = "abc"; + +}); diff --git a/src/libs/ace/snippets/actionscript.js b/src/libs/ace/snippets/actionscript.js new file mode 100755 index 0000000..bc899d1 --- /dev/null +++ b/src/libs/ace/snippets/actionscript.js @@ -0,0 +1,164 @@ +ace.define("ace/snippets/actionscript",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet main\n\ + package {\n\ + import flash.display.*;\n\ + import flash.Events.*;\n\ + \n\ + public class Main extends Sprite {\n\ + public function Main ( ) {\n\ + trace(\"start\");\n\ + stage.scaleMode = StageScaleMode.NO_SCALE;\n\ + stage.addEventListener(Event.RESIZE, resizeListener);\n\ + }\n\ + \n\ + private function resizeListener (e:Event):void {\n\ + trace(\"The application window changed size!\");\n\ + trace(\"New width: \" + stage.stageWidth);\n\ + trace(\"New height: \" + stage.stageHeight);\n\ + }\n\ + \n\ + }\n\ + \n\ + }\n\ +snippet class\n\ + ${1:public|internal} class ${2:name} ${3:extends } {\n\ + public function $2 ( ) {\n\ + (\"start\");\n\ + }\n\ + }\n\ +snippet all\n\ + package name {\n\ +\n\ + ${1:public|internal|final} class ${2:name} ${3:extends } {\n\ + private|public| static const FOO = \"abc\";\n\ + private|public| static var BAR = \"abc\";\n\ +\n\ + // class initializer - no JIT !! one time setup\n\ + if Cababilities.os == \"Linux|MacOS\" {\n\ + FOO = \"other\";\n\ + }\n\ +\n\ + // constructor:\n\ + public function $2 ( ){\n\ + super2();\n\ + trace(\"start\");\n\ + }\n\ + public function name (a, b...){\n\ + super.name(..);\n\ + lable:break\n\ + }\n\ + }\n\ + }\n\ +\n\ + function A(){\n\ + // A can only be accessed within this file\n\ + }\n\ +snippet switch\n\ + switch(${1}){\n\ + case ${2}:\n\ + ${3}\n\ + break;\n\ + default:\n\ + }\n\ +snippet case\n\ + case ${1}:\n\ + ${2}\n\ + break;\n\ +snippet package\n\ + package ${1:package}{\n\ + ${2}\n\ + }\n\ +snippet wh\n\ + while ${1:cond}{\n\ + ${2}\n\ + }\n\ +snippet do\n\ + do {\n\ + ${2}\n\ + } while (${1:cond})\n\ +snippet while\n\ + while ${1:cond}{\n\ + ${2}\n\ + }\n\ +snippet for enumerate names\n\ + for (${1:var} in ${2:object}){\n\ + ${3}\n\ + }\n\ +snippet for enumerate values\n\ + for each (${1:var} in ${2:object}){\n\ + ${3}\n\ + }\n\ +snippet get_set\n\ + function get ${1:name} {\n\ + return ${2}\n\ + }\n\ + function set $1 (newValue) {\n\ + ${3}\n\ + }\n\ +snippet interface\n\ + interface name {\n\ + function method(${1}):${2:returntype};\n\ + }\n\ +snippet try\n\ + try {\n\ + ${1}\n\ + } catch (error:ErrorType) {\n\ + ${2}\n\ + } finally {\n\ + ${3}\n\ + }\n\ +# For Loop (same as c.snippet)\n\ +snippet for for (..) {..}\n\ + for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) {\n\ + ${4:/* code */}\n\ + }\n\ +# Custom For Loop\n\ +snippet forr\n\ + for (${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) {\n\ + ${5:/* code */}\n\ + }\n\ +# If Condition\n\ +snippet if\n\ + if (${1:/* condition */}) {\n\ + ${2:/* code */}\n\ + }\n\ +snippet el\n\ + else {\n\ + ${1}\n\ + }\n\ +# Ternary conditional\n\ +snippet t\n\ + ${1:/* condition */} ? ${2:a} : ${3:b}\n\ +snippet fun\n\ + function ${1:function_name}(${2})${3}\n\ + {\n\ + ${4:/* code */}\n\ + }\n\ +# FlxSprite (usefull when using the flixel library)\n\ +snippet FlxSprite\n\ + package\n\ + {\n\ + import org.flixel.*\n\ +\n\ + public class ${1:ClassName} extends ${2:FlxSprite}\n\ + {\n\ + public function $1(${3: X:Number, Y:Number}):void\n\ + {\n\ + super(X,Y);\n\ + ${4: //code...}\n\ + }\n\ +\n\ + override public function update():void\n\ + {\n\ + super.update();\n\ + ${5: //code...}\n\ + }\n\ + }\n\ + }\n\ +\n\ +"; +exports.scope = "actionscript"; + +}); diff --git a/src/libs/ace/snippets/ada.js b/src/libs/ace/snippets/ada.js new file mode 100755 index 0000000..656608a --- /dev/null +++ b/src/libs/ace/snippets/ada.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/ada",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "ada"; + +}); diff --git a/src/libs/ace/snippets/apache_conf.js b/src/libs/ace/snippets/apache_conf.js new file mode 100755 index 0000000..0f38e54 --- /dev/null +++ b/src/libs/ace/snippets/apache_conf.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/apache_conf",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "apache_conf"; + +}); diff --git a/src/libs/ace/snippets/applescript.js b/src/libs/ace/snippets/applescript.js new file mode 100755 index 0000000..6b59011 --- /dev/null +++ b/src/libs/ace/snippets/applescript.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/applescript",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "applescript"; + +}); diff --git a/src/libs/ace/snippets/asciidoc.js b/src/libs/ace/snippets/asciidoc.js new file mode 100755 index 0000000..ef22c02 --- /dev/null +++ b/src/libs/ace/snippets/asciidoc.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/asciidoc",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "asciidoc"; + +}); diff --git a/src/libs/ace/snippets/assembly_x86.js b/src/libs/ace/snippets/assembly_x86.js new file mode 100755 index 0000000..b3c3cd3 --- /dev/null +++ b/src/libs/ace/snippets/assembly_x86.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/assembly_x86",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "assembly_x86"; + +}); diff --git a/src/libs/ace/snippets/autohotkey.js b/src/libs/ace/snippets/autohotkey.js new file mode 100755 index 0000000..61c8ad4 --- /dev/null +++ b/src/libs/ace/snippets/autohotkey.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/autohotkey",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "autohotkey"; + +}); diff --git a/src/libs/ace/snippets/batchfile.js b/src/libs/ace/snippets/batchfile.js new file mode 100755 index 0000000..619f57d --- /dev/null +++ b/src/libs/ace/snippets/batchfile.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/batchfile",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "batchfile"; + +}); diff --git a/src/libs/ace/snippets/bro.js b/src/libs/ace/snippets/bro.js new file mode 100755 index 0000000..2f2e2e1 --- /dev/null +++ b/src/libs/ace/snippets/bro.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/bro",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/c9search.js b/src/libs/ace/snippets/c9search.js new file mode 100755 index 0000000..78ea3da --- /dev/null +++ b/src/libs/ace/snippets/c9search.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/c9search",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "c9search"; + +}); diff --git a/src/libs/ace/snippets/c_cpp.js b/src/libs/ace/snippets/c_cpp.js new file mode 100755 index 0000000..a232b56 --- /dev/null +++ b/src/libs/ace/snippets/c_cpp.js @@ -0,0 +1,138 @@ +ace.define("ace/snippets/c_cpp",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "## STL Collections\n\ +# std::array\n\ +snippet array\n\ + std::array<${1:T}, ${2:N}> ${3};${4}\n\ +# std::vector\n\ +snippet vector\n\ + std::vector<${1:T}> ${2};${3}\n\ +# std::deque\n\ +snippet deque\n\ + std::deque<${1:T}> ${2};${3}\n\ +# std::forward_list\n\ +snippet flist\n\ + std::forward_list<${1:T}> ${2};${3}\n\ +# std::list\n\ +snippet list\n\ + std::list<${1:T}> ${2};${3}\n\ +# std::set\n\ +snippet set\n\ + std::set<${1:T}> ${2};${3}\n\ +# std::map\n\ +snippet map\n\ + std::map<${1:Key}, ${2:T}> ${3};${4}\n\ +# std::multiset\n\ +snippet mset\n\ + std::multiset<${1:T}> ${2};${3}\n\ +# std::multimap\n\ +snippet mmap\n\ + std::multimap<${1:Key}, ${2:T}> ${3};${4}\n\ +# std::unordered_set\n\ +snippet uset\n\ + std::unordered_set<${1:T}> ${2};${3}\n\ +# std::unordered_map\n\ +snippet umap\n\ + std::unordered_map<${1:Key}, ${2:T}> ${3};${4}\n\ +# std::unordered_multiset\n\ +snippet umset\n\ + std::unordered_multiset<${1:T}> ${2};${3}\n\ +# std::unordered_multimap\n\ +snippet ummap\n\ + std::unordered_multimap<${1:Key}, ${2:T}> ${3};${4}\n\ +# std::stack\n\ +snippet stack\n\ + std::stack<${1:T}> ${2};${3}\n\ +# std::queue\n\ +snippet queue\n\ + std::queue<${1:T}> ${2};${3}\n\ +# std::priority_queue\n\ +snippet pqueue\n\ + std::priority_queue<${1:T}> ${2};${3}\n\ +##\n\ +## Access Modifiers\n\ +# private\n\ +snippet pri\n\ + private\n\ +# protected\n\ +snippet pro\n\ + protected\n\ +# public\n\ +snippet pub\n\ + public\n\ +# friend\n\ +snippet fr\n\ + friend\n\ +# mutable\n\ +snippet mu\n\ + mutable\n\ +## \n\ +## Class\n\ +# class\n\ +snippet cl\n\ + class ${1:`Filename('$1', 'name')`} \n\ + {\n\ + public:\n\ + $1(${2});\n\ + ~$1();\n\ +\n\ + private:\n\ + ${3:/* data */}\n\ + };\n\ +# member function implementation\n\ +snippet mfun\n\ + ${4:void} ${1:`Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) {\n\ + ${5:/* code */}\n\ + }\n\ +# namespace\n\ +snippet ns\n\ + namespace ${1:`Filename('', 'my')`} {\n\ + ${2}\n\ + } /* namespace $1 */\n\ +##\n\ +## Input/Output\n\ +# std::cout\n\ +snippet cout\n\ + std::cout << ${1} << std::endl;${2}\n\ +# std::cin\n\ +snippet cin\n\ + std::cin >> ${1};${2}\n\ +##\n\ +## Iteration\n\ +# for i \n\ +snippet fori\n\ + for (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) {\n\ + ${4:/* code */}\n\ + }${5}\n\ +\n\ +# foreach\n\ +snippet fore\n\ + for (${1:auto} ${2:i} : ${3:container}) {\n\ + ${4:/* code */}\n\ + }${5}\n\ +# iterator\n\ +snippet iter\n\ + for (${1:std::vector}<${2:type}>::${3:const_iterator} ${4:i} = ${5:container}.begin(); $4 != $5.end(); ++$4) {\n\ + ${6}\n\ + }${7}\n\ +\n\ +# auto iterator\n\ +snippet itera\n\ + for (auto ${1:i} = $1.begin(); $1 != $1.end(); ++$1) {\n\ + ${2:std::cout << *$1 << std::endl;}\n\ + }${3}\n\ +##\n\ +## Lambdas\n\ +# lamda (one line)\n\ +snippet ld\n\ + [${1}](${2}){${3:/* code */}}${4}\n\ +# lambda (multi-line)\n\ +snippet lld\n\ + [${1}](${2}){\n\ + ${3:/* code */}\n\ + }${4}\n\ +"; +exports.scope = "c_cpp"; + +}); diff --git a/src/libs/ace/snippets/cirru.js b/src/libs/ace/snippets/cirru.js new file mode 100755 index 0000000..02ef1f3 --- /dev/null +++ b/src/libs/ace/snippets/cirru.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/cirru",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "cirru"; + +}); diff --git a/src/libs/ace/snippets/clojure.js b/src/libs/ace/snippets/clojure.js new file mode 100755 index 0000000..49f23ca --- /dev/null +++ b/src/libs/ace/snippets/clojure.js @@ -0,0 +1,97 @@ +ace.define("ace/snippets/clojure",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet comm\n\ + (comment\n\ + ${1}\n\ + )\n\ +snippet condp\n\ + (condp ${1:pred} ${2:expr}\n\ + ${3})\n\ +snippet def\n\ + (def ${1})\n\ +snippet defm\n\ + (defmethod ${1:multifn} \"${2:doc-string}\" ${3:dispatch-val} [${4:args}]\n\ + ${5})\n\ +snippet defmm\n\ + (defmulti ${1:name} \"${2:doc-string}\" ${3:dispatch-fn})\n\ +snippet defma\n\ + (defmacro ${1:name} \"${2:doc-string}\" ${3:dispatch-fn})\n\ +snippet defn\n\ + (defn ${1:name} \"${2:doc-string}\" [${3:arg-list}]\n\ + ${4})\n\ +snippet defp\n\ + (defprotocol ${1:name}\n\ + ${2})\n\ +snippet defr\n\ + (defrecord ${1:name} [${2:fields}]\n\ + ${3:protocol}\n\ + ${4})\n\ +snippet deft\n\ + (deftest ${1:name}\n\ + (is (= ${2:assertion})))\n\ + ${3})\n\ +snippet is\n\ + (is (= ${1} ${2}))\n\ +snippet defty\n\ + (deftype ${1:Name} [${2:fields}]\n\ + ${3:Protocol}\n\ + ${4})\n\ +snippet doseq\n\ + (doseq [${1:elem} ${2:coll}]\n\ + ${3})\n\ +snippet fn\n\ + (fn [${1:arg-list}] ${2})\n\ +snippet if\n\ + (if ${1:test-expr}\n\ + ${2:then-expr}\n\ + ${3:else-expr})\n\ +snippet if-let \n\ + (if-let [${1:result} ${2:test-expr}]\n\ + (${3:then-expr} $1)\n\ + (${4:else-expr}))\n\ +snippet imp\n\ + (:import [${1:package}])\n\ + & {:keys [${1:keys}] :or {${2:defaults}}}\n\ +snippet let\n\ + (let [${1:name} ${2:expr}]\n\ + ${3})\n\ +snippet letfn\n\ + (letfn [(${1:name) [${2:args}]\n\ + ${3})])\n\ +snippet map\n\ + (map ${1:func} ${2:coll})\n\ +snippet mapl\n\ + (map #(${1:lambda}) ${2:coll})\n\ +snippet met\n\ + (${1:name} [${2:this} ${3:args}]\n\ + ${4})\n\ +snippet ns\n\ + (ns ${1:name}\n\ + ${2})\n\ +snippet dotimes\n\ + (dotimes [_ 10]\n\ + (time\n\ + (dotimes [_ ${1:times}]\n\ + ${2})))\n\ +snippet pmethod\n\ + (${1:name} [${2:this} ${3:args}])\n\ +snippet refer\n\ + (:refer-clojure :exclude [${1}])\n\ +snippet require\n\ + (:require [${1:namespace} :as [${2}]])\n\ +snippet use\n\ + (:use [${1:namespace} :only [${2}]])\n\ +snippet print\n\ + (println ${1})\n\ +snippet reduce\n\ + (reduce ${1:(fn [p n] ${3})} ${2})\n\ +snippet when\n\ + (when ${1:test} ${2:body})\n\ +snippet when-let\n\ + (when-let [${1:result} ${2:test}]\n\ + ${3:body})\n\ +"; +exports.scope = "clojure"; + +}); diff --git a/src/libs/ace/snippets/cobol.js b/src/libs/ace/snippets/cobol.js new file mode 100755 index 0000000..760727c --- /dev/null +++ b/src/libs/ace/snippets/cobol.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/cobol",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "cobol"; + +}); diff --git a/src/libs/ace/snippets/coffee.js b/src/libs/ace/snippets/coffee.js new file mode 100755 index 0000000..eb1a76d --- /dev/null +++ b/src/libs/ace/snippets/coffee.js @@ -0,0 +1,102 @@ +ace.define("ace/snippets/coffee",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Closure loop\n\ +snippet forindo\n\ + for ${1:name} in ${2:array}\n\ + do ($1) ->\n\ + ${3:// body}\n\ +# Array comprehension\n\ +snippet fora\n\ + for ${1:name} in ${2:array}\n\ + ${3:// body...}\n\ +# Object comprehension\n\ +snippet foro\n\ + for ${1:key}, ${2:value} of ${3:object}\n\ + ${4:// body...}\n\ +# Range comprehension (inclusive)\n\ +snippet forr\n\ + for ${1:name} in [${2:start}..${3:finish}]\n\ + ${4:// body...}\n\ +snippet forrb\n\ + for ${1:name} in [${2:start}..${3:finish}] by ${4:step}\n\ + ${5:// body...}\n\ +# Range comprehension (exclusive)\n\ +snippet forrex\n\ + for ${1:name} in [${2:start}...${3:finish}]\n\ + ${4:// body...}\n\ +snippet forrexb\n\ + for ${1:name} in [${2:start}...${3:finish}] by ${4:step}\n\ + ${5:// body...}\n\ +# Function\n\ +snippet fun\n\ + (${1:args}) ->\n\ + ${2:// body...}\n\ +# Function (bound)\n\ +snippet bfun\n\ + (${1:args}) =>\n\ + ${2:// body...}\n\ +# Class\n\ +snippet cla class ..\n\ + class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\ + ${2}\n\ +snippet cla class .. constructor: ..\n\ + class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\ + constructor: (${2:args}) ->\n\ + ${3}\n\ +\n\ + ${4}\n\ +snippet cla class .. extends ..\n\ + class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} extends ${2:ParentClass}\n\ + ${3}\n\ +snippet cla class .. extends .. constructor: ..\n\ + class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} extends ${2:ParentClass}\n\ + constructor: (${3:args}) ->\n\ + ${4}\n\ +\n\ + ${5}\n\ +# If\n\ +snippet if\n\ + if ${1:condition}\n\ + ${2:// body...}\n\ +# If __ Else\n\ +snippet ife\n\ + if ${1:condition}\n\ + ${2:// body...}\n\ + else\n\ + ${3:// body...}\n\ +# Else if\n\ +snippet elif\n\ + else if ${1:condition}\n\ + ${2:// body...}\n\ +# Ternary If\n\ +snippet ifte\n\ + if ${1:condition} then ${2:value} else ${3:other}\n\ +# Unless\n\ +snippet unl\n\ + ${1:action} unless ${2:condition}\n\ +# Switch\n\ +snippet swi\n\ + switch ${1:object}\n\ + when ${2:value}\n\ + ${3:// body...}\n\ +\n\ +# Log\n\ +snippet log\n\ + console.log ${1}\n\ +# Try __ Catch\n\ +snippet try\n\ + try\n\ + ${1}\n\ + catch ${2:error}\n\ + ${3}\n\ +# Require\n\ +snippet req\n\ + ${2:$1} = require '${1:sys}'${3}\n\ +# Export\n\ +snippet exp\n\ + ${1:root} = exports ? this\n\ +"; +exports.scope = "coffee"; + +}); diff --git a/src/libs/ace/snippets/coldfusion.js b/src/libs/ace/snippets/coldfusion.js new file mode 100755 index 0000000..1a91f96 --- /dev/null +++ b/src/libs/ace/snippets/coldfusion.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/coldfusion",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "coldfusion"; + +}); diff --git a/src/libs/ace/snippets/csharp.js b/src/libs/ace/snippets/csharp.js new file mode 100755 index 0000000..96b9174 --- /dev/null +++ b/src/libs/ace/snippets/csharp.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/csharp",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "csharp"; + +}); diff --git a/src/libs/ace/snippets/css.js b/src/libs/ace/snippets/css.js new file mode 100755 index 0000000..db5a8c0 --- /dev/null +++ b/src/libs/ace/snippets/css.js @@ -0,0 +1,974 @@ +ace.define("ace/snippets/css",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet .\n\ + ${1} {\n\ + ${2}\n\ + }\n\ +snippet !\n\ + !important\n\ +snippet bdi:m+\n\ + -moz-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\n\ +snippet bdi:m\n\ + -moz-border-image: ${1};\n\ +snippet bdrz:m\n\ + -moz-border-radius: ${1};\n\ +snippet bxsh:m+\n\ + -moz-box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\n\ +snippet bxsh:m\n\ + -moz-box-shadow: ${1};\n\ +snippet bdi:w+\n\ + -webkit-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\n\ +snippet bdi:w\n\ + -webkit-border-image: ${1};\n\ +snippet bdrz:w\n\ + -webkit-border-radius: ${1};\n\ +snippet bxsh:w+\n\ + -webkit-box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\n\ +snippet bxsh:w\n\ + -webkit-box-shadow: ${1};\n\ +snippet @f\n\ + @font-face {\n\ + font-family: ${1};\n\ + src: url(${2});\n\ + }\n\ +snippet @i\n\ + @import url(${1});\n\ +snippet @m\n\ + @media ${1:print} {\n\ + ${2}\n\ + }\n\ +snippet bg+\n\ + background: #${1:FFF} url(${2}) ${3:0} ${4:0} ${5:no-repeat};\n\ +snippet bga\n\ + background-attachment: ${1};\n\ +snippet bga:f\n\ + background-attachment: fixed;\n\ +snippet bga:s\n\ + background-attachment: scroll;\n\ +snippet bgbk\n\ + background-break: ${1};\n\ +snippet bgbk:bb\n\ + background-break: bounding-box;\n\ +snippet bgbk:c\n\ + background-break: continuous;\n\ +snippet bgbk:eb\n\ + background-break: each-box;\n\ +snippet bgcp\n\ + background-clip: ${1};\n\ +snippet bgcp:bb\n\ + background-clip: border-box;\n\ +snippet bgcp:cb\n\ + background-clip: content-box;\n\ +snippet bgcp:nc\n\ + background-clip: no-clip;\n\ +snippet bgcp:pb\n\ + background-clip: padding-box;\n\ +snippet bgc\n\ + background-color: #${1:FFF};\n\ +snippet bgc:t\n\ + background-color: transparent;\n\ +snippet bgi\n\ + background-image: url(${1});\n\ +snippet bgi:n\n\ + background-image: none;\n\ +snippet bgo\n\ + background-origin: ${1};\n\ +snippet bgo:bb\n\ + background-origin: border-box;\n\ +snippet bgo:cb\n\ + background-origin: content-box;\n\ +snippet bgo:pb\n\ + background-origin: padding-box;\n\ +snippet bgpx\n\ + background-position-x: ${1};\n\ +snippet bgpy\n\ + background-position-y: ${1};\n\ +snippet bgp\n\ + background-position: ${1:0} ${2:0};\n\ +snippet bgr\n\ + background-repeat: ${1};\n\ +snippet bgr:n\n\ + background-repeat: no-repeat;\n\ +snippet bgr:x\n\ + background-repeat: repeat-x;\n\ +snippet bgr:y\n\ + background-repeat: repeat-y;\n\ +snippet bgr:r\n\ + background-repeat: repeat;\n\ +snippet bgz\n\ + background-size: ${1};\n\ +snippet bgz:a\n\ + background-size: auto;\n\ +snippet bgz:ct\n\ + background-size: contain;\n\ +snippet bgz:cv\n\ + background-size: cover;\n\ +snippet bg\n\ + background: ${1};\n\ +snippet bg:ie\n\ + filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1}',sizingMethod='${2:crop}');\n\ +snippet bg:n\n\ + background: none;\n\ +snippet bd+\n\ + border: ${1:1px} ${2:solid} #${3:000};\n\ +snippet bdb+\n\ + border-bottom: ${1:1px} ${2:solid} #${3:000};\n\ +snippet bdbc\n\ + border-bottom-color: #${1:000};\n\ +snippet bdbi\n\ + border-bottom-image: url(${1});\n\ +snippet bdbi:n\n\ + border-bottom-image: none;\n\ +snippet bdbli\n\ + border-bottom-left-image: url(${1});\n\ +snippet bdbli:c\n\ + border-bottom-left-image: continue;\n\ +snippet bdbli:n\n\ + border-bottom-left-image: none;\n\ +snippet bdblrz\n\ + border-bottom-left-radius: ${1};\n\ +snippet bdbri\n\ + border-bottom-right-image: url(${1});\n\ +snippet bdbri:c\n\ + border-bottom-right-image: continue;\n\ +snippet bdbri:n\n\ + border-bottom-right-image: none;\n\ +snippet bdbrrz\n\ + border-bottom-right-radius: ${1};\n\ +snippet bdbs\n\ + border-bottom-style: ${1};\n\ +snippet bdbs:n\n\ + border-bottom-style: none;\n\ +snippet bdbw\n\ + border-bottom-width: ${1};\n\ +snippet bdb\n\ + border-bottom: ${1};\n\ +snippet bdb:n\n\ + border-bottom: none;\n\ +snippet bdbk\n\ + border-break: ${1};\n\ +snippet bdbk:c\n\ + border-break: close;\n\ +snippet bdcl\n\ + border-collapse: ${1};\n\ +snippet bdcl:c\n\ + border-collapse: collapse;\n\ +snippet bdcl:s\n\ + border-collapse: separate;\n\ +snippet bdc\n\ + border-color: #${1:000};\n\ +snippet bdci\n\ + border-corner-image: url(${1});\n\ +snippet bdci:c\n\ + border-corner-image: continue;\n\ +snippet bdci:n\n\ + border-corner-image: none;\n\ +snippet bdf\n\ + border-fit: ${1};\n\ +snippet bdf:c\n\ + border-fit: clip;\n\ +snippet bdf:of\n\ + border-fit: overwrite;\n\ +snippet bdf:ow\n\ + border-fit: overwrite;\n\ +snippet bdf:r\n\ + border-fit: repeat;\n\ +snippet bdf:sc\n\ + border-fit: scale;\n\ +snippet bdf:sp\n\ + border-fit: space;\n\ +snippet bdf:st\n\ + border-fit: stretch;\n\ +snippet bdi\n\ + border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\n\ +snippet bdi:n\n\ + border-image: none;\n\ +snippet bdl+\n\ + border-left: ${1:1px} ${2:solid} #${3:000};\n\ +snippet bdlc\n\ + border-left-color: #${1:000};\n\ +snippet bdli\n\ + border-left-image: url(${1});\n\ +snippet bdli:n\n\ + border-left-image: none;\n\ +snippet bdls\n\ + border-left-style: ${1};\n\ +snippet bdls:n\n\ + border-left-style: none;\n\ +snippet bdlw\n\ + border-left-width: ${1};\n\ +snippet bdl\n\ + border-left: ${1};\n\ +snippet bdl:n\n\ + border-left: none;\n\ +snippet bdlt\n\ + border-length: ${1};\n\ +snippet bdlt:a\n\ + border-length: auto;\n\ +snippet bdrz\n\ + border-radius: ${1};\n\ +snippet bdr+\n\ + border-right: ${1:1px} ${2:solid} #${3:000};\n\ +snippet bdrc\n\ + border-right-color: #${1:000};\n\ +snippet bdri\n\ + border-right-image: url(${1});\n\ +snippet bdri:n\n\ + border-right-image: none;\n\ +snippet bdrs\n\ + border-right-style: ${1};\n\ +snippet bdrs:n\n\ + border-right-style: none;\n\ +snippet bdrw\n\ + border-right-width: ${1};\n\ +snippet bdr\n\ + border-right: ${1};\n\ +snippet bdr:n\n\ + border-right: none;\n\ +snippet bdsp\n\ + border-spacing: ${1};\n\ +snippet bds\n\ + border-style: ${1};\n\ +snippet bds:ds\n\ + border-style: dashed;\n\ +snippet bds:dtds\n\ + border-style: dot-dash;\n\ +snippet bds:dtdtds\n\ + border-style: dot-dot-dash;\n\ +snippet bds:dt\n\ + border-style: dotted;\n\ +snippet bds:db\n\ + border-style: double;\n\ +snippet bds:g\n\ + border-style: groove;\n\ +snippet bds:h\n\ + border-style: hidden;\n\ +snippet bds:i\n\ + border-style: inset;\n\ +snippet bds:n\n\ + border-style: none;\n\ +snippet bds:o\n\ + border-style: outset;\n\ +snippet bds:r\n\ + border-style: ridge;\n\ +snippet bds:s\n\ + border-style: solid;\n\ +snippet bds:w\n\ + border-style: wave;\n\ +snippet bdt+\n\ + border-top: ${1:1px} ${2:solid} #${3:000};\n\ +snippet bdtc\n\ + border-top-color: #${1:000};\n\ +snippet bdti\n\ + border-top-image: url(${1});\n\ +snippet bdti:n\n\ + border-top-image: none;\n\ +snippet bdtli\n\ + border-top-left-image: url(${1});\n\ +snippet bdtli:c\n\ + border-corner-image: continue;\n\ +snippet bdtli:n\n\ + border-corner-image: none;\n\ +snippet bdtlrz\n\ + border-top-left-radius: ${1};\n\ +snippet bdtri\n\ + border-top-right-image: url(${1});\n\ +snippet bdtri:c\n\ + border-top-right-image: continue;\n\ +snippet bdtri:n\n\ + border-top-right-image: none;\n\ +snippet bdtrrz\n\ + border-top-right-radius: ${1};\n\ +snippet bdts\n\ + border-top-style: ${1};\n\ +snippet bdts:n\n\ + border-top-style: none;\n\ +snippet bdtw\n\ + border-top-width: ${1};\n\ +snippet bdt\n\ + border-top: ${1};\n\ +snippet bdt:n\n\ + border-top: none;\n\ +snippet bdw\n\ + border-width: ${1};\n\ +snippet bd\n\ + border: ${1};\n\ +snippet bd:n\n\ + border: none;\n\ +snippet b\n\ + bottom: ${1};\n\ +snippet b:a\n\ + bottom: auto;\n\ +snippet bxsh+\n\ + box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\n\ +snippet bxsh\n\ + box-shadow: ${1};\n\ +snippet bxsh:n\n\ + box-shadow: none;\n\ +snippet bxz\n\ + box-sizing: ${1};\n\ +snippet bxz:bb\n\ + box-sizing: border-box;\n\ +snippet bxz:cb\n\ + box-sizing: content-box;\n\ +snippet cps\n\ + caption-side: ${1};\n\ +snippet cps:b\n\ + caption-side: bottom;\n\ +snippet cps:t\n\ + caption-side: top;\n\ +snippet cl\n\ + clear: ${1};\n\ +snippet cl:b\n\ + clear: both;\n\ +snippet cl:l\n\ + clear: left;\n\ +snippet cl:n\n\ + clear: none;\n\ +snippet cl:r\n\ + clear: right;\n\ +snippet cp\n\ + clip: ${1};\n\ +snippet cp:a\n\ + clip: auto;\n\ +snippet cp:r\n\ + clip: rect(${1:0} ${2:0} ${3:0} ${4:0});\n\ +snippet c\n\ + color: #${1:000};\n\ +snippet ct\n\ + content: ${1};\n\ +snippet ct:a\n\ + content: attr(${1});\n\ +snippet ct:cq\n\ + content: close-quote;\n\ +snippet ct:c\n\ + content: counter(${1});\n\ +snippet ct:cs\n\ + content: counters(${1});\n\ +snippet ct:ncq\n\ + content: no-close-quote;\n\ +snippet ct:noq\n\ + content: no-open-quote;\n\ +snippet ct:n\n\ + content: normal;\n\ +snippet ct:oq\n\ + content: open-quote;\n\ +snippet coi\n\ + counter-increment: ${1};\n\ +snippet cor\n\ + counter-reset: ${1};\n\ +snippet cur\n\ + cursor: ${1};\n\ +snippet cur:a\n\ + cursor: auto;\n\ +snippet cur:c\n\ + cursor: crosshair;\n\ +snippet cur:d\n\ + cursor: default;\n\ +snippet cur:ha\n\ + cursor: hand;\n\ +snippet cur:he\n\ + cursor: help;\n\ +snippet cur:m\n\ + cursor: move;\n\ +snippet cur:p\n\ + cursor: pointer;\n\ +snippet cur:t\n\ + cursor: text;\n\ +snippet d\n\ + display: ${1};\n\ +snippet d:mib\n\ + display: -moz-inline-box;\n\ +snippet d:mis\n\ + display: -moz-inline-stack;\n\ +snippet d:b\n\ + display: block;\n\ +snippet d:cp\n\ + display: compact;\n\ +snippet d:ib\n\ + display: inline-block;\n\ +snippet d:itb\n\ + display: inline-table;\n\ +snippet d:i\n\ + display: inline;\n\ +snippet d:li\n\ + display: list-item;\n\ +snippet d:n\n\ + display: none;\n\ +snippet d:ri\n\ + display: run-in;\n\ +snippet d:tbcp\n\ + display: table-caption;\n\ +snippet d:tbc\n\ + display: table-cell;\n\ +snippet d:tbclg\n\ + display: table-column-group;\n\ +snippet d:tbcl\n\ + display: table-column;\n\ +snippet d:tbfg\n\ + display: table-footer-group;\n\ +snippet d:tbhg\n\ + display: table-header-group;\n\ +snippet d:tbrg\n\ + display: table-row-group;\n\ +snippet d:tbr\n\ + display: table-row;\n\ +snippet d:tb\n\ + display: table;\n\ +snippet ec\n\ + empty-cells: ${1};\n\ +snippet ec:h\n\ + empty-cells: hide;\n\ +snippet ec:s\n\ + empty-cells: show;\n\ +snippet exp\n\ + expression()\n\ +snippet fl\n\ + float: ${1};\n\ +snippet fl:l\n\ + float: left;\n\ +snippet fl:n\n\ + float: none;\n\ +snippet fl:r\n\ + float: right;\n\ +snippet f+\n\ + font: ${1:1em} ${2:Arial},${3:sans-serif};\n\ +snippet fef\n\ + font-effect: ${1};\n\ +snippet fef:eb\n\ + font-effect: emboss;\n\ +snippet fef:eg\n\ + font-effect: engrave;\n\ +snippet fef:n\n\ + font-effect: none;\n\ +snippet fef:o\n\ + font-effect: outline;\n\ +snippet femp\n\ + font-emphasize-position: ${1};\n\ +snippet femp:a\n\ + font-emphasize-position: after;\n\ +snippet femp:b\n\ + font-emphasize-position: before;\n\ +snippet fems\n\ + font-emphasize-style: ${1};\n\ +snippet fems:ac\n\ + font-emphasize-style: accent;\n\ +snippet fems:c\n\ + font-emphasize-style: circle;\n\ +snippet fems:ds\n\ + font-emphasize-style: disc;\n\ +snippet fems:dt\n\ + font-emphasize-style: dot;\n\ +snippet fems:n\n\ + font-emphasize-style: none;\n\ +snippet fem\n\ + font-emphasize: ${1};\n\ +snippet ff\n\ + font-family: ${1};\n\ +snippet ff:c\n\ + font-family: ${1:'Monotype Corsiva','Comic Sans MS'},cursive;\n\ +snippet ff:f\n\ + font-family: ${1:Capitals,Impact},fantasy;\n\ +snippet ff:m\n\ + font-family: ${1:Monaco,'Courier New'},monospace;\n\ +snippet ff:ss\n\ + font-family: ${1:Helvetica,Arial},sans-serif;\n\ +snippet ff:s\n\ + font-family: ${1:Georgia,'Times New Roman'},serif;\n\ +snippet fza\n\ + font-size-adjust: ${1};\n\ +snippet fza:n\n\ + font-size-adjust: none;\n\ +snippet fz\n\ + font-size: ${1};\n\ +snippet fsm\n\ + font-smooth: ${1};\n\ +snippet fsm:aw\n\ + font-smooth: always;\n\ +snippet fsm:a\n\ + font-smooth: auto;\n\ +snippet fsm:n\n\ + font-smooth: never;\n\ +snippet fst\n\ + font-stretch: ${1};\n\ +snippet fst:c\n\ + font-stretch: condensed;\n\ +snippet fst:e\n\ + font-stretch: expanded;\n\ +snippet fst:ec\n\ + font-stretch: extra-condensed;\n\ +snippet fst:ee\n\ + font-stretch: extra-expanded;\n\ +snippet fst:n\n\ + font-stretch: normal;\n\ +snippet fst:sc\n\ + font-stretch: semi-condensed;\n\ +snippet fst:se\n\ + font-stretch: semi-expanded;\n\ +snippet fst:uc\n\ + font-stretch: ultra-condensed;\n\ +snippet fst:ue\n\ + font-stretch: ultra-expanded;\n\ +snippet fs\n\ + font-style: ${1};\n\ +snippet fs:i\n\ + font-style: italic;\n\ +snippet fs:n\n\ + font-style: normal;\n\ +snippet fs:o\n\ + font-style: oblique;\n\ +snippet fv\n\ + font-variant: ${1};\n\ +snippet fv:n\n\ + font-variant: normal;\n\ +snippet fv:sc\n\ + font-variant: small-caps;\n\ +snippet fw\n\ + font-weight: ${1};\n\ +snippet fw:b\n\ + font-weight: bold;\n\ +snippet fw:br\n\ + font-weight: bolder;\n\ +snippet fw:lr\n\ + font-weight: lighter;\n\ +snippet fw:n\n\ + font-weight: normal;\n\ +snippet f\n\ + font: ${1};\n\ +snippet h\n\ + height: ${1};\n\ +snippet h:a\n\ + height: auto;\n\ +snippet l\n\ + left: ${1};\n\ +snippet l:a\n\ + left: auto;\n\ +snippet lts\n\ + letter-spacing: ${1};\n\ +snippet lh\n\ + line-height: ${1};\n\ +snippet lisi\n\ + list-style-image: url(${1});\n\ +snippet lisi:n\n\ + list-style-image: none;\n\ +snippet lisp\n\ + list-style-position: ${1};\n\ +snippet lisp:i\n\ + list-style-position: inside;\n\ +snippet lisp:o\n\ + list-style-position: outside;\n\ +snippet list\n\ + list-style-type: ${1};\n\ +snippet list:c\n\ + list-style-type: circle;\n\ +snippet list:dclz\n\ + list-style-type: decimal-leading-zero;\n\ +snippet list:dc\n\ + list-style-type: decimal;\n\ +snippet list:d\n\ + list-style-type: disc;\n\ +snippet list:lr\n\ + list-style-type: lower-roman;\n\ +snippet list:n\n\ + list-style-type: none;\n\ +snippet list:s\n\ + list-style-type: square;\n\ +snippet list:ur\n\ + list-style-type: upper-roman;\n\ +snippet lis\n\ + list-style: ${1};\n\ +snippet lis:n\n\ + list-style: none;\n\ +snippet mb\n\ + margin-bottom: ${1};\n\ +snippet mb:a\n\ + margin-bottom: auto;\n\ +snippet ml\n\ + margin-left: ${1};\n\ +snippet ml:a\n\ + margin-left: auto;\n\ +snippet mr\n\ + margin-right: ${1};\n\ +snippet mr:a\n\ + margin-right: auto;\n\ +snippet mt\n\ + margin-top: ${1};\n\ +snippet mt:a\n\ + margin-top: auto;\n\ +snippet m\n\ + margin: ${1};\n\ +snippet m:4\n\ + margin: ${1:0} ${2:0} ${3:0} ${4:0};\n\ +snippet m:3\n\ + margin: ${1:0} ${2:0} ${3:0};\n\ +snippet m:2\n\ + margin: ${1:0} ${2:0};\n\ +snippet m:0\n\ + margin: 0;\n\ +snippet m:a\n\ + margin: auto;\n\ +snippet mah\n\ + max-height: ${1};\n\ +snippet mah:n\n\ + max-height: none;\n\ +snippet maw\n\ + max-width: ${1};\n\ +snippet maw:n\n\ + max-width: none;\n\ +snippet mih\n\ + min-height: ${1};\n\ +snippet miw\n\ + min-width: ${1};\n\ +snippet op\n\ + opacity: ${1};\n\ +snippet op:ie\n\ + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=${1:100});\n\ +snippet op:ms\n\ + -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=${1:100})';\n\ +snippet orp\n\ + orphans: ${1};\n\ +snippet o+\n\ + outline: ${1:1px} ${2:solid} #${3:000};\n\ +snippet oc\n\ + outline-color: ${1:#000};\n\ +snippet oc:i\n\ + outline-color: invert;\n\ +snippet oo\n\ + outline-offset: ${1};\n\ +snippet os\n\ + outline-style: ${1};\n\ +snippet ow\n\ + outline-width: ${1};\n\ +snippet o\n\ + outline: ${1};\n\ +snippet o:n\n\ + outline: none;\n\ +snippet ovs\n\ + overflow-style: ${1};\n\ +snippet ovs:a\n\ + overflow-style: auto;\n\ +snippet ovs:mq\n\ + overflow-style: marquee;\n\ +snippet ovs:mv\n\ + overflow-style: move;\n\ +snippet ovs:p\n\ + overflow-style: panner;\n\ +snippet ovs:s\n\ + overflow-style: scrollbar;\n\ +snippet ovx\n\ + overflow-x: ${1};\n\ +snippet ovx:a\n\ + overflow-x: auto;\n\ +snippet ovx:h\n\ + overflow-x: hidden;\n\ +snippet ovx:s\n\ + overflow-x: scroll;\n\ +snippet ovx:v\n\ + overflow-x: visible;\n\ +snippet ovy\n\ + overflow-y: ${1};\n\ +snippet ovy:a\n\ + overflow-y: auto;\n\ +snippet ovy:h\n\ + overflow-y: hidden;\n\ +snippet ovy:s\n\ + overflow-y: scroll;\n\ +snippet ovy:v\n\ + overflow-y: visible;\n\ +snippet ov\n\ + overflow: ${1};\n\ +snippet ov:a\n\ + overflow: auto;\n\ +snippet ov:h\n\ + overflow: hidden;\n\ +snippet ov:s\n\ + overflow: scroll;\n\ +snippet ov:v\n\ + overflow: visible;\n\ +snippet pb\n\ + padding-bottom: ${1};\n\ +snippet pl\n\ + padding-left: ${1};\n\ +snippet pr\n\ + padding-right: ${1};\n\ +snippet pt\n\ + padding-top: ${1};\n\ +snippet p\n\ + padding: ${1};\n\ +snippet p:4\n\ + padding: ${1:0} ${2:0} ${3:0} ${4:0};\n\ +snippet p:3\n\ + padding: ${1:0} ${2:0} ${3:0};\n\ +snippet p:2\n\ + padding: ${1:0} ${2:0};\n\ +snippet p:0\n\ + padding: 0;\n\ +snippet pgba\n\ + page-break-after: ${1};\n\ +snippet pgba:aw\n\ + page-break-after: always;\n\ +snippet pgba:a\n\ + page-break-after: auto;\n\ +snippet pgba:l\n\ + page-break-after: left;\n\ +snippet pgba:r\n\ + page-break-after: right;\n\ +snippet pgbb\n\ + page-break-before: ${1};\n\ +snippet pgbb:aw\n\ + page-break-before: always;\n\ +snippet pgbb:a\n\ + page-break-before: auto;\n\ +snippet pgbb:l\n\ + page-break-before: left;\n\ +snippet pgbb:r\n\ + page-break-before: right;\n\ +snippet pgbi\n\ + page-break-inside: ${1};\n\ +snippet pgbi:a\n\ + page-break-inside: auto;\n\ +snippet pgbi:av\n\ + page-break-inside: avoid;\n\ +snippet pos\n\ + position: ${1};\n\ +snippet pos:a\n\ + position: absolute;\n\ +snippet pos:f\n\ + position: fixed;\n\ +snippet pos:r\n\ + position: relative;\n\ +snippet pos:s\n\ + position: static;\n\ +snippet q\n\ + quotes: ${1};\n\ +snippet q:en\n\ + quotes: '\\201C' '\\201D' '\\2018' '\\2019';\n\ +snippet q:n\n\ + quotes: none;\n\ +snippet q:ru\n\ + quotes: '\\00AB' '\\00BB' '\\201E' '\\201C';\n\ +snippet rz\n\ + resize: ${1};\n\ +snippet rz:b\n\ + resize: both;\n\ +snippet rz:h\n\ + resize: horizontal;\n\ +snippet rz:n\n\ + resize: none;\n\ +snippet rz:v\n\ + resize: vertical;\n\ +snippet r\n\ + right: ${1};\n\ +snippet r:a\n\ + right: auto;\n\ +snippet tbl\n\ + table-layout: ${1};\n\ +snippet tbl:a\n\ + table-layout: auto;\n\ +snippet tbl:f\n\ + table-layout: fixed;\n\ +snippet tal\n\ + text-align-last: ${1};\n\ +snippet tal:a\n\ + text-align-last: auto;\n\ +snippet tal:c\n\ + text-align-last: center;\n\ +snippet tal:l\n\ + text-align-last: left;\n\ +snippet tal:r\n\ + text-align-last: right;\n\ +snippet ta\n\ + text-align: ${1};\n\ +snippet ta:c\n\ + text-align: center;\n\ +snippet ta:l\n\ + text-align: left;\n\ +snippet ta:r\n\ + text-align: right;\n\ +snippet td\n\ + text-decoration: ${1};\n\ +snippet td:l\n\ + text-decoration: line-through;\n\ +snippet td:n\n\ + text-decoration: none;\n\ +snippet td:o\n\ + text-decoration: overline;\n\ +snippet td:u\n\ + text-decoration: underline;\n\ +snippet te\n\ + text-emphasis: ${1};\n\ +snippet te:ac\n\ + text-emphasis: accent;\n\ +snippet te:a\n\ + text-emphasis: after;\n\ +snippet te:b\n\ + text-emphasis: before;\n\ +snippet te:c\n\ + text-emphasis: circle;\n\ +snippet te:ds\n\ + text-emphasis: disc;\n\ +snippet te:dt\n\ + text-emphasis: dot;\n\ +snippet te:n\n\ + text-emphasis: none;\n\ +snippet th\n\ + text-height: ${1};\n\ +snippet th:a\n\ + text-height: auto;\n\ +snippet th:f\n\ + text-height: font-size;\n\ +snippet th:m\n\ + text-height: max-size;\n\ +snippet th:t\n\ + text-height: text-size;\n\ +snippet ti\n\ + text-indent: ${1};\n\ +snippet ti:-\n\ + text-indent: -9999px;\n\ +snippet tj\n\ + text-justify: ${1};\n\ +snippet tj:a\n\ + text-justify: auto;\n\ +snippet tj:d\n\ + text-justify: distribute;\n\ +snippet tj:ic\n\ + text-justify: inter-cluster;\n\ +snippet tj:ii\n\ + text-justify: inter-ideograph;\n\ +snippet tj:iw\n\ + text-justify: inter-word;\n\ +snippet tj:k\n\ + text-justify: kashida;\n\ +snippet tj:t\n\ + text-justify: tibetan;\n\ +snippet to+\n\ + text-outline: ${1:0} ${2:0} #${3:000};\n\ +snippet to\n\ + text-outline: ${1};\n\ +snippet to:n\n\ + text-outline: none;\n\ +snippet tr\n\ + text-replace: ${1};\n\ +snippet tr:n\n\ + text-replace: none;\n\ +snippet tsh+\n\ + text-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\n\ +snippet tsh\n\ + text-shadow: ${1};\n\ +snippet tsh:n\n\ + text-shadow: none;\n\ +snippet tt\n\ + text-transform: ${1};\n\ +snippet tt:c\n\ + text-transform: capitalize;\n\ +snippet tt:l\n\ + text-transform: lowercase;\n\ +snippet tt:n\n\ + text-transform: none;\n\ +snippet tt:u\n\ + text-transform: uppercase;\n\ +snippet tw\n\ + text-wrap: ${1};\n\ +snippet tw:no\n\ + text-wrap: none;\n\ +snippet tw:n\n\ + text-wrap: normal;\n\ +snippet tw:s\n\ + text-wrap: suppress;\n\ +snippet tw:u\n\ + text-wrap: unrestricted;\n\ +snippet t\n\ + top: ${1};\n\ +snippet t:a\n\ + top: auto;\n\ +snippet va\n\ + vertical-align: ${1};\n\ +snippet va:bl\n\ + vertical-align: baseline;\n\ +snippet va:b\n\ + vertical-align: bottom;\n\ +snippet va:m\n\ + vertical-align: middle;\n\ +snippet va:sub\n\ + vertical-align: sub;\n\ +snippet va:sup\n\ + vertical-align: super;\n\ +snippet va:tb\n\ + vertical-align: text-bottom;\n\ +snippet va:tt\n\ + vertical-align: text-top;\n\ +snippet va:t\n\ + vertical-align: top;\n\ +snippet v\n\ + visibility: ${1};\n\ +snippet v:c\n\ + visibility: collapse;\n\ +snippet v:h\n\ + visibility: hidden;\n\ +snippet v:v\n\ + visibility: visible;\n\ +snippet whsc\n\ + white-space-collapse: ${1};\n\ +snippet whsc:ba\n\ + white-space-collapse: break-all;\n\ +snippet whsc:bs\n\ + white-space-collapse: break-strict;\n\ +snippet whsc:k\n\ + white-space-collapse: keep-all;\n\ +snippet whsc:l\n\ + white-space-collapse: loose;\n\ +snippet whsc:n\n\ + white-space-collapse: normal;\n\ +snippet whs\n\ + white-space: ${1};\n\ +snippet whs:n\n\ + white-space: normal;\n\ +snippet whs:nw\n\ + white-space: nowrap;\n\ +snippet whs:pl\n\ + white-space: pre-line;\n\ +snippet whs:pw\n\ + white-space: pre-wrap;\n\ +snippet whs:p\n\ + white-space: pre;\n\ +snippet wid\n\ + widows: ${1};\n\ +snippet w\n\ + width: ${1};\n\ +snippet w:a\n\ + width: auto;\n\ +snippet wob\n\ + word-break: ${1};\n\ +snippet wob:ba\n\ + word-break: break-all;\n\ +snippet wob:bs\n\ + word-break: break-strict;\n\ +snippet wob:k\n\ + word-break: keep-all;\n\ +snippet wob:l\n\ + word-break: loose;\n\ +snippet wob:n\n\ + word-break: normal;\n\ +snippet wos\n\ + word-spacing: ${1};\n\ +snippet wow\n\ + word-wrap: ${1};\n\ +snippet wow:no\n\ + word-wrap: none;\n\ +snippet wow:n\n\ + word-wrap: normal;\n\ +snippet wow:s\n\ + word-wrap: suppress;\n\ +snippet wow:u\n\ + word-wrap: unrestricted;\n\ +snippet z\n\ + z-index: ${1};\n\ +snippet z:a\n\ + z-index: auto;\n\ +snippet zoo\n\ + zoom: 1;\n\ +"; +exports.scope = "css"; + +}); diff --git a/src/libs/ace/snippets/curly.js b/src/libs/ace/snippets/curly.js new file mode 100755 index 0000000..1b2b687 --- /dev/null +++ b/src/libs/ace/snippets/curly.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/curly",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "curly"; + +}); diff --git a/src/libs/ace/snippets/d.js b/src/libs/ace/snippets/d.js new file mode 100755 index 0000000..729741c --- /dev/null +++ b/src/libs/ace/snippets/d.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/d",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "d"; + +}); diff --git a/src/libs/ace/snippets/dart.js b/src/libs/ace/snippets/dart.js new file mode 100755 index 0000000..e96cc5d --- /dev/null +++ b/src/libs/ace/snippets/dart.js @@ -0,0 +1,90 @@ +ace.define("ace/snippets/dart",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet lib\n\ + library ${1};\n\ + ${2}\n\ +snippet im\n\ + import '${1}';\n\ + ${2}\n\ +snippet pa\n\ + part '${1}';\n\ + ${2}\n\ +snippet pao\n\ + part of ${1};\n\ + ${2}\n\ +snippet main\n\ + void main() {\n\ + ${1:/* code */}\n\ + }\n\ +snippet st\n\ + static ${1}\n\ +snippet fi\n\ + final ${1}\n\ +snippet re\n\ + return ${1}\n\ +snippet br\n\ + break;\n\ +snippet th\n\ + throw ${1}\n\ +snippet cl\n\ + class ${1:`Filename(\"\", \"untitled\")`} ${2}\n\ +snippet imp\n\ + implements ${1}\n\ +snippet ext\n\ + extends ${1}\n\ +snippet if\n\ + if (${1:true}) {\n\ + ${2}\n\ + }\n\ +snippet ife\n\ + if (${1:true}) {\n\ + ${2}\n\ + } else {\n\ + ${3}\n\ + }\n\ +snippet el\n\ + else\n\ +snippet sw\n\ + switch (${1}) {\n\ + ${2}\n\ + }\n\ +snippet cs\n\ + case ${1}:\n\ + ${2}\n\ +snippet de\n\ + default:\n\ + ${1}\n\ +snippet for\n\ + for (var ${2:i} = 0, len = ${1:things}.length; $2 < len; ${3:++}$2) {\n\ + ${4:$1[$2]}\n\ + }\n\ +snippet fore\n\ + for (final ${2:item} in ${1:itemList}) {\n\ + ${3:/* code */}\n\ + }\n\ +snippet wh\n\ + while (${1:/* condition */}) {\n\ + ${2:/* code */}\n\ + }\n\ +snippet dowh\n\ + do {\n\ + ${2:/* code */}\n\ + } while (${1:/* condition */});\n\ +snippet as\n\ + assert(${1:/* condition */});\n\ +snippet try\n\ + try {\n\ + ${2}\n\ + } catch (${1:Exception e}) {\n\ + }\n\ +snippet tryf\n\ + try {\n\ + ${2}\n\ + } catch (${1:Exception e}) {\n\ + } finally {\n\ + }\n\ +"; +exports.scope = "dart"; + +}); diff --git a/src/libs/ace/snippets/diff.js b/src/libs/ace/snippets/diff.js new file mode 100755 index 0000000..8fe075e --- /dev/null +++ b/src/libs/ace/snippets/diff.js @@ -0,0 +1,18 @@ +ace.define("ace/snippets/diff",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# DEP-3 (http://dep.debian.net/deps/dep3/) style patch header\n\ +snippet header DEP-3 style header\n\ + Description: ${1}\n\ + Origin: ${2:vendor|upstream|other}, ${3:url of the original patch}\n\ + Bug: ${4:url in upstream bugtracker}\n\ + Forwarded: ${5:no|not-needed|url}\n\ + Author: ${6:`g:snips_author`}\n\ + Reviewed-by: ${7:name and email}\n\ + Last-Update: ${8:`strftime(\"%Y-%m-%d\")`}\n\ + Applied-Upstream: ${9:upstream version|url|commit}\n\ +\n\ +"; +exports.scope = "diff"; + +}); diff --git a/src/libs/ace/snippets/django.js b/src/libs/ace/snippets/django.js new file mode 100755 index 0000000..c1dacbe --- /dev/null +++ b/src/libs/ace/snippets/django.js @@ -0,0 +1,115 @@ +ace.define("ace/snippets/django",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Model Fields\n\ +\n\ +# Note: Optional arguments are using defaults that match what Django will use\n\ +# as a default, e.g. with max_length fields. Doing this as a form of self\n\ +# documentation and to make it easy to know whether you should override the\n\ +# default or not.\n\ +\n\ +# Note: Optional arguments that are booleans will use the opposite since you\n\ +# can either not specify them, or override them, e.g. auto_now_add=False.\n\ +\n\ +snippet auto\n\ + ${1:FIELDNAME} = models.AutoField(${2})\n\ +snippet bool\n\ + ${1:FIELDNAME} = models.BooleanField(${2:default=True})\n\ +snippet char\n\ + ${1:FIELDNAME} = models.CharField(max_length=${2}${3:, blank=True})\n\ +snippet comma\n\ + ${1:FIELDNAME} = models.CommaSeparatedIntegerField(max_length=${2}${3:, blank=True})\n\ +snippet date\n\ + ${1:FIELDNAME} = models.DateField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\n\ +snippet datetime\n\ + ${1:FIELDNAME} = models.DateTimeField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\n\ +snippet decimal\n\ + ${1:FIELDNAME} = models.DecimalField(max_digits=${2}, decimal_places=${3})\n\ +snippet email\n\ + ${1:FIELDNAME} = models.EmailField(max_length=${2:75}${3:, blank=True})\n\ +snippet file\n\ + ${1:FIELDNAME} = models.FileField(upload_to=${2:path/for/upload}${3:, max_length=100})\n\ +snippet filepath\n\ + ${1:FIELDNAME} = models.FilePathField(path=${2:\"/abs/path/to/dir\"}${3:, max_length=100}${4:, match=\"*.ext\"}${5:, recursive=True}${6:, blank=True, })\n\ +snippet float\n\ + ${1:FIELDNAME} = models.FloatField(${2})\n\ +snippet image\n\ + ${1:FIELDNAME} = models.ImageField(upload_to=${2:path/for/upload}${3:, height_field=height, width_field=width}${4:, max_length=100})\n\ +snippet int\n\ + ${1:FIELDNAME} = models.IntegerField(${2})\n\ +snippet ip\n\ + ${1:FIELDNAME} = models.IPAddressField(${2})\n\ +snippet nullbool\n\ + ${1:FIELDNAME} = models.NullBooleanField(${2})\n\ +snippet posint\n\ + ${1:FIELDNAME} = models.PositiveIntegerField(${2})\n\ +snippet possmallint\n\ + ${1:FIELDNAME} = models.PositiveSmallIntegerField(${2})\n\ +snippet slug\n\ + ${1:FIELDNAME} = models.SlugField(max_length=${2:50}${3:, blank=True})\n\ +snippet smallint\n\ + ${1:FIELDNAME} = models.SmallIntegerField(${2})\n\ +snippet text\n\ + ${1:FIELDNAME} = models.TextField(${2:blank=True})\n\ +snippet time\n\ + ${1:FIELDNAME} = models.TimeField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\n\ +snippet url\n\ + ${1:FIELDNAME} = models.URLField(${2:verify_exists=False}${3:, max_length=200}${4:, blank=True})\n\ +snippet xml\n\ + ${1:FIELDNAME} = models.XMLField(schema_path=${2:None}${3:, blank=True})\n\ +# Relational Fields\n\ +snippet fk\n\ + ${1:FIELDNAME} = models.ForeignKey(${2:OtherModel}${3:, related_name=''}${4:, limit_choices_to=}${5:, to_field=''})\n\ +snippet m2m\n\ + ${1:FIELDNAME} = models.ManyToManyField(${2:OtherModel}${3:, related_name=''}${4:, limit_choices_to=}${5:, symmetrical=False}${6:, through=''}${7:, db_table=''})\n\ +snippet o2o\n\ + ${1:FIELDNAME} = models.OneToOneField(${2:OtherModel}${3:, parent_link=True}${4:, related_name=''}${5:, limit_choices_to=}${6:, to_field=''})\n\ +\n\ +# Code Skeletons\n\ +\n\ +snippet form\n\ + class ${1:FormName}(forms.Form):\n\ + \"\"\"${2:docstring}\"\"\"\n\ + ${3}\n\ +\n\ +snippet model\n\ + class ${1:ModelName}(models.Model):\n\ + \"\"\"${2:docstring}\"\"\"\n\ + ${3}\n\ + \n\ + class Meta:\n\ + ${4}\n\ + \n\ + def __unicode__(self):\n\ + ${5}\n\ + \n\ + def save(self, force_insert=False, force_update=False):\n\ + ${6}\n\ + \n\ + @models.permalink\n\ + def get_absolute_url(self):\n\ + return ('${7:view_or_url_name}' ${8})\n\ +\n\ +snippet modeladmin\n\ + class ${1:ModelName}Admin(admin.ModelAdmin):\n\ + ${2}\n\ + \n\ + admin.site.register($1, $1Admin)\n\ + \n\ +snippet tabularinline\n\ + class ${1:ModelName}Inline(admin.TabularInline):\n\ + model = $1\n\ +\n\ +snippet stackedinline\n\ + class ${1:ModelName}Inline(admin.StackedInline):\n\ + model = $1\n\ +\n\ +snippet r2r\n\ + return render_to_response('${1:template.html}', {\n\ + ${2}\n\ + }${3:, context_instance=RequestContext(request)}\n\ + )\n\ +"; +exports.scope = "django"; + +}); diff --git a/src/libs/ace/snippets/dockerfile.js b/src/libs/ace/snippets/dockerfile.js new file mode 100755 index 0000000..981cee8 --- /dev/null +++ b/src/libs/ace/snippets/dockerfile.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/dockerfile",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "dockerfile"; + +}); diff --git a/src/libs/ace/snippets/dot.js b/src/libs/ace/snippets/dot.js new file mode 100755 index 0000000..3a09fc7 --- /dev/null +++ b/src/libs/ace/snippets/dot.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/dot",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "dot"; + +}); diff --git a/src/libs/ace/snippets/drools.js b/src/libs/ace/snippets/drools.js new file mode 100755 index 0000000..a8dd859 --- /dev/null +++ b/src/libs/ace/snippets/drools.js @@ -0,0 +1,26 @@ +ace.define("ace/snippets/drools",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "\n\ +snippet rule\n\ + rule \"${1?:rule_name}\"\n\ + when\n\ + ${2:// when...} \n\ + then\n\ + ${3:// then...}\n\ + end\n\ +\n\ +snippet query\n\ + query ${1?:query_name}\n\ + ${2:// find} \n\ + end\n\ + \n\ +snippet declare\n\ + declare ${1?:type_name}\n\ + ${2:// attributes} \n\ + end\n\ +\n\ +"; +exports.scope = "drools"; + +}); diff --git a/src/libs/ace/snippets/eiffel.js b/src/libs/ace/snippets/eiffel.js new file mode 100755 index 0000000..2567278 --- /dev/null +++ b/src/libs/ace/snippets/eiffel.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/eiffel",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "eiffel"; + +}); diff --git a/src/libs/ace/snippets/ejs.js b/src/libs/ace/snippets/ejs.js new file mode 100755 index 0000000..fd38fa0 --- /dev/null +++ b/src/libs/ace/snippets/ejs.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/ejs",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "ejs"; + +}); diff --git a/src/libs/ace/snippets/elixir.js b/src/libs/ace/snippets/elixir.js new file mode 100755 index 0000000..d932627 --- /dev/null +++ b/src/libs/ace/snippets/elixir.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/elixir",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/elm.js b/src/libs/ace/snippets/elm.js new file mode 100755 index 0000000..a9d06b5 --- /dev/null +++ b/src/libs/ace/snippets/elm.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/elm",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "elm"; + +}); diff --git a/src/libs/ace/snippets/erlang.js b/src/libs/ace/snippets/erlang.js new file mode 100755 index 0000000..d04ee11 --- /dev/null +++ b/src/libs/ace/snippets/erlang.js @@ -0,0 +1,167 @@ +ace.define("ace/snippets/erlang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# module and export all\n\ +snippet mod\n\ + -module(${1:`Filename('', 'my')`}).\n\ + \n\ + -compile([export_all]).\n\ + \n\ + start() ->\n\ + ${2}\n\ + \n\ + stop() ->\n\ + ok.\n\ +# define directive\n\ +snippet def\n\ + -define(${1:macro}, ${2:body}).${3}\n\ +# export directive\n\ +snippet exp\n\ + -export([${1:function}/${2:arity}]).\n\ +# include directive\n\ +snippet inc\n\ + -include(\"${1:file}\").${2}\n\ +# behavior directive\n\ +snippet beh\n\ + -behaviour(${1:behaviour}).${2}\n\ +# if expression\n\ +snippet if\n\ + if\n\ + ${1:guard} ->\n\ + ${2:body}\n\ + end\n\ +# case expression\n\ +snippet case\n\ + case ${1:expression} of\n\ + ${2:pattern} ->\n\ + ${3:body};\n\ + end\n\ +# anonymous function\n\ +snippet fun\n\ + fun (${1:Parameters}) -> ${2:body} end${3}\n\ +# try...catch\n\ +snippet try\n\ + try\n\ + ${1}\n\ + catch\n\ + ${2:_:_} -> ${3:got_some_exception}\n\ + end\n\ +# record directive\n\ +snippet rec\n\ + -record(${1:record}, {\n\ + ${2:field}=${3:value}}).${4}\n\ +# todo comment\n\ +snippet todo\n\ + %% TODO: ${1}\n\ +## Snippets below (starting with '%') are in EDoc format.\n\ +## See http://www.erlang.org/doc/apps/edoc/chapter.html#id56887 for more details\n\ +# doc comment\n\ +snippet %d\n\ + %% @doc ${1}\n\ +# end of doc comment\n\ +snippet %e\n\ + %% @end\n\ +# specification comment\n\ +snippet %s\n\ + %% @spec ${1}\n\ +# private function marker\n\ +snippet %p\n\ + %% @private\n\ +# OTP application\n\ +snippet application\n\ + -module(${1:`Filename('', 'my')`}).\n\ +\n\ + -behaviour(application).\n\ +\n\ + -export([start/2, stop/1]).\n\ +\n\ + start(_Type, _StartArgs) ->\n\ + case ${2:root_supervisor}:start_link() of\n\ + {ok, Pid} ->\n\ + {ok, Pid};\n\ + Other ->\n\ + {error, Other}\n\ + end.\n\ +\n\ + stop(_State) ->\n\ + ok. \n\ +# OTP supervisor\n\ +snippet supervisor\n\ + -module(${1:`Filename('', 'my')`}).\n\ +\n\ + -behaviour(supervisor).\n\ +\n\ + %% API\n\ + -export([start_link/0]).\n\ +\n\ + %% Supervisor callbacks\n\ + -export([init/1]).\n\ +\n\ + -define(SERVER, ?MODULE).\n\ +\n\ + start_link() ->\n\ + supervisor:start_link({local, ?SERVER}, ?MODULE, []).\n\ +\n\ + init([]) ->\n\ + Server = {${2:my_server}, {$2, start_link, []},\n\ + permanent, 2000, worker, [$2]},\n\ + Children = [Server],\n\ + RestartStrategy = {one_for_one, 0, 1},\n\ + {ok, {RestartStrategy, Children}}.\n\ +# OTP gen_server\n\ +snippet gen_server\n\ + -module(${1:`Filename('', 'my')`}).\n\ +\n\ + -behaviour(gen_server).\n\ +\n\ + %% API\n\ + -export([\n\ + start_link/0\n\ + ]).\n\ +\n\ + %% gen_server callbacks\n\ + -export([init/1, handle_call/3, handle_cast/2, handle_info/2,\n\ + terminate/2, code_change/3]).\n\ +\n\ + -define(SERVER, ?MODULE).\n\ +\n\ + -record(state, {}).\n\ +\n\ + %%%===================================================================\n\ + %%% API\n\ + %%%===================================================================\n\ +\n\ + start_link() ->\n\ + gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).\n\ +\n\ + %%%===================================================================\n\ + %%% gen_server callbacks\n\ + %%%===================================================================\n\ +\n\ + init([]) ->\n\ + {ok, #state{}}.\n\ +\n\ + handle_call(_Request, _From, State) ->\n\ + Reply = ok,\n\ + {reply, Reply, State}.\n\ +\n\ + handle_cast(_Msg, State) ->\n\ + {noreply, State}.\n\ +\n\ + handle_info(_Info, State) ->\n\ + {noreply, State}.\n\ +\n\ + terminate(_Reason, _State) ->\n\ + ok.\n\ +\n\ + code_change(_OldVsn, State, _Extra) ->\n\ + {ok, State}.\n\ +\n\ + %%%===================================================================\n\ + %%% Internal functions\n\ + %%%===================================================================\n\ +\n\ +"; +exports.scope = "erlang"; + +}); diff --git a/src/libs/ace/snippets/forth.js b/src/libs/ace/snippets/forth.js new file mode 100755 index 0000000..afb1f8a --- /dev/null +++ b/src/libs/ace/snippets/forth.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/forth",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "forth"; + +}); diff --git a/src/libs/ace/snippets/fortran.js b/src/libs/ace/snippets/fortran.js new file mode 100755 index 0000000..b460592 --- /dev/null +++ b/src/libs/ace/snippets/fortran.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/fortran",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "fortran"; + +}); diff --git a/src/libs/ace/snippets/ftl.js b/src/libs/ace/snippets/ftl.js new file mode 100755 index 0000000..3b53ad4 --- /dev/null +++ b/src/libs/ace/snippets/ftl.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/ftl",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "ftl"; + +}); diff --git a/src/libs/ace/snippets/gcode.js b/src/libs/ace/snippets/gcode.js new file mode 100755 index 0000000..0ed4a10 --- /dev/null +++ b/src/libs/ace/snippets/gcode.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/gcode",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "gcode"; + +}); diff --git a/src/libs/ace/snippets/gherkin.js b/src/libs/ace/snippets/gherkin.js new file mode 100755 index 0000000..2044647 --- /dev/null +++ b/src/libs/ace/snippets/gherkin.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/gherkin",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "gherkin"; + +}); diff --git a/src/libs/ace/snippets/gitignore.js b/src/libs/ace/snippets/gitignore.js new file mode 100755 index 0000000..6da54aa --- /dev/null +++ b/src/libs/ace/snippets/gitignore.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/gitignore",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "gitignore"; + +}); diff --git a/src/libs/ace/snippets/glsl.js b/src/libs/ace/snippets/glsl.js new file mode 100755 index 0000000..bb8e40d --- /dev/null +++ b/src/libs/ace/snippets/glsl.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/glsl",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "glsl"; + +}); diff --git a/src/libs/ace/snippets/gobstones.js b/src/libs/ace/snippets/gobstones.js new file mode 100755 index 0000000..4e36e53 --- /dev/null +++ b/src/libs/ace/snippets/gobstones.js @@ -0,0 +1,41 @@ +ace.define("ace/snippets/gobstones",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Procedure\n\ +snippet proc\n\ + procedure ${1?:name}(${2:argument}) {\n\ + ${3:// body...}\n\ + }\n\ +\n\ +# Function\n\ +snippet fun\n\ + function ${1?:name}(${2:argument}) {\n\ + return ${3:// body...}\n\ + }\n\ +\n\ +# Repeat\n\ +snippet rep\n\ + repeat ${1?:times} {\n\ + ${2:// body...}\n\ + }\n\ +\n\ +# For\n\ +snippet for\n\ + foreach ${1?:e} in ${2?:list} {\n\ + ${3:// body...} \n\ + }\n\ +\n\ +# If\n\ +snippet if\n\ + if (${1?:condition}) {\n\ + ${3:// body...} \n\ + }\n\ +\n\ +# While\n\ + while (${1?:condition}) {\n\ + ${2:// body...} \n\ + }\n\ +"; +exports.scope = "gobstones"; + +}); diff --git a/src/libs/ace/snippets/golang.js b/src/libs/ace/snippets/golang.js new file mode 100755 index 0000000..0a2411d --- /dev/null +++ b/src/libs/ace/snippets/golang.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/golang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "golang"; + +}); diff --git a/src/libs/ace/snippets/graphqlschema.js b/src/libs/ace/snippets/graphqlschema.js new file mode 100755 index 0000000..6b1e49f --- /dev/null +++ b/src/libs/ace/snippets/graphqlschema.js @@ -0,0 +1,39 @@ +ace.define("ace/snippets/graphqlschema",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Type Snippet\n\ +trigger type\n\ +snippet type\n\ + type ${1:type_name} {\n\ + ${2:type_siblings}\n\ + }\n\ +\n\ +# Input Snippet\n\ +trigger input\n\ +snippet input\n\ + input ${1:input_name} {\n\ + ${2:input_siblings}\n\ + }\n\ +\n\ +# Interface Snippet\n\ +trigger interface\n\ +snippet interface\n\ + interface ${1:interface_name} {\n\ + ${2:interface_siblings}\n\ + }\n\ +\n\ +# Interface Snippet\n\ +trigger union\n\ +snippet union\n\ + union ${1:union_name} = ${2:type} | ${3: type}\n\ +\n\ +# Enum Snippet\n\ +trigger enum\n\ +snippet enum\n\ + enum ${1:enum_name} {\n\ + ${2:enum_siblings}\n\ + }\n\ +"; +exports.scope = "graphqlschema"; + +}); diff --git a/src/libs/ace/snippets/groovy.js b/src/libs/ace/snippets/groovy.js new file mode 100755 index 0000000..ddeab2c --- /dev/null +++ b/src/libs/ace/snippets/groovy.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/groovy",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "groovy"; + +}); diff --git a/src/libs/ace/snippets/haml.js b/src/libs/ace/snippets/haml.js new file mode 100755 index 0000000..2d1c68a --- /dev/null +++ b/src/libs/ace/snippets/haml.js @@ -0,0 +1,27 @@ +ace.define("ace/snippets/haml",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet t\n\ + %table\n\ + %tr\n\ + %th\n\ + ${1:headers}\n\ + %tr\n\ + %td\n\ + ${2:headers}\n\ +snippet ul\n\ + %ul\n\ + %li\n\ + ${1:item}\n\ + %li\n\ +snippet =rp\n\ + = render :partial => '${1:partial}'\n\ +snippet =rpl\n\ + = render :partial => '${1:partial}', :locals => {}\n\ +snippet =rpc\n\ + = render :partial => '${1:partial}', :collection => @$1\n\ +\n\ +"; +exports.scope = "haml"; + +}); diff --git a/src/libs/ace/snippets/handlebars.js b/src/libs/ace/snippets/handlebars.js new file mode 100755 index 0000000..1764b75 --- /dev/null +++ b/src/libs/ace/snippets/handlebars.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/handlebars",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "handlebars"; + +}); diff --git a/src/libs/ace/snippets/haskell.js b/src/libs/ace/snippets/haskell.js new file mode 100755 index 0000000..2bd8b5a --- /dev/null +++ b/src/libs/ace/snippets/haskell.js @@ -0,0 +1,89 @@ +ace.define("ace/snippets/haskell",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet lang\n\ + {-# LANGUAGE ${1:OverloadedStrings} #-}\n\ +snippet info\n\ + -- |\n\ + -- Module : ${1:Module.Namespace}\n\ + -- Copyright : ${2:Author} ${3:2011-2012}\n\ + -- License : ${4:BSD3}\n\ + --\n\ + -- Maintainer : ${5:email@something.com}\n\ + -- Stability : ${6:experimental}\n\ + -- Portability : ${7:unknown}\n\ + --\n\ + -- ${8:Description}\n\ + --\n\ +snippet import\n\ + import ${1:Data.Text}\n\ +snippet import2\n\ + import ${1:Data.Text} (${2:head})\n\ +snippet importq\n\ + import qualified ${1:Data.Text} as ${2:T}\n\ +snippet inst\n\ + instance ${1:Monoid} ${2:Type} where\n\ + ${3}\n\ +snippet type\n\ + type ${1:Type} = ${2:Type}\n\ +snippet data\n\ + data ${1:Type} = ${2:$1} ${3:Int}\n\ +snippet newtype\n\ + newtype ${1:Type} = ${2:$1} ${3:Int}\n\ +snippet class\n\ + class ${1:Class} a where\n\ + ${2}\n\ +snippet module\n\ + module `substitute(substitute(expand('%:r'), '[/\\\\]','.','g'),'^\\%(\\l*\\.\\)\\?','','')` (\n\ + ) where\n\ + `expand('%') =~ 'Main' ? \"\\n\\nmain = do\\n print \\\"hello world\\\"\" : \"\"`\n\ +\n\ +snippet const\n\ + ${1:name} :: ${2:a}\n\ + $1 = ${3:undefined}\n\ +snippet fn\n\ + ${1:fn} :: ${2:a} -> ${3:a}\n\ + $1 ${4} = ${5:undefined}\n\ +snippet fn2\n\ + ${1:fn} :: ${2:a} -> ${3:a} -> ${4:a}\n\ + $1 ${5} = ${6:undefined}\n\ +snippet ap\n\ + ${1:map} ${2:fn} ${3:list}\n\ +snippet do\n\ + do\n\ + \n\ +snippet λ\n\ + \\${1:x} -> ${2}\n\ +snippet \\\n\ + \\${1:x} -> ${2}\n\ +snippet <-\n\ + ${1:a} <- ${2:m a}\n\ +snippet ←\n\ + ${1:a} <- ${2:m a}\n\ +snippet ->\n\ + ${1:m a} -> ${2:a}\n\ +snippet →\n\ + ${1:m a} -> ${2:a}\n\ +snippet tup\n\ + (${1:a}, ${2:b})\n\ +snippet tup2\n\ + (${1:a}, ${2:b}, ${3:c})\n\ +snippet tup3\n\ + (${1:a}, ${2:b}, ${3:c}, ${4:d})\n\ +snippet rec\n\ + ${1:Record} { ${2:recFieldA} = ${3:undefined}\n\ + , ${4:recFieldB} = ${5:undefined}\n\ + }\n\ +snippet case\n\ + case ${1:something} of\n\ + ${2} -> ${3}\n\ +snippet let\n\ + let ${1} = ${2}\n\ + in ${3}\n\ +snippet where\n\ + where\n\ + ${1:fn} = ${2:undefined}\n\ +"; +exports.scope = "haskell"; + +}); diff --git a/src/libs/ace/snippets/haskell_cabal.js b/src/libs/ace/snippets/haskell_cabal.js new file mode 100755 index 0000000..56d6e87 --- /dev/null +++ b/src/libs/ace/snippets/haskell_cabal.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/haskell_cabal",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "haskell_cabal"; + +}); diff --git a/src/libs/ace/snippets/haxe.js b/src/libs/ace/snippets/haxe.js new file mode 100755 index 0000000..3769547 --- /dev/null +++ b/src/libs/ace/snippets/haxe.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/haxe",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "haxe"; + +}); diff --git a/src/libs/ace/snippets/hjson.js b/src/libs/ace/snippets/hjson.js new file mode 100755 index 0000000..b31e556 --- /dev/null +++ b/src/libs/ace/snippets/hjson.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/hjson",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/html.js b/src/libs/ace/snippets/html.js new file mode 100755 index 0000000..5b29fd5 --- /dev/null +++ b/src/libs/ace/snippets/html.js @@ -0,0 +1,835 @@ +ace.define("ace/snippets/html",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Some useful Unicode entities\n\ +# Non-Breaking Space\n\ +snippet nbs\n\ +  \n\ +# ←\n\ +snippet left\n\ + ←\n\ +# →\n\ +snippet right\n\ + →\n\ +# ↑\n\ +snippet up\n\ + ↑\n\ +# ↓\n\ +snippet down\n\ + ↓\n\ +# ↩\n\ +snippet return\n\ + ↩\n\ +# ⇤\n\ +snippet backtab\n\ + ⇤\n\ +# ⇥\n\ +snippet tab\n\ + ⇥\n\ +# ⇧\n\ +snippet shift\n\ + ⇧\n\ +# ⌃\n\ +snippet ctrl\n\ + ⌃\n\ +# ⌅\n\ +snippet enter\n\ + ⌅\n\ +# ⌘\n\ +snippet cmd\n\ + ⌘\n\ +# ⌥\n\ +snippet option\n\ + ⌥\n\ +# ⌦\n\ +snippet delete\n\ + ⌦\n\ +# ⌫\n\ +snippet backspace\n\ + ⌫\n\ +# ⎋\n\ +snippet esc\n\ + ⎋\n\ +# Generic Doctype\n\ +snippet doctype HTML 4.01 Strict\n\ + \n\ +snippet doctype HTML 4.01 Transitional\n\ + \n\ +snippet doctype HTML 5\n\ + \n\ +snippet doctype XHTML 1.0 Frameset\n\ + \n\ +snippet doctype XHTML 1.0 Strict\n\ + \n\ +snippet doctype XHTML 1.0 Transitional\n\ + \n\ +snippet doctype XHTML 1.1\n\ + \n\ +# HTML Doctype 4.01 Strict\n\ +snippet docts\n\ + \n\ +# HTML Doctype 4.01 Transitional\n\ +snippet doct\n\ + \n\ +# HTML Doctype 5\n\ +snippet doct5\n\ + \n\ +# XHTML Doctype 1.0 Frameset\n\ +snippet docxf\n\ + \n\ +# XHTML Doctype 1.0 Strict\n\ +snippet docxs\n\ + \n\ +# XHTML Doctype 1.0 Transitional\n\ +snippet docxt\n\ + \n\ +# XHTML Doctype 1.1\n\ +snippet docx\n\ + \n\ +# Attributes\n\ +snippet attr\n\ + ${1:attribute}=\"${2:property}\"\n\ +snippet attr+\n\ + ${1:attribute}=\"${2:property}\" attr+${3}\n\ +snippet .\n\ + class=\"${1}\"${2}\n\ +snippet #\n\ + id=\"${1}\"${2}\n\ +snippet alt\n\ + alt=\"${1}\"${2}\n\ +snippet charset\n\ + charset=\"${1:utf-8}\"${2}\n\ +snippet data\n\ + data-${1}=\"${2:$1}\"${3}\n\ +snippet for\n\ + for=\"${1}\"${2}\n\ +snippet height\n\ + height=\"${1}\"${2}\n\ +snippet href\n\ + href=\"${1:#}\"${2}\n\ +snippet lang\n\ + lang=\"${1:en}\"${2}\n\ +snippet media\n\ + media=\"${1}\"${2}\n\ +snippet name\n\ + name=\"${1}\"${2}\n\ +snippet rel\n\ + rel=\"${1}\"${2}\n\ +snippet scope\n\ + scope=\"${1:row}\"${2}\n\ +snippet src\n\ + src=\"${1}\"${2}\n\ +snippet title=\n\ + title=\"${1}\"${2}\n\ +snippet type\n\ + type=\"${1}\"${2}\n\ +snippet value\n\ + value=\"${1}\"${2}\n\ +snippet width\n\ + width=\"${1}\"${2}\n\ +# Elements\n\ +snippet a\n\ +
      ${2:$1}\n\ +snippet a.\n\ + ${3:$1}\n\ +snippet a#\n\ + ${3:$1}\n\ +snippet a:ext\n\ + ${2:$1}\n\ +snippet a:mail\n\ + ${3:email me}\n\ +snippet abbr\n\ + ${2}\n\ +snippet address\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet area\n\ + \"${4}\"\n\ +snippet area+\n\ + \"${4}\"\n\ + area+${5}\n\ +snippet area:c\n\ + \"${3}\"\n\ +snippet area:d\n\ + \"${3}\"\n\ +snippet area:p\n\ + \"${3}\"\n\ +snippet area:r\n\ + \"${3}\"\n\ +snippet article\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet article.\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet article#\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet aside\n\ + \n\ +snippet aside.\n\ + \n\ +snippet aside#\n\ + \n\ +snippet audio\n\ + \n\ +snippet b\n\ + ${1}\n\ +snippet base\n\ + \n\ +snippet bdi\n\ + ${1}\n\ +snippet bdo\n\ + ${2}\n\ +snippet bdo:l\n\ + ${1}\n\ +snippet bdo:r\n\ + ${1}\n\ +snippet blockquote\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet body\n\ + \n\ + ${1}\n\ + \n\ +snippet br\n\ +
      ${1}\n\ +snippet button\n\ + \n\ +snippet button.\n\ + \n\ +snippet button#\n\ + \n\ +snippet button:s\n\ + \n\ +snippet button:r\n\ + \n\ +snippet canvas\n\ + \n\ + ${1}\n\ + \n\ +snippet caption\n\ + ${1}\n\ +snippet cite\n\ + ${1}\n\ +snippet code\n\ + ${1}\n\ +snippet col\n\ + ${1}\n\ +snippet col+\n\ + \n\ + col+${1}\n\ +snippet colgroup\n\ + \n\ + ${1}\n\ + \n\ +snippet colgroup+\n\ + \n\ + \n\ + col+${1}\n\ + \n\ +snippet command\n\ + \n\ +snippet command:c\n\ + \n\ +snippet command:r\n\ + \n\ +snippet datagrid\n\ + \n\ + ${1}\n\ + \n\ +snippet datalist\n\ + \n\ + ${1}\n\ + \n\ +snippet datatemplate\n\ + \n\ + ${1}\n\ + \n\ +snippet dd\n\ +
      ${1}
      \n\ +snippet dd.\n\ +
      ${2}
      \n\ +snippet dd#\n\ +
      ${2}
      \n\ +snippet del\n\ + ${1}\n\ +snippet details\n\ +
      ${1}
      \n\ +snippet dfn\n\ + ${1}\n\ +snippet dialog\n\ + \n\ + ${1}\n\ + \n\ +snippet div\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet div.\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet div#\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet dl\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet dl.\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet dl#\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet dl+\n\ +
      \n\ +
      ${1}
      \n\ +
      ${2}
      \n\ + dt+${3}\n\ +
      \n\ +snippet dt\n\ +
      ${1}
      \n\ +snippet dt.\n\ +
      ${2}
      \n\ +snippet dt#\n\ +
      ${2}
      \n\ +snippet dt+\n\ +
      ${1}
      \n\ +
      ${2}
      \n\ + dt+${3}\n\ +snippet em\n\ + ${1}\n\ +snippet embed\n\ + \n\ +snippet fieldset\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet fieldset.\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet fieldset#\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet fieldset+\n\ +
      \n\ + ${1}\n\ + ${2}\n\ +
      \n\ + fieldset+${3}\n\ +snippet figcaption\n\ +
      ${1}
      \n\ +snippet figure\n\ +
      ${1}
      \n\ +snippet footer\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet footer.\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet footer#\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet form\n\ +
      \n\ + ${3}\n\ +
      \n\ +snippet form.\n\ +
      \n\ + ${4}\n\ +
      \n\ +snippet form#\n\ +
      \n\ + ${4}\n\ +
      \n\ +snippet h1\n\ +

      ${1}

      \n\ +snippet h1.\n\ +

      ${2}

      \n\ +snippet h1#\n\ +

      ${2}

      \n\ +snippet h2\n\ +

      ${1}

      \n\ +snippet h2.\n\ +

      ${2}

      \n\ +snippet h2#\n\ +

      ${2}

      \n\ +snippet h3\n\ +

      ${1}

      \n\ +snippet h3.\n\ +

      ${2}

      \n\ +snippet h3#\n\ +

      ${2}

      \n\ +snippet h4\n\ +

      ${1}

      \n\ +snippet h4.\n\ +

      ${2}

      \n\ +snippet h4#\n\ +

      ${2}

      \n\ +snippet h5\n\ +
      ${1}
      \n\ +snippet h5.\n\ +
      ${2}
      \n\ +snippet h5#\n\ +
      ${2}
      \n\ +snippet h6\n\ +
      ${1}
      \n\ +snippet h6.\n\ +
      ${2}
      \n\ +snippet h6#\n\ +
      ${2}
      \n\ +snippet head\n\ + \n\ + \n\ +\n\ + ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`}\n\ + ${2}\n\ + \n\ +snippet header\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet header.\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet header#\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet hgroup\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet hgroup.\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet hr\n\ +
      ${1}\n\ +snippet html\n\ + \n\ + ${1}\n\ + \n\ +snippet xhtml\n\ + \n\ + ${1}\n\ + \n\ +snippet html5\n\ + \n\ + \n\ + \n\ + \n\ + ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`}\n\ + ${2:meta}\n\ + \n\ + \n\ + ${3:body}\n\ + \n\ + \n\ +snippet i\n\ + ${1}\n\ +snippet iframe\n\ + ${2}\n\ +snippet iframe.\n\ + ${3}\n\ +snippet iframe#\n\ + ${3}\n\ +snippet img\n\ + \"${2}\"${3}\n\ +snippet img.\n\ + \"${3}\"${4}\n\ +snippet img#\n\ + \"${3}\"${4}\n\ +snippet input\n\ + ${5}\n\ +snippet input.\n\ + ${6}\n\ +snippet input:text\n\ + ${4}\n\ +snippet input:submit\n\ + ${4}\n\ +snippet input:hidden\n\ + ${4}\n\ +snippet input:button\n\ + ${4}\n\ +snippet input:image\n\ + ${5}\n\ +snippet input:checkbox\n\ + ${3}\n\ +snippet input:radio\n\ + ${3}\n\ +snippet input:color\n\ + ${4}\n\ +snippet input:date\n\ + ${4}\n\ +snippet input:datetime\n\ + ${4}\n\ +snippet input:datetime-local\n\ + ${4}\n\ +snippet input:email\n\ + ${4}\n\ +snippet input:file\n\ + ${4}\n\ +snippet input:month\n\ + ${4}\n\ +snippet input:number\n\ + ${4}\n\ +snippet input:password\n\ + ${4}\n\ +snippet input:range\n\ + ${4}\n\ +snippet input:reset\n\ + ${4}\n\ +snippet input:search\n\ + ${4}\n\ +snippet input:time\n\ + ${4}\n\ +snippet input:url\n\ + ${4}\n\ +snippet input:week\n\ + ${4}\n\ +snippet ins\n\ + ${1}\n\ +snippet kbd\n\ + ${1}\n\ +snippet keygen\n\ + ${1}\n\ +snippet label\n\ + \n\ +snippet label:i\n\ + \n\ + ${7}\n\ +snippet label:s\n\ + \n\ + \n\ +snippet legend\n\ + ${1}\n\ +snippet legend+\n\ + ${1}\n\ +snippet li\n\ +
    1. ${1}
    2. \n\ +snippet li.\n\ +
    3. ${2}
    4. \n\ +snippet li+\n\ +
    5. ${1}
    6. \n\ + li+${2}\n\ +snippet lia\n\ +
    7. ${1}
    8. \n\ +snippet lia+\n\ +
    9. ${1}
    10. \n\ + lia+${3}\n\ +snippet link\n\ + ${5}\n\ +snippet link:atom\n\ + ${2}\n\ +snippet link:css\n\ + ${4}\n\ +snippet link:favicon\n\ + ${2}\n\ +snippet link:rss\n\ + ${2}\n\ +snippet link:touch\n\ + ${2}\n\ +snippet map\n\ + \n\ + ${2}\n\ + \n\ +snippet map.\n\ + \n\ + ${3}\n\ + \n\ +snippet map#\n\ + \n\ + ${3}\n\ + \n\ +snippet map+\n\ + \n\ + \"${5}\"${6}\n\ + ${7}\n\ +snippet mark\n\ + ${1}\n\ +snippet menu\n\ + \n\ + ${1}\n\ + \n\ +snippet menu:c\n\ + \n\ + ${1}\n\ + \n\ +snippet menu:t\n\ + \n\ + ${1}\n\ + \n\ +snippet meta\n\ + ${3}\n\ +snippet meta:compat\n\ + ${3}\n\ +snippet meta:refresh\n\ + ${3}\n\ +snippet meta:utf\n\ + ${3}\n\ +snippet meter\n\ + ${1}\n\ +snippet nav\n\ + \n\ +snippet nav.\n\ + \n\ +snippet nav#\n\ + \n\ +snippet noscript\n\ + \n\ +snippet object\n\ + \n\ + ${3}\n\ + ${4}\n\ +# Embed QT Movie\n\ +snippet movie\n\ + \n\ + \n\ + \n\ + \n\ + \n\ + ${6}\n\ +snippet ol\n\ +
        \n\ + ${1}\n\ +
      \n\ +snippet ol.\n\ +
        \n\ + ${2}\n\ +
      \n\ +snippet ol#\n\ +
        \n\ + ${2}\n\ +
      \n\ +snippet ol+\n\ +
        \n\ +
      1. ${1}
      2. \n\ + li+${2}\n\ +
      \n\ +snippet opt\n\ + \n\ +snippet opt+\n\ + \n\ + opt+${3}\n\ +snippet optt\n\ + \n\ +snippet optgroup\n\ + \n\ + \n\ + opt+${3}\n\ + \n\ +snippet output\n\ + ${1}\n\ +snippet p\n\ +

      ${1}

      \n\ +snippet param\n\ + ${3}\n\ +snippet pre\n\ +
      \n\
      +		${1}\n\
      +	
      \n\ +snippet progress\n\ + ${1}\n\ +snippet q\n\ + ${1}\n\ +snippet rp\n\ + ${1}\n\ +snippet rt\n\ + ${1}\n\ +snippet ruby\n\ + \n\ + ${1}\n\ + \n\ +snippet s\n\ + ${1}\n\ +snippet samp\n\ + \n\ + ${1}\n\ + \n\ +snippet script\n\ + \n\ +snippet scriptsrc\n\ + \n\ +snippet section\n\ +
      \n\ + ${1}\n\ +
      \n\ +snippet section.\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet section#\n\ +
      \n\ + ${2}\n\ +
      \n\ +snippet select\n\ + \n\ +snippet select.\n\ + \n\ +snippet select+\n\ + \n\ +snippet small\n\ + ${1}\n\ +snippet source\n\ + \n\ +snippet span\n\ + ${1}\n\ +snippet strong\n\ + ${1}\n\ +snippet style\n\ + \n\ +snippet sub\n\ + ${1}\n\ +snippet summary\n\ + \n\ + ${1}\n\ + \n\ +snippet sup\n\ + ${1}\n\ +snippet table\n\ + \n\ + ${2}\n\ +
      \n\ +snippet table.\n\ + \n\ + ${3}\n\ +
      \n\ +snippet table#\n\ + \n\ + ${3}\n\ +
      \n\ +snippet tbody\n\ + \n\ + ${1}\n\ + \n\ +snippet td\n\ + ${1}\n\ +snippet td.\n\ + ${2}\n\ +snippet td#\n\ + ${2}\n\ +snippet td+\n\ + ${1}\n\ + td+${2}\n\ +snippet textarea\n\ + ${6}\n\ +snippet tfoot\n\ + \n\ + ${1}\n\ + \n\ +snippet th\n\ + ${1}\n\ +snippet th.\n\ + ${2}\n\ +snippet th#\n\ + ${2}\n\ +snippet th+\n\ + ${1}\n\ + th+${2}\n\ +snippet thead\n\ + \n\ + ${1}\n\ + \n\ +snippet time\n\ + \n\ +snippet title\n\ + ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`}\n\ +snippet tr\n\ + \n\ + ${1}\n\ + \n\ +snippet tr+\n\ + \n\ + ${1}\n\ + td+${2}\n\ + \n\ +snippet track\n\ + ${5}${6}\n\ +snippet ul\n\ +
        \n\ + ${1}\n\ +
      \n\ +snippet ul.\n\ +
        \n\ + ${2}\n\ +
      \n\ +snippet ul#\n\ +
        \n\ + ${2}\n\ +
      \n\ +snippet ul+\n\ +
        \n\ +
      • ${1}
      • \n\ + li+${2}\n\ +
      \n\ +snippet var\n\ + ${1}\n\ +snippet video\n\ + ${8}\n\ +snippet wbr\n\ + ${1}\n\ +"; +exports.scope = "html"; + +}); diff --git a/src/libs/ace/snippets/html_elixir.js b/src/libs/ace/snippets/html_elixir.js new file mode 100755 index 0000000..66d9eb3 --- /dev/null +++ b/src/libs/ace/snippets/html_elixir.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/html_elixir",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "html_elixir"; + +}); diff --git a/src/libs/ace/snippets/html_ruby.js b/src/libs/ace/snippets/html_ruby.js new file mode 100755 index 0000000..83676f7 --- /dev/null +++ b/src/libs/ace/snippets/html_ruby.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/html_ruby",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "html_ruby"; + +}); diff --git a/src/libs/ace/snippets/ini.js b/src/libs/ace/snippets/ini.js new file mode 100755 index 0000000..ad9bf52 --- /dev/null +++ b/src/libs/ace/snippets/ini.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/ini",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "ini"; + +}); diff --git a/src/libs/ace/snippets/io.js b/src/libs/ace/snippets/io.js new file mode 100755 index 0000000..431002b --- /dev/null +++ b/src/libs/ace/snippets/io.js @@ -0,0 +1,69 @@ +ace.define("ace/snippets/io",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippets = [ + { + "content": "assertEquals(${1:expected}, ${2:expr})", + "name": "assertEquals", + "scope": "io", + "tabTrigger": "ae" + }, + { + "content": "${1:${2:newValue} := ${3:Object} }clone do(\n\t$0\n)", + "name": "clone do", + "scope": "io", + "tabTrigger": "cdo" + }, + { + "content": "docSlot(\"${1:slotName}\", \"${2:documentation}\")", + "name": "docSlot", + "scope": "io", + "tabTrigger": "ds" + }, + { + "content": "(${1:header,}\n\t${2:body}\n)$0", + "keyEquivalent": "@(", + "name": "Indented Bracketed Line", + "scope": "io", + "tabTrigger": "(" + }, + { + "content": "\n\t$0\n", + "keyEquivalent": "\r", + "name": "Special: Return Inside Empty Parenthesis", + "scope": "io meta.empty-parenthesis.io, io meta.comma-parenthesis.io" + }, + { + "content": "${1:methodName} := method(${2:args,}\n\t$0\n)", + "name": "method", + "scope": "io", + "tabTrigger": "m" + }, + { + "content": "newSlot(\"${1:slotName}\", ${2:defaultValue}, \"${3:docString}\")$0", + "name": "newSlot", + "scope": "io", + "tabTrigger": "ns" + }, + { + "content": "${1:name} := Object clone do(\n\t$0\n)", + "name": "Object clone do", + "scope": "io", + "tabTrigger": "ocdo" + }, + { + "content": "test${1:SomeFeature} := method(\n\t$0\n)", + "name": "testMethod", + "scope": "io", + "tabTrigger": "ts" + }, + { + "content": "${1:Something}Test := ${2:UnitTest} clone do(\n\t$0\n)", + "name": "UnitTest", + "scope": "io", + "tabTrigger": "ut" + } +]; +exports.scope = "io"; + +}); diff --git a/src/libs/ace/snippets/jack.js b/src/libs/ace/snippets/jack.js new file mode 100755 index 0000000..eca7f29 --- /dev/null +++ b/src/libs/ace/snippets/jack.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/jack",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "jack"; + +}); diff --git a/src/libs/ace/snippets/jade.js b/src/libs/ace/snippets/jade.js new file mode 100755 index 0000000..f516d0c --- /dev/null +++ b/src/libs/ace/snippets/jade.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/jade",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "jade"; + +}); diff --git a/src/libs/ace/snippets/java.js b/src/libs/ace/snippets/java.js new file mode 100755 index 0000000..1bc92ac --- /dev/null +++ b/src/libs/ace/snippets/java.js @@ -0,0 +1,247 @@ +ace.define("ace/snippets/java",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "## Access Modifiers\n\ +snippet po\n\ + protected\n\ +snippet pu\n\ + public\n\ +snippet pr\n\ + private\n\ +##\n\ +## Annotations\n\ +snippet before\n\ + @Before\n\ + static void ${1:intercept}(${2:args}) { ${3} }\n\ +snippet mm\n\ + @ManyToMany\n\ + ${1}\n\ +snippet mo\n\ + @ManyToOne\n\ + ${1}\n\ +snippet om\n\ + @OneToMany${1:(cascade=CascadeType.ALL)}\n\ + ${2}\n\ +snippet oo\n\ + @OneToOne\n\ + ${1}\n\ +##\n\ +## Basic Java packages and import\n\ +snippet im\n\ + import\n\ +snippet j.b\n\ + java.beans.\n\ +snippet j.i\n\ + java.io.\n\ +snippet j.m\n\ + java.math.\n\ +snippet j.n\n\ + java.net.\n\ +snippet j.u\n\ + java.util.\n\ +##\n\ +## Class\n\ +snippet cl\n\ + class ${1:`Filename(\"\", \"untitled\")`} ${2}\n\ +snippet in\n\ + interface ${1:`Filename(\"\", \"untitled\")`} ${2:extends Parent}${3}\n\ +snippet tc\n\ + public class ${1:`Filename()`} extends ${2:TestCase}\n\ +##\n\ +## Class Enhancements\n\ +snippet ext\n\ + extends \n\ +snippet imp\n\ + implements\n\ +##\n\ +## Comments\n\ +snippet /*\n\ + /*\n\ + * ${1}\n\ + */\n\ +##\n\ +## Constants\n\ +snippet co\n\ + static public final ${1:String} ${2:var} = ${3};${4}\n\ +snippet cos\n\ + static public final String ${1:var} = \"${2}\";${3}\n\ +##\n\ +## Control Statements\n\ +snippet case\n\ + case ${1}:\n\ + ${2}\n\ +snippet def\n\ + default:\n\ + ${2}\n\ +snippet el\n\ + else\n\ +snippet elif\n\ + else if (${1}) ${2}\n\ +snippet if\n\ + if (${1}) ${2}\n\ +snippet sw\n\ + switch (${1}) {\n\ + ${2}\n\ + }\n\ +##\n\ +## Create a Method\n\ +snippet m\n\ + ${1:void} ${2:method}(${3}) ${4:throws }${5}\n\ +##\n\ +## Create a Variable\n\ +snippet v\n\ + ${1:String} ${2:var}${3: = null}${4};${5}\n\ +##\n\ +## Enhancements to Methods, variables, classes, etc.\n\ +snippet ab\n\ + abstract\n\ +snippet fi\n\ + final\n\ +snippet st\n\ + static\n\ +snippet sy\n\ + synchronized\n\ +##\n\ +## Error Methods\n\ +snippet err\n\ + System.err.print(\"${1:Message}\");\n\ +snippet errf\n\ + System.err.printf(\"${1:Message}\", ${2:exception});\n\ +snippet errln\n\ + System.err.println(\"${1:Message}\");\n\ +##\n\ +## Exception Handling\n\ +snippet as\n\ + assert ${1:test} : \"${2:Failure message}\";${3}\n\ +snippet ca\n\ + catch(${1:Exception} ${2:e}) ${3}\n\ +snippet thr\n\ + throw\n\ +snippet ths\n\ + throws\n\ +snippet try\n\ + try {\n\ + ${3}\n\ + } catch(${1:Exception} ${2:e}) {\n\ + }\n\ +snippet tryf\n\ + try {\n\ + ${3}\n\ + } catch(${1:Exception} ${2:e}) {\n\ + } finally {\n\ + }\n\ +##\n\ +## Find Methods\n\ +snippet findall\n\ + List<${1:listName}> ${2:items} = ${1}.findAll();${3}\n\ +snippet findbyid\n\ + ${1:var} ${2:item} = ${1}.findById(${3});${4}\n\ +##\n\ +## Javadocs\n\ +snippet /**\n\ + /**\n\ + * ${1}\n\ + */\n\ +snippet @au\n\ + @author `system(\"grep \\`id -un\\` /etc/passwd | cut -d \\\":\\\" -f5 | cut -d \\\",\\\" -f1\")`\n\ +snippet @br\n\ + @brief ${1:Description}\n\ +snippet @fi\n\ + @file ${1:`Filename()`}.java\n\ +snippet @pa\n\ + @param ${1:param}\n\ +snippet @re\n\ + @return ${1:param}\n\ +##\n\ +## Logger Methods\n\ +snippet debug\n\ + Logger.debug(${1:param});${2}\n\ +snippet error\n\ + Logger.error(${1:param});${2}\n\ +snippet info\n\ + Logger.info(${1:param});${2}\n\ +snippet warn\n\ + Logger.warn(${1:param});${2}\n\ +##\n\ +## Loops\n\ +snippet enfor\n\ + for (${1} : ${2}) ${3}\n\ +snippet for\n\ + for (${1}; ${2}; ${3}) ${4}\n\ +snippet wh\n\ + while (${1}) ${2}\n\ +##\n\ +## Main method\n\ +snippet main\n\ + public static void main (String[] args) {\n\ + ${1:/* code */}\n\ + }\n\ +##\n\ +## Print Methods\n\ +snippet print\n\ + System.out.print(\"${1:Message}\");\n\ +snippet printf\n\ + System.out.printf(\"${1:Message}\", ${2:args});\n\ +snippet println\n\ + System.out.println(${1});\n\ +##\n\ +## Render Methods\n\ +snippet ren\n\ + render(${1:param});${2}\n\ +snippet rena\n\ + renderArgs.put(\"${1}\", ${2});${3}\n\ +snippet renb\n\ + renderBinary(${1:param});${2}\n\ +snippet renj\n\ + renderJSON(${1:param});${2}\n\ +snippet renx\n\ + renderXml(${1:param});${2}\n\ +##\n\ +## Setter and Getter Methods\n\ +snippet set\n\ + ${1:public} void set${3:}(${2:String} ${4:}){\n\ + this.$4 = $4;\n\ + }\n\ +snippet get\n\ + ${1:public} ${2:String} get${3:}(){\n\ + return this.${4:};\n\ + }\n\ +##\n\ +## Terminate Methods or Loops\n\ +snippet re\n\ + return\n\ +snippet br\n\ + break;\n\ +##\n\ +## Test Methods\n\ +snippet t\n\ + public void test${1:Name}() throws Exception {\n\ + ${2}\n\ + }\n\ +snippet test\n\ + @Test\n\ + public void test${1:Name}() throws Exception {\n\ + ${2}\n\ + }\n\ +##\n\ +## Utils\n\ +snippet Sc\n\ + Scanner\n\ +##\n\ +## Miscellaneous\n\ +snippet action\n\ + public static void ${1:index}(${2:args}) { ${3} }\n\ +snippet rnf\n\ + notFound(${1:param});${2}\n\ +snippet rnfin\n\ + notFoundIfNull(${1:param});${2}\n\ +snippet rr\n\ + redirect(${1:param});${2}\n\ +snippet ru\n\ + unauthorized(${1:param});${2}\n\ +snippet unless\n\ + (unless=${1:param});${2}\n\ +"; +exports.scope = "java"; + +}); diff --git a/src/libs/ace/snippets/javascript.js b/src/libs/ace/snippets/javascript.js new file mode 100755 index 0000000..f3f998a --- /dev/null +++ b/src/libs/ace/snippets/javascript.js @@ -0,0 +1,202 @@ +ace.define("ace/snippets/javascript",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Prototype\n\ +snippet proto\n\ + ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n\ + ${4:// body...}\n\ + };\n\ +# Function\n\ +snippet fun\n\ + function ${1?:function_name}(${2:argument}) {\n\ + ${3:// body...}\n\ + }\n\ +# Anonymous Function\n\ +regex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\n\ +snippet f\n\ + function${M1?: ${1:functionName}}($2) {\n\ + ${0:$TM_SELECTED_TEXT}\n\ + }${M2?;}${M3?,}${M4?)}\n\ +# Immediate function\n\ +trigger \\(?f\\(\n\ +endTrigger \\)?\n\ +snippet f(\n\ + (function(${1}) {\n\ + ${0:${TM_SELECTED_TEXT:/* code */}}\n\ + }(${1}));\n\ +# if\n\ +snippet if\n\ + if (${1:true}) {\n\ + ${0}\n\ + }\n\ +# if ... else\n\ +snippet ife\n\ + if (${1:true}) {\n\ + ${2}\n\ + } else {\n\ + ${0}\n\ + }\n\ +# tertiary conditional\n\ +snippet ter\n\ + ${1:/* condition */} ? ${2:a} : ${3:b}\n\ +# switch\n\ +snippet switch\n\ + switch (${1:expression}) {\n\ + case '${3:case}':\n\ + ${4:// code}\n\ + break;\n\ + ${5}\n\ + default:\n\ + ${2:// code}\n\ + }\n\ +# case\n\ +snippet case\n\ + case '${1:case}':\n\ + ${2:// code}\n\ + break;\n\ + ${3}\n\ +\n\ +# while (...) {...}\n\ +snippet wh\n\ + while (${1:/* condition */}) {\n\ + ${0:/* code */}\n\ + }\n\ +# try\n\ +snippet try\n\ + try {\n\ + ${0:/* code */}\n\ + } catch (e) {}\n\ +# do...while\n\ +snippet do\n\ + do {\n\ + ${2:/* code */}\n\ + } while (${1:/* condition */});\n\ +# Object Method\n\ +snippet :f\n\ +regex /([,{[])|^\\s*/:f/\n\ + ${1:method_name}: function(${2:attribute}) {\n\ + ${0}\n\ + }${3:,}\n\ +# setTimeout function\n\ +snippet setTimeout\n\ +regex /\\b/st|timeout|setTimeo?u?t?/\n\ + setTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n\ +# Get Elements\n\ +snippet gett\n\ + getElementsBy${1:TagName}('${2}')${3}\n\ +# Get Element\n\ +snippet get\n\ + getElementBy${1:Id}('${2}')${3}\n\ +# console.log (Firebug)\n\ +snippet cl\n\ + console.log(${1});\n\ +# return\n\ +snippet ret\n\ + return ${1:result}\n\ +# for (property in object ) { ... }\n\ +snippet fori\n\ + for (var ${1:prop} in ${2:Things}) {\n\ + ${0:$2[$1]}\n\ + }\n\ +# hasOwnProperty\n\ +snippet has\n\ + hasOwnProperty(${1})\n\ +# docstring\n\ +snippet /**\n\ + /**\n\ + * ${1:description}\n\ + *\n\ + */\n\ +snippet @par\n\ +regex /^\\s*\\*\\s*/@(para?m?)?/\n\ + @param {${1:type}} ${2:name} ${3:description}\n\ +snippet @ret\n\ + @return {${1:type}} ${2:description}\n\ +# JSON.parse\n\ +snippet jsonp\n\ + JSON.parse(${1:jstr});\n\ +# JSON.stringify\n\ +snippet jsons\n\ + JSON.stringify(${1:object});\n\ +# self-defining function\n\ +snippet sdf\n\ + var ${1:function_name} = function(${2:argument}) {\n\ + ${3:// initial code ...}\n\ +\n\ + $1 = function($2) {\n\ + ${4:// main code}\n\ + };\n\ + }\n\ +# singleton\n\ +snippet sing\n\ + function ${1:Singleton} (${2:argument}) {\n\ + // the cached instance\n\ + var instance;\n\ +\n\ + // rewrite the constructor\n\ + $1 = function $1($2) {\n\ + return instance;\n\ + };\n\ + \n\ + // carry over the prototype properties\n\ + $1.prototype = this;\n\ +\n\ + // the instance\n\ + instance = new $1();\n\ +\n\ + // reset the constructor pointer\n\ + instance.constructor = $1;\n\ +\n\ + ${3:// code ...}\n\ +\n\ + return instance;\n\ + }\n\ +# class\n\ +snippet class\n\ +regex /^\\s*/clas{0,2}/\n\ + var ${1:class} = function(${20}) {\n\ + $40$0\n\ + };\n\ + \n\ + (function() {\n\ + ${60:this.prop = \"\"}\n\ + }).call(${1:class}.prototype);\n\ + \n\ + exports.${1:class} = ${1:class};\n\ +# \n\ +snippet for-\n\ + for (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n\ + ${0:${2:Things}[${1:i}];}\n\ + }\n\ +# for (...) {...}\n\ +snippet for\n\ + for (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n\ + ${3:$2[$1]}$0\n\ + }\n\ +# for (...) {...} (Improved Native For-Loop)\n\ +snippet forr\n\ + for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n\ + ${3:$2[$1]}$0\n\ + }\n\ +\n\ +\n\ +#modules\n\ +snippet def\n\ + define(function(require, exports, module) {\n\ + \"use strict\";\n\ + var ${1/.*\\///} = require(\"${1}\");\n\ + \n\ + $TM_SELECTED_TEXT\n\ + });\n\ +snippet req\n\ +guard ^\\s*\n\ + var ${1/.*\\///} = require(\"${1}\");\n\ + $0\n\ +snippet requ\n\ +guard ^\\s*\n\ + var ${1/.*\\/(.)/\\u$1/} = require(\"${1}\").${1/.*\\/(.)/\\u$1/};\n\ + $0\n\ +"; +exports.scope = "javascript"; + +}); diff --git a/src/libs/ace/snippets/json.js b/src/libs/ace/snippets/json.js new file mode 100755 index 0000000..cc02e65 --- /dev/null +++ b/src/libs/ace/snippets/json.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/json",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "json"; + +}); diff --git a/src/libs/ace/snippets/jsoniq.js b/src/libs/ace/snippets/jsoniq.js new file mode 100755 index 0000000..9c5eaf6 --- /dev/null +++ b/src/libs/ace/snippets/jsoniq.js @@ -0,0 +1,68 @@ +ace.define("ace/snippets/jsoniq",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet for\n\ + for $${1:item} in ${2:expr}\n\ +snippet return\n\ + return ${1:expr}\n\ +snippet import\n\ + import module namespace ${1:ns} = \"${2:http://www.example.com/}\";\n\ +snippet some\n\ + some $${1:varname} in ${2:expr} satisfies ${3:expr}\n\ +snippet every\n\ + every $${1:varname} in ${2:expr} satisfies ${3:expr}\n\ +snippet if\n\ + if(${1:true}) then ${2:expr} else ${3:true}\n\ +snippet switch\n\ + switch(${1:\"foo\"})\n\ + case ${2:\"foo\"}\n\ + return ${3:true}\n\ + default return ${4:false}\n\ +snippet try\n\ + try { ${1:expr} } catch ${2:*} { ${3:expr} }\n\ +snippet tumbling\n\ + for tumbling window $${1:varname} in ${2:expr}\n\ + start at $${3:start} when ${4:expr}\n\ + end at $${5:end} when ${6:expr}\n\ + return ${7:expr}\n\ +snippet sliding\n\ + for sliding window $${1:varname} in ${2:expr}\n\ + start at $${3:start} when ${4:expr}\n\ + end at $${5:end} when ${6:expr}\n\ + return ${7:expr}\n\ +snippet let\n\ + let $${1:varname} := ${2:expr}\n\ +snippet group\n\ + group by $${1:varname} := ${2:expr}\n\ +snippet order\n\ + order by ${1:expr} ${2:descending}\n\ +snippet stable\n\ + stable order by ${1:expr}\n\ +snippet count\n\ + count $${1:varname}\n\ +snippet ordered\n\ + ordered { ${1:expr} }\n\ +snippet unordered\n\ + unordered { ${1:expr} }\n\ +snippet treat \n\ + treat as ${1:expr}\n\ +snippet castable\n\ + castable as ${1:atomicType}\n\ +snippet cast\n\ + cast as ${1:atomicType}\n\ +snippet typeswitch\n\ + typeswitch(${1:expr})\n\ + case ${2:type} return ${3:expr}\n\ + default return ${4:expr}\n\ +snippet var\n\ + declare variable $${1:varname} := ${2:expr};\n\ +snippet fn\n\ + declare function ${1:ns}:${2:name}(){\n\ + ${3:expr}\n\ + };\n\ +snippet module\n\ + module namespace ${1:ns} = \"${2:http://www.example.com}\";\n\ +"; +exports.scope = "jsoniq"; + +}); diff --git a/src/libs/ace/snippets/jsp.js b/src/libs/ace/snippets/jsp.js new file mode 100755 index 0000000..6428e5b --- /dev/null +++ b/src/libs/ace/snippets/jsp.js @@ -0,0 +1,106 @@ +ace.define("ace/snippets/jsp",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet @page\n\ + <%@page contentType=\"text/html\" pageEncoding=\"UTF-8\"%>\n\ +snippet jstl\n\ + <%@ taglib uri=\"http://java.sun.com/jsp/jstl/core\" prefix=\"c\" %>\n\ + <%@ taglib uri=\"http://java.sun.com/jsp/jstl/functions\" prefix=\"fn\" %>\n\ +snippet jstl:c\n\ + <%@ taglib uri=\"http://java.sun.com/jsp/jstl/core\" prefix=\"c\" %>\n\ +snippet jstl:fn\n\ + <%@ taglib uri=\"http://java.sun.com/jsp/jstl/functions\" prefix=\"fn\" %>\n\ +snippet cpath\n\ + ${pageContext.request.contextPath}\n\ +snippet cout\n\ + \n\ +snippet cset\n\ + \n\ +snippet cremove\n\ + \n\ +snippet ccatch\n\ + \n\ +snippet cif\n\ + \n\ + ${2}\n\ + \n\ +snippet cchoose\n\ + \n\ + ${1}\n\ + \n\ +snippet cwhen\n\ + \n\ + ${2}\n\ + \n\ +snippet cother\n\ + \n\ + ${1}\n\ + \n\ +snippet cfore\n\ + \n\ + ${4:}\n\ + \n\ +snippet cfort\n\ + ${2:item1,item2,item3}\n\ + \n\ + ${5:}\n\ + \n\ +snippet cparam\n\ + \n\ +snippet cparam+\n\ + \n\ + cparam+${3}\n\ +snippet cimport\n\ + \n\ +snippet cimport+\n\ + \n\ + \n\ + cparam+${4}\n\ + \n\ +snippet curl\n\ + \n\ + ${3}\n\ +snippet curl+\n\ + \n\ + \n\ + cparam+${6}\n\ + \n\ + ${3}\n\ +snippet credirect\n\ + \n\ +snippet contains\n\ + ${fn:contains(${1:string}, ${2:substr})}\n\ +snippet contains:i\n\ + ${fn:containsIgnoreCase(${1:string}, ${2:substr})}\n\ +snippet endswith\n\ + ${fn:endsWith(${1:string}, ${2:suffix})}\n\ +snippet escape\n\ + ${fn:escapeXml(${1:string})}\n\ +snippet indexof\n\ + ${fn:indexOf(${1:string}, ${2:substr})}\n\ +snippet join\n\ + ${fn:join(${1:collection}, ${2:delims})}\n\ +snippet length\n\ + ${fn:length(${1:collection_or_string})}\n\ +snippet replace\n\ + ${fn:replace(${1:string}, ${2:substr}, ${3:replace})}\n\ +snippet split\n\ + ${fn:split(${1:string}, ${2:delims})}\n\ +snippet startswith\n\ + ${fn:startsWith(${1:string}, ${2:prefix})}\n\ +snippet substr\n\ + ${fn:substring(${1:string}, ${2:begin}, ${3:end})}\n\ +snippet substr:a\n\ + ${fn:substringAfter(${1:string}, ${2:substr})}\n\ +snippet substr:b\n\ + ${fn:substringBefore(${1:string}, ${2:substr})}\n\ +snippet lc\n\ + ${fn:toLowerCase(${1:string})}\n\ +snippet uc\n\ + ${fn:toUpperCase(${1:string})}\n\ +snippet trim\n\ + ${fn:trim(${1:string})}\n\ +"; +exports.scope = "jsp"; + +}); diff --git a/src/libs/ace/snippets/jsx.js b/src/libs/ace/snippets/jsx.js new file mode 100755 index 0000000..9f39a94 --- /dev/null +++ b/src/libs/ace/snippets/jsx.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/jsx",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "jsx"; + +}); diff --git a/src/libs/ace/snippets/julia.js b/src/libs/ace/snippets/julia.js new file mode 100755 index 0000000..e81370f --- /dev/null +++ b/src/libs/ace/snippets/julia.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/julia",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "julia"; + +}); diff --git a/src/libs/ace/snippets/kotlin.js b/src/libs/ace/snippets/kotlin.js new file mode 100755 index 0000000..d78bd46 --- /dev/null +++ b/src/libs/ace/snippets/kotlin.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/kotlin",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/latex.js b/src/libs/ace/snippets/latex.js new file mode 100755 index 0000000..e6fe761 --- /dev/null +++ b/src/libs/ace/snippets/latex.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/latex",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "latex"; + +}); diff --git a/src/libs/ace/snippets/lean.js b/src/libs/ace/snippets/lean.js new file mode 100755 index 0000000..cff1657 --- /dev/null +++ b/src/libs/ace/snippets/lean.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/lean",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "lean"; + +}); diff --git a/src/libs/ace/snippets/less.js b/src/libs/ace/snippets/less.js new file mode 100755 index 0000000..148aa0c --- /dev/null +++ b/src/libs/ace/snippets/less.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/less",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "less"; + +}); diff --git a/src/libs/ace/snippets/liquid.js b/src/libs/ace/snippets/liquid.js new file mode 100755 index 0000000..c7f708d --- /dev/null +++ b/src/libs/ace/snippets/liquid.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/liquid",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "liquid"; + +}); diff --git a/src/libs/ace/snippets/lisp.js b/src/libs/ace/snippets/lisp.js new file mode 100755 index 0000000..410b807 --- /dev/null +++ b/src/libs/ace/snippets/lisp.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/lisp",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "lisp"; + +}); diff --git a/src/libs/ace/snippets/live_script.js b/src/libs/ace/snippets/live_script.js new file mode 100755 index 0000000..80a9da8 --- /dev/null +++ b/src/libs/ace/snippets/live_script.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/live_script",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/livescript.js b/src/libs/ace/snippets/livescript.js new file mode 100755 index 0000000..37ea1c1 --- /dev/null +++ b/src/libs/ace/snippets/livescript.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/livescript",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "livescript"; + +}); diff --git a/src/libs/ace/snippets/logiql.js b/src/libs/ace/snippets/logiql.js new file mode 100755 index 0000000..77943f3 --- /dev/null +++ b/src/libs/ace/snippets/logiql.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/logiql",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "logiql"; + +}); diff --git a/src/libs/ace/snippets/lsl.js b/src/libs/ace/snippets/lsl.js new file mode 100755 index 0000000..717a5cf --- /dev/null +++ b/src/libs/ace/snippets/lsl.js @@ -0,0 +1,1239 @@ +ace.define("ace/snippets/lsl",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet @\n\ + @${1:label};\n\ +snippet CAMERA_ACTIVE\n\ + CAMERA_ACTIVE, ${1:integer isActive}, $0\n\ +snippet CAMERA_BEHINDNESS_ANGLE\n\ + CAMERA_BEHINDNESS_ANGLE, ${1:float degrees}, $0\n\ +snippet CAMERA_BEHINDNESS_LAG\n\ + CAMERA_BEHINDNESS_LAG, ${1:float seconds}, $0\n\ +snippet CAMERA_DISTANCE\n\ + CAMERA_DISTANCE, ${1:float meters}, $0\n\ +snippet CAMERA_FOCUS\n\ + CAMERA_FOCUS, ${1:vector position}, $0\n\ +snippet CAMERA_FOCUS_LAG\n\ + CAMERA_FOCUS_LAG, ${1:float seconds}, $0\n\ +snippet CAMERA_FOCUS_LOCKED\n\ + CAMERA_FOCUS_LOCKED, ${1:integer isLocked}, $0\n\ +snippet CAMERA_FOCUS_OFFSET\n\ + CAMERA_FOCUS_OFFSET, ${1:vector meters}, $0\n\ +snippet CAMERA_FOCUS_THRESHOLD\n\ + CAMERA_FOCUS_THRESHOLD, ${1:float meters}, $0\n\ +snippet CAMERA_PITCH\n\ + CAMERA_PITCH, ${1:float degrees}, $0\n\ +snippet CAMERA_POSITION\n\ + CAMERA_POSITION, ${1:vector position}, $0\n\ +snippet CAMERA_POSITION_LAG\n\ + CAMERA_POSITION_LAG, ${1:float seconds}, $0\n\ +snippet CAMERA_POSITION_LOCKED\n\ + CAMERA_POSITION_LOCKED, ${1:integer isLocked}, $0\n\ +snippet CAMERA_POSITION_THRESHOLD\n\ + CAMERA_POSITION_THRESHOLD, ${1:float meters}, $0\n\ +snippet CHARACTER_AVOIDANCE_MODE\n\ + CHARACTER_AVOIDANCE_MODE, ${1:integer flags}, $0\n\ +snippet CHARACTER_DESIRED_SPEED\n\ + CHARACTER_DESIRED_SPEED, ${1:float speed}, $0\n\ +snippet CHARACTER_DESIRED_TURN_SPEED\n\ + CHARACTER_DESIRED_TURN_SPEED, ${1:float speed}, $0\n\ +snippet CHARACTER_LENGTH\n\ + CHARACTER_LENGTH, ${1:float length}, $0\n\ +snippet CHARACTER_MAX_TURN_RADIUS\n\ + CHARACTER_MAX_TURN_RADIUS, ${1:float radius}, $0\n\ +snippet CHARACTER_ORIENTATION\n\ + CHARACTER_ORIENTATION, ${1:integer orientation}, $0\n\ +snippet CHARACTER_RADIUS\n\ + CHARACTER_RADIUS, ${1:float radius}, $0\n\ +snippet CHARACTER_STAY_WITHIN_PARCEL\n\ + CHARACTER_STAY_WITHIN_PARCEL, ${1:boolean stay}, $0\n\ +snippet CHARACTER_TYPE\n\ + CHARACTER_TYPE, ${1:integer type}, $0\n\ +snippet HTTP_BODY_MAXLENGTH\n\ + HTTP_BODY_MAXLENGTH, ${1:integer length}, $0\n\ +snippet HTTP_CUSTOM_HEADER\n\ + HTTP_CUSTOM_HEADER, ${1:string name}, ${2:string value}, $0\n\ +snippet HTTP_METHOD\n\ + HTTP_METHOD, ${1:string method}, $0\n\ +snippet HTTP_MIMETYPE\n\ + HTTP_MIMETYPE, ${1:string mimeType}, $0\n\ +snippet HTTP_PRAGMA_NO_CACHE\n\ + HTTP_PRAGMA_NO_CACHE, ${1:integer send_header}, $0\n\ +snippet HTTP_VERBOSE_THROTTLE\n\ + HTTP_VERBOSE_THROTTLE, ${1:integer noisy}, $0\n\ +snippet HTTP_VERIFY_CERT\n\ + HTTP_VERIFY_CERT, ${1:integer verify}, $0\n\ +snippet RC_DATA_FLAGS\n\ + RC_DATA_FLAGS, ${1:integer flags}, $0\n\ +snippet RC_DETECT_PHANTOM\n\ + RC_DETECT_PHANTOM, ${1:integer dectedPhantom}, $0\n\ +snippet RC_MAX_HITS\n\ + RC_MAX_HITS, ${1:integer maxHits}, $0\n\ +snippet RC_REJECT_TYPES\n\ + RC_REJECT_TYPES, ${1:integer filterMask}, $0\n\ +snippet at_rot_target\n\ + at_rot_target(${1:integer handle}, ${2:rotation targetrot}, ${3:rotation ourrot})\n\ + {\n\ + $0\n\ + }\n\ +snippet at_target\n\ + at_target(${1:integer tnum}, ${2:vector targetpos}, ${3:vector ourpos})\n\ + {\n\ + $0\n\ + }\n\ +snippet attach\n\ + attach(${1:key id})\n\ + {\n\ + $0\n\ + }\n\ +snippet changed\n\ + changed(${1:integer change})\n\ + {\n\ + $0\n\ + }\n\ +snippet collision\n\ + collision(${1:integer index})\n\ + {\n\ + $0\n\ + }\n\ +snippet collision_end\n\ + collision_end(${1:integer index})\n\ + {\n\ + $0\n\ + }\n\ +snippet collision_start\n\ + collision_start(${1:integer index})\n\ + {\n\ + $0\n\ + }\n\ +snippet control\n\ + control(${1:key id}, ${2:integer level}, ${3:integer edge})\n\ + {\n\ + $0\n\ + }\n\ +snippet dataserver\n\ + dataserver(${1:key query_id}, ${2:string data})\n\ + {\n\ + $0\n\ + }\n\ +snippet do\n\ + do\n\ + {\n\ + $0\n\ + }\n\ + while (${1:condition});\n\ +snippet else\n\ + else\n\ + {\n\ + $0\n\ + }\n\ +snippet email\n\ + email(${1:string time}, ${2:string address}, ${3:string subject}, ${4:string message}, ${5:integer num_left})\n\ + {\n\ + $0\n\ + }\n\ +snippet experience_permissions\n\ + experience_permissions(${1:key agent_id})\n\ + {\n\ + $0\n\ + }\n\ +snippet experience_permissions_denied\n\ + experience_permissions_denied(${1:key agent_id}, ${2:integer reason})\n\ + {\n\ + $0\n\ + }\n\ +snippet for\n\ + for (${1:start}; ${3:condition}; ${3:step})\n\ + {\n\ + $0\n\ + }\n\ +snippet http_request\n\ + http_request(${1:key request_id}, ${2:string method}, ${3:string body})\n\ + {\n\ + $0\n\ + }\n\ +snippet http_response\n\ + http_response(${1:key request_id}, ${2:integer status}, ${3:list metadata}, ${4:string body})\n\ + {\n\ + $0\n\ + }\n\ +snippet if\n\ + if (${1:condition})\n\ + {\n\ + $0\n\ + }\n\ +snippet jump\n\ + jump ${1:label};\n\ +snippet land_collision\n\ + land_collision(${1:vector pos})\n\ + {\n\ + $0\n\ + }\n\ +snippet land_collision_end\n\ + land_collision_end(${1:vector pos})\n\ + {\n\ + $0\n\ + }\n\ +snippet land_collision_start\n\ + land_collision_start(${1:vector pos})\n\ + {\n\ + $0\n\ + }\n\ +snippet link_message\n\ + link_message(${1:integer sender_num}, ${2:integer num}, ${3:string str}, ${4:key id})\n\ + {\n\ + $0\n\ + }\n\ +snippet listen\n\ + listen(${1:integer channel}, ${2:string name}, ${3:key id}, ${4:string message})\n\ + {\n\ + $0\n\ + }\n\ +snippet llAbs\n\ + llAbs(${1:integer val})\n\ +snippet llAcos\n\ + llAcos(${1:float val})\n\ +snippet llAddToLandBanList\n\ + llAddToLandBanList(${1:key agent}, ${2:float hours});\n\ + $0\n\ +snippet llAddToLandPassList\n\ + llAddToLandPassList(${1:key agent}, ${2:float hours});\n\ + $0\n\ +snippet llAdjustSoundVolume\n\ + llAdjustSoundVolume(${1:float volume});\n\ + $0\n\ +snippet llAgentInExperience\n\ + llAgentInExperience(${1:key agent})\n\ +snippet llAllowInventoryDrop\n\ + llAllowInventoryDrop(${1:integer add});\n\ + $0\n\ +snippet llAngleBetween\n\ + llAngleBetween(${1:rotation a}, ${2:rotation b})\n\ +snippet llApplyImpulse\n\ + llApplyImpulse(${1:vector force}, ${2:integer local});\n\ + $0\n\ +snippet llApplyRotationalImpulse\n\ + llApplyRotationalImpulse(${1:vector force}, ${2:integer local});\n\ + $0\n\ +snippet llAsin\n\ + llAsin(${1:float val})\n\ +snippet llAtan2\n\ + llAtan2(${1:float y}, ${2:float x})\n\ +snippet llAttachToAvatar\n\ + llAttachToAvatar(${1:integer attach_point});\n\ + $0\n\ +snippet llAttachToAvatarTemp\n\ + llAttachToAvatarTemp(${1:integer attach_point});\n\ + $0\n\ +snippet llAvatarOnLinkSitTarget\n\ + llAvatarOnLinkSitTarget(${1:integer link})\n\ +snippet llAvatarOnSitTarget\n\ + llAvatarOnSitTarget()\n\ +snippet llAxes2Rot\n\ + llAxes2Rot(${1:vector fwd}, ${2:vector left}, ${3:vector up})\n\ +snippet llAxisAngle2Rot\n\ + llAxisAngle2Rot(${1:vector axis}, ${2:float angle})\n\ +snippet llBase64ToInteger\n\ + llBase64ToInteger(${1:string str})\n\ +snippet llBase64ToString\n\ + llBase64ToString(${1:string str})\n\ +snippet llBreakAllLinks\n\ + llBreakAllLinks();\n\ + $0\n\ +snippet llBreakLink\n\ + llBreakLink(${1:integer link});\n\ + $0\n\ +snippet llCastRay\n\ + llCastRay(${1:vector start}, ${2:vector end}, ${3:list options});\n\ + $0\n\ +snippet llCeil\n\ + llCeil(${1:float val})\n\ +snippet llClearCameraParams\n\ + llClearCameraParams();\n\ + $0\n\ +snippet llClearLinkMedia\n\ + llClearLinkMedia(${1:integer link}, ${2:integer face});\n\ + $0\n\ +snippet llClearPrimMedia\n\ + llClearPrimMedia(${1:integer face});\n\ + $0\n\ +snippet llCloseRemoteDataChannel\n\ + llCloseRemoteDataChannel(${1:key channel});\n\ + $0\n\ +snippet llCollisionFilter\n\ + llCollisionFilter(${1:string name}, ${2:key id}, ${3:integer accept});\n\ + $0\n\ +snippet llCollisionSound\n\ + llCollisionSound(${1:string impact_sound}, ${2:float impact_volume});\n\ + $0\n\ +snippet llCos\n\ + llCos(${1:float theta})\n\ +snippet llCreateCharacter\n\ + llCreateCharacter(${1:list options});\n\ + $0\n\ +snippet llCreateKeyValue\n\ + llCreateKeyValue(${1:string k})\n\ +snippet llCreateLink\n\ + llCreateLink(${1:key target}, ${2:integer parent});\n\ + $0\n\ +snippet llCSV2List\n\ + llCSV2List(${1:string src})\n\ +snippet llDataSizeKeyValue\n\ + llDataSizeKeyValue()\n\ +snippet llDeleteCharacter\n\ + llDeleteCharacter();\n\ + $0\n\ +snippet llDeleteKeyValue\n\ + llDeleteKeyValue(${1:string k})\n\ +snippet llDeleteSubList\n\ + llDeleteSubList(${1:list src}, ${2:integer start}, ${3:integer end})\n\ +snippet llDeleteSubString\n\ + llDeleteSubString(${1:string src}, ${2:integer start}, ${3:integer end})\n\ +snippet llDetachFromAvatar\n\ + llDetachFromAvatar();\n\ + $0\n\ +snippet llDetectedGrab\n\ + llDetectedGrab(${1:integer number})\n\ +snippet llDetectedGroup\n\ + llDetectedGroup(${1:integer number})\n\ +snippet llDetectedKey\n\ + llDetectedKey(${1:integer number})\n\ +snippet llDetectedLinkNumber\n\ + llDetectedLinkNumber(${1:integer number})\n\ +snippet llDetectedName\n\ + llDetectedName(${1:integer number})\n\ +snippet llDetectedOwner\n\ + llDetectedOwner(${1:integer number})\n\ +snippet llDetectedPos\n\ + llDetectedPosl(${1:integer number})\n\ +snippet llDetectedRot\n\ + llDetectedRot(${1:integer number})\n\ +snippet llDetectedTouchBinormal\n\ + llDetectedTouchBinormal(${1:integer number})\n\ +snippet llDetectedTouchFace\n\ + llDetectedTouchFace(${1:integer number})\n\ +snippet llDetectedTouchNormal\n\ + llDetectedTouchNormal(${1:integer number})\n\ +snippet llDetectedTouchPos\n\ + llDetectedTouchPos(${1:integer number})\n\ +snippet llDetectedTouchST\n\ + llDetectedTouchST(${1:integer number})\n\ +snippet llDetectedTouchUV\n\ + llDetectedTouchUV(${1:integer number})\n\ +snippet llDetectedType\n\ + llDetectedType(${1:integer number})\n\ +snippet llDetectedVel\n\ + llDetectedVel(${1:integer number})\n\ +snippet llDialog\n\ + llDialog(${1:key agent}, ${2:string message}, ${3:list buttons}, ${4:integer channel});\n\ + $0\n\ +snippet llDie\n\ + llDie();\n\ + $0\n\ +snippet llDumpList2String\n\ + llDumpList2String(${1:list src}, ${2:string separator})\n\ +snippet llEdgeOfWorld\n\ + llEdgeOfWorld(${1:vector pos}, ${2:vector dir})\n\ +snippet llEjectFromLand\n\ + llEjectFromLand(${1:key agent});\n\ + $0\n\ +snippet llEmail\n\ + llEmail(${1:string address}, ${2:string subject}, ${3:string message});\n\ + $0\n\ +snippet llEscapeURL\n\ + llEscapeURL(${1:string url})\n\ +snippet llEuler2Rot\n\ + llEuler2Rot(${1:vector v})\n\ +snippet llExecCharacterCmd\n\ + llExecCharacterCmd(${1:integer command}, ${2:list options});\n\ + $0\n\ +snippet llEvade\n\ + llEvade(${1:key target}, ${2:list options});\n\ + $0\n\ +snippet llFabs\n\ + llFabs(${1:float val})\n\ +snippet llFleeFrom\n\ + llFleeFrom(${1:vector position}, ${2:float distance}, ${3:list options});\n\ + $0\n\ +snippet llFloor\n\ + llFloor(${1:float val})\n\ +snippet llForceMouselook\n\ + llForceMouselook(${1:integer mouselook});\n\ + $0\n\ +snippet llFrand\n\ + llFrand(${1:float mag})\n\ +snippet llGenerateKey\n\ + llGenerateKey()\n\ +snippet llGetAccel\n\ + llGetAccel()\n\ +snippet llGetAgentInfo\n\ + llGetAgentInfo(${1:key id})\n\ +snippet llGetAgentLanguage\n\ + llGetAgentLanguage(${1:key agent})\n\ +snippet llGetAgentList\n\ + llGetAgentList(${1:integer scope}, ${2:list options})\n\ +snippet llGetAgentSize\n\ + llGetAgentSize(${1:key agent})\n\ +snippet llGetAlpha\n\ + llGetAlpha(${1:integer face})\n\ +snippet llGetAndResetTime\n\ + llGetAndResetTime()\n\ +snippet llGetAnimation\n\ + llGetAnimation(${1:key id})\n\ +snippet llGetAnimationList\n\ + llGetAnimationList(${1:key agent})\n\ +snippet llGetAnimationOverride\n\ + llGetAnimationOverride(${1:string anim_state})\n\ +snippet llGetAttached\n\ + llGetAttached()\n\ +snippet llGetAttachedList\n\ + llGetAttachedList(${1:key id})\n\ +snippet llGetBoundingBox\n\ + llGetBoundingBox(${1:key object})\n\ +snippet llGetCameraPos\n\ + llGetCameraPos()\n\ +snippet llGetCameraRot\n\ + llGetCameraRot()\n\ +snippet llGetCenterOfMass\n\ + llGetCenterOfMass()\n\ +snippet llGetClosestNavPoint\n\ + llGetClosestNavPoint(${1:vector point}, ${2:list options})\n\ +snippet llGetColor\n\ + llGetColor(${1:integer face})\n\ +snippet llGetCreator\n\ + llGetCreator()\n\ +snippet llGetDate\n\ + llGetDate()\n\ +snippet llGetDisplayName\n\ + llGetDisplayName(${1:key id})\n\ +snippet llGetEnergy\n\ + llGetEnergy()\n\ +snippet llGetEnv\n\ + llGetEnv(${1:string name})\n\ +snippet llGetExperienceDetails\n\ + llGetExperienceDetails(${1:key experience_id})\n\ +snippet llGetExperienceErrorMessage\n\ + llGetExperienceErrorMessage(${1:integer error})\n\ +snippet llGetForce\n\ + llGetForce()\n\ +snippet llGetFreeMemory\n\ + llGetFreeMemory()\n\ +snippet llGetFreeURLs\n\ + llGetFreeURLs()\n\ +snippet llGetGeometricCenter\n\ + llGetGeometricCenter()\n\ +snippet llGetGMTclock\n\ + llGetGMTclock()\n\ +snippet llGetHTTPHeader\n\ + llGetHTTPHeader(${1:key request_id}, ${2:string header})\n\ +snippet llGetInventoryCreator\n\ + llGetInventoryCreator(${1:string item})\n\ +snippet llGetInventoryKey\n\ + llGetInventoryKey(${1:string name})\n\ +snippet llGetInventoryName\n\ + llGetInventoryName(${1:integer type}, ${2:integer number})\n\ +snippet llGetInventoryNumber\n\ + llGetInventoryNumber(${1:integer type})\n\ +snippet llGetInventoryPermMask\n\ + llGetInventoryPermMask(${1:string item}, ${2:integer mask})\n\ +snippet llGetInventoryType\n\ + llGetInventoryType(${1:string name})\n\ +snippet llGetKey\n\ + llGetKey()\n\ +snippet llGetLandOwnerAt\n\ + llGetLandOwnerAt(${1:vector pos})\n\ +snippet llGetLinkKey\n\ + llGetLinkKey(${1:integer link})\n\ +snippet llGetLinkMedia\n\ + llGetLinkMedia(${1:integer link}, ${2:integer face}, ${3:list params})\n\ +snippet llGetLinkName\n\ + llGetLinkName(${1:integer link})\n\ +snippet llGetLinkNumber\n\ + llGetLinkNumber()\n\ +snippet llGetLinkNumberOfSides\n\ + llGetLinkNumberOfSides(${1:integer link})\n\ +snippet llGetLinkPrimitiveParams\n\ + llGetLinkPrimitiveParams(${1:integer link}, ${2:list params})\n\ +snippet llGetListEntryType\n\ + llGetListEntryType(${1:list src}, ${2:integer index})\n\ +snippet llGetListLength\n\ + llGetListLength(${1:list src})\n\ +snippet llGetLocalPos\n\ + llGetLocalPos()\n\ +snippet llGetLocalRot\n\ + llGetLocalRot()\n\ +snippet llGetMass\n\ + llGetMass()\n\ +snippet llGetMassMKS\n\ + llGetMassMKS()\n\ +snippet llGetMaxScaleFactor\n\ + llGetMaxScaleFactor()\n\ +snippet llGetMemoryLimit\n\ + llGetMemoryLimit()\n\ +snippet llGetMinScaleFactor\n\ + llGetMinScaleFactor()\n\ +snippet llGetNextEmail\n\ + llGetNextEmail(${1:string address}, ${2:string subject});\n\ + $0\n\ +snippet llGetNotecardLine\n\ + llGetNotecardLine(${1:string name}, ${2:integer line})\n\ +snippet llGetNumberOfNotecardLines\n\ + llGetNumberOfNotecardLines(${1:string name})\n\ +snippet llGetNumberOfPrims\n\ + llGetNumberOfPrims()\n\ +snippet llGetNumberOfSides\n\ + llGetNumberOfSides()\n\ +snippet llGetObjectDesc\n\ + llGetObjectDesc()\n\ +snippet llGetObjectDetails\n\ + llGetObjectDetails(${1:key id}, ${2:list params})\n\ +snippet llGetObjectMass\n\ + llGetObjectMass(${1:key id})\n\ +snippet llGetObjectName\n\ + llGetObjectName()\n\ +snippet llGetObjectPermMask\n\ + llGetObjectPermMask(${1:integer mask})\n\ +snippet llGetObjectPrimCount\n\ + llGetObjectPrimCount(${1:key prim})\n\ +snippet llGetOmega\n\ + llGetOmega()\n\ +snippet llGetOwner\n\ + llGetOwner()\n\ +snippet llGetOwnerKey\n\ + llGetOwnerKey(${1:key id})\n\ +snippet llGetParcelDetails\n\ + llGetParcelDetails(${1:vector pos}, ${2:list params})\n\ +snippet llGetParcelFlags\n\ + llGetParcelFlags(${1:vector pos})\n\ +snippet llGetParcelMaxPrims\n\ + llGetParcelMaxPrims(${1:vector pos}, ${2:integer sim_wide})\n\ +snippet llGetParcelMusicURL\n\ + llGetParcelMusicURL()\n\ +snippet llGetParcelPrimCount\n\ + llGetParcelPrimCount(${1:vector pos}, ${2:integer category}, ${3:integer sim_wide})\n\ +snippet llGetParcelPrimOwners\n\ + llGetParcelPrimOwners(${1:vector pos})\n\ +snippet llGetPermissions\n\ + llGetPermissions()\n\ +snippet llGetPermissionsKey\n\ + llGetPermissionsKey()\n\ +snippet llGetPhysicsMaterial\n\ + llGetPhysicsMaterial()\n\ +snippet llGetPos\n\ + llGetPos()\n\ +snippet llGetPrimitiveParams\n\ + llGetPrimitiveParams(${1:list params})\n\ +snippet llGetPrimMediaParams\n\ + llGetPrimMediaParams(${1:integer face}, ${2:list params})\n\ +snippet llGetRegionAgentCount\n\ + llGetRegionAgentCount()\n\ +snippet llGetRegionCorner\n\ + llGetRegionCorner()\n\ +snippet llGetRegionFlags\n\ + llGetRegionFlags()\n\ +snippet llGetRegionFPS\n\ + llGetRegionFPS()\n\ +snippet llGetRegionName\n\ + llGetRegionName()\n\ +snippet llGetRegionTimeDilation\n\ + llGetRegionTimeDilation()\n\ +snippet llGetRootPosition\n\ + llGetRootPosition()\n\ +snippet llGetRootRotation\n\ + llGetRootRotation()\n\ +snippet llGetRot\n\ + llGetRot()\n\ +snippet llGetScale\n\ + llGetScale()\n\ +snippet llGetScriptName\n\ + llGetScriptName()\n\ +snippet llGetScriptState\n\ + llGetScriptState(${1:string script})\n\ +snippet llGetSimStats\n\ + llGetSimStats(${1:integer stat_type})\n\ +snippet llGetSimulatorHostname\n\ + llGetSimulatorHostname()\n\ +snippet llGetSPMaxMemory\n\ + llGetSPMaxMemory()\n\ +snippet llGetStartParameter\n\ + llGetStartParameter()\n\ +snippet llGetStaticPath\n\ + llGetStaticPath(${1:vector start}, ${2:vector end}, ${3:float radius}, ${4:list params})\n\ +snippet llGetStatus\n\ + llGetStatus(${1:integer status})\n\ +snippet llGetSubString\n\ + llGetSubString(${1:string src}, ${2:integer start}, ${3:integer end})\n\ +snippet llGetSunDirection\n\ + llGetSunDirection()\n\ +snippet llGetTexture\n\ + llGetTexture(${1:integer face})\n\ +snippet llGetTextureOffset\n\ + llGetTextureOffset(${1:integer face})\n\ +snippet llGetTextureRot\n\ + llGetTextureRot(${1:integer face})\n\ +snippet llGetTextureScale\n\ + llGetTextureScale(${1:integer face})\n\ +snippet llGetTime\n\ + llGetTime()\n\ +snippet llGetTimeOfDay\n\ + llGetTimeOfDay()\n\ +snippet llGetTimestamp\n\ + llGetTimestamp()\n\ +snippet llGetTorque\n\ + llGetTorque()\n\ +snippet llGetUnixTime\n\ + llGetUnixTime()\n\ +snippet llGetUsedMemory\n\ + llGetUsedMemory()\n\ +snippet llGetUsername\n\ + llGetUsername(${1:key id})\n\ +snippet llGetVel\n\ + llGetVel()\n\ +snippet llGetWallclock\n\ + llGetWallclock()\n\ +snippet llGiveInventory\n\ + llGiveInventory(${1:key destination}, ${2:string inventory});\n\ + $0\n\ +snippet llGiveInventoryList\n\ + llGiveInventoryList(${1:key target}, ${2:string folder}, ${3:list inventory});\n\ + $0\n\ +snippet llGiveMoney\n\ + llGiveMoney(${1:key destination}, ${2:integer amount})\n\ +snippet llGround\n\ + llGround(${1:vector offset})\n\ +snippet llGroundContour\n\ + llGroundContour(${1:vector offset})\n\ +snippet llGroundNormal\n\ + llGroundNormal(${1:vector offset})\n\ +snippet llGroundRepel\n\ + llGroundRepel(${1:float height}, ${2:integer water}, ${3:float tau});\n\ + $0\n\ +snippet llGroundSlope\n\ + llGroundSlope(${1:vector offset})\n\ +snippet llHTTPRequest\n\ + llHTTPRequest(${1:string url}, ${2:list parameters}, ${3:string body})\n\ +snippet llHTTPResponse\n\ + llHTTPResponse(${1:key request_id}, ${2:integer status}, ${3:string body});\n\ + $0\n\ +snippet llInsertString\n\ + llInsertString(${1:string dst}, ${2:integer pos}, ${3:string src})\n\ +snippet llInstantMessage\n\ + llInstantMessage(${1:key user}, ${2:string message});\n\ + $0\n\ +snippet llIntegerToBase64\n\ + llIntegerToBase64(${1:integer number})\n\ +snippet llJson2List\n\ + llJson2List(${1:string json})\n\ +snippet llJsonGetValue\n\ + llJsonGetValue(${1:string json}, ${2:list specifiers})\n\ +snippet llJsonSetValue\n\ + llJsonSetValue(${1:string json}, ${2:list specifiers}, ${3:string newValue})\n\ +snippet llJsonValueType\n\ + llJsonValueType(${1:string json}, ${2:list specifiers})\n\ +snippet llKey2Name\n\ + llKey2Name(${1:key id})\n\ +snippet llKeyCountKeyValue\n\ + llKeyCountKeyValue()\n\ +snippet llKeysKeyValue\n\ + llKeysKeyValue(${1:integer first}, ${2:integer count})\n\ +snippet llLinkParticleSystem\n\ + llLinkParticleSystem(${1:integer link}, ${2:list rules});\n\ + $0\n\ +snippet llLinkSitTarget\n\ + llLinkSitTarget(${1:integer link}, ${2:vector offset}, ${3:rotation rot});\n\ + $0\n\ +snippet llList2CSV\n\ + llList2CSV(${1:list src})\n\ +snippet llList2Float\n\ + llList2Float(${1:list src}, ${2:integer index})\n\ +snippet llList2Integer\n\ + llList2Integer(${1:list src}, ${2:integer index})\n\ +snippet llList2Json\n\ + llList2Json(${1:string type}, ${2:list values})\n\ +snippet llList2Key\n\ + llList2Key(${1:list src}, ${2:integer index})\n\ +snippet llList2List\n\ + llList2List(${1:list src}, ${2:integer start}, ${3:integer end})\n\ +snippet llList2ListStrided\n\ + llList2ListStrided(${1:list src}, ${2:integer start}, ${3:integer end}, ${4:integer stride})\n\ +snippet llList2Rot\n\ + llList2Rot(${1:list src}, ${2:integer index})\n\ +snippet llList2String\n\ + llList2String(${1:list src}, ${2:integer index})\n\ +snippet llList2Vector\n\ + llList2Vector(${1:list src}, ${2:integer index})\n\ +snippet llListen\n\ + llListen(${1:integer channel}, ${2:string name}, ${3:key id}, ${4:string msg})\n\ +snippet llListenControl\n\ + llListenControl(${1:integer handle}, ${2:integer active});\n\ + $0\n\ +snippet llListenRemove\n\ + llListenRemove(${1:integer handle});\n\ + $0\n\ +snippet llListFindList\n\ + llListFindList(${1:list src}, ${2:list test})\n\ +snippet llListInsertList\n\ + llListInsertList(${1:list dest}, ${2:list src}, ${3:integer start})\n\ +snippet llListRandomize\n\ + llListRandomize(${1:list src}, ${2:integer stride})\n\ +snippet llListReplaceList\n\ + llListReplaceList(${1:list dest}, ${2:list src}, ${3:integer start}, ${4:integer end})\n\ +snippet llListSort\n\ + llListSort(${1:list src}, ${2:integer stride}, ${3:integer ascending})\n\ +snippet llListStatistics\n\ + llListStatistics(${1:integer operation}, ${2:list src})\n\ +snippet llLoadURL\n\ + llLoadURL(${1:key agent}, ${2:string message}, ${3:string url});\n\ + $0\n\ +snippet llLog\n\ + llLog(${1:float val})\n\ +snippet llLog10\n\ + llLog10(${1:float val})\n\ +snippet llLookAt\n\ + llLookAt(${1:vector target}, ${2:float strength}, ${3:float damping});\n\ + $0\n\ +snippet llLoopSound\n\ + llLoopSound(${1:string sound}, ${2:float volume});\n\ + $0\n\ +snippet llLoopSoundMaster\n\ + llLoopSoundMaster(${1:string sound}, ${2:float volume});\n\ + $0\n\ +snippet llLoopSoundSlave\n\ + llLoopSoundSlave(${1:string sound}, ${2:float volume});\n\ + $0\n\ +snippet llManageEstateAccess\n\ + llManageEstateAccess(${1:integer action}, ${2:key agent})\n\ +snippet llMapDestination\n\ + llMapDestination(${1:string simname}, ${2:vector pos}, ${3:vector look_at});\n\ + $0\n\ +snippet llMD5String\n\ + llMD5String(${1:string src}, ${2:integer nonce})\n\ +snippet llMessageLinked\n\ + llMessageLinked(${1:integer link}, ${2:integer num}, ${3:string str}, ${4:key id});\n\ + $0\n\ +snippet llMinEventDelay\n\ + llMinEventDelay(${1:float delay});\n\ + $0\n\ +snippet llModifyLand\n\ + llModifyLand(${1:integer action}, ${2:integer brush});\n\ + $0\n\ +snippet llModPow\n\ + llModPow(${1:integer a}, ${2:integer b}, ${3:integer c})\n\ +snippet llMoveToTarget\n\ + llMoveToTarget(${1:vector target}, ${2:float tau});\n\ + $0\n\ +snippet llNavigateTo\n\ + llNavigateTo(${1:vector pos}, ${2:list options});\n\ + $0\n\ +snippet llOffsetTexture\n\ + llOffsetTexture(${1:float u}, ${2:float v}, ${3:integer face});\n\ + $0\n\ +snippet llOpenRemoteDataChannel\n\ + llOpenRemoteDataChannel();\n\ + $0\n\ +snippet llOverMyLand\n\ + llOverMyLand(${1:key id})\n\ +snippet llOwnerSay\n\ + llOwnerSay(${1:string msg});\n\ + $0\n\ +snippet llParcelMediaCommandList\n\ + llParcelMediaCommandList(${1:list commandList});\n\ + $0\n\ +snippet llParcelMediaQuery\n\ + llParcelMediaQuery(${1:list query})\n\ +snippet llParseString2List\n\ + llParseString2List(${1:string src}, ${2:list separators}, ${3:list spacers})\n\ +snippet llParseStringKeepNulls\n\ + llParseStringKeepNulls(${1:string src}, ${2:list separators}, ${3:list spacers})\n\ +snippet llParticleSystem\n\ + llParticleSystem(${1:list rules});\n\ + $0\n\ +snippet llPassCollisions\n\ + llPassCollisions(${1:integer pass});\n\ + $0\n\ +snippet llPassTouches\n\ + llPassTouches(${1:integer pass});\n\ + $0\n\ +snippet llPatrolPoints\n\ + llPatrolPoints(${1:list patrolPoints}, ${2:list options});\n\ + $0\n\ +snippet llPlaySound\n\ + llPlaySound(${1:string sound}, ${2:float volume});\n\ + $0\n\ +snippet llPlaySoundSlave\n\ + llPlaySoundSlave(${1:string sound}, ${2:float volume});\n\ + $0\n\ +snippet llPow\n\ + llPow(${1:float base}, ${2:float exponent})\n\ +snippet llPreloadSound\n\ + llPreloadSound(${1:string sound});\n\ + $0\n\ +snippet llPursue\n\ + llPursue(${1:key target}, ${2:list options});\n\ + $0\n\ +snippet llPushObject\n\ + llPushObject(${1:key target}, ${2:vector impulse}, ${3:vector ang_impulse}, ${4:integer local});\n\ + $0\n\ +snippet llReadKeyValue\n\ + llReadKeyValue(${1:string k})\n\ +snippet llRegionSay\n\ + llRegionSay(${1:integer channel}, ${2:string msg});\n\ + $0\n\ +snippet llRegionSayTo\n\ + llRegionSayTo(${1:key target}, ${2:integer channel}, ${3:string msg});\n\ + $0\n\ +snippet llReleaseControls\n\ + llReleaseControls();\n\ + $0\n\ +snippet llReleaseURL\n\ + llReleaseURL(${1:string url});\n\ + $0\n\ +snippet llRemoteDataReply\n\ + llRemoteDataReply(${1:key channel}, ${2:key message_id}, ${3:string sdata}, ${4:integer idata});\n\ + $0\n\ +snippet llRemoteLoadScriptPin\n\ + llRemoteLoadScriptPin(${1:key target}, ${2:string name}, ${3:integer pin}, ${4:integer running}, ${5:integer start_param});\n\ + $0\n\ +snippet llRemoveFromLandBanList\n\ + llRemoveFromLandBanList(${1:key agent});\n\ + $0\n\ +snippet llRemoveFromLandPassList\n\ + llRemoveFromLandPassList(${1:key agent});\n\ + $0\n\ +snippet llRemoveInventory\n\ + llRemoveInventory(${1:string item});\n\ + $0\n\ +snippet llRemoveVehicleFlags\n\ + llRemoveVehicleFlags(${1:integer flags});\n\ + $0\n\ +snippet llRequestAgentData\n\ + llRequestAgentData(${1:key id}, ${2:integer data})\n\ +snippet llRequestDisplayName\n\ + llRequestDisplayName(${1:key id})\n\ +snippet llRequestExperiencePermissions\n\ + llRequestExperiencePermissions(${1:key agent}, ${2:string name})\n\ +snippet llRequestInventoryData\n\ + llRequestInventoryData(${1:string name})\n\ +snippet llRequestPermissions\n\ + llRequestPermissions(${1:key agent}, ${2:integer permissions})\n\ +snippet llRequestSecureURL\n\ + llRequestSecureURL()\n\ +snippet llRequestSimulatorData\n\ + llRequestSimulatorData(${1:string region}, ${2:integer data})\n\ +snippet llRequestURL\n\ + llRequestURL()\n\ +snippet llRequestUsername\n\ + llRequestUsername(${1:key id})\n\ +snippet llResetAnimationOverride\n\ + llResetAnimationOverride(${1:string anim_state});\n\ + $0\n\ +snippet llResetLandBanList\n\ + llResetLandBanList();\n\ + $0\n\ +snippet llResetLandPassList\n\ + llResetLandPassList();\n\ + $0\n\ +snippet llResetOtherScript\n\ + llResetOtherScript(${1:string name});\n\ + $0\n\ +snippet llResetScript\n\ + llResetScript();\n\ + $0\n\ +snippet llResetTime\n\ + llResetTime();\n\ + $0\n\ +snippet llReturnObjectsByID\n\ + llReturnObjectsByID(${1:list objects})\n\ +snippet llReturnObjectsByOwner\n\ + llReturnObjectsByOwner(${1:key owner}, ${2:integer scope})\n\ +snippet llRezAtRoot\n\ + llRezAtRoot(${1:string inventory}, ${2:vector position}, ${3:vector velocity}, ${4:rotation rot}, ${5:integer param});\n\ + $0\n\ +snippet llRezObject\n\ + llRezObject(${1:string inventory}, ${2:vector pos}, ${3:vector vel}, ${4:rotation rot}, ${5:integer param});\n\ + $0\n\ +snippet llRot2Angle\n\ + llRot2Angle(${1:rotation rot})\n\ +snippet llRot2Axis\n\ + llRot2Axis(${1:rotation rot})\n\ +snippet llRot2Euler\n\ + llRot2Euler(${1:rotation quat})\n\ +snippet llRot2Fwd\n\ + llRot2Fwd(${1:rotation q})\n\ +snippet llRot2Left\n\ + llRot2Left(${1:rotation q})\n\ +snippet llRot2Up\n\ + llRot2Up(${1:rotation q})\n\ +snippet llRotateTexture\n\ + llRotateTexture(${1:float angle}, ${2:integer face});\n\ + $0\n\ +snippet llRotBetween\n\ + llRotBetween(${1:vector start}, ${2:vector end})\n\ +snippet llRotLookAt\n\ + llRotLookAt(${1:rotation target_direction}, ${2:float strength}, ${3:float damping});\n\ + $0\n\ +snippet llRotTarget\n\ + llRotTarget(${1:rotation rot}, ${2:float error})\n\ +snippet llRotTargetRemove\n\ + llRotTargetRemove(${1:integer handle});\n\ + $0\n\ +snippet llRound\n\ + llRound(${1:float val})\n\ +snippet llSameGroup\n\ + llSameGroup(${1:key group})\n\ +snippet llSay\n\ + llSay(${1:integer channel}, ${2:string msg});\n\ + $0\n\ +snippet llScaleByFactor\n\ + llScaleByFactor(${1:float scaling_factor})\n\ +snippet llScaleTexture\n\ + llScaleTexture(${1:float u}, ${2:float v}, ${3:integer face});\n\ + $0\n\ +snippet llScriptDanger\n\ + llScriptDanger(${1:vector pos})\n\ +snippet llScriptProfiler\n\ + llScriptProfiler(${1:integer flags});\n\ + $0\n\ +snippet llSendRemoteData\n\ + llSendRemoteData(${1:key channel}, ${2:string dest}, ${3:integer idata}, ${4:string sdata})\n\ +snippet llSensor\n\ + llSensor(${1:string name}, ${2:key id}, ${3:integer type}, ${4:float range}, ${5:float arc});\n\ + $0\n\ +snippet llSensorRepeat\n\ + llSensorRepeat(${1:string name}, ${2:key id}, ${3:integer type}, ${4:float range}, ${5:float arc}, ${6:float rate});\n\ + $0\n\ +snippet llSetAlpha\n\ + llSetAlpha(${1:float alpha}, ${2:integer face});\n\ + $0\n\ +snippet llSetAngularVelocity\n\ + llSetAngularVelocity(${1:vector force}, ${2:integer local});\n\ + $0\n\ +snippet llSetAnimationOverride\n\ + llSetAnimationOverride(${1:string anim_state}, ${2:string anim})\n\ +snippet llSetBuoyancy\n\ + llSetBuoyancy(${1:float buoyancy});\n\ + $0\n\ +snippet llSetCameraAtOffset\n\ + llSetCameraAtOffset(${1:vector offset});\n\ + $0\n\ +snippet llSetCameraEyeOffset\n\ + llSetCameraEyeOffset(${1:vector offset});\n\ + $0\n\ +snippet llSetCameraParams\n\ + llSetCameraParams(${1:list rules});\n\ + $0\n\ +snippet llSetClickAction\n\ + llSetClickAction(${1:integer action});\n\ + $0\n\ +snippet llSetColor\n\ + llSetColor(${1:vector color}, ${2:integer face});\n\ + $0\n\ +snippet llSetContentType\n\ + llSetContentType(${1:key request_id}, ${2:integer content_type});\n\ + $0\n\ +snippet llSetDamage\n\ + llSetDamage(${1:float damage});\n\ + $0\n\ +snippet llSetForce\n\ + llSetForce(${1:vector force}, ${2:integer local});\n\ + $0\n\ +snippet llSetForceAndTorque\n\ + llSetForceAndTorque(${1:vector force}, ${2:vector torque}, ${3:integer local});\n\ + $0\n\ +snippet llSetHoverHeight\n\ + llSetHoverHeight(${1:float height}, ${2:integer water}, ${3:float tau});\n\ + $0\n\ +snippet llSetKeyframedMotion\n\ + llSetKeyframedMotion(${1:list keyframes}, ${2:list options});\n\ + $0\n\ +snippet llSetLinkAlpha\n\ + llSetLinkAlpha(${1:integer link}, ${2:float alpha}, ${3:integer face});\n\ + $0\n\ +snippet llSetLinkCamera\n\ + llSetLinkCamera(${1:integer link}, ${2:vector eye}, ${3:vector at});\n\ + $0\n\ +snippet llSetLinkColor\n\ + llSetLinkColor(${1:integer link}, ${2:vector color}, ${3:integer face});\n\ + $0\n\ +snippet llSetLinkMedia\n\ + llSetLinkMedia(${1:integer link}, ${2:integer face}, ${3:list params});\n\ + $0\n\ +snippet llSetLinkPrimitiveParams\n\ + llSetLinkPrimitiveParams(${1:integer link}, ${2:list rules});\n\ + $0\n\ +snippet llSetLinkPrimitiveParamsFast\n\ + llSetLinkPrimitiveParamsFast(${1:integer link}, ${2:list rules});\n\ + $0\n\ +snippet llSetLinkTexture\n\ + llSetLinkTexture(${1:integer link}, ${2:string texture}, ${3:integer face});\n\ + $0\n\ +snippet llSetLinkTextureAnim\n\ + llSetLinkTextureAnim(${1:integer link}, ${2:integer mode}, ${3:integer face}, ${4:integer sizex}, ${5:integer sizey}, ${6:float start}, ${7:float length}, ${8:float rate});\n\ + $0\n\ +snippet llSetLocalRot\n\ + llSetLocalRot(${1:rotation rot});\n\ + $0\n\ +snippet llSetMemoryLimit\n\ + llSetMemoryLimit(${1:integer limit})\n\ +snippet llSetObjectDesc\n\ + llSetObjectDesc(${1:string description});\n\ + $0\n\ +snippet llSetObjectName\n\ + llSetObjectName(${1:string name});\n\ + $0\n\ +snippet llSetParcelMusicURL\n\ + llSetParcelMusicURL(${1:string url});\n\ + $0\n\ +snippet llSetPayPrice\n\ + llSetPayPrice(${1:integer price}, [${2:integer price_button_a}, ${3:integer price_button_b}, ${4:integer price_button_c}, ${5:integer price_button_d}]);\n\ + $0\n\ +snippet llSetPhysicsMaterial\n\ + llSetPhysicsMaterial(${1:integer mask}, ${2:float gravity_multiplier}, ${3:float restitution}, ${4:float friction}, ${5:float density});\n\ + $0\n\ +snippet llSetPos\n\ + llSetPos(${1:vector pos});\n\ + $0\n\ +snippet llSetPrimitiveParams\n\ + llSetPrimitiveParams(${1:list rules});\n\ + $0\n\ +snippet llSetPrimMediaParams\n\ + llSetPrimMediaParams(${1:integer face}, ${2:list params});\n\ + $0\n\ +snippet llSetRegionPos\n\ + llSetRegionPos(${1:vector position})\n\ +snippet llSetRemoteScriptAccessPin\n\ + llSetRemoteScriptAccessPin(${1:integer pin});\n\ + $0\n\ +snippet llSetRot\n\ + llSetRot(${1:rotation rot});\n\ + $0\n\ +snippet llSetScale\n\ + llSetScale(${1:vector size});\n\ + $0\n\ +snippet llSetScriptState\n\ + llSetScriptState(${1:string name}, ${2:integer run});\n\ + $0\n\ +snippet llSetSitText\n\ + llSetSitText(${1:string text});\n\ + $0\n\ +snippet llSetSoundQueueing\n\ + llSetSoundQueueing(${1:integer queue});\n\ + $0\n\ +snippet llSetSoundRadius\n\ + llSetSoundRadius(${1:float radius});\n\ + $0\n\ +snippet llSetStatus\n\ + llSetStatus(${1:integer status}, ${2:integer value});\n\ + $0\n\ +snippet llSetText\n\ + llSetText(${1:string text}, ${2:vector color}, ${3:float alpha});\n\ + $0\n\ +snippet llSetTexture\n\ + llSetTexture(${1:string texture}, ${2:integer face});\n\ + $0\n\ +snippet llSetTextureAnim\n\ + llSetTextureAnim(${1:integer mode}, ${2:integer face}, ${3:integer sizex}, ${4:integer sizey}, ${5:float start}, ${6:float length}, ${7:float rate});\n\ + $0\n\ +snippet llSetTimerEvent\n\ + llSetTimerEvent(${1:float sec});\n\ + $0\n\ +snippet llSetTorque\n\ + llSetTorque(${1:vector torque}, ${2:integer local});\n\ + $0\n\ +snippet llSetTouchText\n\ + llSetTouchText(${1:string text});\n\ + $0\n\ +snippet llSetVehicleFlags\n\ + llSetVehicleFlags(${1:integer flags});\n\ + $0\n\ +snippet llSetVehicleFloatParam\n\ + llSetVehicleFloatParam(${1:integer param}, ${2:float value});\n\ + $0\n\ +snippet llSetVehicleRotationParam\n\ + llSetVehicleRotationParam(${1:integer param}, ${2:rotation rot});\n\ + $0\n\ +snippet llSetVehicleType\n\ + llSetVehicleType(${1:integer type});\n\ + $0\n\ +snippet llSetVehicleVectorParam\n\ + llSetVehicleVectorParam(${1:integer param}, ${2:vector vec});\n\ + $0\n\ +snippet llSetVelocity\n\ + llSetVelocity(${1:vector force}, ${2:integer local});\n\ + $0\n\ +snippet llSHA1String\n\ + llSHA1String(${1:string src})\n\ +snippet llShout\n\ + llShout(${1:integer channel}, ${2:string msg});\n\ + $0\n\ +snippet llSin\n\ + llSin(${1:float theta})\n\ +snippet llSitTarget\n\ + llSitTarget(${1:vector offset}, ${2:rotation rot});\n\ + $0\n\ +snippet llSleep\n\ + llSleep(${1:float sec});\n\ + $0\n\ +snippet llSqrt\n\ + llSqrt(${1:float val})\n\ +snippet llStartAnimation\n\ + llStartAnimation(${1:string anim});\n\ + $0\n\ +snippet llStopAnimation\n\ + llStopAnimation(${1:string anim});\n\ + $0\n\ +snippet llStopHover\n\ + llStopHover();\n\ + $0\n\ +snippet llStopLookAt\n\ + llStopLookAt();\n\ + $0\n\ +snippet llStopMoveToTarget\n\ + llStopMoveToTarget();\n\ + $0\n\ +snippet llStopSound\n\ + llStopSound();\n\ + $0\n\ +snippet llStringLength\n\ + llStringLength(${1:string str})\n\ +snippet llStringToBase64\n\ + llStringToBase64(${1:string str})\n\ +snippet llStringTrim\n\ + llStringTrim(${1:string src}, ${2:integer type})\n\ +snippet llSubStringIndex\n\ + llSubStringIndex(${1:string source}, ${2:string pattern})\n\ +snippet llTakeControls\n\ + llTakeControls(${1:integer controls}, ${2:integer accept}, ${3:integer pass_on});\n\ + $0\n\ +snippet llTan\n\ + llTan(${1:float theta})\n\ +snippet llTarget\n\ + llTarget(${1:vector position}, ${2:float range})\n\ +snippet llTargetOmega\n\ + llTargetOmega(${1:vector axis}, ${2:float spinrate}, ${3:float gain});\n\ + $0\n\ +snippet llTargetRemove\n\ + llTargetRemove(${1:integer handle});\n\ + $0\n\ +snippet llTeleportAgent\n\ + llTeleportAgent(${1:key agent}, ${2:string landmark}, ${3:vector position}, ${4:vector look_at});\n\ + $0\n\ +snippet llTeleportAgentGlobalCoords\n\ + llTeleportAgentGlobalCoords(${1:key agent}, ${2:vector global_coordinates}, ${3:vector region_coordinates}, ${4:vector look_at});\n\ + $0\n\ +snippet llTeleportAgentHome\n\ + llTeleportAgentHome(${1:key agent});\n\ + $0\n\ +snippet llTextBox\n\ + llTextBox(${1:key agent}, ${2:string message}, ${3:integer channel});\n\ + $0\n\ +snippet llToLower\n\ + llToLower(${1:string src})\n\ +snippet llToUpper\n\ + llToUpper(${1:string src})\n\ +snippet llTransferLindenDollars\n\ + llTransferLindenDollars(${1:key destination}, ${2:integer amount})\n\ +snippet llTriggerSound\n\ + llTriggerSound(${1:string sound}, ${2:float volume});\n\ + $0\n\ +snippet llTriggerSoundLimited\n\ + llTriggerSoundLimited(${1:string sound}, ${2:float volume}, ${3:vector top_north_east}, ${4:vector bottom_south_west});\n\ + $0\n\ +snippet llUnescapeURL\n\ + llUnescapeURL(${1:string url})\n\ +snippet llUnSit\n\ + llUnSit(${1:key id});\n\ + $0\n\ +snippet llUpdateCharacter\n\ + llUpdateCharacter(${1:list options})\n\ +snippet llUpdateKeyValue\n\ + llUpdateKeyValue(${1:string k}, ${2:string v}, ${3:integer checked}, ${4:string ov})\n\ +snippet llVecDist\n\ + llVecDist(${1:vector vec_a}, ${2:vector vec_b})\n\ +snippet llVecMag\n\ + llVecMag(${1:vector vec})\n\ +snippet llVecNorm\n\ + llVecNorm(${1:vector vec})\n\ +snippet llVolumeDetect\n\ + llVolumeDetect(${1:integer detect});\n\ + $0\n\ +snippet llWanderWithin\n\ + llWanderWithin(${1:vector origin}, ${2:vector dist}, ${3:list options});\n\ + $0\n\ +snippet llWater\n\ + llWater(${1:vector offset});\n\ + $0\n\ +snippet llWhisper\n\ + llWhisper(${1:integer channel}, ${2:string msg});\n\ + $0\n\ +snippet llWind\n\ + llWind(${1:vector offset});\n\ + $0\n\ +snippet llXorBase64\n\ + llXorBase64(${1:string str1}, ${2:string str2})\n\ +snippet money\n\ + money(${1:key id}, ${2:integer amount})\n\ + {\n\ + $0\n\ + }\n\ +snippet object_rez\n\ + object_rez(${1:key id})\n\ + {\n\ + $0\n\ + }\n\ +snippet on_rez\n\ + on_rez(${1:integer start_param})\n\ + {\n\ + $0\n\ + }\n\ +snippet path_update\n\ + path_update(${1:integer type}, ${2:list reserved})\n\ + {\n\ + $0\n\ + }\n\ +snippet remote_data\n\ + remote_data(${1:integer event_type}, ${2:key channel}, ${3:key message_id}, ${4:string sender}, ${5:integer idata}, ${6:string sdata})\n\ + {\n\ + $0\n\ + }\n\ +snippet run_time_permissions\n\ + run_time_permissions(${1:integer perm})\n\ + {\n\ + $0\n\ + }\n\ +snippet sensor\n\ + sensor(${1:integer index})\n\ + {\n\ + $0\n\ + }\n\ +snippet state\n\ + state ${1:name}\n\ +snippet touch\n\ + touch(${1:integer index})\n\ + {\n\ + $0\n\ + }\n\ +snippet touch_end\n\ + touch_end(${1:integer index})\n\ + {\n\ + $0\n\ + }\n\ +snippet touch_start\n\ + touch_start(${1:integer index})\n\ + {\n\ + $0\n\ + }\n\ +snippet transaction_result\n\ + transaction_result(${1:key id}, ${2:integer success}, ${3:string data})\n\ + {\n\ + $0\n\ + }\n\ +snippet while\n\ + while (${1:condition})\n\ + {\n\ + $0\n\ + }\n\ +"; +exports.scope = "lsl"; + +}); diff --git a/src/libs/ace/snippets/lua.js b/src/libs/ace/snippets/lua.js new file mode 100755 index 0000000..c369b64 --- /dev/null +++ b/src/libs/ace/snippets/lua.js @@ -0,0 +1,28 @@ +ace.define("ace/snippets/lua",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet #!\n\ + #!/usr/bin/env lua\n\ + $1\n\ +snippet local\n\ + local ${1:x} = ${2:1}\n\ +snippet fun\n\ + function ${1:fname}(${2:...})\n\ + ${3:-- body}\n\ + end\n\ +snippet for\n\ + for ${1:i}=${2:1},${3:10} do\n\ + ${4:print(i)}\n\ + end\n\ +snippet forp\n\ + for ${1:i},${2:v} in pairs(${3:table_name}) do\n\ + ${4:-- body}\n\ + end\n\ +snippet fori\n\ + for ${1:i},${2:v} in ipairs(${3:table_name}) do\n\ + ${4:-- body}\n\ + end\n\ +"; +exports.scope = "lua"; + +}); diff --git a/src/libs/ace/snippets/luapage.js b/src/libs/ace/snippets/luapage.js new file mode 100755 index 0000000..f1bcf09 --- /dev/null +++ b/src/libs/ace/snippets/luapage.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/luapage",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "luapage"; + +}); diff --git a/src/libs/ace/snippets/lucene.js b/src/libs/ace/snippets/lucene.js new file mode 100755 index 0000000..8795919 --- /dev/null +++ b/src/libs/ace/snippets/lucene.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/lucene",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "lucene"; + +}); diff --git a/src/libs/ace/snippets/makefile.js b/src/libs/ace/snippets/makefile.js new file mode 100755 index 0000000..6c02e0d --- /dev/null +++ b/src/libs/ace/snippets/makefile.js @@ -0,0 +1,11 @@ +ace.define("ace/snippets/makefile",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet ifeq\n\ + ifeq (${1:cond0},${2:cond1})\n\ + ${3:code}\n\ + endif\n\ +"; +exports.scope = "makefile"; + +}); diff --git a/src/libs/ace/snippets/markdown.js b/src/libs/ace/snippets/markdown.js new file mode 100755 index 0000000..d05f16b --- /dev/null +++ b/src/libs/ace/snippets/markdown.js @@ -0,0 +1,95 @@ +ace.define("ace/snippets/markdown",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Markdown\n\ +\n\ +# Includes octopress (http://octopress.org/) snippets\n\ +\n\ +snippet [\n\ + [${1:text}](http://${2:address} \"${3:title}\")\n\ +snippet [*\n\ + [${1:link}](${2:`@*`} \"${3:title}\")${4}\n\ +\n\ +snippet [:\n\ + [${1:id}]: http://${2:url} \"${3:title}\"\n\ +snippet [:*\n\ + [${1:id}]: ${2:`@*`} \"${3:title}\"\n\ +\n\ +snippet ![\n\ + ![${1:alttext}](${2:/images/image.jpg} \"${3:title}\")\n\ +snippet ![*\n\ + ![${1:alt}](${2:`@*`} \"${3:title}\")${4}\n\ +\n\ +snippet ![:\n\ + ![${1:id}]: ${2:url} \"${3:title}\"\n\ +snippet ![:*\n\ + ![${1:id}]: ${2:`@*`} \"${3:title}\"\n\ +\n\ +snippet ===\n\ +regex /^/=+/=*//\n\ + ${PREV_LINE/./=/g}\n\ + \n\ + ${0}\n\ +snippet ---\n\ +regex /^/-+/-*//\n\ + ${PREV_LINE/./-/g}\n\ + \n\ + ${0}\n\ +snippet blockquote\n\ + {% blockquote %}\n\ + ${1:quote}\n\ + {% endblockquote %}\n\ +\n\ +snippet blockquote-author\n\ + {% blockquote ${1:author}, ${2:title} %}\n\ + ${3:quote}\n\ + {% endblockquote %}\n\ +\n\ +snippet blockquote-link\n\ + {% blockquote ${1:author} ${2:URL} ${3:link_text} %}\n\ + ${4:quote}\n\ + {% endblockquote %}\n\ +\n\ +snippet bt-codeblock-short\n\ + ```\n\ + ${1:code_snippet}\n\ + ```\n\ +\n\ +snippet bt-codeblock-full\n\ + ``` ${1:language} ${2:title} ${3:URL} ${4:link_text}\n\ + ${5:code_snippet}\n\ + ```\n\ +\n\ +snippet codeblock-short\n\ + {% codeblock %}\n\ + ${1:code_snippet}\n\ + {% endcodeblock %}\n\ +\n\ +snippet codeblock-full\n\ + {% codeblock ${1:title} lang:${2:language} ${3:URL} ${4:link_text} %}\n\ + ${5:code_snippet}\n\ + {% endcodeblock %}\n\ +\n\ +snippet gist-full\n\ + {% gist ${1:gist_id} ${2:filename} %}\n\ +\n\ +snippet gist-short\n\ + {% gist ${1:gist_id} %}\n\ +\n\ +snippet img\n\ + {% img ${1:class} ${2:URL} ${3:width} ${4:height} ${5:title_text} ${6:alt_text} %}\n\ +\n\ +snippet youtube\n\ + {% youtube ${1:video_id} %}\n\ +\n\ +# The quote should appear only once in the text. It is inherently part of it.\n\ +# See http://octopress.org/docs/plugins/pullquote/ for more info.\n\ +\n\ +snippet pullquote\n\ + {% pullquote %}\n\ + ${1:text} {\" ${2:quote} \"} ${3:text}\n\ + {% endpullquote %}\n\ +"; +exports.scope = "markdown"; + +}); diff --git a/src/libs/ace/snippets/mask.js b/src/libs/ace/snippets/mask.js new file mode 100755 index 0000000..2811ad2 --- /dev/null +++ b/src/libs/ace/snippets/mask.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/mask",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "mask"; + +}); diff --git a/src/libs/ace/snippets/matlab.js b/src/libs/ace/snippets/matlab.js new file mode 100755 index 0000000..ce298c3 --- /dev/null +++ b/src/libs/ace/snippets/matlab.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/matlab",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "matlab"; + +}); diff --git a/src/libs/ace/snippets/maze.js b/src/libs/ace/snippets/maze.js new file mode 100755 index 0000000..c12d566 --- /dev/null +++ b/src/libs/ace/snippets/maze.js @@ -0,0 +1,16 @@ +ace.define("ace/snippets/maze",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet >\n\ +description assignment\n\ +scope maze\n\ + -> ${1}= ${2}\n\ +\n\ +snippet >\n\ +description if\n\ +scope maze\n\ + -> IF ${2:**} THEN %${3:L} ELSE %${4:R}\n\ +"; +exports.scope = "maze"; + +}); diff --git a/src/libs/ace/snippets/mel.js b/src/libs/ace/snippets/mel.js new file mode 100755 index 0000000..537cc25 --- /dev/null +++ b/src/libs/ace/snippets/mel.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/mel",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "mel"; + +}); diff --git a/src/libs/ace/snippets/mips_assembler.js b/src/libs/ace/snippets/mips_assembler.js new file mode 100755 index 0000000..08fbb81 --- /dev/null +++ b/src/libs/ace/snippets/mips_assembler.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/mips_assembler",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "mips_assembler"; + +}); diff --git a/src/libs/ace/snippets/mipsassembler.js b/src/libs/ace/snippets/mipsassembler.js new file mode 100755 index 0000000..3e997aa --- /dev/null +++ b/src/libs/ace/snippets/mipsassembler.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/mipsassembler",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/mushcode.js b/src/libs/ace/snippets/mushcode.js new file mode 100755 index 0000000..1f0fe24 --- /dev/null +++ b/src/libs/ace/snippets/mushcode.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/mushcode",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "mushcode"; + +}); diff --git a/src/libs/ace/snippets/mysql.js b/src/libs/ace/snippets/mysql.js new file mode 100755 index 0000000..bfb3a42 --- /dev/null +++ b/src/libs/ace/snippets/mysql.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/mysql",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "mysql"; + +}); diff --git a/src/libs/ace/snippets/nix.js b/src/libs/ace/snippets/nix.js new file mode 100755 index 0000000..4fb6e70 --- /dev/null +++ b/src/libs/ace/snippets/nix.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/nix",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "nix"; + +}); diff --git a/src/libs/ace/snippets/nsis.js b/src/libs/ace/snippets/nsis.js new file mode 100755 index 0000000..81b5726 --- /dev/null +++ b/src/libs/ace/snippets/nsis.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/nsis",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/objectivec.js b/src/libs/ace/snippets/objectivec.js new file mode 100755 index 0000000..f93e6ae --- /dev/null +++ b/src/libs/ace/snippets/objectivec.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/objectivec",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "objectivec"; + +}); diff --git a/src/libs/ace/snippets/ocaml.js b/src/libs/ace/snippets/ocaml.js new file mode 100755 index 0000000..06e0940 --- /dev/null +++ b/src/libs/ace/snippets/ocaml.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/ocaml",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "ocaml"; + +}); diff --git a/src/libs/ace/snippets/pascal.js b/src/libs/ace/snippets/pascal.js new file mode 100755 index 0000000..70aa2ee --- /dev/null +++ b/src/libs/ace/snippets/pascal.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/pascal",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "pascal"; + +}); diff --git a/src/libs/ace/snippets/perl.js b/src/libs/ace/snippets/perl.js new file mode 100755 index 0000000..9f81843 --- /dev/null +++ b/src/libs/ace/snippets/perl.js @@ -0,0 +1,354 @@ +ace.define("ace/snippets/perl",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# #!/usr/bin/perl\n\ +snippet #!\n\ + #!/usr/bin/env perl\n\ +\n\ +# Hash Pointer\n\ +snippet .\n\ + =>\n\ +# Function\n\ +snippet sub\n\ + sub ${1:function_name} {\n\ + ${2:#body ...}\n\ + }\n\ +# Conditional\n\ +snippet if\n\ + if (${1}) {\n\ + ${2:# body...}\n\ + }\n\ +# Conditional if..else\n\ +snippet ife\n\ + if (${1}) {\n\ + ${2:# body...}\n\ + }\n\ + else {\n\ + ${3:# else...}\n\ + }\n\ +# Conditional if..elsif..else\n\ +snippet ifee\n\ + if (${1}) {\n\ + ${2:# body...}\n\ + }\n\ + elsif (${3}) {\n\ + ${4:# elsif...}\n\ + }\n\ + else {\n\ + ${5:# else...}\n\ + }\n\ +# Conditional One-line\n\ +snippet xif\n\ + ${1:expression} if ${2:condition};${3}\n\ +# Unless conditional\n\ +snippet unless\n\ + unless (${1}) {\n\ + ${2:# body...}\n\ + }\n\ +# Unless conditional One-line\n\ +snippet xunless\n\ + ${1:expression} unless ${2:condition};${3}\n\ +# Try/Except\n\ +snippet eval\n\ + local $@;\n\ + eval {\n\ + ${1:# do something risky...}\n\ + };\n\ + if (my $e = $@) {\n\ + ${2:# handle failure...}\n\ + }\n\ +# While Loop\n\ +snippet wh\n\ + while (${1}) {\n\ + ${2:# body...}\n\ + }\n\ +# While Loop One-line\n\ +snippet xwh\n\ + ${1:expression} while ${2:condition};${3}\n\ +# C-style For Loop\n\ +snippet cfor\n\ + for (my $${2:var} = 0; $$2 < ${1:count}; $$2${3:++}) {\n\ + ${4:# body...}\n\ + }\n\ +# For loop one-line\n\ +snippet xfor\n\ + ${1:expression} for @${2:array};${3}\n\ +# Foreach Loop\n\ +snippet for\n\ + foreach my $${1:x} (@${2:array}) {\n\ + ${3:# body...}\n\ + }\n\ +# Foreach Loop One-line\n\ +snippet fore\n\ + ${1:expression} foreach @${2:array};${3}\n\ +# Package\n\ +snippet package\n\ + package ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`};\n\ +\n\ + ${2}\n\ +\n\ + 1;\n\ +\n\ + __END__\n\ +# Package syntax perl >= 5.14\n\ +snippet packagev514\n\ + package ${1:`substitute(Filename('', 'Page Title'), '^.', '\\u&', '')`} ${2:0.99};\n\ +\n\ + ${3}\n\ +\n\ + 1;\n\ +\n\ + __END__\n\ +#moose\n\ +snippet moose\n\ + use Moose;\n\ + use namespace::autoclean;\n\ + ${1:#}BEGIN {extends '${2:ParentClass}'};\n\ +\n\ + ${3}\n\ +# parent\n\ +snippet parent\n\ + use parent qw(${1:Parent Class});\n\ +# Read File\n\ +snippet slurp\n\ + my $${1:var} = do { local $/; open my $file, '<', \"${2:file}\"; <$file> };\n\ + ${3}\n\ +# strict warnings\n\ +snippet strwar\n\ + use strict;\n\ + use warnings;\n\ +# older versioning with perlcritic bypass\n\ +snippet vers\n\ + ## no critic\n\ + our $VERSION = '${1:version}';\n\ + eval $VERSION;\n\ + ## use critic\n\ +# new 'switch' like feature\n\ +snippet switch\n\ + use feature 'switch';\n\ +\n\ +# Anonymous subroutine\n\ +snippet asub\n\ + sub {\n\ + ${1:# body }\n\ + }\n\ +\n\ +\n\ +\n\ +# Begin block\n\ +snippet begin\n\ + BEGIN {\n\ + ${1:# begin body}\n\ + }\n\ +\n\ +# call package function with some parameter\n\ +snippet pkgmv\n\ + __PACKAGE__->${1:package_method}(${2:var})\n\ +\n\ +# call package function without a parameter\n\ +snippet pkgm\n\ + __PACKAGE__->${1:package_method}()\n\ +\n\ +# call package \"get_\" function without a parameter\n\ +snippet pkget\n\ + __PACKAGE__->get_${1:package_method}()\n\ +\n\ +# call package function with a parameter\n\ +snippet pkgetv\n\ + __PACKAGE__->get_${1:package_method}(${2:var})\n\ +\n\ +# complex regex\n\ +snippet qrx\n\ + qr/\n\ + ${1:regex}\n\ + /xms\n\ +\n\ +#simpler regex\n\ +snippet qr/\n\ + qr/${1:regex}/x\n\ +\n\ +#given\n\ +snippet given\n\ + given ($${1:var}) {\n\ + ${2:# cases}\n\ + ${3:# default}\n\ + }\n\ +\n\ +# switch-like case\n\ +snippet when\n\ + when (${1:case}) {\n\ + ${2:# body}\n\ + }\n\ +\n\ +# hash slice\n\ +snippet hslice\n\ + @{ ${1:hash} }{ ${2:array} }\n\ +\n\ +\n\ +# map\n\ +snippet map\n\ + map { ${2: body } } ${1: @array } ;\n\ +\n\ +\n\ +\n\ +# Pod stub\n\ +snippet ppod\n\ + =head1 NAME\n\ +\n\ + ${1:ClassName} - ${2:ShortDesc}\n\ +\n\ + =head1 SYNOPSIS\n\ +\n\ + use $1;\n\ +\n\ + ${3:# synopsis...}\n\ +\n\ + =head1 DESCRIPTION\n\ +\n\ + ${4:# longer description...}\n\ +\n\ +\n\ + =head1 INTERFACE\n\ +\n\ +\n\ + =head1 DEPENDENCIES\n\ +\n\ +\n\ + =head1 SEE ALSO\n\ +\n\ +\n\ +# Heading for a subroutine stub\n\ +snippet psub\n\ + =head2 ${1:MethodName}\n\ +\n\ + ${2:Summary....}\n\ +\n\ +# Heading for inline subroutine pod\n\ +snippet psubi\n\ + =head2 ${1:MethodName}\n\ +\n\ + ${2:Summary...}\n\ +\n\ +\n\ + =cut\n\ +# inline documented subroutine\n\ +snippet subpod\n\ + =head2 $1\n\ +\n\ + Summary of $1\n\ +\n\ + =cut\n\ +\n\ + sub ${1:subroutine_name} {\n\ + ${2:# body...}\n\ + }\n\ +# Subroutine signature\n\ +snippet parg\n\ + =over 2\n\ +\n\ + =item\n\ + Arguments\n\ +\n\ +\n\ + =over 3\n\ +\n\ + =item\n\ + C<${1:DataStructure}>\n\ +\n\ + ${2:Sample}\n\ +\n\ +\n\ + =back\n\ +\n\ +\n\ + =item\n\ + Return\n\ +\n\ + =over 3\n\ +\n\ +\n\ + =item\n\ + C<${3:...return data}>\n\ +\n\ +\n\ + =back\n\ +\n\ +\n\ + =back\n\ +\n\ +\n\ +\n\ +# Moose has\n\ +snippet has\n\ + has ${1:attribute} => (\n\ + is => '${2:ro|rw}',\n\ + isa => '${3:Str|Int|HashRef|ArrayRef|etc}',\n\ + default => sub {\n\ + ${4:defaultvalue}\n\ + },\n\ + ${5:# other attributes}\n\ + );\n\ +\n\ +\n\ +# override\n\ +snippet override\n\ + override ${1:attribute} => sub {\n\ + ${2:# my $self = shift;};\n\ + ${3:# my ($self, $args) = @_;};\n\ + };\n\ +\n\ +\n\ +# use test classes\n\ +snippet tuse\n\ + use Test::More;\n\ + use Test::Deep; # (); # uncomment to stop prototype errors\n\ + use Test::Exception;\n\ +\n\ +# local test lib\n\ +snippet tlib\n\ + use lib qw{ ./t/lib };\n\ +\n\ +#test methods\n\ +snippet tmeths\n\ + $ENV{TEST_METHOD} = '${1:regex}';\n\ +\n\ +# runtestclass\n\ +snippet trunner\n\ + use ${1:test_class};\n\ + $1->runtests();\n\ +\n\ +# Test::Class-style test\n\ +snippet tsub\n\ + sub t${1:number}_${2:test_case} :Test(${3:num_of_tests}) {\n\ + my $self = shift;\n\ + ${4:# body}\n\ +\n\ + }\n\ +\n\ +# Test::Routine-style test\n\ +snippet trsub\n\ + test ${1:test_name} => { description => '${2:Description of test.}'} => sub {\n\ + my ($self) = @_;\n\ + ${3:# test code}\n\ + };\n\ +\n\ +#prep test method\n\ +snippet tprep\n\ + sub prep${1:number}_${2:test_case} :Test(startup) {\n\ + my $self = shift;\n\ + ${4:# body}\n\ + }\n\ +\n\ +# cause failures to print stack trace\n\ +snippet debug_trace\n\ + use Carp; # 'verbose';\n\ + # cloak \"die\"\n\ + # warn \"warning\"\n\ + $SIG{'__DIE__'} = sub {\n\ + require Carp; Carp::confess\n\ + };\n\ +\n\ +"; +exports.scope = "perl"; + +}); diff --git a/src/libs/ace/snippets/pgsql.js b/src/libs/ace/snippets/pgsql.js new file mode 100755 index 0000000..5914fe1 --- /dev/null +++ b/src/libs/ace/snippets/pgsql.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/pgsql",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "pgsql"; + +}); diff --git a/src/libs/ace/snippets/php.js b/src/libs/ace/snippets/php.js new file mode 100755 index 0000000..a99ab6e --- /dev/null +++ b/src/libs/ace/snippets/php.js @@ -0,0 +1,384 @@ +ace.define("ace/snippets/php",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet \n\ +# this one is for php5.4\n\ +snippet \n\ +snippet ns\n\ + namespace ${1:Foo\\Bar\\Baz};\n\ + ${2}\n\ +snippet use\n\ + use ${1:Foo\\Bar\\Baz};\n\ + ${2}\n\ +snippet c\n\ + ${1:abstract }class ${2:$FILENAME}\n\ + {\n\ + ${3}\n\ + }\n\ +snippet i\n\ + interface ${1:$FILENAME}\n\ + {\n\ + ${2}\n\ + }\n\ +snippet t.\n\ + $this->${1}\n\ +snippet f\n\ + function ${1:foo}(${2:array }${3:$bar})\n\ + {\n\ + ${4}\n\ + }\n\ +# method\n\ +snippet m\n\ + ${1:abstract }${2:protected}${3: static} function ${4:foo}(${5:array }${6:$bar})\n\ + {\n\ + ${7}\n\ + }\n\ +# setter method\n\ +snippet sm \n\ + /**\n\ + * Sets the value of ${1:foo}\n\ + *\n\ + * @param ${2:$1} $$1 ${3:description}\n\ + *\n\ + * @return ${4:$FILENAME}\n\ + */\n\ + ${5:public} function set${6:$2}(${7:$2 }$$1)\n\ + {\n\ + $this->${8:$1} = $$1;\n\ + return $this;\n\ + }${9}\n\ +# getter method\n\ +snippet gm\n\ + /**\n\ + * Gets the value of ${1:foo}\n\ + *\n\ + * @return ${2:$1}\n\ + */\n\ + ${3:public} function get${4:$2}()\n\ + {\n\ + return $this->${5:$1};\n\ + }${6}\n\ +#setter\n\ +snippet $s\n\ + ${1:$foo}->set${2:Bar}(${3});\n\ +#getter\n\ +snippet $g\n\ + ${1:$foo}->get${2:Bar}();\n\ +\n\ +# Tertiary conditional\n\ +snippet =?:\n\ + $${1:foo} = ${2:true} ? ${3:a} : ${4};\n\ +snippet ?:\n\ + ${1:true} ? ${2:a} : ${3}\n\ +\n\ +snippet C\n\ + $_COOKIE['${1:variable}']${2}\n\ +snippet E\n\ + $_ENV['${1:variable}']${2}\n\ +snippet F\n\ + $_FILES['${1:variable}']${2}\n\ +snippet G\n\ + $_GET['${1:variable}']${2}\n\ +snippet P\n\ + $_POST['${1:variable}']${2}\n\ +snippet R\n\ + $_REQUEST['${1:variable}']${2}\n\ +snippet S\n\ + $_SERVER['${1:variable}']${2}\n\ +snippet SS\n\ + $_SESSION['${1:variable}']${2}\n\ + \n\ +# the following are old ones\n\ +snippet inc\n\ + include '${1:file}';${2}\n\ +snippet inc1\n\ + include_once '${1:file}';${2}\n\ +snippet req\n\ + require '${1:file}';${2}\n\ +snippet req1\n\ + require_once '${1:file}';${2}\n\ +# Start Docblock\n\ +snippet /*\n\ + /**\n\ + * ${1}\n\ + */\n\ +# Class - post doc\n\ +snippet doc_cp\n\ + /**\n\ + * ${1:undocumented class}\n\ + *\n\ + * @package ${2:default}\n\ + * @subpackage ${3:default}\n\ + * @author ${4:`g:snips_author`}\n\ + */${5}\n\ +# Class Variable - post doc\n\ +snippet doc_vp\n\ + /**\n\ + * ${1:undocumented class variable}\n\ + *\n\ + * @var ${2:string}\n\ + */${3}\n\ +# Class Variable\n\ +snippet doc_v\n\ + /**\n\ + * ${3:undocumented class variable}\n\ + *\n\ + * @var ${4:string}\n\ + */\n\ + ${1:var} $${2};${5}\n\ +# Class\n\ +snippet doc_c\n\ + /**\n\ + * ${3:undocumented class}\n\ + *\n\ + * @package ${4:default}\n\ + * @subpackage ${5:default}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1:}class ${2:}\n\ + {\n\ + ${7}\n\ + } // END $1class $2\n\ +# Constant Definition - post doc\n\ +snippet doc_dp\n\ + /**\n\ + * ${1:undocumented constant}\n\ + */${2}\n\ +# Constant Definition\n\ +snippet doc_d\n\ + /**\n\ + * ${3:undocumented constant}\n\ + */\n\ + define(${1}, ${2});${4}\n\ +# Function - post doc\n\ +snippet doc_fp\n\ + /**\n\ + * ${1:undocumented function}\n\ + *\n\ + * @return ${2:void}\n\ + * @author ${3:`g:snips_author`}\n\ + */${4}\n\ +# Function signature\n\ +snippet doc_s\n\ + /**\n\ + * ${4:undocumented function}\n\ + *\n\ + * @return ${5:void}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1}function ${2}(${3});${7}\n\ +# Function\n\ +snippet doc_f\n\ + /**\n\ + * ${4:undocumented function}\n\ + *\n\ + * @return ${5:void}\n\ + * @author ${6:`g:snips_author`}\n\ + */\n\ + ${1}function ${2}(${3})\n\ + {${7}\n\ + }\n\ +# Header\n\ +snippet doc_h\n\ + /**\n\ + * ${1}\n\ + *\n\ + * @author ${2:`g:snips_author`}\n\ + * @version ${3:$Id$}\n\ + * @copyright ${4:$2}, `strftime('%d %B, %Y')`\n\ + * @package ${5:default}\n\ + */\n\ + \n\ +# Interface\n\ +snippet interface\n\ + /**\n\ + * ${2:undocumented class}\n\ + *\n\ + * @package ${3:default}\n\ + * @author ${4:`g:snips_author`}\n\ + */\n\ + interface ${1:$FILENAME}\n\ + {\n\ + ${5}\n\ + }\n\ +# class ...\n\ +snippet class\n\ + /**\n\ + * ${1}\n\ + */\n\ + class ${2:$FILENAME}\n\ + {\n\ + ${3}\n\ + /**\n\ + * ${4}\n\ + */\n\ + ${5:public} function ${6:__construct}(${7:argument})\n\ + {\n\ + ${8:// code...}\n\ + }\n\ + }\n\ +# define(...)\n\ +snippet def\n\ + define('${1}'${2});${3}\n\ +# defined(...)\n\ +snippet def?\n\ + ${1}defined('${2}')${3}\n\ +snippet wh\n\ + while (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +# do ... while\n\ +snippet do\n\ + do {\n\ + ${2:// code... }\n\ + } while (${1:/* condition */});\n\ +snippet if\n\ + if (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +snippet ifil\n\ + \n\ + ${2:}\n\ + \n\ +snippet ife\n\ + if (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + } else {\n\ + ${3:// code...}\n\ + }\n\ + ${4}\n\ +snippet ifeil\n\ + \n\ + ${2:}\n\ + \n\ + ${3:}\n\ + \n\ + ${4}\n\ +snippet else\n\ + else {\n\ + ${1:// code...}\n\ + }\n\ +snippet elseif\n\ + elseif (${1:/* condition */}) {\n\ + ${2:// code...}\n\ + }\n\ +snippet switch\n\ + switch ($${1:variable}) {\n\ + case '${2:value}':\n\ + ${3:// code...}\n\ + break;\n\ + ${5}\n\ + default:\n\ + ${4:// code...}\n\ + break;\n\ + }\n\ +snippet case\n\ + case '${1:value}':\n\ + ${2:// code...}\n\ + break;${3}\n\ +snippet for\n\ + for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) {\n\ + ${4: // code...}\n\ + }\n\ +snippet foreach\n\ + foreach ($${1:variable} as $${2:value}) {\n\ + ${3:// code...}\n\ + }\n\ +snippet foreachil\n\ + \n\ + ${3:}\n\ + \n\ +snippet foreachk\n\ + foreach ($${1:variable} as $${2:key} => $${3:value}) {\n\ + ${4:// code...}\n\ + }\n\ +snippet foreachkil\n\ + $${3:value}): ?>\n\ + ${4:}\n\ + \n\ +# $... = array (...)\n\ +snippet array\n\ + $${1:arrayName} = array('${2}' => ${3});${4}\n\ +snippet try\n\ + try {\n\ + ${2}\n\ + } catch (${1:Exception} $e) {\n\ + }\n\ +# lambda with closure\n\ +snippet lambda\n\ + ${1:static }function (${2:args}) use (${3:&$x, $y /*put vars in scope (closure) */}) {\n\ + ${4}\n\ + };\n\ +# pre_dump();\n\ +snippet pd\n\ + echo '
      '; var_dump(${1}); echo '
      ';\n\ +# pre_dump(); die();\n\ +snippet pdd\n\ + echo '
      '; var_dump(${1}); echo '
      '; die(${2:});\n\ +snippet vd\n\ + var_dump(${1});\n\ +snippet vdd\n\ + var_dump(${1}); die(${2:});\n\ +snippet http_redirect\n\ + header (\"HTTP/1.1 301 Moved Permanently\"); \n\ + header (\"Location: \".URL); \n\ + exit();\n\ +# Getters & Setters\n\ +snippet gs\n\ + /**\n\ + * Gets the value of ${1:foo}\n\ + *\n\ + * @return ${2:$1}\n\ + */\n\ + public function get${3:$2}()\n\ + {\n\ + return $this->${4:$1};\n\ + }\n\ +\n\ + /**\n\ + * Sets the value of $1\n\ + *\n\ + * @param $2 $$1 ${5:description}\n\ + *\n\ + * @return ${6:$FILENAME}\n\ + */\n\ + public function set$3(${7:$2 }$$1)\n\ + {\n\ + $this->$4 = $$1;\n\ + return $this;\n\ + }${8}\n\ +# anotation, get, and set, useful for doctrine\n\ +snippet ags\n\ + /**\n\ + * ${1:description}\n\ + * \n\ + * @${7}\n\ + */\n\ + ${2:protected} $${3:foo};\n\ +\n\ + public function get${4:$3}()\n\ + {\n\ + return $this->$3;\n\ + }\n\ +\n\ + public function set$4(${5:$4 }$${6:$3})\n\ + {\n\ + $this->$3 = $$6;\n\ + return $this;\n\ + }\n\ +snippet rett\n\ + return true;\n\ +snippet retf\n\ + return false;\n\ +"; +exports.scope = "php"; + +}); diff --git a/src/libs/ace/snippets/pig.js b/src/libs/ace/snippets/pig.js new file mode 100755 index 0000000..479a03b --- /dev/null +++ b/src/libs/ace/snippets/pig.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/pig",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "pig"; + +}); diff --git a/src/libs/ace/snippets/plain_text.js b/src/libs/ace/snippets/plain_text.js new file mode 100755 index 0000000..24223a6 --- /dev/null +++ b/src/libs/ace/snippets/plain_text.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/plain_text",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "plain_text"; + +}); diff --git a/src/libs/ace/snippets/powershell.js b/src/libs/ace/snippets/powershell.js new file mode 100755 index 0000000..a8e7310 --- /dev/null +++ b/src/libs/ace/snippets/powershell.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/powershell",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "powershell"; + +}); diff --git a/src/libs/ace/snippets/praat.js b/src/libs/ace/snippets/praat.js new file mode 100755 index 0000000..dcf6826 --- /dev/null +++ b/src/libs/ace/snippets/praat.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/praat",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "praat"; + +}); diff --git a/src/libs/ace/snippets/prolog.js b/src/libs/ace/snippets/prolog.js new file mode 100755 index 0000000..2d63cb8 --- /dev/null +++ b/src/libs/ace/snippets/prolog.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/prolog",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "prolog"; + +}); diff --git a/src/libs/ace/snippets/properties.js b/src/libs/ace/snippets/properties.js new file mode 100755 index 0000000..44c1ada --- /dev/null +++ b/src/libs/ace/snippets/properties.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/properties",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "properties"; + +}); diff --git a/src/libs/ace/snippets/protobuf.js b/src/libs/ace/snippets/protobuf.js new file mode 100755 index 0000000..d00d57a --- /dev/null +++ b/src/libs/ace/snippets/protobuf.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/protobuf",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = ""; +exports.scope = "protobuf"; + +}); diff --git a/src/libs/ace/snippets/python.js b/src/libs/ace/snippets/python.js new file mode 100755 index 0000000..182b340 --- /dev/null +++ b/src/libs/ace/snippets/python.js @@ -0,0 +1,165 @@ +ace.define("ace/snippets/python",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet #!\n\ + #!/usr/bin/env python\n\ +snippet imp\n\ + import ${1:module}\n\ +snippet from\n\ + from ${1:package} import ${2:module}\n\ +# Module Docstring\n\ +snippet docs\n\ + '''\n\ + File: ${1:FILENAME:file_name}\n\ + Author: ${2:author}\n\ + Description: ${3}\n\ + '''\n\ +snippet wh\n\ + while ${1:condition}:\n\ + ${2:# TODO: write code...}\n\ +# dowh - does the same as do...while in other languages\n\ +snippet dowh\n\ + while True:\n\ + ${1:# TODO: write code...}\n\ + if ${2:condition}:\n\ + break\n\ +snippet with\n\ + with ${1:expr} as ${2:var}:\n\ + ${3:# TODO: write code...}\n\ +# New Class\n\ +snippet cl\n\ + class ${1:ClassName}(${2:object}):\n\ + \"\"\"${3:docstring for $1}\"\"\"\n\ + def __init__(self, ${4:arg}):\n\ + ${5:super($1, self).__init__()}\n\ + self.$4 = $4\n\ + ${6}\n\ +# New Function\n\ +snippet def\n\ + def ${1:fname}(${2:`indent('.') ? 'self' : ''`}):\n\ + \"\"\"${3:docstring for $1}\"\"\"\n\ + ${4:# TODO: write code...}\n\ +snippet deff\n\ + def ${1:fname}(${2:`indent('.') ? 'self' : ''`}):\n\ + ${3:# TODO: write code...}\n\ +# New Method\n\ +snippet defs\n\ + def ${1:mname}(self, ${2:arg}):\n\ + ${3:# TODO: write code...}\n\ +# New Property\n\ +snippet property\n\ + def ${1:foo}():\n\ + doc = \"${2:The $1 property.}\"\n\ + def fget(self):\n\ + ${3:return self._$1}\n\ + def fset(self, value):\n\ + ${4:self._$1 = value}\n\ +# Ifs\n\ +snippet if\n\ + if ${1:condition}:\n\ + ${2:# TODO: write code...}\n\ +snippet el\n\ + else:\n\ + ${1:# TODO: write code...}\n\ +snippet ei\n\ + elif ${1:condition}:\n\ + ${2:# TODO: write code...}\n\ +# For\n\ +snippet for\n\ + for ${1:item} in ${2:items}:\n\ + ${3:# TODO: write code...}\n\ +# Encodes\n\ +snippet cutf8\n\ + # -*- coding: utf-8 -*-\n\ +snippet clatin1\n\ + # -*- coding: latin-1 -*-\n\ +snippet cascii\n\ + # -*- coding: ascii -*-\n\ +# Lambda\n\ +snippet ld\n\ + ${1:var} = lambda ${2:vars} : ${3:action}\n\ +snippet .\n\ + self.\n\ +snippet try Try/Except\n\ + try:\n\ + ${1:# TODO: write code...}\n\ + except ${2:Exception}, ${3:e}:\n\ + ${4:raise $3}\n\ +snippet try Try/Except/Else\n\ + try:\n\ + ${1:# TODO: write code...}\n\ + except ${2:Exception}, ${3:e}:\n\ + ${4:raise $3}\n\ + else:\n\ + ${5:# TODO: write code...}\n\ +snippet try Try/Except/Finally\n\ + try:\n\ + ${1:# TODO: write code...}\n\ + except ${2:Exception}, ${3:e}:\n\ + ${4:raise $3}\n\ + finally:\n\ + ${5:# TODO: write code...}\n\ +snippet try Try/Except/Else/Finally\n\ + try:\n\ + ${1:# TODO: write code...}\n\ + except ${2:Exception}, ${3:e}:\n\ + ${4:raise $3}\n\ + else:\n\ + ${5:# TODO: write code...}\n\ + finally:\n\ + ${6:# TODO: write code...}\n\ +# if __name__ == '__main__':\n\ +snippet ifmain\n\ + if __name__ == '__main__':\n\ + ${1:main()}\n\ +# __magic__\n\ +snippet _\n\ + __${1:init}__${2}\n\ +# python debugger (pdb)\n\ +snippet pdb\n\ + import pdb; pdb.set_trace()\n\ +# ipython debugger (ipdb)\n\ +snippet ipdb\n\ + import ipdb; ipdb.set_trace()\n\ +# ipython debugger (pdbbb)\n\ +snippet pdbbb\n\ + import pdbpp; pdbpp.set_trace()\n\ +snippet pprint\n\ + import pprint; pprint.pprint(${1})${2}\n\ +snippet \"\n\ + \"\"\"\n\ + ${1:doc}\n\ + \"\"\"\n\ +# test function/method\n\ +snippet test\n\ + def test_${1:description}(${2:self}):\n\ + ${3:# TODO: write code...}\n\ +# test case\n\ +snippet testcase\n\ + class ${1:ExampleCase}(unittest.TestCase):\n\ + \n\ + def test_${2:description}(self):\n\ + ${3:# TODO: write code...}\n\ +snippet fut\n\ + from __future__ import ${1}\n\ +#getopt\n\ +snippet getopt\n\ + try:\n\ + # Short option syntax: \"hv:\"\n\ + # Long option syntax: \"help\" or \"verbose=\"\n\ + opts, args = getopt.getopt(sys.argv[1:], \"${1:short_options}\", [${2:long_options}])\n\ + \n\ + except getopt.GetoptError, err:\n\ + # Print debug info\n\ + print str(err)\n\ + ${3:error_action}\n\ +\n\ + for option, argument in opts:\n\ + if option in (\"-h\", \"--help\"):\n\ + ${4}\n\ + elif option in (\"-v\", \"--verbose\"):\n\ + verbose = argument\n\ +"; +exports.scope = "python"; + +}); diff --git a/src/libs/ace/snippets/r.js b/src/libs/ace/snippets/r.js new file mode 100755 index 0000000..24c02a0 --- /dev/null +++ b/src/libs/ace/snippets/r.js @@ -0,0 +1,128 @@ +ace.define("ace/snippets/r",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet #!\n\ + #!/usr/bin/env Rscript\n\ +\n\ +# includes\n\ +snippet lib\n\ + library(${1:package})\n\ +snippet req\n\ + require(${1:package})\n\ +snippet source\n\ + source('${1:file}')\n\ +\n\ +# conditionals\n\ +snippet if\n\ + if (${1:condition}) {\n\ + ${2:code}\n\ + }\n\ +snippet el\n\ + else {\n\ + ${1:code}\n\ + }\n\ +snippet ei\n\ + else if (${1:condition}) {\n\ + ${2:code}\n\ + }\n\ +\n\ +# functions\n\ +snippet fun\n\ + ${1:name} = function (${2:variables}) {\n\ + ${3:code}\n\ + }\n\ +snippet ret\n\ + return(${1:code})\n\ +\n\ +# dataframes, lists, etc\n\ +snippet df\n\ + ${1:name}[${2:rows}, ${3:cols}]\n\ +snippet c\n\ + c(${1:items})\n\ +snippet li\n\ + list(${1:items})\n\ +snippet mat\n\ + matrix(${1:data}, nrow=${2:rows}, ncol=${3:cols})\n\ +\n\ +# apply functions\n\ +snippet apply\n\ + apply(${1:array}, ${2:margin}, ${3:function})\n\ +snippet lapply\n\ + lapply(${1:list}, ${2:function})\n\ +snippet sapply\n\ + sapply(${1:list}, ${2:function})\n\ +snippet vapply\n\ + vapply(${1:list}, ${2:function}, ${3:type})\n\ +snippet mapply\n\ + mapply(${1:function}, ${2:...})\n\ +snippet tapply\n\ + tapply(${1:vector}, ${2:index}, ${3:function})\n\ +snippet rapply\n\ + rapply(${1:list}, ${2:function})\n\ +\n\ +# plyr functions\n\ +snippet dd\n\ + ddply(${1:frame}, ${2:variables}, ${3:function})\n\ +snippet dl\n\ + dlply(${1:frame}, ${2:variables}, ${3:function})\n\ +snippet da\n\ + daply(${1:frame}, ${2:variables}, ${3:function})\n\ +snippet d_\n\ + d_ply(${1:frame}, ${2:variables}, ${3:function})\n\ +\n\ +snippet ad\n\ + adply(${1:array}, ${2:margin}, ${3:function})\n\ +snippet al\n\ + alply(${1:array}, ${2:margin}, ${3:function})\n\ +snippet aa\n\ + aaply(${1:array}, ${2:margin}, ${3:function})\n\ +snippet a_\n\ + a_ply(${1:array}, ${2:margin}, ${3:function})\n\ +\n\ +snippet ld\n\ + ldply(${1:list}, ${2:function})\n\ +snippet ll\n\ + llply(${1:list}, ${2:function})\n\ +snippet la\n\ + laply(${1:list}, ${2:function})\n\ +snippet l_\n\ + l_ply(${1:list}, ${2:function})\n\ +\n\ +snippet md\n\ + mdply(${1:matrix}, ${2:function})\n\ +snippet ml\n\ + mlply(${1:matrix}, ${2:function})\n\ +snippet ma\n\ + maply(${1:matrix}, ${2:function})\n\ +snippet m_\n\ + m_ply(${1:matrix}, ${2:function})\n\ +\n\ +# plot functions\n\ +snippet pl\n\ + plot(${1:x}, ${2:y})\n\ +snippet ggp\n\ + ggplot(${1:data}, aes(${2:aesthetics}))\n\ +snippet img\n\ + ${1:(jpeg,bmp,png,tiff)}(filename=\"${2:filename}\", width=${3}, height=${4}, unit=\"${5}\")\n\ + ${6:plot}\n\ + dev.off()\n\ +\n\ +# statistical test functions\n\ +snippet fis\n\ + fisher.test(${1:x}, ${2:y})\n\ +snippet chi\n\ + chisq.test(${1:x}, ${2:y})\n\ +snippet tt\n\ + t.test(${1:x}, ${2:y})\n\ +snippet wil\n\ + wilcox.test(${1:x}, ${2:y})\n\ +snippet cor\n\ + cor.test(${1:x}, ${2:y})\n\ +snippet fte\n\ + var.test(${1:x}, ${2:y})\n\ +snippet kvt \n\ + kv.test(${1:x}, ${2:y})\n\ +"; +exports.scope = "r"; + +}); diff --git a/src/libs/ace/snippets/razor.js b/src/libs/ace/snippets/razor.js new file mode 100755 index 0000000..78fdf8c --- /dev/null +++ b/src/libs/ace/snippets/razor.js @@ -0,0 +1,10 @@ +ace.define("ace/snippets/razor",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet if\n\ +(${1} == ${2}) {\n\ + ${3}\n\ +}"; +exports.scope = "razor"; + +}); diff --git a/src/libs/ace/snippets/rdoc.js b/src/libs/ace/snippets/rdoc.js new file mode 100755 index 0000000..956de47 --- /dev/null +++ b/src/libs/ace/snippets/rdoc.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/rdoc",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "rdoc"; + +}); diff --git a/src/libs/ace/snippets/rhtml.js b/src/libs/ace/snippets/rhtml.js new file mode 100755 index 0000000..e62ce87 --- /dev/null +++ b/src/libs/ace/snippets/rhtml.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/rhtml",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "rhtml"; + +}); diff --git a/src/libs/ace/snippets/rst.js b/src/libs/ace/snippets/rst.js new file mode 100755 index 0000000..db6c960 --- /dev/null +++ b/src/libs/ace/snippets/rst.js @@ -0,0 +1,29 @@ +ace.define("ace/snippets/rst",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# rst\n\ +\n\ +snippet :\n\ + :${1:field name}: ${2:field body}\n\ +snippet *\n\ + *${1:Emphasis}*\n\ +snippet **\n\ + **${1:Strong emphasis}**\n\ +snippet _\n\ + \\`${1:hyperlink-name}\\`_\n\ + .. _\\`$1\\`: ${2:link-block}\n\ +snippet =\n\ + ${1:Title}\n\ + =====${2:=}\n\ + ${3}\n\ +snippet -\n\ + ${1:Title}\n\ + -----${2:-}\n\ + ${3}\n\ +snippet cont:\n\ + .. contents::\n\ + \n\ +"; +exports.scope = "rst"; + +}); diff --git a/src/libs/ace/snippets/ruby.js b/src/libs/ace/snippets/ruby.js new file mode 100755 index 0000000..18bc409 --- /dev/null +++ b/src/libs/ace/snippets/ruby.js @@ -0,0 +1,935 @@ +ace.define("ace/snippets/ruby",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "########################################\n\ +# Ruby snippets - for Rails, see below #\n\ +########################################\n\ +\n\ +# encoding for Ruby 1.9\n\ +snippet enc\n\ + # encoding: utf-8\n\ +\n\ +# #!/usr/bin/env ruby\n\ +snippet #!\n\ + #!/usr/bin/env ruby\n\ + # encoding: utf-8\n\ +\n\ +# New Block\n\ +snippet =b\n\ + =begin rdoc\n\ + ${1}\n\ + =end\n\ +snippet y\n\ + :yields: ${1:arguments}\n\ +snippet rb\n\ + #!/usr/bin/env ruby -wKU\n\ +snippet beg\n\ + begin\n\ + ${3}\n\ + rescue ${1:Exception} => ${2:e}\n\ + end\n\ +\n\ +snippet req require\n\ + require \"${1}\"${2}\n\ +snippet #\n\ + # =>\n\ +snippet end\n\ + __END__\n\ +snippet case\n\ + case ${1:object}\n\ + when ${2:condition}\n\ + ${3}\n\ + end\n\ +snippet when\n\ + when ${1:condition}\n\ + ${2}\n\ +snippet def\n\ + def ${1:method_name}\n\ + ${2}\n\ + end\n\ +snippet deft\n\ + def test_${1:case_name}\n\ + ${2}\n\ + end\n\ +snippet if\n\ + if ${1:condition}\n\ + ${2}\n\ + end\n\ +snippet ife\n\ + if ${1:condition}\n\ + ${2}\n\ + else\n\ + ${3}\n\ + end\n\ +snippet elsif\n\ + elsif ${1:condition}\n\ + ${2}\n\ +snippet unless\n\ + unless ${1:condition}\n\ + ${2}\n\ + end\n\ +snippet while\n\ + while ${1:condition}\n\ + ${2}\n\ + end\n\ +snippet for\n\ + for ${1:e} in ${2:c}\n\ + ${3}\n\ + end\n\ +snippet until\n\ + until ${1:condition}\n\ + ${2}\n\ + end\n\ +snippet cla class .. end\n\ + class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\ + ${2}\n\ + end\n\ +snippet cla class .. initialize .. end\n\ + class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\ + def initialize(${2:args})\n\ + ${3}\n\ + end\n\ + end\n\ +snippet cla class .. < ParentClass .. initialize .. end\n\ + class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} < ${2:ParentClass}\n\ + def initialize(${3:args})\n\ + ${4}\n\ + end\n\ + end\n\ +snippet cla ClassName = Struct .. do .. end\n\ + ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} = Struct.new(:${2:attr_names}) do\n\ + def ${3:method_name}\n\ + ${4}\n\ + end\n\ + end\n\ +snippet cla class BlankSlate .. initialize .. end\n\ + class ${1:BlankSlate}\n\ + instance_methods.each { |meth| undef_method(meth) unless meth =~ /\\A__/ }\n\ + end\n\ +snippet cla class << self .. end\n\ + class << ${1:self}\n\ + ${2}\n\ + end\n\ +# class .. < DelegateClass .. initialize .. end\n\ +snippet cla-\n\ + class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} < DelegateClass(${2:ParentClass})\n\ + def initialize(${3:args})\n\ + super(${4:del_obj})\n\ +\n\ + ${5}\n\ + end\n\ + end\n\ +snippet mod module .. end\n\ + module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\ + ${2}\n\ + end\n\ +snippet mod module .. module_function .. end\n\ + module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\ + module_function\n\ +\n\ + ${2}\n\ + end\n\ +snippet mod module .. ClassMethods .. end\n\ + module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\ + module ClassMethods\n\ + ${2}\n\ + end\n\ +\n\ + module InstanceMethods\n\ +\n\ + end\n\ +\n\ + def self.included(receiver)\n\ + receiver.extend ClassMethods\n\ + receiver.send :include, InstanceMethods\n\ + end\n\ + end\n\ +# attr_reader\n\ +snippet r\n\ + attr_reader :${1:attr_names}\n\ +# attr_writer\n\ +snippet w\n\ + attr_writer :${1:attr_names}\n\ +# attr_accessor\n\ +snippet rw\n\ + attr_accessor :${1:attr_names}\n\ +snippet atp\n\ + attr_protected :${1:attr_names}\n\ +snippet ata\n\ + attr_accessible :${1:attr_names}\n\ +# include Enumerable\n\ +snippet Enum\n\ + include Enumerable\n\ +\n\ + def each(&block)\n\ + ${1}\n\ + end\n\ +# include Comparable\n\ +snippet Comp\n\ + include Comparable\n\ +\n\ + def <=>(other)\n\ + ${1}\n\ + end\n\ +# extend Forwardable\n\ +snippet Forw-\n\ + extend Forwardable\n\ +# def self\n\ +snippet defs\n\ + def self.${1:class_method_name}\n\ + ${2}\n\ + end\n\ +# def method_missing\n\ +snippet defmm\n\ + def method_missing(meth, *args, &blk)\n\ + ${1}\n\ + end\n\ +snippet defd\n\ + def_delegator :${1:@del_obj}, :${2:del_meth}, :${3:new_name}\n\ +snippet defds\n\ + def_delegators :${1:@del_obj}, :${2:del_methods}\n\ +snippet am\n\ + alias_method :${1:new_name}, :${2:old_name}\n\ +snippet app\n\ + if __FILE__ == $PROGRAM_NAME\n\ + ${1}\n\ + end\n\ +# usage_if()\n\ +snippet usai\n\ + if ARGV.${1}\n\ + abort \"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\"${3}\n\ + end\n\ +# usage_unless()\n\ +snippet usau\n\ + unless ARGV.${1}\n\ + abort \"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\"${3}\n\ + end\n\ +snippet array\n\ + Array.new(${1:10}) { |${2:i}| ${3} }\n\ +snippet hash\n\ + Hash.new { |${1:hash}, ${2:key}| $1[$2] = ${3} }\n\ +snippet file File.foreach() { |line| .. }\n\ + File.foreach(${1:\"path/to/file\"}) { |${2:line}| ${3} }\n\ +snippet file File.read()\n\ + File.read(${1:\"path/to/file\"})${2}\n\ +snippet Dir Dir.global() { |file| .. }\n\ + Dir.glob(${1:\"dir/glob/*\"}) { |${2:file}| ${3} }\n\ +snippet Dir Dir[\"..\"]\n\ + Dir[${1:\"glob/**/*.rb\"}]${2}\n\ +snippet dir\n\ + Filename.dirname(__FILE__)\n\ +snippet deli\n\ + delete_if { |${1:e}| ${2} }\n\ +snippet fil\n\ + fill(${1:range}) { |${2:i}| ${3} }\n\ +# flatten_once()\n\ +snippet flao\n\ + inject(Array.new) { |${1:arr}, ${2:a}| $1.push(*$2)}${3}\n\ +snippet zip\n\ + zip(${1:enums}) { |${2:row}| ${3} }\n\ +# downto(0) { |n| .. }\n\ +snippet dow\n\ + downto(${1:0}) { |${2:n}| ${3} }\n\ +snippet ste\n\ + step(${1:2}) { |${2:n}| ${3} }\n\ +snippet tim\n\ + times { |${1:n}| ${2} }\n\ +snippet upt\n\ + upto(${1:1.0/0.0}) { |${2:n}| ${3} }\n\ +snippet loo\n\ + loop { ${1} }\n\ +snippet ea\n\ + each { |${1:e}| ${2} }\n\ +snippet ead\n\ + each do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet eab\n\ + each_byte { |${1:byte}| ${2} }\n\ +snippet eac- each_char { |chr| .. }\n\ + each_char { |${1:chr}| ${2} }\n\ +snippet eac- each_cons(..) { |group| .. }\n\ + each_cons(${1:2}) { |${2:group}| ${3} }\n\ +snippet eai\n\ + each_index { |${1:i}| ${2} }\n\ +snippet eaid\n\ + each_index do |${1:i}|\n\ + ${2}\n\ + end\n\ +snippet eak\n\ + each_key { |${1:key}| ${2} }\n\ +snippet eakd\n\ + each_key do |${1:key}|\n\ + ${2}\n\ + end\n\ +snippet eal\n\ + each_line { |${1:line}| ${2} }\n\ +snippet eald\n\ + each_line do |${1:line}|\n\ + ${2}\n\ + end\n\ +snippet eap\n\ + each_pair { |${1:name}, ${2:val}| ${3} }\n\ +snippet eapd\n\ + each_pair do |${1:name}, ${2:val}|\n\ + ${3}\n\ + end\n\ +snippet eas-\n\ + each_slice(${1:2}) { |${2:group}| ${3} }\n\ +snippet easd-\n\ + each_slice(${1:2}) do |${2:group}|\n\ + ${3}\n\ + end\n\ +snippet eav\n\ + each_value { |${1:val}| ${2} }\n\ +snippet eavd\n\ + each_value do |${1:val}|\n\ + ${2}\n\ + end\n\ +snippet eawi\n\ + each_with_index { |${1:e}, ${2:i}| ${3} }\n\ +snippet eawid\n\ + each_with_index do |${1:e},${2:i}|\n\ + ${3}\n\ + end\n\ +snippet reve\n\ + reverse_each { |${1:e}| ${2} }\n\ +snippet reved\n\ + reverse_each do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet inj\n\ + inject(${1:init}) { |${2:mem}, ${3:var}| ${4} }\n\ +snippet injd\n\ + inject(${1:init}) do |${2:mem}, ${3:var}|\n\ + ${4}\n\ + end\n\ +snippet map\n\ + map { |${1:e}| ${2} }\n\ +snippet mapd\n\ + map do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet mapwi-\n\ + enum_with_index.map { |${1:e}, ${2:i}| ${3} }\n\ +snippet sor\n\ + sort { |a, b| ${1} }\n\ +snippet sorb\n\ + sort_by { |${1:e}| ${2} }\n\ +snippet ran\n\ + sort_by { rand }\n\ +snippet all\n\ + all? { |${1:e}| ${2} }\n\ +snippet any\n\ + any? { |${1:e}| ${2} }\n\ +snippet cl\n\ + classify { |${1:e}| ${2} }\n\ +snippet col\n\ + collect { |${1:e}| ${2} }\n\ +snippet cold\n\ + collect do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet det\n\ + detect { |${1:e}| ${2} }\n\ +snippet detd\n\ + detect do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet fet\n\ + fetch(${1:name}) { |${2:key}| ${3} }\n\ +snippet fin\n\ + find { |${1:e}| ${2} }\n\ +snippet find\n\ + find do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet fina\n\ + find_all { |${1:e}| ${2} }\n\ +snippet finad\n\ + find_all do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet gre\n\ + grep(${1:/pattern/}) { |${2:match}| ${3} }\n\ +snippet sub\n\ + ${1:g}sub(${2:/pattern/}) { |${3:match}| ${4} }\n\ +snippet sca\n\ + scan(${1:/pattern/}) { |${2:match}| ${3} }\n\ +snippet scad\n\ + scan(${1:/pattern/}) do |${2:match}|\n\ + ${3}\n\ + end\n\ +snippet max\n\ + max { |a, b| ${1} }\n\ +snippet min\n\ + min { |a, b| ${1} }\n\ +snippet par\n\ + partition { |${1:e}| ${2} }\n\ +snippet pard\n\ + partition do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet rej\n\ + reject { |${1:e}| ${2} }\n\ +snippet rejd\n\ + reject do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet sel\n\ + select { |${1:e}| ${2} }\n\ +snippet seld\n\ + select do |${1:e}|\n\ + ${2}\n\ + end\n\ +snippet lam\n\ + lambda { |${1:args}| ${2} }\n\ +snippet doo\n\ + do\n\ + ${1}\n\ + end\n\ +snippet dov\n\ + do |${1:variable}|\n\ + ${2}\n\ + end\n\ +snippet :\n\ + :${1:key} => ${2:\"value\"}${3}\n\ +snippet ope\n\ + open(${1:\"path/or/url/or/pipe\"}, \"${2:w}\") { |${3:io}| ${4} }\n\ +# path_from_here()\n\ +snippet fpath\n\ + File.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2}\n\ +# unix_filter {}\n\ +snippet unif\n\ + ARGF.each_line${1} do |${2:line}|\n\ + ${3}\n\ + end\n\ +# option_parse {}\n\ +snippet optp\n\ + require \"optparse\"\n\ +\n\ + options = {${1:default => \"args\"}}\n\ +\n\ + ARGV.options do |opts|\n\ + opts.banner = \"Usage: #{File.basename($PROGRAM_NAME)}\n\ +snippet opt\n\ + opts.on( \"-${1:o}\", \"--${2:long-option-name}\", ${3:String},\n\ + \"${4:Option description.}\") do |${5:opt}|\n\ + ${6}\n\ + end\n\ +snippet tc\n\ + require \"test/unit\"\n\ +\n\ + require \"${1:library_file_name}\"\n\ +\n\ + class Test${2:$1} < Test::Unit::TestCase\n\ + def test_${3:case_name}\n\ + ${4}\n\ + end\n\ + end\n\ +snippet ts\n\ + require \"test/unit\"\n\ +\n\ + require \"tc_${1:test_case_file}\"\n\ + require \"tc_${2:test_case_file}\"${3}\n\ +snippet as\n\ + assert ${1:test}, \"${2:Failure message.}\"${3}\n\ +snippet ase\n\ + assert_equal ${1:expected}, ${2:actual}${3}\n\ +snippet asne\n\ + assert_not_equal ${1:unexpected}, ${2:actual}${3}\n\ +snippet asid\n\ + assert_in_delta ${1:expected_float}, ${2:actual_float}, ${3:2 ** -20}${4}\n\ +snippet asio\n\ + assert_instance_of ${1:ExpectedClass}, ${2:actual_instance}${3}\n\ +snippet asko\n\ + assert_kind_of ${1:ExpectedKind}, ${2:actual_instance}${3}\n\ +snippet asn\n\ + assert_nil ${1:instance}${2}\n\ +snippet asnn\n\ + assert_not_nil ${1:instance}${2}\n\ +snippet asm\n\ + assert_match /${1:expected_pattern}/, ${2:actual_string}${3}\n\ +snippet asnm\n\ + assert_no_match /${1:unexpected_pattern}/, ${2:actual_string}${3}\n\ +snippet aso\n\ + assert_operator ${1:left}, :${2:operator}, ${3:right}${4}\n\ +snippet asr\n\ + assert_raise ${1:Exception} { ${2} }\n\ +snippet asrd\n\ + assert_raise ${1:Exception} do\n\ + ${2}\n\ + end\n\ +snippet asnr\n\ + assert_nothing_raised ${1:Exception} { ${2} }\n\ +snippet asnrd\n\ + assert_nothing_raised ${1:Exception} do\n\ + ${2}\n\ + end\n\ +snippet asrt\n\ + assert_respond_to ${1:object}, :${2:method}${3}\n\ +snippet ass assert_same(..)\n\ + assert_same ${1:expected}, ${2:actual}${3}\n\ +snippet ass assert_send(..)\n\ + assert_send [${1:object}, :${2:message}, ${3:args}]${4}\n\ +snippet asns\n\ + assert_not_same ${1:unexpected}, ${2:actual}${3}\n\ +snippet ast\n\ + assert_throws :${1:expected} { ${2} }\n\ +snippet astd\n\ + assert_throws :${1:expected} do\n\ + ${2}\n\ + end\n\ +snippet asnt\n\ + assert_nothing_thrown { ${1} }\n\ +snippet asntd\n\ + assert_nothing_thrown do\n\ + ${1}\n\ + end\n\ +snippet fl\n\ + flunk \"${1:Failure message.}\"${2}\n\ +# Benchmark.bmbm do .. end\n\ +snippet bm-\n\ + TESTS = ${1:10_000}\n\ + Benchmark.bmbm do |results|\n\ + ${2}\n\ + end\n\ +snippet rep\n\ + results.report(\"${1:name}:\") { TESTS.times { ${2} }}\n\ +# Marshal.dump(.., file)\n\ +snippet Md\n\ + File.open(${1:\"path/to/file.dump\"}, \"wb\") { |${2:file}| Marshal.dump(${3:obj}, $2) }${4}\n\ +# Mashal.load(obj)\n\ +snippet Ml\n\ + File.open(${1:\"path/to/file.dump\"}, \"rb\") { |${2:file}| Marshal.load($2) }${3}\n\ +# deep_copy(..)\n\ +snippet deec\n\ + Marshal.load(Marshal.dump(${1:obj_to_copy}))${2}\n\ +snippet Pn-\n\ + PStore.new(${1:\"file_name.pstore\"})${2}\n\ +snippet tra\n\ + transaction(${1:true}) { ${2} }\n\ +# xmlread(..)\n\ +snippet xml-\n\ + REXML::Document.new(File.read(${1:\"path/to/file\"}))${2}\n\ +# xpath(..) { .. }\n\ +snippet xpa\n\ + elements.each(${1:\"//Xpath\"}) do |${2:node}|\n\ + ${3}\n\ + end\n\ +# class_from_name()\n\ +snippet clafn\n\ + split(\"::\").inject(Object) { |par, const| par.const_get(const) }\n\ +# singleton_class()\n\ +snippet sinc\n\ + class << self; self end\n\ +snippet nam\n\ + namespace :${1:`Filename()`} do\n\ + ${2}\n\ + end\n\ +snippet tas\n\ + desc \"${1:Task description}\"\n\ + task :${2:task_name => [:dependent, :tasks]} do\n\ + ${3}\n\ + end\n\ +# block\n\ +snippet b\n\ + { |${1:var}| ${2} }\n\ +snippet begin\n\ + begin\n\ + raise 'A test exception.'\n\ + rescue Exception => e\n\ + puts e.message\n\ + puts e.backtrace.inspect\n\ + else\n\ + # other exception\n\ + ensure\n\ + # always executed\n\ + end\n\ +\n\ +#debugging\n\ +snippet debug\n\ + require 'ruby-debug'; debugger; true;\n\ +snippet pry\n\ + require 'pry'; binding.pry\n\ +\n\ +#############################################\n\ +# Rails snippets - for pure Ruby, see above #\n\ +#############################################\n\ +snippet art\n\ + assert_redirected_to ${1::action => \"${2:index}\"}\n\ +snippet artnp\n\ + assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1}, ${4:@$2})\n\ +snippet artnpp\n\ + assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1})\n\ +snippet artp\n\ + assert_redirected_to ${1:model}_path(${2:@$1})\n\ +snippet artpp\n\ + assert_redirected_to ${1:model}s_path\n\ +snippet asd\n\ + assert_difference \"${1:Model}.${2:count}\", $1 do\n\ + ${3}\n\ + end\n\ +snippet asnd\n\ + assert_no_difference \"${1:Model}.${2:count}\" do\n\ + ${3}\n\ + end\n\ +snippet asre\n\ + assert_response :${1:success}, @response.body${2}\n\ +snippet asrj\n\ + assert_rjs :${1:replace}, \"${2:dom id}\"\n\ +snippet ass assert_select(..)\n\ + assert_select '${1:path}', :${2:text} => '${3:inner_html' ${4:do}\n\ +snippet bf\n\ + before_filter :${1:method}\n\ +snippet bt\n\ + belongs_to :${1:association}\n\ +snippet crw\n\ + cattr_accessor :${1:attr_names}\n\ +snippet defcreate\n\ + def create\n\ + @${1:model_class_name} = ${2:ModelClassName}.new(params[:$1])\n\ +\n\ + respond_to do |wants|\n\ + if @$1.save\n\ + flash[:notice] = '$2 was successfully created.'\n\ + wants.html { redirect_to(@$1) }\n\ + wants.xml { render :xml => @$1, :status => :created, :location => @$1 }\n\ + else\n\ + wants.html { render :action => \"new\" }\n\ + wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }\n\ + end\n\ + end\n\ + end${3}\n\ +snippet defdestroy\n\ + def destroy\n\ + @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\ + @$1.destroy\n\ +\n\ + respond_to do |wants|\n\ + wants.html { redirect_to($1s_url) }\n\ + wants.xml { head :ok }\n\ + end\n\ + end${3}\n\ +snippet defedit\n\ + def edit\n\ + @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\ + end\n\ +snippet defindex\n\ + def index\n\ + @${1:model_class_name} = ${2:ModelClassName}.all\n\ +\n\ + respond_to do |wants|\n\ + wants.html # index.html.erb\n\ + wants.xml { render :xml => @$1s }\n\ + end\n\ + end${3}\n\ +snippet defnew\n\ + def new\n\ + @${1:model_class_name} = ${2:ModelClassName}.new\n\ +\n\ + respond_to do |wants|\n\ + wants.html # new.html.erb\n\ + wants.xml { render :xml => @$1 }\n\ + end\n\ + end${3}\n\ +snippet defshow\n\ + def show\n\ + @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\ +\n\ + respond_to do |wants|\n\ + wants.html # show.html.erb\n\ + wants.xml { render :xml => @$1 }\n\ + end\n\ + end${3}\n\ +snippet defupdate\n\ + def update\n\ + @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\ +\n\ + respond_to do |wants|\n\ + if @$1.update_attributes(params[:$1])\n\ + flash[:notice] = '$2 was successfully updated.'\n\ + wants.html { redirect_to(@$1) }\n\ + wants.xml { head :ok }\n\ + else\n\ + wants.html { render :action => \"edit\" }\n\ + wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }\n\ + end\n\ + end\n\ + end${3}\n\ +snippet flash\n\ + flash[:${1:notice}] = \"${2}\"\n\ +snippet habtm\n\ + has_and_belongs_to_many :${1:object}, :join_table => \"${2:table_name}\", :foreign_key => \"${3}_id\"${4}\n\ +snippet hm\n\ + has_many :${1:object}\n\ +snippet hmd\n\ + has_many :${1:other}s, :class_name => \"${2:$1}\", :foreign_key => \"${3:$1}_id\", :dependent => :destroy${4}\n\ +snippet hmt\n\ + has_many :${1:object}, :through => :${2:object}\n\ +snippet ho\n\ + has_one :${1:object}\n\ +snippet i18\n\ + I18n.t('${1:type.key}')${2}\n\ +snippet ist\n\ + <%= image_submit_tag(\"${1:agree.png}\", :id => \"${2:id}\"${3} %>\n\ +snippet log\n\ + Rails.logger.${1:debug} ${2}\n\ +snippet log2\n\ + RAILS_DEFAULT_LOGGER.${1:debug} ${2}\n\ +snippet logd\n\ + logger.debug { \"${1:message}\" }${2}\n\ +snippet loge\n\ + logger.error { \"${1:message}\" }${2}\n\ +snippet logf\n\ + logger.fatal { \"${1:message}\" }${2}\n\ +snippet logi\n\ + logger.info { \"${1:message}\" }${2}\n\ +snippet logw\n\ + logger.warn { \"${1:message}\" }${2}\n\ +snippet mapc\n\ + ${1:map}.${2:connect} '${3:controller/:action/:id}'\n\ +snippet mapca\n\ + ${1:map}.catch_all \"*${2:anything}\", :controller => \"${3:default}\", :action => \"${4:error}\"${5}\n\ +snippet mapr\n\ + ${1:map}.resource :${2:resource}\n\ +snippet maprs\n\ + ${1:map}.resources :${2:resource}\n\ +snippet mapwo\n\ + ${1:map}.with_options :${2:controller} => '${3:thing}' do |$3|\n\ + ${4}\n\ + end\n\ +snippet mbs\n\ + before_save :${1:method}\n\ +snippet mcht\n\ + change_table :${1:table_name} do |t|\n\ + ${2}\n\ + end\n\ +snippet mp\n\ + map(&:${1:id})\n\ +snippet mrw\n\ + mattr_accessor :${1:attr_names}\n\ +snippet oa\n\ + order(\"${1:field}\")\n\ +snippet od\n\ + order(\"${1:field} DESC\")\n\ +snippet pa\n\ + params[:${1:id}]${2}\n\ +snippet ra\n\ + render :action => \"${1:action}\"\n\ +snippet ral\n\ + render :action => \"${1:action}\", :layout => \"${2:layoutname}\"\n\ +snippet rest\n\ + respond_to do |wants|\n\ + wants.${1:html} { ${2} }\n\ + end\n\ +snippet rf\n\ + render :file => \"${1:filepath}\"\n\ +snippet rfu\n\ + render :file => \"${1:filepath}\", :use_full_path => ${2:false}\n\ +snippet ri\n\ + render :inline => \"${1:<%= 'hello' %>}\"\n\ +snippet ril\n\ + render :inline => \"${1:<%= 'hello' %>}\", :locals => { ${2::name} => \"${3:value}\"${4} }\n\ +snippet rit\n\ + render :inline => \"${1:<%= 'hello' %>}\", :type => ${2::rxml}\n\ +snippet rjson\n\ + render :json => ${1:text to render}\n\ +snippet rl\n\ + render :layout => \"${1:layoutname}\"\n\ +snippet rn\n\ + render :nothing => ${1:true}\n\ +snippet rns\n\ + render :nothing => ${1:true}, :status => ${2:401}\n\ +snippet rp\n\ + render :partial => \"${1:item}\"\n\ +snippet rpc\n\ + render :partial => \"${1:item}\", :collection => ${2:@$1s}\n\ +snippet rpl\n\ + render :partial => \"${1:item}\", :locals => { :${2:$1} => ${3:@$1}\n\ +snippet rpo\n\ + render :partial => \"${1:item}\", :object => ${2:@$1}\n\ +snippet rps\n\ + render :partial => \"${1:item}\", :status => ${2:500}\n\ +snippet rt\n\ + render :text => \"${1:text to render}\"\n\ +snippet rtl\n\ + render :text => \"${1:text to render}\", :layout => \"${2:layoutname}\"\n\ +snippet rtlt\n\ + render :text => \"${1:text to render}\", :layout => ${2:true}\n\ +snippet rts\n\ + render :text => \"${1:text to render}\", :status => ${2:401}\n\ +snippet ru\n\ + render :update do |${1:page}|\n\ + $1.${2}\n\ + end\n\ +snippet rxml\n\ + render :xml => ${1:text to render}\n\ +snippet sc\n\ + scope :${1:name}, :where(:@${2:field} => ${3:value})\n\ +snippet sl\n\ + scope :${1:name}, lambda do |${2:value}|\n\ + where(\"${3:field = ?}\", ${4:bind var})\n\ + end\n\ +snippet sha1\n\ + Digest::SHA1.hexdigest(${1:string})\n\ +snippet sweeper\n\ + class ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper\n\ + observe $1\n\ +\n\ + def after_save(${2:model_class_name})\n\ + expire_cache($2)\n\ + end\n\ +\n\ + def after_destroy($2)\n\ + expire_cache($2)\n\ + end\n\ +\n\ + def expire_cache($2)\n\ + expire_page\n\ + end\n\ + end\n\ +snippet tcb\n\ + t.boolean :${1:title}\n\ + ${2}\n\ +snippet tcbi\n\ + t.binary :${1:title}, :limit => ${2:2}.megabytes\n\ + ${3}\n\ +snippet tcd\n\ + t.decimal :${1:title}, :precision => ${2:10}, :scale => ${3:2}\n\ + ${4}\n\ +snippet tcda\n\ + t.date :${1:title}\n\ + ${2}\n\ +snippet tcdt\n\ + t.datetime :${1:title}\n\ + ${2}\n\ +snippet tcf\n\ + t.float :${1:title}\n\ + ${2}\n\ +snippet tch\n\ + t.change :${1:name}, :${2:string}, :${3:limit} => ${4:80}\n\ + ${5}\n\ +snippet tci\n\ + t.integer :${1:title}\n\ + ${2}\n\ +snippet tcl\n\ + t.integer :lock_version, :null => false, :default => 0\n\ + ${1}\n\ +snippet tcr\n\ + t.references :${1:taggable}, :polymorphic => { :default => '${2:Photo}' }\n\ + ${3}\n\ +snippet tcs\n\ + t.string :${1:title}\n\ + ${2}\n\ +snippet tct\n\ + t.text :${1:title}\n\ + ${2}\n\ +snippet tcti\n\ + t.time :${1:title}\n\ + ${2}\n\ +snippet tcts\n\ + t.timestamp :${1:title}\n\ + ${2}\n\ +snippet tctss\n\ + t.timestamps\n\ + ${1}\n\ +snippet va\n\ + validates_associated :${1:attribute}\n\ +snippet vao\n\ + validates_acceptance_of :${1:terms}\n\ +snippet vc\n\ + validates_confirmation_of :${1:attribute}\n\ +snippet ve\n\ + validates_exclusion_of :${1:attribute}, :in => ${2:%w( mov avi )}\n\ +snippet vf\n\ + validates_format_of :${1:attribute}, :with => /${2:regex}/\n\ +snippet vi\n\ + validates_inclusion_of :${1:attribute}, :in => %w(${2: mov avi })\n\ +snippet vl\n\ + validates_length_of :${1:attribute}, :within => ${2:3}..${3:20}\n\ +snippet vn\n\ + validates_numericality_of :${1:attribute}\n\ +snippet vpo\n\ + validates_presence_of :${1:attribute}\n\ +snippet vu\n\ + validates_uniqueness_of :${1:attribute}\n\ +snippet wants\n\ + wants.${1:js|xml|html} { ${2} }\n\ +snippet wc\n\ + where(${1:\"conditions\"}${2:, bind_var})\n\ +snippet wh\n\ + where(${1:field} => ${2:value})\n\ +snippet xdelete\n\ + xhr :delete, :${1:destroy}, :id => ${2:1}${3}\n\ +snippet xget\n\ + xhr :get, :${1:show}, :id => ${2:1}${3}\n\ +snippet xpost\n\ + xhr :post, :${1:create}, :${2:object} => { ${3} }\n\ +snippet xput\n\ + xhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { ${4} }${5}\n\ +snippet test\n\ + test \"should ${1:do something}\" do\n\ + ${2}\n\ + end\n\ +#migrations\n\ +snippet mac\n\ + add_column :${1:table_name}, :${2:column_name}, :${3:data_type}\n\ +snippet mrc\n\ + remove_column :${1:table_name}, :${2:column_name}\n\ +snippet mrnc\n\ + rename_column :${1:table_name}, :${2:old_column_name}, :${3:new_column_name}\n\ +snippet mcc\n\ + change_column :${1:table}, :${2:column}, :${3:type}\n\ +snippet mccc\n\ + t.column :${1:title}, :${2:string}\n\ +snippet mct\n\ + create_table :${1:table_name} do |t|\n\ + t.column :${2:name}, :${3:type}\n\ + end\n\ +snippet migration\n\ + class ${1:class_name} < ActiveRecord::Migration\n\ + def self.up\n\ + ${2}\n\ + end\n\ +\n\ + def self.down\n\ + end\n\ + end\n\ +\n\ +snippet trc\n\ + t.remove :${1:column}\n\ +snippet tre\n\ + t.rename :${1:old_column_name}, :${2:new_column_name}\n\ + ${3}\n\ +snippet tref\n\ + t.references :${1:model}\n\ +\n\ +#rspec\n\ +snippet it\n\ + it \"${1:spec_name}\" do\n\ + ${2}\n\ + end\n\ +snippet itp\n\ + it \"${1:spec_name}\"\n\ + ${2}\n\ +snippet desc\n\ + describe ${1:class_name} do\n\ + ${2}\n\ + end\n\ +snippet cont\n\ + context \"${1:message}\" do\n\ + ${2}\n\ + end\n\ +snippet bef\n\ + before :${1:each} do\n\ + ${2}\n\ + end\n\ +snippet aft\n\ + after :${1:each} do\n\ + ${2}\n\ + end\n\ +"; +exports.scope = "ruby"; + +}); diff --git a/src/libs/ace/snippets/rust.js b/src/libs/ace/snippets/rust.js new file mode 100755 index 0000000..0411c63 --- /dev/null +++ b/src/libs/ace/snippets/rust.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/rust",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "rust"; + +}); diff --git a/src/libs/ace/snippets/sass.js b/src/libs/ace/snippets/sass.js new file mode 100755 index 0000000..b9adc9d --- /dev/null +++ b/src/libs/ace/snippets/sass.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/sass",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "sass"; + +}); diff --git a/src/libs/ace/snippets/scad.js b/src/libs/ace/snippets/scad.js new file mode 100755 index 0000000..998a98a --- /dev/null +++ b/src/libs/ace/snippets/scad.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/scad",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "scad"; + +}); diff --git a/src/libs/ace/snippets/scala.js b/src/libs/ace/snippets/scala.js new file mode 100755 index 0000000..4051d98 --- /dev/null +++ b/src/libs/ace/snippets/scala.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/scala",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "scala"; + +}); diff --git a/src/libs/ace/snippets/scheme.js b/src/libs/ace/snippets/scheme.js new file mode 100755 index 0000000..202d074 --- /dev/null +++ b/src/libs/ace/snippets/scheme.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/scheme",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "scheme"; + +}); diff --git a/src/libs/ace/snippets/scss.js b/src/libs/ace/snippets/scss.js new file mode 100755 index 0000000..fbd98f7 --- /dev/null +++ b/src/libs/ace/snippets/scss.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/scss",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "scss"; + +}); diff --git a/src/libs/ace/snippets/sh.js b/src/libs/ace/snippets/sh.js new file mode 100755 index 0000000..0f1f6d8 --- /dev/null +++ b/src/libs/ace/snippets/sh.js @@ -0,0 +1,90 @@ +ace.define("ace/snippets/sh",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Shebang. Executing bash via /usr/bin/env makes scripts more portable.\n\ +snippet #!\n\ + #!/usr/bin/env bash\n\ + \n\ +snippet if\n\ + if [[ ${1:condition} ]]; then\n\ + ${2:#statements}\n\ + fi\n\ +snippet elif\n\ + elif [[ ${1:condition} ]]; then\n\ + ${2:#statements}\n\ +snippet for\n\ + for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do\n\ + ${3:#statements}\n\ + done\n\ +snippet fori\n\ + for ${1:needle} in ${2:haystack} ; do\n\ + ${3:#statements}\n\ + done\n\ +snippet wh\n\ + while [[ ${1:condition} ]]; do\n\ + ${2:#statements}\n\ + done\n\ +snippet until\n\ + until [[ ${1:condition} ]]; do\n\ + ${2:#statements}\n\ + done\n\ +snippet case\n\ + case ${1:word} in\n\ + ${2:pattern})\n\ + ${3};;\n\ + esac\n\ +snippet go \n\ + while getopts '${1:o}' ${2:opts} \n\ + do \n\ + case $$2 in\n\ + ${3:o0})\n\ + ${4:#staments};;\n\ + esac\n\ + done\n\ +# Set SCRIPT_DIR variable to directory script is located.\n\ +snippet sdir\n\ + SCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\ +# getopt\n\ +snippet getopt\n\ + __ScriptVersion=\"${1:version}\"\n\ +\n\ + #=== FUNCTION ================================================================\n\ + # NAME: usage\n\ + # DESCRIPTION: Display usage information.\n\ + #===============================================================================\n\ + function usage ()\n\ + {\n\ + cat <<- EOT\n\ +\n\ + Usage : $${0:0} [options] [--] \n\ +\n\ + Options: \n\ + -h|help Display this message\n\ + -v|version Display script version\n\ +\n\ + EOT\n\ + } # ---------- end of function usage ----------\n\ +\n\ + #-----------------------------------------------------------------------\n\ + # Handle command line arguments\n\ + #-----------------------------------------------------------------------\n\ +\n\ + while getopts \":hv\" opt\n\ + do\n\ + case $opt in\n\ +\n\ + h|help ) usage; exit 0 ;;\n\ +\n\ + v|version ) echo \"$${0:0} -- Version $__ScriptVersion\"; exit 0 ;;\n\ +\n\ + \\? ) echo -e \"\\n Option does not exist : $OPTARG\\n\"\n\ + usage; exit 1 ;;\n\ +\n\ + esac # --- end of case ---\n\ + done\n\ + shift $(($OPTIND-1))\n\ +\n\ +"; +exports.scope = "sh"; + +}); diff --git a/src/libs/ace/snippets/sjs.js b/src/libs/ace/snippets/sjs.js new file mode 100755 index 0000000..cf39a34 --- /dev/null +++ b/src/libs/ace/snippets/sjs.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/sjs",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "sjs"; + +}); diff --git a/src/libs/ace/snippets/smarty.js b/src/libs/ace/snippets/smarty.js new file mode 100755 index 0000000..47319a2 --- /dev/null +++ b/src/libs/ace/snippets/smarty.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/smarty",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "smarty"; + +}); diff --git a/src/libs/ace/snippets/snippets.js b/src/libs/ace/snippets/snippets.js new file mode 100755 index 0000000..b81605c --- /dev/null +++ b/src/libs/ace/snippets/snippets.js @@ -0,0 +1,16 @@ +ace.define("ace/snippets/snippets",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# snippets for making snippets :)\n\ +snippet snip\n\ + snippet ${1:trigger}\n\ + ${2}\n\ +snippet msnip\n\ + snippet ${1:trigger} ${2:description}\n\ + ${3}\n\ +snippet v\n\ + {VISUAL}\n\ +"; +exports.scope = "snippets"; + +}); diff --git a/src/libs/ace/snippets/soy_template.js b/src/libs/ace/snippets/soy_template.js new file mode 100755 index 0000000..908f5fd --- /dev/null +++ b/src/libs/ace/snippets/soy_template.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/soy_template",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "soy_template"; + +}); diff --git a/src/libs/ace/snippets/space.js b/src/libs/ace/snippets/space.js new file mode 100755 index 0000000..302b84e --- /dev/null +++ b/src/libs/ace/snippets/space.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/space",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "space"; + +}); diff --git a/src/libs/ace/snippets/sparql.js b/src/libs/ace/snippets/sparql.js new file mode 100755 index 0000000..2c87bbf --- /dev/null +++ b/src/libs/ace/snippets/sparql.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/sparql",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/sql.js b/src/libs/ace/snippets/sql.js new file mode 100755 index 0000000..1822126 --- /dev/null +++ b/src/libs/ace/snippets/sql.js @@ -0,0 +1,33 @@ +ace.define("ace/snippets/sql",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet tbl\n\ + create table ${1:table} (\n\ + ${2:columns}\n\ + );\n\ +snippet col\n\ + ${1:name} ${2:type} ${3:default ''} ${4:not null}\n\ +snippet ccol\n\ + ${1:name} varchar2(${2:size}) ${3:default ''} ${4:not null}\n\ +snippet ncol\n\ + ${1:name} number ${3:default 0} ${4:not null}\n\ +snippet dcol\n\ + ${1:name} date ${3:default sysdate} ${4:not null}\n\ +snippet ind\n\ + create index ${3:$1_$2} on ${1:table}(${2:column});\n\ +snippet uind\n\ + create unique index ${1:name} on ${2:table}(${3:column});\n\ +snippet tblcom\n\ + comment on table ${1:table} is '${2:comment}';\n\ +snippet colcom\n\ + comment on column ${1:table}.${2:column} is '${3:comment}';\n\ +snippet addcol\n\ + alter table ${1:table} add (${2:column} ${3:type});\n\ +snippet seq\n\ + create sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\n\ +snippet s*\n\ + select * from ${1:table}\n\ +"; +exports.scope = "sql"; + +}); diff --git a/src/libs/ace/snippets/sqlserver.js b/src/libs/ace/snippets/sqlserver.js new file mode 100755 index 0000000..7dfa2d0 --- /dev/null +++ b/src/libs/ace/snippets/sqlserver.js @@ -0,0 +1,76 @@ +ace.define("ace/snippets/sqlserver",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# ISNULL\n\ +snippet isnull\n\ + ISNULL(${1:check_expression}, ${2:replacement_value})\n\ +# FORMAT\n\ +snippet format\n\ + FORMAT(${1:value}, ${2:format})\n\ +# CAST\n\ +snippet cast\n\ + CAST(${1:expression} AS ${2:data_type})\n\ +# CONVERT\n\ +snippet convert\n\ + CONVERT(${1:data_type}, ${2:expression})\n\ +# DATEPART\n\ +snippet datepart\n\ + DATEPART(${1:datepart}, ${2:date})\n\ +# DATEDIFF\n\ +snippet datediff\n\ + DATEDIFF(${1:datepart}, ${2:startdate}, ${3:enddate})\n\ +# DATEADD\n\ +snippet dateadd\n\ + DATEADD(${1:datepart}, ${2:number}, ${3:date})\n\ +# DATEFROMPARTS \n\ +snippet datefromparts\n\ + DATEFROMPARTS(${1:year}, ${2:month}, ${3:day})\n\ +# OBJECT_DEFINITION\n\ +snippet objectdef\n\ + SELECT OBJECT_DEFINITION(OBJECT_ID('${1:sys.server_permissions /*object name*/}'))\n\ +# STUFF XML\n\ +snippet stuffxml\n\ + STUFF((SELECT ', ' + ${1:ColumnName}\n\ + FROM ${2:TableName}\n\ + WHERE ${3:WhereClause}\n\ + FOR XML PATH('')), 1, 1, '') AS ${4:Alias}\n\ + ${5:/*https://msdn.microsoft.com/en-us/library/ms188043.aspx*/}\n\ +# Create Procedure\n\ +snippet createproc\n\ + -- =============================================\n\ + -- Author: ${1:Author}\n\ + -- Create date: ${2:Date}\n\ + -- Description: ${3:Description}\n\ + -- =============================================\n\ + CREATE PROCEDURE ${4:Procedure_Name}\n\ + ${5:/*Add the parameters for the stored procedure here*/}\n\ + AS\n\ + BEGIN\n\ + -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.\n\ + SET NOCOUNT ON;\n\ + \n\ + ${6:/*Add the T-SQL statements to compute the return value here*/}\n\ + \n\ + END\n\ + GO\n\ +# Create Scalar Function\n\ +snippet createfn\n\ + -- =============================================\n\ + -- Author: ${1:Author}\n\ + -- Create date: ${2:Date}\n\ + -- Description: ${3:Description}\n\ + -- =============================================\n\ + CREATE FUNCTION ${4:Scalar_Function_Name}\n\ + -- Add the parameters for the function here\n\ + RETURNS ${5:Function_Data_Type}\n\ + AS\n\ + BEGIN\n\ + DECLARE @Result ${5:Function_Data_Type}\n\ + \n\ + ${6:/*Add the T-SQL statements to compute the return value here*/}\n\ + \n\ + END\n\ + GO"; +exports.scope = "sqlserver"; + +}); diff --git a/src/libs/ace/snippets/stylus.js b/src/libs/ace/snippets/stylus.js new file mode 100755 index 0000000..5f700ba --- /dev/null +++ b/src/libs/ace/snippets/stylus.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/stylus",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "stylus"; + +}); diff --git a/src/libs/ace/snippets/svg.js b/src/libs/ace/snippets/svg.js new file mode 100755 index 0000000..69a3408 --- /dev/null +++ b/src/libs/ace/snippets/svg.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/svg",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "svg"; + +}); diff --git a/src/libs/ace/snippets/swift.js b/src/libs/ace/snippets/swift.js new file mode 100755 index 0000000..55226ba --- /dev/null +++ b/src/libs/ace/snippets/swift.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/swift",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "swift"; + +}); diff --git a/src/libs/ace/snippets/swig.js b/src/libs/ace/snippets/swig.js new file mode 100755 index 0000000..1eee033 --- /dev/null +++ b/src/libs/ace/snippets/swig.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/swig",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "swig"; + +}); diff --git a/src/libs/ace/snippets/tcl.js b/src/libs/ace/snippets/tcl.js new file mode 100755 index 0000000..4d116da --- /dev/null +++ b/src/libs/ace/snippets/tcl.js @@ -0,0 +1,99 @@ +ace.define("ace/snippets/tcl",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# #!/usr/bin/env tclsh\n\ +snippet #!\n\ + #!/usr/bin/env tclsh\n\ + \n\ +# Process\n\ +snippet pro\n\ + proc ${1:function_name} {${2:args}} {\n\ + ${3:#body ...}\n\ + }\n\ +#xif\n\ +snippet xif\n\ + ${1:expr}? ${2:true} : ${3:false}\n\ +# Conditional\n\ +snippet if\n\ + if {${1}} {\n\ + ${2:# body...}\n\ + }\n\ +# Conditional if..else\n\ +snippet ife\n\ + if {${1}} {\n\ + ${2:# body...}\n\ + } else {\n\ + ${3:# else...}\n\ + }\n\ +# Conditional if..elsif..else\n\ +snippet ifee\n\ + if {${1}} {\n\ + ${2:# body...}\n\ + } elseif {${3}} {\n\ + ${4:# elsif...}\n\ + } else {\n\ + ${5:# else...}\n\ + }\n\ +# If catch then\n\ +snippet ifc\n\ + if { [catch {${1:#do something...}} ${2:err}] } {\n\ + ${3:# handle failure...}\n\ + }\n\ +# Catch\n\ +snippet catch\n\ + catch {${1}} ${2:err} ${3:options}\n\ +# While Loop\n\ +snippet wh\n\ + while {${1}} {\n\ + ${2:# body...}\n\ + }\n\ +# For Loop\n\ +snippet for\n\ + for {set ${2:var} 0} {$$2 < ${1:count}} {${3:incr} $2} {\n\ + ${4:# body...}\n\ + }\n\ +# Foreach Loop\n\ +snippet fore\n\ + foreach ${1:x} {${2:#list}} {\n\ + ${3:# body...}\n\ + }\n\ +# after ms script...\n\ +snippet af\n\ + after ${1:ms} ${2:#do something}\n\ +# after cancel id\n\ +snippet afc\n\ + after cancel ${1:id or script}\n\ +# after idle\n\ +snippet afi\n\ + after idle ${1:script}\n\ +# after info id\n\ +snippet afin\n\ + after info ${1:id}\n\ +# Expr\n\ +snippet exp\n\ + expr {${1:#expression here}}\n\ +# Switch\n\ +snippet sw\n\ + switch ${1:var} {\n\ + ${3:pattern 1} {\n\ + ${4:#do something}\n\ + }\n\ + default {\n\ + ${2:#do something}\n\ + }\n\ + }\n\ +# Case\n\ +snippet ca\n\ + ${1:pattern} {\n\ + ${2:#do something}\n\ + }${3}\n\ +# Namespace eval\n\ +snippet ns\n\ + namespace eval ${1:path} {${2:#script...}}\n\ +# Namespace current\n\ +snippet nsc\n\ + namespace current\n\ +"; +exports.scope = "tcl"; + +}); diff --git a/src/libs/ace/snippets/tex.js b/src/libs/ace/snippets/tex.js new file mode 100755 index 0000000..2bd3f10 --- /dev/null +++ b/src/libs/ace/snippets/tex.js @@ -0,0 +1,197 @@ +ace.define("ace/snippets/tex",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "#PREAMBLE\n\ +#newcommand\n\ +snippet nc\n\ + \\newcommand{\\${1:cmd}}[${2:opt}]{${3:realcmd}}${4}\n\ +#usepackage\n\ +snippet up\n\ + \\usepackage[${1:[options}]{${2:package}}\n\ +#newunicodechar\n\ +snippet nuc\n\ + \\newunicodechar{${1}}{${2:\\ensuremath}${3:tex-substitute}}}\n\ +#DeclareMathOperator\n\ +snippet dmo\n\ + \\DeclareMathOperator{${1}}{${2}}\n\ +\n\ +#DOCUMENT\n\ +# \\begin{}...\\end{}\n\ +snippet begin\n\ + \\begin{${1:env}}\n\ + ${2}\n\ + \\end{$1}\n\ +# Tabular\n\ +snippet tab\n\ + \\begin{${1:tabular}}{${2:c}}\n\ + ${3}\n\ + \\end{$1}\n\ +snippet thm\n\ + \\begin[${1:author}]{${2:thm}}\n\ + ${3}\n\ + \\end{$1}\n\ +snippet center\n\ + \\begin{center}\n\ + ${1}\n\ + \\end{center}\n\ +# Align(ed)\n\ +snippet ali\n\ + \\begin{align${1:ed}}\n\ + ${2}\n\ + \\end{align$1}\n\ +# Gather(ed)\n\ +snippet gat\n\ + \\begin{gather${1:ed}}\n\ + ${2}\n\ + \\end{gather$1}\n\ +# Equation\n\ +snippet eq\n\ + \\begin{equation}\n\ + ${1}\n\ + \\end{equation}\n\ +# Equation\n\ +snippet eq*\n\ + \\begin{equation*}\n\ + ${1}\n\ + \\end{equation*}\n\ +# Unnumbered Equation\n\ +snippet \\\n\ + \\[\n\ + ${1}\n\ + \\]\n\ +# Enumerate\n\ +snippet enum\n\ + \\begin{enumerate}\n\ + \\item ${1}\n\ + \\end{enumerate}\n\ +# Itemize\n\ +snippet itemize\n\ + \\begin{itemize}\n\ + \\item ${1}\n\ + \\end{itemize}\n\ +# Description\n\ +snippet desc\n\ + \\begin{description}\n\ + \\item[${1}] ${2}\n\ + \\end{description}\n\ +# Matrix\n\ +snippet mat\n\ + \\begin{${1:p/b/v/V/B/small}matrix}\n\ + ${2}\n\ + \\end{$1matrix}\n\ +# Cases\n\ +snippet cas\n\ + \\begin{cases}\n\ + ${1:equation}, &\\text{ if }${2:case}\\\\\n\ + ${3}\n\ + \\end{cases}\n\ +# Split\n\ +snippet spl\n\ + \\begin{split}\n\ + ${1}\n\ + \\end{split}\n\ +# Part\n\ +snippet part\n\ + \\part{${1:part name}} % (fold)\n\ + \\label{prt:${2:$1}}\n\ + ${3}\n\ + % part $2 (end)\n\ +# Chapter\n\ +snippet cha\n\ + \\chapter{${1:chapter name}}\n\ + \\label{cha:${2:$1}}\n\ + ${3}\n\ +# Section\n\ +snippet sec\n\ + \\section{${1:section name}}\n\ + \\label{sec:${2:$1}}\n\ + ${3}\n\ +# Sub Section\n\ +snippet sub\n\ + \\subsection{${1:subsection name}}\n\ + \\label{sub:${2:$1}}\n\ + ${3}\n\ +# Sub Sub Section\n\ +snippet subs\n\ + \\subsubsection{${1:subsubsection name}}\n\ + \\label{ssub:${2:$1}}\n\ + ${3}\n\ +# Paragraph\n\ +snippet par\n\ + \\paragraph{${1:paragraph name}}\n\ + \\label{par:${2:$1}}\n\ + ${3}\n\ +# Sub Paragraph\n\ +snippet subp\n\ + \\subparagraph{${1:subparagraph name}}\n\ + \\label{subp:${2:$1}}\n\ + ${3}\n\ +#References\n\ +snippet itd\n\ + \\item[${1:description}] ${2:item}\n\ +snippet figure\n\ + ${1:Figure}~\\ref{${2:fig:}}${3}\n\ +snippet table\n\ + ${1:Table}~\\ref{${2:tab:}}${3}\n\ +snippet listing\n\ + ${1:Listing}~\\ref{${2:list}}${3}\n\ +snippet section\n\ + ${1:Section}~\\ref{${2:sec:}}${3}\n\ +snippet page\n\ + ${1:page}~\\pageref{${2}}${3}\n\ +snippet index\n\ + \\index{${1:index}}${2}\n\ +#Citations\n\ +snippet cite\n\ + \\cite[${1}]{${2}}${3}\n\ +snippet fcite\n\ + \\footcite[${1}]{${2}}${3}\n\ +#Formating text: italic, bold, underline, small capital, emphase ..\n\ +snippet it\n\ + \\textit{${1:text}}\n\ +snippet bf\n\ + \\textbf{${1:text}}\n\ +snippet under\n\ + \\underline{${1:text}}\n\ +snippet emp\n\ + \\emph{${1:text}}\n\ +snippet sc\n\ + \\textsc{${1:text}}\n\ +#Choosing font\n\ +snippet sf\n\ + \\textsf{${1:text}}\n\ +snippet rm\n\ + \\textrm{${1:text}}\n\ +snippet tt\n\ + \\texttt{${1:text}}\n\ +#misc\n\ +snippet ft\n\ + \\footnote{${1:text}}\n\ +snippet fig\n\ + \\begin{figure}\n\ + \\begin{center}\n\ + \\includegraphics[scale=${1}]{Figures/${2}}\n\ + \\end{center}\n\ + \\caption{${3}}\n\ + \\label{fig:${4}}\n\ + \\end{figure}\n\ +snippet tikz\n\ + \\begin{figure}\n\ + \\begin{center}\n\ + \\begin{tikzpicture}[scale=${1:1}]\n\ + ${2}\n\ + \\end{tikzpicture}\n\ + \\end{center}\n\ + \\caption{${3}}\n\ + \\label{fig:${4}}\n\ + \\end{figure}\n\ +#math\n\ +snippet stackrel\n\ + \\stackrel{${1:above}}{${2:below}} ${3}\n\ +snippet frac\n\ + \\frac{${1:num}}{${2:denom}}\n\ +snippet sum\n\ + \\sum^{${1:n}}_{${2:i=1}}{${3}}"; +exports.scope = "tex"; + +}); diff --git a/src/libs/ace/snippets/text.js b/src/libs/ace/snippets/text.js new file mode 100755 index 0000000..57b897b --- /dev/null +++ b/src/libs/ace/snippets/text.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/text",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "text"; + +}); diff --git a/src/libs/ace/snippets/textile.js b/src/libs/ace/snippets/textile.js new file mode 100755 index 0000000..a6fd711 --- /dev/null +++ b/src/libs/ace/snippets/textile.js @@ -0,0 +1,37 @@ +ace.define("ace/snippets/textile",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# Jekyll post header\n\ +snippet header\n\ + ---\n\ + title: ${1:title}\n\ + layout: post\n\ + date: ${2:date} ${3:hour:minute:second} -05:00\n\ + ---\n\ +\n\ +# Image\n\ +snippet img\n\ + !${1:url}(${2:title}):${3:link}!\n\ +\n\ +# Table\n\ +snippet |\n\ + |${1}|${2}\n\ +\n\ +# Link\n\ +snippet link\n\ + \"${1:link text}\":${2:url}\n\ +\n\ +# Acronym\n\ +snippet (\n\ + (${1:Expand acronym})${2}\n\ +\n\ +# Footnote\n\ +snippet fn\n\ + [${1:ref number}] ${3}\n\ +\n\ + fn$1. ${2:footnote}\n\ + \n\ +"; +exports.scope = "textile"; + +}); diff --git a/src/libs/ace/snippets/toml.js b/src/libs/ace/snippets/toml.js new file mode 100755 index 0000000..0c1a857 --- /dev/null +++ b/src/libs/ace/snippets/toml.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/toml",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "toml"; + +}); diff --git a/src/libs/ace/snippets/tsx.js b/src/libs/ace/snippets/tsx.js new file mode 100755 index 0000000..7946297 --- /dev/null +++ b/src/libs/ace/snippets/tsx.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/tsx",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "tsx"; + +}); diff --git a/src/libs/ace/snippets/turtle.js b/src/libs/ace/snippets/turtle.js new file mode 100755 index 0000000..5e104b2 --- /dev/null +++ b/src/libs/ace/snippets/turtle.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/turtle",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/twig.js b/src/libs/ace/snippets/twig.js new file mode 100755 index 0000000..ccc6073 --- /dev/null +++ b/src/libs/ace/snippets/twig.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/twig",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "twig"; + +}); diff --git a/src/libs/ace/snippets/typescript.js b/src/libs/ace/snippets/typescript.js new file mode 100755 index 0000000..5f6217d --- /dev/null +++ b/src/libs/ace/snippets/typescript.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/typescript",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "typescript"; + +}); diff --git a/src/libs/ace/snippets/vala.js b/src/libs/ace/snippets/vala.js new file mode 100755 index 0000000..3b49342 --- /dev/null +++ b/src/libs/ace/snippets/vala.js @@ -0,0 +1,193 @@ +ace.define("ace/snippets/vala",["require","exports","module"], function(require, exports, module) { +"use strict"; +exports.snippets = [ + { + "content": "case ${1:condition}:\n\t$0\n\tbreak;\n", + "name": "case", + "scope": "vala", + "tabTrigger": "case" + }, + { + "content": "/**\n * ${6}\n */\n${1:public} class ${2:MethodName}${3: : GLib.Object} {\n\n\t/**\n\t * ${7}\n\t */\n\tpublic ${2}(${4}) {\n\t\t${5}\n\t}\n\n\t$0\n}", + "name": "class", + "scope": "vala", + "tabTrigger": "class" + }, + { + "content": "(${1}) => {\n\t${0}\n}\n", + "name": "closure", + "scope": "vala", + "tabTrigger": "=>" + }, + { + "content": "/*\n * $0\n */", + "name": "Comment (multiline)", + "scope": "vala", + "tabTrigger": "/*" + }, + { + "content": "Console.WriteLine($1);\n$0", + "name": "Console.WriteLine (writeline)", + "scope": "vala", + "tabTrigger": "writeline" + }, + { + "content": "[DBus(name = \"$0\")]", + "name": "DBus annotation", + "scope": "vala", + "tabTrigger": "[DBus" + }, + { + "content": "delegate ${1:void} ${2:DelegateName}($0);", + "name": "delegate", + "scope": "vala", + "tabTrigger": "delegate" + }, + { + "content": "do {\n\t$0\n} while ($1);\n", + "name": "do while", + "scope": "vala", + "tabTrigger": "dowhile" + }, + { + "content": "/**\n * $0\n */", + "name": "DocBlock", + "scope": "vala", + "tabTrigger": "/**" + }, + { + "content": "else if ($1) {\n\t$0\n}\n", + "name": "else if (elseif)", + "scope": "vala", + "tabTrigger": "elseif" + }, + { + "content": "else {\n\t$0\n}", + "name": "else", + "scope": "vala", + "tabTrigger": "else" + }, + { + "content": "enum {$1:EnumName} {\n\t$0\n}", + "name": "enum", + "scope": "vala", + "tabTrigger": "enum" + }, + { + "content": "public errordomain ${1:Error} {\n\t$0\n}", + "name": "error domain", + "scope": "vala", + "tabTrigger": "errordomain" + }, + { + "content": "for ($1;$2;$3) {\n\t$0\n}", + "name": "for", + "scope": "vala", + "tabTrigger": "for" + }, + { + "content": "foreach ($1 in $2) {\n\t$0\n}", + "name": "foreach", + "scope": "vala", + "tabTrigger": "foreach" + }, + { + "content": "Gee.ArrayList<${1:G}>($0);", + "name": "Gee.ArrayList", + "scope": "vala", + "tabTrigger": "ArrayList" + }, + { + "content": "Gee.HashMap<${1:K},${2:V}>($0);", + "name": "Gee.HashMap", + "scope": "vala", + "tabTrigger": "HashMap" + }, + { + "content": "Gee.HashSet<${1:G}>($0);", + "name": "Gee.HashSet", + "scope": "vala", + "tabTrigger": "HashSet" + }, + { + "content": "if ($1) {\n\t$0\n}", + "name": "if", + "scope": "vala", + "tabTrigger": "if" + }, + { + "content": "interface ${1:InterfaceName}{$2: : SuperInterface} {\n\t$0\n}", + "name": "interface", + "scope": "vala", + "tabTrigger": "interface" + }, + { + "content": "public static int main(string [] argv) {\n\t${0}\n\treturn 0;\n}", + "name": "Main function", + "scope": "vala", + "tabTrigger": "main" + }, + { + "content": "namespace $1 {\n\t$0\n}\n", + "name": "namespace (ns)", + "scope": "vala", + "tabTrigger": "ns" + }, + { + "content": "stdout.printf($0);", + "name": "printf", + "scope": "vala", + "tabTrigger": "printf" + }, + { + "content": "${1:public} ${2:Type} ${3:Name} {\n\tset {\n\t\t$0\n\t}\n\tget {\n\n\t}\n}", + "name": "property (prop)", + "scope": "vala", + "tabTrigger": "prop" + }, + { + "content": "${1:public} ${2:Type} ${3:Name} {\n\tget {\n\t\t$0\n\t}\n}", + "name": "read-only property (roprop)", + "scope": "vala", + "tabTrigger": "roprop" + }, + { + "content": "@\"${1:\\$var}\"", + "name": "String template (@)", + "scope": "vala", + "tabTrigger": "@" + }, + { + "content": "struct ${1:StructName} {\n\t$0\n}", + "name": "struct", + "scope": "vala", + "tabTrigger": "struct" + }, + { + "content": "switch ($1) {\n\t$0\n}", + "name": "switch", + "scope": "vala", + "tabTrigger": "switch" + }, + { + "content": "try {\n\t$2\n} catch (${1:Error} e) {\n\t$0\n}", + "name": "try/catch", + "scope": "vala", + "tabTrigger": "try" + }, + { + "content": "\"\"\"$0\"\"\";", + "name": "Verbatim string (\"\"\")", + "scope": "vala", + "tabTrigger": "verbatim" + }, + { + "content": "while ($1) {\n\t$0\n}", + "name": "while", + "scope": "vala", + "tabTrigger": "while" + } +]; +exports.scope = ""; + +}); diff --git a/src/libs/ace/snippets/vbscript.js b/src/libs/ace/snippets/vbscript.js new file mode 100755 index 0000000..38ca68f --- /dev/null +++ b/src/libs/ace/snippets/vbscript.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/vbscript",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "vbscript"; + +}); diff --git a/src/libs/ace/snippets/velocity.js b/src/libs/ace/snippets/velocity.js new file mode 100755 index 0000000..e2b12a4 --- /dev/null +++ b/src/libs/ace/snippets/velocity.js @@ -0,0 +1,36 @@ +ace.define("ace/snippets/velocity",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "# macro\n\ +snippet #macro\n\ + #macro ( ${1:macroName} ${2:\\$var1, [\\$var2, ...]} )\n\ + ${3:## macro code}\n\ + #end\n\ +# foreach\n\ +snippet #foreach\n\ + #foreach ( ${1:\\$item} in ${2:\\$collection} )\n\ + ${3:## foreach code}\n\ + #end\n\ +# if\n\ +snippet #if\n\ + #if ( ${1:true} )\n\ + ${0}\n\ + #end\n\ +# if ... else\n\ +snippet #ife\n\ + #if ( ${1:true} )\n\ + ${2}\n\ + #else\n\ + ${0}\n\ + #end\n\ +#import\n\ +snippet #import\n\ + #import ( \"${1:path/to/velocity/format}\" )\n\ +# set\n\ +snippet #set\n\ + #set ( $${1:var} = ${0} )\n\ +"; +exports.scope = "velocity"; +exports.includeScopes = ["html", "javascript", "css"]; + +}); diff --git a/src/libs/ace/snippets/verilog.js b/src/libs/ace/snippets/verilog.js new file mode 100755 index 0000000..8103ff6 --- /dev/null +++ b/src/libs/ace/snippets/verilog.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/verilog",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "verilog"; + +}); diff --git a/src/libs/ace/snippets/vhdl.js b/src/libs/ace/snippets/vhdl.js new file mode 100755 index 0000000..10d8ca0 --- /dev/null +++ b/src/libs/ace/snippets/vhdl.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/vhdl",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "vhdl"; + +}); diff --git a/src/libs/ace/snippets/wollok.js b/src/libs/ace/snippets/wollok.js new file mode 100755 index 0000000..31e6211 --- /dev/null +++ b/src/libs/ace/snippets/wollok.js @@ -0,0 +1,91 @@ +ace.define("ace/snippets/wollok",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "##\n\ +## Basic Java packages and import\n\ +snippet im\n\ + import\n\ +snippet w.l\n\ + wollok.lang\n\ +snippet w.i\n\ + wollok.lib\n\ +\n\ +## Class and object\n\ +snippet cl\n\ + class ${1:`Filename(\"\", \"untitled\")`} ${2}\n\ +snippet obj\n\ + object ${1:`Filename(\"\", \"untitled\")`} ${2:inherits Parent}${3}\n\ +snippet te\n\ + test ${1:`Filename(\"\", \"untitled\")`}\n\ +\n\ +##\n\ +## Enhancements\n\ +snippet inh\n\ + inherits\n\ +\n\ +##\n\ +## Comments\n\ +snippet /*\n\ + /*\n\ + * ${1}\n\ + */\n\ +\n\ +##\n\ +## Control Statements\n\ +snippet el\n\ + else\n\ +snippet if\n\ + if (${1}) ${2}\n\ +\n\ +##\n\ +## Create a Method\n\ +snippet m\n\ + method ${1:method}(${2}) ${5}\n\ +\n\ +## \n\ +## Tests\n\ +snippet as\n\ + assert.equals(${1:expected}, ${2:actual})\n\ +\n\ +##\n\ +## Exceptions\n\ +snippet ca\n\ + catch ${1:e} : (${2:Exception} ) ${3}\n\ +snippet thr\n\ + throw\n\ +snippet try\n\ + try {\n\ + ${3}\n\ + } catch ${1:e} : ${2:Exception} {\n\ + }\n\ +\n\ +##\n\ +## Javadocs\n\ +snippet /**\n\ + /**\n\ + * ${1}\n\ + */\n\ +\n\ +##\n\ +## Print Methods\n\ +snippet print\n\ + console.println(\"${1:Message}\")\n\ +\n\ +##\n\ +## Setter and Getter Methods\n\ +snippet set\n\ + method set${1:}(${2:}) {\n\ + $1 = $2\n\ + }\n\ +snippet get\n\ + method get${1:}() {\n\ + return ${1:};\n\ + }\n\ +\n\ +##\n\ +## Terminate Methods or Loops\n\ +snippet re\n\ + return"; +exports.scope = "wollok"; + +}); diff --git a/src/libs/ace/snippets/xml.js b/src/libs/ace/snippets/xml.js new file mode 100755 index 0000000..ee4b688 --- /dev/null +++ b/src/libs/ace/snippets/xml.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/xml",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "xml"; + +}); diff --git a/src/libs/ace/snippets/xquery.js b/src/libs/ace/snippets/xquery.js new file mode 100755 index 0000000..c880abc --- /dev/null +++ b/src/libs/ace/snippets/xquery.js @@ -0,0 +1,68 @@ +ace.define("ace/snippets/xquery",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText = "snippet for\n\ + for $${1:item} in ${2:expr}\n\ +snippet return\n\ + return ${1:expr}\n\ +snippet import\n\ + import module namespace ${1:ns} = \"${2:http://www.example.com/}\";\n\ +snippet some\n\ + some $${1:varname} in ${2:expr} satisfies ${3:expr}\n\ +snippet every\n\ + every $${1:varname} in ${2:expr} satisfies ${3:expr}\n\ +snippet if\n\ + if(${1:true}) then ${2:expr} else ${3:true}\n\ +snippet switch\n\ + switch(${1:\"foo\"})\n\ + case ${2:\"foo\"}\n\ + return ${3:true}\n\ + default return ${4:false}\n\ +snippet try\n\ + try { ${1:expr} } catch ${2:*} { ${3:expr} }\n\ +snippet tumbling\n\ + for tumbling window $${1:varname} in ${2:expr}\n\ + start at $${3:start} when ${4:expr}\n\ + end at $${5:end} when ${6:expr}\n\ + return ${7:expr}\n\ +snippet sliding\n\ + for sliding window $${1:varname} in ${2:expr}\n\ + start at $${3:start} when ${4:expr}\n\ + end at $${5:end} when ${6:expr}\n\ + return ${7:expr}\n\ +snippet let\n\ + let $${1:varname} := ${2:expr}\n\ +snippet group\n\ + group by $${1:varname} := ${2:expr}\n\ +snippet order\n\ + order by ${1:expr} ${2:descending}\n\ +snippet stable\n\ + stable order by ${1:expr}\n\ +snippet count\n\ + count $${1:varname}\n\ +snippet ordered\n\ + ordered { ${1:expr} }\n\ +snippet unordered\n\ + unordered { ${1:expr} }\n\ +snippet treat \n\ + treat as ${1:expr}\n\ +snippet castable\n\ + castable as ${1:atomicType}\n\ +snippet cast\n\ + cast as ${1:atomicType}\n\ +snippet typeswitch\n\ + typeswitch(${1:expr})\n\ + case ${2:type} return ${3:expr}\n\ + default return ${4:expr}\n\ +snippet var\n\ + declare variable $${1:varname} := ${2:expr};\n\ +snippet fn\n\ + declare function ${1:ns}:${2:name}(){\n\ + ${3:expr}\n\ + };\n\ +snippet module\n\ + module namespace ${1:ns} = \"${2:http://www.example.com}\";\n\ +"; +exports.scope = "xquery"; + +}); diff --git a/src/libs/ace/snippets/yaml.js b/src/libs/ace/snippets/yaml.js new file mode 100755 index 0000000..1adceab --- /dev/null +++ b/src/libs/ace/snippets/yaml.js @@ -0,0 +1,7 @@ +ace.define("ace/snippets/yaml",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.snippetText =undefined; +exports.scope = "yaml"; + +}); diff --git a/src/libs/ace/theme-ambiance.js b/src/libs/ace/theme-ambiance.js new file mode 100755 index 0000000..1e53ecd --- /dev/null +++ b/src/libs/ace/theme-ambiance.js @@ -0,0 +1,182 @@ +ace.define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-ambiance"; +exports.cssText = ".ace-ambiance .ace_gutter {\ +background-color: #3d3d3d;\ +background-image: -moz-linear-gradient(left, #3D3D3D, #333);\ +background-image: -ms-linear-gradient(left, #3D3D3D, #333);\ +background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));\ +background-image: -webkit-linear-gradient(left, #3D3D3D, #333);\ +background-image: -o-linear-gradient(left, #3D3D3D, #333);\ +background-image: linear-gradient(left, #3D3D3D, #333);\ +background-repeat: repeat-x;\ +border-right: 1px solid #4d4d4d;\ +text-shadow: 0px 1px 1px #4d4d4d;\ +color: #222;\ +}\ +.ace-ambiance .ace_gutter-layer {\ +background: repeat left top;\ +}\ +.ace-ambiance .ace_gutter-active-line {\ +background-color: #3F3F3F;\ +}\ +.ace-ambiance .ace_fold-widget {\ +text-align: center;\ +}\ +.ace-ambiance .ace_fold-widget:hover {\ +color: #777;\ +}\ +.ace-ambiance .ace_fold-widget.ace_start,\ +.ace-ambiance .ace_fold-widget.ace_end,\ +.ace-ambiance .ace_fold-widget.ace_closed{\ +background: none;\ +border: none;\ +box-shadow: none;\ +}\ +.ace-ambiance .ace_fold-widget.ace_start:after {\ +content: '▾'\ +}\ +.ace-ambiance .ace_fold-widget.ace_end:after {\ +content: '▴'\ +}\ +.ace-ambiance .ace_fold-widget.ace_closed:after {\ +content: '‣'\ +}\ +.ace-ambiance .ace_print-margin {\ +border-left: 1px dotted #2D2D2D;\ +right: 0;\ +background: #262626;\ +}\ +.ace-ambiance .ace_scroller {\ +-webkit-box-shadow: inset 0 0 10px black;\ +-moz-box-shadow: inset 0 0 10px black;\ +-o-box-shadow: inset 0 0 10px black;\ +box-shadow: inset 0 0 10px black;\ +}\ +.ace-ambiance {\ +color: #E6E1DC;\ +background-color: #202020;\ +}\ +.ace-ambiance .ace_cursor {\ +border-left: 1px solid #7991E8;\ +}\ +.ace-ambiance .ace_overwrite-cursors .ace_cursor {\ +border: 1px solid #FFE300;\ +background: #766B13;\ +}\ +.ace-ambiance.normal-mode .ace_cursor-layer {\ +z-index: 0;\ +}\ +.ace-ambiance .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20);\ +}\ +.ace-ambiance .ace_marker-layer .ace_selected-word {\ +border-radius: 4px;\ +border: 8px solid #3f475d;\ +box-shadow: 0 0 4px black;\ +}\ +.ace-ambiance .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-ambiance .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25);\ +}\ +.ace-ambiance .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031);\ +}\ +.ace-ambiance .ace_invisible {\ +color: #333;\ +}\ +.ace-ambiance .ace_paren {\ +color: #24C2C7;\ +}\ +.ace-ambiance .ace_keyword {\ +color: #cda869;\ +}\ +.ace-ambiance .ace_keyword.ace_operator {\ +color: #fa8d6a;\ +}\ +.ace-ambiance .ace_punctuation.ace_operator {\ +color: #fa8d6a;\ +}\ +.ace-ambiance .ace_identifier {\ +}\ +.ace-ambiance .ace-statement {\ +color: #cda869;\ +}\ +.ace-ambiance .ace_constant {\ +color: #CF7EA9;\ +}\ +.ace-ambiance .ace_constant.ace_language {\ +color: #CF7EA9;\ +}\ +.ace-ambiance .ace_constant.ace_library {\ +}\ +.ace-ambiance .ace_constant.ace_numeric {\ +color: #78CF8A;\ +}\ +.ace-ambiance .ace_invalid {\ +text-decoration: underline;\ +}\ +.ace-ambiance .ace_invalid.ace_illegal {\ +color:#F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75);\ +}\ +.ace-ambiance .ace_invalid,\ +.ace-ambiance .ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1;\ +}\ +.ace-ambiance .ace_support {\ +color: #9B859D;\ +}\ +.ace-ambiance .ace_support.ace_function {\ +color: #DAD085;\ +}\ +.ace-ambiance .ace_function.ace_buildin {\ +color: #9b859d;\ +}\ +.ace-ambiance .ace_string {\ +color: #8f9d6a;\ +}\ +.ace-ambiance .ace_string.ace_regexp {\ +color: #DAD085;\ +}\ +.ace-ambiance .ace_comment {\ +font-style: italic;\ +color: #555;\ +}\ +.ace-ambiance .ace_comment.ace_doc {\ +}\ +.ace-ambiance .ace_comment.ace_doc.ace_tag {\ +color: #666;\ +font-style: normal;\ +}\ +.ace-ambiance .ace_definition,\ +.ace-ambiance .ace_type {\ +color: #aac6e3;\ +}\ +.ace-ambiance .ace_variable {\ +color: #9999cc;\ +}\ +.ace-ambiance .ace_variable.ace_language {\ +color: #9b859d;\ +}\ +.ace-ambiance .ace_xml-pe {\ +color: #494949;\ +}\ +.ace-ambiance .ace_gutter-layer,\ +.ace-ambiance .ace_text-layer {\ +background-image: url(\"data:image/png;base64,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\");\ +}\ +.ace-ambiance .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); + +}); diff --git a/src/libs/ace/theme-chaos.js b/src/libs/ace/theme-chaos.js new file mode 100755 index 0000000..97ec7fb --- /dev/null +++ b/src/libs/ace/theme-chaos.js @@ -0,0 +1,156 @@ +ace.define("ace/theme/chaos",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-chaos"; +exports.cssText = ".ace-chaos .ace_gutter {\ +background: #141414;\ +color: #595959;\ +border-right: 1px solid #282828;\ +}\ +.ace-chaos .ace_gutter-cell.ace_warning {\ +background-image: none;\ +background: #FC0;\ +border-left: none;\ +padding-left: 0;\ +color: #000;\ +}\ +.ace-chaos .ace_gutter-cell.ace_error {\ +background-position: -6px center;\ +background-image: none;\ +background: #F10;\ +border-left: none;\ +padding-left: 0;\ +color: #000;\ +}\ +.ace-chaos .ace_print-margin {\ +border-left: 1px solid #555;\ +right: 0;\ +background: #1D1D1D;\ +}\ +.ace-chaos {\ +background-color: #161616;\ +color: #E6E1DC;\ +}\ +.ace-chaos .ace_cursor {\ +border-left: 2px solid #FFFFFF;\ +}\ +.ace-chaos .ace_cursor.ace_overwrite {\ +border-left: 0px;\ +border-bottom: 1px solid #FFFFFF;\ +}\ +.ace-chaos .ace_marker-layer .ace_selection {\ +background: #494836;\ +}\ +.ace-chaos .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-chaos .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #FCE94F;\ +}\ +.ace-chaos .ace_marker-layer .ace_active-line {\ +background: #333;\ +}\ +.ace-chaos .ace_gutter-active-line {\ +background-color: #222;\ +}\ +.ace-chaos .ace_invisible {\ +color: #404040;\ +}\ +.ace-chaos .ace_keyword {\ +color:#00698F;\ +}\ +.ace-chaos .ace_keyword.ace_operator {\ +color:#FF308F;\ +}\ +.ace-chaos .ace_constant {\ +color:#1EDAFB;\ +}\ +.ace-chaos .ace_constant.ace_language {\ +color:#FDC251;\ +}\ +.ace-chaos .ace_constant.ace_library {\ +color:#8DFF0A;\ +}\ +.ace-chaos .ace_constant.ace_numeric {\ +color:#58C554;\ +}\ +.ace-chaos .ace_invalid {\ +color:#FFFFFF;\ +background-color:#990000;\ +}\ +.ace-chaos .ace_invalid.ace_deprecated {\ +color:#FFFFFF;\ +background-color:#990000;\ +}\ +.ace-chaos .ace_support {\ +color: #999;\ +}\ +.ace-chaos .ace_support.ace_function {\ +color:#00AEEF;\ +}\ +.ace-chaos .ace_function {\ +color:#00AEEF;\ +}\ +.ace-chaos .ace_string {\ +color:#58C554;\ +}\ +.ace-chaos .ace_comment {\ +color:#555;\ +font-style:italic;\ +padding-bottom: 0px;\ +}\ +.ace-chaos .ace_variable {\ +color:#997744;\ +}\ +.ace-chaos .ace_meta.ace_tag {\ +color:#BE53E6;\ +}\ +.ace-chaos .ace_entity.ace_other.ace_attribute-name {\ +color:#FFFF89;\ +}\ +.ace-chaos .ace_markup.ace_underline {\ +text-decoration: underline;\ +}\ +.ace-chaos .ace_fold-widget {\ +text-align: center;\ +}\ +.ace-chaos .ace_fold-widget:hover {\ +color: #777;\ +}\ +.ace-chaos .ace_fold-widget.ace_start,\ +.ace-chaos .ace_fold-widget.ace_end,\ +.ace-chaos .ace_fold-widget.ace_closed{\ +background: none;\ +border: none;\ +box-shadow: none;\ +}\ +.ace-chaos .ace_fold-widget.ace_start:after {\ +content: '▾'\ +}\ +.ace-chaos .ace_fold-widget.ace_end:after {\ +content: '▴'\ +}\ +.ace-chaos .ace_fold-widget.ace_closed:after {\ +content: '‣'\ +}\ +.ace-chaos .ace_indent-guide {\ +border-right:1px dotted #333;\ +margin-right:-1px;\ +}\ +.ace-chaos .ace_fold { \ +background: #222; \ +border-radius: 3px; \ +color: #7AF; \ +border: none; \ +}\ +.ace-chaos .ace_fold:hover {\ +background: #CCC; \ +color: #000;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); + +}); diff --git a/src/libs/ace/theme-chrome.js b/src/libs/ace/theme-chrome.js new file mode 100755 index 0000000..83742aa --- /dev/null +++ b/src/libs/ace/theme-chrome.js @@ -0,0 +1,128 @@ +ace.define("ace/theme/chrome",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-chrome"; +exports.cssText = ".ace-chrome .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow : hidden;\ +}\ +.ace-chrome .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-chrome {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-chrome .ace_cursor {\ +color: black;\ +}\ +.ace-chrome .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-chrome .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-chrome .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-chrome .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-chrome .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-chrome .ace_fold {\ +}\ +.ace-chrome .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-chrome .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-chrome .ace_support.ace_type,\ +.ace-chrome .ace_support.ace_class\ +.ace-chrome .ace_support.ace_other {\ +color: rgb(109, 121, 222);\ +}\ +.ace-chrome .ace_variable.ace_parameter {\ +font-style:italic;\ +color:#FD971F;\ +}\ +.ace-chrome .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-chrome .ace_comment {\ +color: #236e24;\ +}\ +.ace-chrome .ace_comment.ace_doc {\ +color: #236e24;\ +}\ +.ace-chrome .ace_comment.ace_doc.ace_tag {\ +color: #236e24;\ +}\ +.ace-chrome .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-chrome .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-chrome .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-chrome .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-chrome .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-chrome .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-chrome .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-chrome .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-chrome .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-chrome .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-chrome .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-chrome .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-chrome .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-chrome .ace_storage,\ +.ace-chrome .ace_keyword,\ +.ace-chrome .ace_meta.ace_tag {\ +color: rgb(147, 15, 128);\ +}\ +.ace-chrome .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-chrome .ace_string {\ +color: #1A1AA6;\ +}\ +.ace-chrome .ace_entity.ace_other.ace_attribute-name {\ +color: #994409;\ +}\ +.ace-chrome .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-clouds.js b/src/libs/ace/theme-clouds.js new file mode 100755 index 0000000..83d0d14 --- /dev/null +++ b/src/libs/ace/theme-clouds.js @@ -0,0 +1,95 @@ +ace.define("ace/theme/clouds",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-clouds"; +exports.cssText = ".ace-clouds .ace_gutter {\ +background: #ebebeb;\ +color: #333\ +}\ +.ace-clouds .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-clouds {\ +background-color: #FFFFFF;\ +color: #000000\ +}\ +.ace-clouds .ace_cursor {\ +color: #000000\ +}\ +.ace-clouds .ace_marker-layer .ace_selection {\ +background: #BDD5FC\ +}\ +.ace-clouds.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-clouds .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-clouds .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-clouds .ace_marker-layer .ace_active-line {\ +background: #FFFBD1\ +}\ +.ace-clouds .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-clouds .ace_marker-layer .ace_selected-word {\ +border: 1px solid #BDD5FC\ +}\ +.ace-clouds .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-clouds .ace_keyword,\ +.ace-clouds .ace_meta,\ +.ace-clouds .ace_support.ace_constant.ace_property-value {\ +color: #AF956F\ +}\ +.ace-clouds .ace_keyword.ace_operator {\ +color: #484848\ +}\ +.ace-clouds .ace_keyword.ace_other.ace_unit {\ +color: #96DC5F\ +}\ +.ace-clouds .ace_constant.ace_language {\ +color: #39946A\ +}\ +.ace-clouds .ace_constant.ace_numeric {\ +color: #46A609\ +}\ +.ace-clouds .ace_constant.ace_character.ace_entity {\ +color: #BF78CC\ +}\ +.ace-clouds .ace_invalid {\ +background-color: #FF002A\ +}\ +.ace-clouds .ace_fold {\ +background-color: #AF956F;\ +border-color: #000000\ +}\ +.ace-clouds .ace_storage,\ +.ace-clouds .ace_support.ace_class,\ +.ace-clouds .ace_support.ace_function,\ +.ace-clouds .ace_support.ace_other,\ +.ace-clouds .ace_support.ace_type {\ +color: #C52727\ +}\ +.ace-clouds .ace_string {\ +color: #5D90CD\ +}\ +.ace-clouds .ace_comment {\ +color: #BCC8BA\ +}\ +.ace-clouds .ace_entity.ace_name.ace_tag,\ +.ace-clouds .ace_entity.ace_other.ace_attribute-name {\ +color: #606060\ +}\ +.ace-clouds .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-clouds_midnight.js b/src/libs/ace/theme-clouds_midnight.js new file mode 100755 index 0000000..275e9f2 --- /dev/null +++ b/src/libs/ace/theme-clouds_midnight.js @@ -0,0 +1,96 @@ +ace.define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-clouds-midnight"; +exports.cssText = ".ace-clouds-midnight .ace_gutter {\ +background: #232323;\ +color: #929292\ +}\ +.ace-clouds-midnight .ace_print-margin {\ +width: 1px;\ +background: #232323\ +}\ +.ace-clouds-midnight {\ +background-color: #191919;\ +color: #929292\ +}\ +.ace-clouds-midnight .ace_cursor {\ +color: #7DA5DC\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_selection {\ +background: #000000\ +}\ +.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #191919;\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_active-line {\ +background: rgba(215, 215, 215, 0.031)\ +}\ +.ace-clouds-midnight .ace_gutter-active-line {\ +background-color: rgba(215, 215, 215, 0.031)\ +}\ +.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\ +border: 1px solid #000000\ +}\ +.ace-clouds-midnight .ace_invisible {\ +color: #666\ +}\ +.ace-clouds-midnight .ace_keyword,\ +.ace-clouds-midnight .ace_meta,\ +.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\ +color: #927C5D\ +}\ +.ace-clouds-midnight .ace_keyword.ace_operator {\ +color: #4B4B4B\ +}\ +.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\ +color: #366F1A\ +}\ +.ace-clouds-midnight .ace_constant.ace_language {\ +color: #39946A\ +}\ +.ace-clouds-midnight .ace_constant.ace_numeric {\ +color: #46A609\ +}\ +.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\ +color: #A165AC\ +}\ +.ace-clouds-midnight .ace_invalid {\ +color: #FFFFFF;\ +background-color: #E92E2E\ +}\ +.ace-clouds-midnight .ace_fold {\ +background-color: #927C5D;\ +border-color: #929292\ +}\ +.ace-clouds-midnight .ace_storage,\ +.ace-clouds-midnight .ace_support.ace_class,\ +.ace-clouds-midnight .ace_support.ace_function,\ +.ace-clouds-midnight .ace_support.ace_other,\ +.ace-clouds-midnight .ace_support.ace_type {\ +color: #E92E2E\ +}\ +.ace-clouds-midnight .ace_string {\ +color: #5D90CD\ +}\ +.ace-clouds-midnight .ace_comment {\ +color: #3C403B\ +}\ +.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\ +.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\ +color: #606060\ +}\ +.ace-clouds-midnight .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-cobalt.js b/src/libs/ace/theme-cobalt.js new file mode 100755 index 0000000..c5b6f26 --- /dev/null +++ b/src/libs/ace/theme-cobalt.js @@ -0,0 +1,113 @@ +ace.define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-cobalt"; +exports.cssText = ".ace-cobalt .ace_gutter {\ +background: #011e3a;\ +color: rgb(128,145,160)\ +}\ +.ace-cobalt .ace_print-margin {\ +width: 1px;\ +background: #555555\ +}\ +.ace-cobalt {\ +background-color: #002240;\ +color: #FFFFFF\ +}\ +.ace-cobalt .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-cobalt .ace_marker-layer .ace_selection {\ +background: rgba(179, 101, 57, 0.75)\ +}\ +.ace-cobalt.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002240;\ +}\ +.ace-cobalt .ace_marker-layer .ace_step {\ +background: rgb(127, 111, 19)\ +}\ +.ace-cobalt .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.15)\ +}\ +.ace-cobalt .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.35)\ +}\ +.ace-cobalt .ace_gutter-active-line {\ +background-color: rgba(0, 0, 0, 0.35)\ +}\ +.ace-cobalt .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(179, 101, 57, 0.75)\ +}\ +.ace-cobalt .ace_invisible {\ +color: rgba(255, 255, 255, 0.15)\ +}\ +.ace-cobalt .ace_keyword,\ +.ace-cobalt .ace_meta {\ +color: #FF9D00\ +}\ +.ace-cobalt .ace_constant,\ +.ace-cobalt .ace_constant.ace_character,\ +.ace-cobalt .ace_constant.ace_character.ace_escape,\ +.ace-cobalt .ace_constant.ace_other {\ +color: #FF628C\ +}\ +.ace-cobalt .ace_invalid {\ +color: #F8F8F8;\ +background-color: #800F00\ +}\ +.ace-cobalt .ace_support {\ +color: #80FFBB\ +}\ +.ace-cobalt .ace_support.ace_constant {\ +color: #EB939A\ +}\ +.ace-cobalt .ace_fold {\ +background-color: #FF9D00;\ +border-color: #FFFFFF\ +}\ +.ace-cobalt .ace_support.ace_function {\ +color: #FFB054\ +}\ +.ace-cobalt .ace_storage {\ +color: #FFEE80\ +}\ +.ace-cobalt .ace_entity {\ +color: #FFDD00\ +}\ +.ace-cobalt .ace_string {\ +color: #3AD900\ +}\ +.ace-cobalt .ace_string.ace_regexp {\ +color: #80FFC2\ +}\ +.ace-cobalt .ace_comment {\ +font-style: italic;\ +color: #0088FF\ +}\ +.ace-cobalt .ace_heading,\ +.ace-cobalt .ace_markup.ace_heading {\ +color: #C8E4FD;\ +background-color: #001221\ +}\ +.ace-cobalt .ace_list,\ +.ace-cobalt .ace_markup.ace_list {\ +background-color: #130D26\ +}\ +.ace-cobalt .ace_variable {\ +color: #CCCCCC\ +}\ +.ace-cobalt .ace_variable.ace_language {\ +color: #FF80E1\ +}\ +.ace-cobalt .ace_meta.ace_tag {\ +color: #9EFFFF\ +}\ +.ace-cobalt .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-crimson_editor.js b/src/libs/ace/theme-crimson_editor.js new file mode 100755 index 0000000..a188552 --- /dev/null +++ b/src/libs/ace/theme-crimson_editor.js @@ -0,0 +1,118 @@ +ace.define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +exports.isDark = false; +exports.cssText = ".ace-crimson-editor .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow : hidden;\ +}\ +.ace-crimson-editor .ace_gutter-layer {\ +width: 100%;\ +text-align: right;\ +}\ +.ace-crimson-editor .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-crimson-editor {\ +background-color: #FFFFFF;\ +color: rgb(64, 64, 64);\ +}\ +.ace-crimson-editor .ace_cursor {\ +color: black;\ +}\ +.ace-crimson-editor .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-crimson-editor .ace_identifier {\ +color: black;\ +}\ +.ace-crimson-editor .ace_keyword {\ +color: blue;\ +}\ +.ace-crimson-editor .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-crimson-editor .ace_constant.ace_language {\ +color: rgb(255, 156, 0);\ +}\ +.ace-crimson-editor .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-crimson-editor .ace_invalid {\ +text-decoration: line-through;\ +color: rgb(224, 0, 0);\ +}\ +.ace-crimson-editor .ace_fold {\ +}\ +.ace-crimson-editor .ace_support.ace_function {\ +color: rgb(192, 0, 0);\ +}\ +.ace-crimson-editor .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-crimson-editor .ace_support.ace_type,\ +.ace-crimson-editor .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-crimson-editor .ace_keyword.ace_operator {\ +color: rgb(49, 132, 149);\ +}\ +.ace-crimson-editor .ace_string {\ +color: rgb(128, 0, 128);\ +}\ +.ace-crimson-editor .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-crimson-editor .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-crimson-editor .ace_constant.ace_numeric {\ +color: rgb(0, 0, 64);\ +}\ +.ace-crimson-editor .ace_variable {\ +color: rgb(0, 64, 128);\ +}\ +.ace-crimson-editor .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_active-line {\ +background: rgb(232, 242, 254);\ +}\ +.ace-crimson-editor .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-crimson-editor .ace_meta.ace_tag {\ +color:rgb(28, 2, 255);\ +}\ +.ace-crimson-editor .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-crimson-editor .ace_string.ace_regex {\ +color: rgb(192, 0, 192);\ +}\ +.ace-crimson-editor .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +exports.cssClass = "ace-crimson-editor"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-dawn.js b/src/libs/ace/theme-dawn.js new file mode 100755 index 0000000..f3c15c9 --- /dev/null +++ b/src/libs/ace/theme-dawn.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/dawn",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-dawn"; +exports.cssText = ".ace-dawn .ace_gutter {\ +background: #ebebeb;\ +color: #333\ +}\ +.ace-dawn .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-dawn {\ +background-color: #F9F9F9;\ +color: #080808\ +}\ +.ace-dawn .ace_cursor {\ +color: #000000\ +}\ +.ace-dawn .ace_marker-layer .ace_selection {\ +background: rgba(39, 95, 255, 0.30)\ +}\ +.ace-dawn.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #F9F9F9;\ +}\ +.ace-dawn .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-dawn .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(75, 75, 126, 0.50)\ +}\ +.ace-dawn .ace_marker-layer .ace_active-line {\ +background: rgba(36, 99, 180, 0.12)\ +}\ +.ace-dawn .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-dawn .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(39, 95, 255, 0.30)\ +}\ +.ace-dawn .ace_invisible {\ +color: rgba(75, 75, 126, 0.50)\ +}\ +.ace-dawn .ace_keyword,\ +.ace-dawn .ace_meta {\ +color: #794938\ +}\ +.ace-dawn .ace_constant,\ +.ace-dawn .ace_constant.ace_character,\ +.ace-dawn .ace_constant.ace_character.ace_escape,\ +.ace-dawn .ace_constant.ace_other {\ +color: #811F24\ +}\ +.ace-dawn .ace_invalid.ace_illegal {\ +text-decoration: underline;\ +font-style: italic;\ +color: #F8F8F8;\ +background-color: #B52A1D\ +}\ +.ace-dawn .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #B52A1D\ +}\ +.ace-dawn .ace_support {\ +color: #691C97\ +}\ +.ace-dawn .ace_support.ace_constant {\ +color: #B4371F\ +}\ +.ace-dawn .ace_fold {\ +background-color: #794938;\ +border-color: #080808\ +}\ +.ace-dawn .ace_list,\ +.ace-dawn .ace_markup.ace_list,\ +.ace-dawn .ace_support.ace_function {\ +color: #693A17\ +}\ +.ace-dawn .ace_storage {\ +font-style: italic;\ +color: #A71D5D\ +}\ +.ace-dawn .ace_string {\ +color: #0B6125\ +}\ +.ace-dawn .ace_string.ace_regexp {\ +color: #CF5628\ +}\ +.ace-dawn .ace_comment {\ +font-style: italic;\ +color: #5A525F\ +}\ +.ace-dawn .ace_heading,\ +.ace-dawn .ace_markup.ace_heading {\ +color: #19356D\ +}\ +.ace-dawn .ace_variable {\ +color: #234A97\ +}\ +.ace-dawn .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-dreamweaver.js b/src/libs/ace/theme-dreamweaver.js new file mode 100755 index 0000000..632b1ea --- /dev/null +++ b/src/libs/ace/theme-dreamweaver.js @@ -0,0 +1,141 @@ +ace.define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +exports.isDark = false; +exports.cssClass = "ace-dreamweaver"; +exports.cssText = ".ace-dreamweaver .ace_gutter {\ +background: #e8e8e8;\ +color: #333;\ +}\ +.ace-dreamweaver .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-dreamweaver {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-dreamweaver .ace_fold {\ +background-color: #757AD8;\ +}\ +.ace-dreamweaver .ace_cursor {\ +color: black;\ +}\ +.ace-dreamweaver .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-dreamweaver .ace_storage,\ +.ace-dreamweaver .ace_keyword {\ +color: blue;\ +}\ +.ace-dreamweaver .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-dreamweaver .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-dreamweaver .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-dreamweaver .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-dreamweaver .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-dreamweaver .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-dreamweaver .ace_support.ace_type,\ +.ace-dreamweaver .ace_support.ace_class {\ +color: #009;\ +}\ +.ace-dreamweaver .ace_support.ace_php_tag {\ +color: #f00;\ +}\ +.ace-dreamweaver .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-dreamweaver .ace_string {\ +color: #00F;\ +}\ +.ace-dreamweaver .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-dreamweaver .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-dreamweaver .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-dreamweaver .ace_variable {\ +color: #06F\ +}\ +.ace-dreamweaver .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-dreamweaver .ace_entity.ace_name.ace_function {\ +color: #00F;\ +}\ +.ace-dreamweaver .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-dreamweaver .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-dreamweaver .ace_gutter-active-line {\ +background-color : #DCDCDC;\ +}\ +.ace-dreamweaver .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-dreamweaver .ace_meta.ace_tag {\ +color:#009;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\ +color:#060;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_form {\ +color:#F90;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_image {\ +color:#909;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_script {\ +color:#900;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_style {\ +color:#909;\ +}\ +.ace-dreamweaver .ace_meta.ace_tag.ace_table {\ +color:#099;\ +}\ +.ace-dreamweaver .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-dreamweaver .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-eclipse.js b/src/libs/ace/theme-eclipse.js new file mode 100755 index 0000000..63aa334 --- /dev/null +++ b/src/libs/ace/theme-eclipse.js @@ -0,0 +1,98 @@ +ace.define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssText = ".ace-eclipse .ace_gutter {\ +background: #ebebeb;\ +border-right: 1px solid rgb(159, 159, 159);\ +color: rgb(136, 136, 136);\ +}\ +.ace-eclipse .ace_print-margin {\ +width: 1px;\ +background: #ebebeb;\ +}\ +.ace-eclipse {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-eclipse .ace_fold {\ +background-color: rgb(60, 76, 114);\ +}\ +.ace-eclipse .ace_cursor {\ +color: black;\ +}\ +.ace-eclipse .ace_storage,\ +.ace-eclipse .ace_keyword,\ +.ace-eclipse .ace_variable {\ +color: rgb(127, 0, 85);\ +}\ +.ace-eclipse .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-eclipse .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-eclipse .ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-eclipse .ace_string {\ +color: rgb(42, 0, 255);\ +}\ +.ace-eclipse .ace_comment {\ +color: rgb(113, 150, 130);\ +}\ +.ace-eclipse .ace_comment.ace_doc {\ +color: rgb(63, 95, 191);\ +}\ +.ace-eclipse .ace_comment.ace_doc.ace_tag {\ +color: rgb(127, 159, 191);\ +}\ +.ace-eclipse .ace_constant.ace_numeric {\ +color: darkblue;\ +}\ +.ace-eclipse .ace_tag {\ +color: rgb(25, 118, 116);\ +}\ +.ace-eclipse .ace_type {\ +color: rgb(127, 0, 127);\ +}\ +.ace-eclipse .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-eclipse .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-eclipse .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-eclipse .ace_meta.ace_tag {\ +color:rgb(25, 118, 116);\ +}\ +.ace-eclipse .ace_invisible {\ +color: #ddd;\ +}\ +.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\ +color:rgb(127, 0, 127);\ +}\ +.ace-eclipse .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0);\ +}\ +.ace-eclipse .ace_active-line {\ +background: rgb(232, 242, 254);\ +}\ +.ace-eclipse .ace_gutter-active-line {\ +background-color : #DADADA;\ +}\ +.ace-eclipse .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgb(181, 213, 255);\ +}\ +.ace-eclipse .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + +exports.cssClass = "ace-eclipse"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-github.js b/src/libs/ace/theme-github.js new file mode 100755 index 0000000..d19512c --- /dev/null +++ b/src/libs/ace/theme-github.js @@ -0,0 +1,103 @@ +ace.define("ace/theme/github",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-github"; +exports.cssText = "\ +.ace-github .ace_gutter {\ +background: #e8e8e8;\ +color: #AAA;\ +}\ +.ace-github {\ +background: #fff;\ +color: #000;\ +}\ +.ace-github .ace_keyword {\ +font-weight: bold;\ +}\ +.ace-github .ace_string {\ +color: #D14;\ +}\ +.ace-github .ace_variable.ace_class {\ +color: teal;\ +}\ +.ace-github .ace_constant.ace_numeric {\ +color: #099;\ +}\ +.ace-github .ace_constant.ace_buildin {\ +color: #0086B3;\ +}\ +.ace-github .ace_support.ace_function {\ +color: #0086B3;\ +}\ +.ace-github .ace_comment {\ +color: #998;\ +font-style: italic;\ +}\ +.ace-github .ace_variable.ace_language {\ +color: #0086B3;\ +}\ +.ace-github .ace_paren {\ +font-weight: bold;\ +}\ +.ace-github .ace_boolean {\ +font-weight: bold;\ +}\ +.ace-github .ace_string.ace_regexp {\ +color: #009926;\ +font-weight: normal;\ +}\ +.ace-github .ace_variable.ace_instance {\ +color: teal;\ +}\ +.ace-github .ace_constant.ace_language {\ +font-weight: bold;\ +}\ +.ace-github .ace_cursor {\ +color: black;\ +}\ +.ace-github.ace_focus .ace_marker-layer .ace_active-line {\ +background: rgb(255, 255, 204);\ +}\ +.ace-github .ace_marker-layer .ace_active-line {\ +background: rgb(245, 245, 245);\ +}\ +.ace-github .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-github.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-github.ace_nobold .ace_line > span {\ +font-weight: normal !important;\ +}\ +.ace-github .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-github .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-github .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-github .ace_gutter-active-line {\ +background-color : rgba(0, 0, 0, 0.07);\ +}\ +.ace-github .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-github .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-github .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-github .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + + var dom = require("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-gob.js b/src/libs/ace/theme-gob.js new file mode 100755 index 0000000..9023fba --- /dev/null +++ b/src/libs/ace/theme-gob.js @@ -0,0 +1,112 @@ +ace.define("ace/theme/gob",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-gob"; +exports.cssText = ".ace-gob .ace_gutter {\ +background: #0B1818;\ +color: #03EE03\ +}\ +.ace-gob .ace_print-margin {\ +width: 1px;\ +background: #131313\ +}\ +.ace-gob {\ +background-color: #0B0B0B;\ +color: #00FF00\ +}\ +.ace-gob .ace_cursor {\ +border-color: rgba(16, 248, 255, 0.90);\ +background-color: rgba(16, 240, 248, 0.70);\ +opacity: 0.4;\ +}\ +.ace-gob .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20)\ +}\ +.ace-gob.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #141414;\ +}\ +.ace-gob .ace_marker-layer .ace_step {\ +background: rgb(16, 128, 0)\ +}\ +.ace-gob .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(64, 255, 255, 0.25)\ +}\ +.ace-gob .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.04)\ +}\ +.ace-gob .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.04)\ +}\ +.ace-gob .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(192, 240, 255, 0.20)\ +}\ +.ace-gob .ace_invisible {\ +color: rgba(255, 255, 255, 0.25)\ +}\ +.ace-gob .ace_keyword,\ +.ace-gob .ace_meta {\ +color: #10D8E8\ +}\ +.ace-gob .ace_constant,\ +.ace-gob .ace_constant.ace_character,\ +.ace-gob .ace_constant.ace_character.ace_escape,\ +.ace-gob .ace_constant.ace_other,\ +.ace-gob .ace_heading,\ +.ace-gob .ace_markup.ace_heading,\ +.ace-gob .ace_support.ace_constant {\ +color: #10F0A0\ +}\ +.ace-gob .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75)\ +}\ +.ace-gob .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #20F8C0\ +}\ +.ace-gob .ace_support {\ +color: #20E8B0\ +}\ +.ace-gob .ace_fold {\ +background-color: #50B8B8;\ +border-color: #70F8F8\ +}\ +.ace-gob .ace_support.ace_function {\ +color: #00F800\ +}\ +.ace-gob .ace_list,\ +.ace-gob .ace_markup.ace_list,\ +.ace-gob .ace_storage {\ +color: #10FF98\ +}\ +.ace-gob .ace_entity.ace_name.ace_function,\ +.ace-gob .ace_meta.ace_tag,\ +.ace-gob .ace_variable {\ +color: #00F868\ +}\ +.ace-gob .ace_string {\ +color: #10F060\ +}\ +.ace-gob .ace_string.ace_regexp {\ +color: #20F090;\ +}\ +.ace-gob .ace_comment {\ +font-style: italic;\ +color: #00E060;\ +}\ +.ace-gob .ace_variable {\ +color: #00F888;\ +}\ +.ace-gob .ace_xml-pe {\ +color: #488858;\ +}\ +.ace-gob .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-gruvbox.js b/src/libs/ace/theme-gruvbox.js new file mode 100755 index 0000000..133ca64 --- /dev/null +++ b/src/libs/ace/theme-gruvbox.js @@ -0,0 +1,82 @@ +ace.define("ace/theme/gruvbox",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-gruvbox"; +exports.cssText = ".ace-gruvbox .ace_gutter-active-line {\ +background-color: #3C3836;\ +}\ +.ace-gruvbox {\ +color: #EBDAB4;\ +background-color: #1D2021;\ +}\ +.ace-gruvbox .ace_invisible {\ +color: #504945;\ +}\ +.ace-gruvbox .ace_marker-layer .ace_selection {\ +background: rgba(179, 101, 57, 0.75)\ +}\ +.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002240;\ +}\ +.ace-gruvbox .ace_keyword {\ +color: #8ec07c;\ +}\ +.ace-gruvbox .ace_comment {\ +font-style: italic;\ +color: #928375;\ +}\ +.ace-gruvbox .ace-statement {\ +color: red;\ +}\ +.ace-gruvbox .ace_variable {\ +color: #84A598;\ +}\ +.ace-gruvbox .ace_variable.ace_language {\ +color: #D2879B;\ +}\ +.ace-gruvbox .ace_constant {\ +color: #C2859A;\ +}\ +.ace-gruvbox .ace_constant.ace_language {\ +color: #C2859A;\ +}\ +.ace-gruvbox .ace_constant.ace_numeric {\ +color: #C2859A;\ +}\ +.ace-gruvbox .ace_string {\ +color: #B8BA37;\ +}\ +.ace-gruvbox .ace_support {\ +color: #F9BC41;\ +}\ +.ace-gruvbox .ace_support.ace_function {\ +color: #F84B3C;\ +}\ +.ace-gruvbox .ace_storage {\ +color: #8FBF7F;\ +}\ +.ace-gruvbox .ace_keyword.ace_operator {\ +color: #EBDAB4;\ +}\ +.ace-gruvbox .ace_punctuation.ace_operator {\ +color: yellow;\ +}\ +.ace-gruvbox .ace_marker-layer .ace_active-line {\ +background: #3C3836;\ +}\ +.ace-gruvbox .ace_marker-layer .ace_selected-word {\ +border-radius: 4px;\ +border: 8px solid #3f475d;\ +}\ +.ace-gruvbox .ace_print-margin {\ +width: 5px;\ +background: #3C3836;\ +}\ +.ace-gruvbox .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); + +}); diff --git a/src/libs/ace/theme-idle_fingers.js b/src/libs/ace/theme-idle_fingers.js new file mode 100755 index 0000000..7fcf1cb --- /dev/null +++ b/src/libs/ace/theme-idle_fingers.js @@ -0,0 +1,96 @@ +ace.define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-idle-fingers"; +exports.cssText = ".ace-idle-fingers .ace_gutter {\ +background: #3b3b3b;\ +color: rgb(153,153,153)\ +}\ +.ace-idle-fingers .ace_print-margin {\ +width: 1px;\ +background: #3b3b3b\ +}\ +.ace-idle-fingers {\ +background-color: #323232;\ +color: #FFFFFF\ +}\ +.ace-idle-fingers .ace_cursor {\ +color: #91FF00\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_selection {\ +background: rgba(90, 100, 126, 0.88)\ +}\ +.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #323232;\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_active-line {\ +background: #353637\ +}\ +.ace-idle-fingers .ace_gutter-active-line {\ +background-color: #353637\ +}\ +.ace-idle-fingers .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(90, 100, 126, 0.88)\ +}\ +.ace-idle-fingers .ace_invisible {\ +color: #404040\ +}\ +.ace-idle-fingers .ace_keyword,\ +.ace-idle-fingers .ace_meta {\ +color: #CC7833\ +}\ +.ace-idle-fingers .ace_constant,\ +.ace-idle-fingers .ace_constant.ace_character,\ +.ace-idle-fingers .ace_constant.ace_character.ace_escape,\ +.ace-idle-fingers .ace_constant.ace_other,\ +.ace-idle-fingers .ace_support.ace_constant {\ +color: #6C99BB\ +}\ +.ace-idle-fingers .ace_invalid {\ +color: #FFFFFF;\ +background-color: #FF0000\ +}\ +.ace-idle-fingers .ace_fold {\ +background-color: #CC7833;\ +border-color: #FFFFFF\ +}\ +.ace-idle-fingers .ace_support.ace_function {\ +color: #B83426\ +}\ +.ace-idle-fingers .ace_variable.ace_parameter {\ +font-style: italic\ +}\ +.ace-idle-fingers .ace_string {\ +color: #A5C261\ +}\ +.ace-idle-fingers .ace_string.ace_regexp {\ +color: #CCCC33\ +}\ +.ace-idle-fingers .ace_comment {\ +font-style: italic;\ +color: #BC9458\ +}\ +.ace-idle-fingers .ace_meta.ace_tag {\ +color: #FFE5BB\ +}\ +.ace-idle-fingers .ace_entity.ace_name {\ +color: #FFC66D\ +}\ +.ace-idle-fingers .ace_collab.ace_user1 {\ +color: #323232;\ +background-color: #FFF980\ +}\ +.ace-idle-fingers .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-iplastic.js b/src/libs/ace/theme-iplastic.js new file mode 100755 index 0000000..593aa00 --- /dev/null +++ b/src/libs/ace/theme-iplastic.js @@ -0,0 +1,121 @@ +ace.define("ace/theme/iplastic",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-iplastic"; +exports.cssText = ".ace-iplastic .ace_gutter {\ +background: #dddddd;\ +color: #666666\ +}\ +.ace-iplastic .ace_print-margin {\ +width: 1px;\ +background: #bbbbbb\ +}\ +.ace-iplastic {\ +background-color: #eeeeee;\ +color: #333333\ +}\ +.ace-iplastic .ace_cursor {\ +color: #333\ +}\ +.ace-iplastic .ace_marker-layer .ace_selection {\ +background: #BAD6FD;\ +}\ +.ace-iplastic.ace_multiselect .ace_selection.ace_start {\ +border-radius: 4px\ +}\ +.ace-iplastic .ace_marker-layer .ace_step {\ +background: #444444\ +}\ +.ace-iplastic .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #49483E;\ +background: #FFF799\ +}\ +.ace-iplastic .ace_marker-layer .ace_active-line {\ +background: #e5e5e5\ +}\ +.ace-iplastic .ace_gutter-active-line {\ +background-color: #eeeeee\ +}\ +.ace-iplastic .ace_marker-layer .ace_selected-word {\ +border: 1px solid #555555;\ +border-radius:4px\ +}\ +.ace-iplastic .ace_invisible {\ +color: #999999\ +}\ +.ace-iplastic .ace_entity.ace_name.ace_tag,\ +.ace-iplastic .ace_keyword,\ +.ace-iplastic .ace_meta.ace_tag,\ +.ace-iplastic .ace_storage {\ +color: #0000FF\ +}\ +.ace-iplastic .ace_punctuation,\ +.ace-iplastic .ace_punctuation.ace_tag {\ +color: #000\ +}\ +.ace-iplastic .ace_constant {\ +color: #333333;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_constant.ace_character,\ +.ace-iplastic .ace_constant.ace_language,\ +.ace-iplastic .ace_constant.ace_numeric,\ +.ace-iplastic .ace_constant.ace_other {\ +color: #0066FF;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_constant.ace_numeric{\ +font-weight: 100\ +}\ +.ace-iplastic .ace_invalid {\ +color: #F8F8F0;\ +background-color: #F92672\ +}\ +.ace-iplastic .ace_invalid.ace_deprecated {\ +color: #F8F8F0;\ +background-color: #AE81FF\ +}\ +.ace-iplastic .ace_support.ace_constant,\ +.ace-iplastic .ace_support.ace_function {\ +color: #333333;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_fold {\ +background-color: #464646;\ +border-color: #F8F8F2\ +}\ +.ace-iplastic .ace_storage.ace_type,\ +.ace-iplastic .ace_support.ace_class,\ +.ace-iplastic .ace_support.ace_type {\ +color: #3333fc;\ +font-weight: 700\ +}\ +.ace-iplastic .ace_entity.ace_name.ace_function,\ +.ace-iplastic .ace_entity.ace_other,\ +.ace-iplastic .ace_entity.ace_other.ace_attribute-name,\ +.ace-iplastic .ace_variable {\ +color: #3366cc;\ +font-style: italic\ +}\ +.ace-iplastic .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #2469E0\ +}\ +.ace-iplastic .ace_string {\ +color: #a55f03\ +}\ +.ace-iplastic .ace_comment {\ +color: #777777;\ +font-style: italic\ +}\ +.ace-iplastic .ace_fold-widget {\ +background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);\ +}\ +.ace-iplastic .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAABlJREFUeNpi+P//PwMzMzPzfwAAAAD//wMAGRsECSML/RIAAAAASUVORK5CYII=) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-katzenmilch.js b/src/libs/ace/theme-katzenmilch.js new file mode 100755 index 0000000..f65ce4a --- /dev/null +++ b/src/libs/ace/theme-katzenmilch.js @@ -0,0 +1,121 @@ +ace.define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-katzenmilch"; +exports.cssText = ".ace-katzenmilch .ace_gutter,\ +.ace-katzenmilch .ace_gutter {\ +background: #e8e8e8;\ +color: #333\ +}\ +.ace-katzenmilch .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-katzenmilch {\ +background-color: #f3f2f3;\ +color: rgba(15, 0, 9, 1.0)\ +}\ +.ace-katzenmilch .ace_cursor {\ +border-left: 2px solid #100011\ +}\ +.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\ +border-left: 0px;\ +border-bottom: 1px solid #100011\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_selection {\ +background: rgba(100, 5, 208, 0.27)\ +}\ +.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #f3f2f3;\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(0, 0, 0, 0.33);\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_active-line {\ +background: rgb(232, 242, 254)\ +}\ +.ace-katzenmilch .ace_gutter-active-line {\ +background-color: rgb(232, 242, 254)\ +}\ +.ace-katzenmilch .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(100, 5, 208, 0.27)\ +}\ +.ace-katzenmilch .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-katzenmilch .ace_fold {\ +background-color: rgba(2, 95, 73, 0.97);\ +border-color: rgba(15, 0, 9, 1.0)\ +}\ +.ace-katzenmilch .ace_keyword {\ +color: #674Aa8;\ +rbackground-color: rgba(163, 170, 216, 0.055)\ +}\ +.ace-katzenmilch .ace_constant.ace_language {\ +color: #7D7e52;\ +rbackground-color: rgba(189, 190, 130, 0.059)\ +}\ +.ace-katzenmilch .ace_constant.ace_numeric {\ +color: rgba(79, 130, 123, 0.93);\ +rbackground-color: rgba(119, 194, 187, 0.059)\ +}\ +.ace-katzenmilch .ace_constant.ace_character,\ +.ace-katzenmilch .ace_constant.ace_other {\ +color: rgba(2, 95, 105, 1.0);\ +rbackground-color: rgba(127, 34, 153, 0.063)\ +}\ +.ace-katzenmilch .ace_support.ace_function {\ +color: #9D7e62;\ +rbackground-color: rgba(189, 190, 130, 0.039)\ +}\ +.ace-katzenmilch .ace_support.ace_class {\ +color: rgba(239, 106, 167, 1.0);\ +rbackground-color: rgba(239, 106, 167, 0.063)\ +}\ +.ace-katzenmilch .ace_storage {\ +color: rgba(123, 92, 191, 1.0);\ +rbackground-color: rgba(139, 93, 223, 0.051)\ +}\ +.ace-katzenmilch .ace_invalid {\ +color: #DFDFD5;\ +rbackground-color: #CC1B27\ +}\ +.ace-katzenmilch .ace_string {\ +color: #5a5f9b;\ +rbackground-color: rgba(170, 175, 219, 0.035)\ +}\ +.ace-katzenmilch .ace_comment {\ +font-style: italic;\ +color: rgba(64, 79, 80, 0.67);\ +rbackground-color: rgba(95, 15, 255, 0.0078)\ +}\ +.ace-katzenmilch .ace_entity.ace_name.ace_function,\ +.ace-katzenmilch .ace_variable {\ +color: rgba(2, 95, 73, 0.97);\ +rbackground-color: rgba(34, 255, 73, 0.12)\ +}\ +.ace-katzenmilch .ace_variable.ace_language {\ +color: #316fcf;\ +rbackground-color: rgba(58, 175, 255, 0.039)\ +}\ +.ace-katzenmilch .ace_variable.ace_parameter {\ +font-style: italic;\ +color: rgba(51, 150, 159, 0.87);\ +rbackground-color: rgba(5, 214, 249, 0.043)\ +}\ +.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\ +color: rgba(73, 70, 194, 0.93);\ +rbackground-color: rgba(73, 134, 194, 0.035)\ +}\ +.ace-katzenmilch .ace_entity.ace_name.ace_tag {\ +color: #3976a2;\ +rbackground-color: rgba(73, 166, 210, 0.039)\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-kr_theme.js b/src/libs/ace/theme-kr_theme.js new file mode 100755 index 0000000..8818b33 --- /dev/null +++ b/src/libs/ace/theme-kr_theme.js @@ -0,0 +1,104 @@ +ace.define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-kr-theme"; +exports.cssText = ".ace-kr-theme .ace_gutter {\ +background: #1c1917;\ +color: #FCFFE0\ +}\ +.ace-kr-theme .ace_print-margin {\ +width: 1px;\ +background: #1c1917\ +}\ +.ace-kr-theme {\ +background-color: #0B0A09;\ +color: #FCFFE0\ +}\ +.ace-kr-theme .ace_cursor {\ +color: #FF9900\ +}\ +.ace-kr-theme .ace_marker-layer .ace_selection {\ +background: rgba(170, 0, 255, 0.45)\ +}\ +.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #0B0A09;\ +}\ +.ace-kr-theme .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-kr-theme .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 177, 111, 0.32)\ +}\ +.ace-kr-theme .ace_marker-layer .ace_active-line {\ +background: #38403D\ +}\ +.ace-kr-theme .ace_gutter-active-line {\ +background-color : #38403D\ +}\ +.ace-kr-theme .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(170, 0, 255, 0.45)\ +}\ +.ace-kr-theme .ace_invisible {\ +color: rgba(255, 177, 111, 0.32)\ +}\ +.ace-kr-theme .ace_keyword,\ +.ace-kr-theme .ace_meta {\ +color: #949C8B\ +}\ +.ace-kr-theme .ace_constant,\ +.ace-kr-theme .ace_constant.ace_character,\ +.ace-kr-theme .ace_constant.ace_character.ace_escape,\ +.ace-kr-theme .ace_constant.ace_other {\ +color: rgba(210, 117, 24, 0.76)\ +}\ +.ace-kr-theme .ace_invalid {\ +color: #F8F8F8;\ +background-color: #A41300\ +}\ +.ace-kr-theme .ace_support {\ +color: #9FC28A\ +}\ +.ace-kr-theme .ace_support.ace_constant {\ +color: #C27E66\ +}\ +.ace-kr-theme .ace_fold {\ +background-color: #949C8B;\ +border-color: #FCFFE0\ +}\ +.ace-kr-theme .ace_support.ace_function {\ +color: #85873A\ +}\ +.ace-kr-theme .ace_storage {\ +color: #FFEE80\ +}\ +.ace-kr-theme .ace_string {\ +color: rgba(164, 161, 181, 0.8)\ +}\ +.ace-kr-theme .ace_string.ace_regexp {\ +color: rgba(125, 255, 192, 0.65)\ +}\ +.ace-kr-theme .ace_comment {\ +font-style: italic;\ +color: #706D5B\ +}\ +.ace-kr-theme .ace_variable {\ +color: #D1A796\ +}\ +.ace-kr-theme .ace_list,\ +.ace-kr-theme .ace_markup.ace_list {\ +background-color: #0F0040\ +}\ +.ace-kr-theme .ace_variable.ace_language {\ +color: #FF80E1\ +}\ +.ace-kr-theme .ace_meta.ace_tag {\ +color: #BABD9C\ +}\ +.ace-kr-theme .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-kuroir.js b/src/libs/ace/theme-kuroir.js new file mode 100755 index 0000000..30e0a8b --- /dev/null +++ b/src/libs/ace/theme-kuroir.js @@ -0,0 +1,61 @@ +ace.define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-kuroir"; +exports.cssText = "\ +.ace-kuroir .ace_gutter {\ +background: #e8e8e8;\ +color: #333;\ +}\ +.ace-kuroir .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-kuroir {\ +background-color: #E8E9E8;\ +color: #363636;\ +}\ +.ace-kuroir .ace_cursor {\ +color: #202020;\ +}\ +.ace-kuroir .ace_marker-layer .ace_selection {\ +background: rgba(245, 170, 0, 0.57);\ +}\ +.ace-kuroir.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #E8E9E8;\ +}\ +.ace-kuroir .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174);\ +}\ +.ace-kuroir .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(0, 0, 0, 0.29);\ +}\ +.ace-kuroir .ace_marker-layer .ace_active-line {\ +background: rgba(203, 220, 47, 0.22);\ +}\ +.ace-kuroir .ace_gutter-active-line {\ +background-color: rgba(203, 220, 47, 0.22);\ +}\ +.ace-kuroir .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(245, 170, 0, 0.57);\ +}\ +.ace-kuroir .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-kuroir .ace_fold {\ +border-color: #363636;\ +}\ +.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\ +background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\ +font-style:italic;\ +color:#FD1732;\ +background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\ +background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\ +background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\ +background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-merbivore.js b/src/libs/ace/theme-merbivore.js new file mode 100755 index 0000000..fc0a72f --- /dev/null +++ b/src/libs/ace/theme-merbivore.js @@ -0,0 +1,95 @@ +ace.define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-merbivore"; +exports.cssText = ".ace-merbivore .ace_gutter {\ +background: #202020;\ +color: #E6E1DC\ +}\ +.ace-merbivore .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-merbivore {\ +background-color: #161616;\ +color: #E6E1DC\ +}\ +.ace-merbivore .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-merbivore .ace_marker-layer .ace_selection {\ +background: #454545\ +}\ +.ace-merbivore.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #161616;\ +}\ +.ace-merbivore .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-merbivore .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-merbivore .ace_marker-layer .ace_active-line {\ +background: #333435\ +}\ +.ace-merbivore .ace_gutter-active-line {\ +background-color: #333435\ +}\ +.ace-merbivore .ace_marker-layer .ace_selected-word {\ +border: 1px solid #454545\ +}\ +.ace-merbivore .ace_invisible {\ +color: #404040\ +}\ +.ace-merbivore .ace_entity.ace_name.ace_tag,\ +.ace-merbivore .ace_keyword,\ +.ace-merbivore .ace_meta,\ +.ace-merbivore .ace_meta.ace_tag,\ +.ace-merbivore .ace_storage,\ +.ace-merbivore .ace_support.ace_function {\ +color: #FC6F09\ +}\ +.ace-merbivore .ace_constant,\ +.ace-merbivore .ace_constant.ace_character,\ +.ace-merbivore .ace_constant.ace_character.ace_escape,\ +.ace-merbivore .ace_constant.ace_other,\ +.ace-merbivore .ace_support.ace_type {\ +color: #1EDAFB\ +}\ +.ace-merbivore .ace_constant.ace_character.ace_escape {\ +color: #519F50\ +}\ +.ace-merbivore .ace_constant.ace_language {\ +color: #FDC251\ +}\ +.ace-merbivore .ace_constant.ace_library,\ +.ace-merbivore .ace_string,\ +.ace-merbivore .ace_support.ace_constant {\ +color: #8DFF0A\ +}\ +.ace-merbivore .ace_constant.ace_numeric {\ +color: #58C554\ +}\ +.ace-merbivore .ace_invalid {\ +color: #FFFFFF;\ +background-color: #990000\ +}\ +.ace-merbivore .ace_fold {\ +background-color: #FC6F09;\ +border-color: #E6E1DC\ +}\ +.ace-merbivore .ace_comment {\ +font-style: italic;\ +color: #AD2EA4\ +}\ +.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\ +color: #FFFF89\ +}\ +.ace-merbivore .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-merbivore_soft.js b/src/libs/ace/theme-merbivore_soft.js new file mode 100755 index 0000000..eff2464 --- /dev/null +++ b/src/libs/ace/theme-merbivore_soft.js @@ -0,0 +1,96 @@ +ace.define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-merbivore-soft"; +exports.cssText = ".ace-merbivore-soft .ace_gutter {\ +background: #262424;\ +color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_print-margin {\ +width: 1px;\ +background: #262424\ +}\ +.ace-merbivore-soft {\ +background-color: #1C1C1C;\ +color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_selection {\ +background: #494949\ +}\ +.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #1C1C1C;\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_active-line {\ +background: #333435\ +}\ +.ace-merbivore-soft .ace_gutter-active-line {\ +background-color: #333435\ +}\ +.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\ +border: 1px solid #494949\ +}\ +.ace-merbivore-soft .ace_invisible {\ +color: #404040\ +}\ +.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\ +.ace-merbivore-soft .ace_keyword,\ +.ace-merbivore-soft .ace_meta,\ +.ace-merbivore-soft .ace_meta.ace_tag,\ +.ace-merbivore-soft .ace_storage {\ +color: #FC803A\ +}\ +.ace-merbivore-soft .ace_constant,\ +.ace-merbivore-soft .ace_constant.ace_character,\ +.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\ +.ace-merbivore-soft .ace_constant.ace_other,\ +.ace-merbivore-soft .ace_support.ace_type {\ +color: #68C1D8\ +}\ +.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\ +color: #B3E5B4\ +}\ +.ace-merbivore-soft .ace_constant.ace_language {\ +color: #E1C582\ +}\ +.ace-merbivore-soft .ace_constant.ace_library,\ +.ace-merbivore-soft .ace_string,\ +.ace-merbivore-soft .ace_support.ace_constant {\ +color: #8EC65F\ +}\ +.ace-merbivore-soft .ace_constant.ace_numeric {\ +color: #7FC578\ +}\ +.ace-merbivore-soft .ace_invalid,\ +.ace-merbivore-soft .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #FE3838\ +}\ +.ace-merbivore-soft .ace_fold {\ +background-color: #FC803A;\ +border-color: #E6E1DC\ +}\ +.ace-merbivore-soft .ace_comment,\ +.ace-merbivore-soft .ace_meta {\ +font-style: italic;\ +color: #AC4BB8\ +}\ +.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\ +color: #EAF1A3\ +}\ +.ace-merbivore-soft .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-mono_industrial.js b/src/libs/ace/theme-mono_industrial.js new file mode 100755 index 0000000..0ece030 --- /dev/null +++ b/src/libs/ace/theme-mono_industrial.js @@ -0,0 +1,107 @@ +ace.define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-mono-industrial"; +exports.cssText = ".ace-mono-industrial .ace_gutter {\ +background: #1d2521;\ +color: #C5C9C9\ +}\ +.ace-mono-industrial .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-mono-industrial {\ +background-color: #222C28;\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_selection {\ +background: rgba(145, 153, 148, 0.40)\ +}\ +.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #222C28;\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(102, 108, 104, 0.50)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_active-line {\ +background: rgba(12, 13, 12, 0.25)\ +}\ +.ace-mono-industrial .ace_gutter-active-line {\ +background-color: rgba(12, 13, 12, 0.25)\ +}\ +.ace-mono-industrial .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(145, 153, 148, 0.40)\ +}\ +.ace-mono-industrial .ace_invisible {\ +color: rgba(102, 108, 104, 0.50)\ +}\ +.ace-mono-industrial .ace_string {\ +background-color: #151C19;\ +color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_keyword,\ +.ace-mono-industrial .ace_meta {\ +color: #A39E64\ +}\ +.ace-mono-industrial .ace_constant,\ +.ace-mono-industrial .ace_constant.ace_character,\ +.ace-mono-industrial .ace_constant.ace_character.ace_escape,\ +.ace-mono-industrial .ace_constant.ace_numeric,\ +.ace-mono-industrial .ace_constant.ace_other {\ +color: #E98800\ +}\ +.ace-mono-industrial .ace_entity.ace_name.ace_function,\ +.ace-mono-industrial .ace_keyword.ace_operator,\ +.ace-mono-industrial .ace_variable {\ +color: #A8B3AB\ +}\ +.ace-mono-industrial .ace_invalid {\ +color: #FFFFFF;\ +background-color: rgba(153, 0, 0, 0.68)\ +}\ +.ace-mono-industrial .ace_support.ace_constant {\ +color: #C87500\ +}\ +.ace-mono-industrial .ace_fold {\ +background-color: #A8B3AB;\ +border-color: #FFFFFF\ +}\ +.ace-mono-industrial .ace_support.ace_function {\ +color: #588E60\ +}\ +.ace-mono-industrial .ace_entity.ace_name,\ +.ace-mono-industrial .ace_support.ace_class,\ +.ace-mono-industrial .ace_support.ace_type {\ +color: #5778B6\ +}\ +.ace-mono-industrial .ace_storage {\ +color: #C23B00\ +}\ +.ace-mono-industrial .ace_variable.ace_language,\ +.ace-mono-industrial .ace_variable.ace_parameter {\ +color: #648BD2\ +}\ +.ace-mono-industrial .ace_comment {\ +color: #666C68;\ +background-color: #151C19\ +}\ +.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\ +color: #909993\ +}\ +.ace-mono-industrial .ace_entity.ace_name.ace_tag {\ +color: #A65EFF\ +}\ +.ace-mono-industrial .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-monokai.js b/src/libs/ace/theme-monokai.js new file mode 100755 index 0000000..322c2fa --- /dev/null +++ b/src/libs/ace/theme-monokai.js @@ -0,0 +1,105 @@ +ace.define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-monokai"; +exports.cssText = ".ace-monokai .ace_gutter {\ +background: #2F3129;\ +color: #8F908A\ +}\ +.ace-monokai .ace_print-margin {\ +width: 1px;\ +background: #555651\ +}\ +.ace-monokai {\ +background-color: #272822;\ +color: #F8F8F2\ +}\ +.ace-monokai .ace_cursor {\ +color: #F8F8F0\ +}\ +.ace-monokai .ace_marker-layer .ace_selection {\ +background: #49483E\ +}\ +.ace-monokai.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #272822;\ +}\ +.ace-monokai .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-monokai .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #49483E\ +}\ +.ace-monokai .ace_marker-layer .ace_active-line {\ +background: #202020\ +}\ +.ace-monokai .ace_gutter-active-line {\ +background-color: #272727\ +}\ +.ace-monokai .ace_marker-layer .ace_selected-word {\ +border: 1px solid #49483E\ +}\ +.ace-monokai .ace_invisible {\ +color: #52524d\ +}\ +.ace-monokai .ace_entity.ace_name.ace_tag,\ +.ace-monokai .ace_keyword,\ +.ace-monokai .ace_meta.ace_tag,\ +.ace-monokai .ace_storage {\ +color: #F92672\ +}\ +.ace-monokai .ace_punctuation,\ +.ace-monokai .ace_punctuation.ace_tag {\ +color: #fff\ +}\ +.ace-monokai .ace_constant.ace_character,\ +.ace-monokai .ace_constant.ace_language,\ +.ace-monokai .ace_constant.ace_numeric,\ +.ace-monokai .ace_constant.ace_other {\ +color: #AE81FF\ +}\ +.ace-monokai .ace_invalid {\ +color: #F8F8F0;\ +background-color: #F92672\ +}\ +.ace-monokai .ace_invalid.ace_deprecated {\ +color: #F8F8F0;\ +background-color: #AE81FF\ +}\ +.ace-monokai .ace_support.ace_constant,\ +.ace-monokai .ace_support.ace_function {\ +color: #66D9EF\ +}\ +.ace-monokai .ace_fold {\ +background-color: #A6E22E;\ +border-color: #F8F8F2\ +}\ +.ace-monokai .ace_storage.ace_type,\ +.ace-monokai .ace_support.ace_class,\ +.ace-monokai .ace_support.ace_type {\ +font-style: italic;\ +color: #66D9EF\ +}\ +.ace-monokai .ace_entity.ace_name.ace_function,\ +.ace-monokai .ace_entity.ace_other,\ +.ace-monokai .ace_entity.ace_other.ace_attribute-name,\ +.ace-monokai .ace_variable {\ +color: #A6E22E\ +}\ +.ace-monokai .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #FD971F\ +}\ +.ace-monokai .ace_string {\ +color: #E6DB74\ +}\ +.ace-monokai .ace_comment {\ +color: #75715E\ +}\ +.ace-monokai .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-pastel_on_dark.js b/src/libs/ace/theme-pastel_on_dark.js new file mode 100755 index 0000000..2631ae0 --- /dev/null +++ b/src/libs/ace/theme-pastel_on_dark.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-pastel-on-dark"; +exports.cssText = ".ace-pastel-on-dark .ace_gutter {\ +background: #353030;\ +color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_print-margin {\ +width: 1px;\ +background: #353030\ +}\ +.ace-pastel-on-dark {\ +background-color: #2C2828;\ +color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_cursor {\ +color: #A7A7A7\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20)\ +}\ +.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #2C2828;\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031)\ +}\ +.ace-pastel-on-dark .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.031)\ +}\ +.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(221, 240, 255, 0.20)\ +}\ +.ace-pastel-on-dark .ace_invisible {\ +color: rgba(255, 255, 255, 0.25)\ +}\ +.ace-pastel-on-dark .ace_keyword,\ +.ace-pastel-on-dark .ace_meta {\ +color: #757aD8\ +}\ +.ace-pastel-on-dark .ace_constant,\ +.ace-pastel-on-dark .ace_constant.ace_character,\ +.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\ +.ace-pastel-on-dark .ace_constant.ace_other {\ +color: #4FB7C5\ +}\ +.ace-pastel-on-dark .ace_keyword.ace_operator {\ +color: #797878\ +}\ +.ace-pastel-on-dark .ace_constant.ace_character {\ +color: #AFA472\ +}\ +.ace-pastel-on-dark .ace_constant.ace_language {\ +color: #DE8E30\ +}\ +.ace-pastel-on-dark .ace_constant.ace_numeric {\ +color: #CCCCCC\ +}\ +.ace-pastel-on-dark .ace_invalid,\ +.ace-pastel-on-dark .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75)\ +}\ +.ace-pastel-on-dark .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1\ +}\ +.ace-pastel-on-dark .ace_fold {\ +background-color: #757aD8;\ +border-color: #8F938F\ +}\ +.ace-pastel-on-dark .ace_support.ace_function {\ +color: #AEB2F8\ +}\ +.ace-pastel-on-dark .ace_string {\ +color: #66A968\ +}\ +.ace-pastel-on-dark .ace_string.ace_regexp {\ +color: #E9C062\ +}\ +.ace-pastel-on-dark .ace_comment {\ +color: #A6C6FF\ +}\ +.ace-pastel-on-dark .ace_variable {\ +color: #BEBF55\ +}\ +.ace-pastel-on-dark .ace_variable.ace_language {\ +color: #C1C144\ +}\ +.ace-pastel-on-dark .ace_xml-pe {\ +color: #494949\ +}\ +.ace-pastel-on-dark .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-solarized_dark.js b/src/libs/ace/theme-solarized_dark.js new file mode 100755 index 0000000..d1acdb4 --- /dev/null +++ b/src/libs/ace/theme-solarized_dark.js @@ -0,0 +1,88 @@ +ace.define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-solarized-dark"; +exports.cssText = ".ace-solarized-dark .ace_gutter {\ +background: #01313f;\ +color: #d0edf7\ +}\ +.ace-solarized-dark .ace_print-margin {\ +width: 1px;\ +background: #33555E\ +}\ +.ace-solarized-dark {\ +background-color: #002B36;\ +color: #93A1A1\ +}\ +.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\ +.ace-solarized-dark .ace_storage {\ +color: #93A1A1\ +}\ +.ace-solarized-dark .ace_cursor,\ +.ace-solarized-dark .ace_string.ace_regexp {\ +color: #D30102\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_active-line,\ +.ace-solarized-dark .ace_marker-layer .ace_selection {\ +background: rgba(255, 255, 255, 0.1)\ +}\ +.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002B36;\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-dark .ace_gutter-active-line {\ +background-color: #0d3440\ +}\ +.ace-solarized-dark .ace_marker-layer .ace_selected-word {\ +border: 1px solid #073642\ +}\ +.ace-solarized-dark .ace_invisible {\ +color: rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-dark .ace_keyword,\ +.ace-solarized-dark .ace_meta,\ +.ace-solarized-dark .ace_support.ace_class,\ +.ace-solarized-dark .ace_support.ace_type {\ +color: #859900\ +}\ +.ace-solarized-dark .ace_constant.ace_character,\ +.ace-solarized-dark .ace_constant.ace_other {\ +color: #CB4B16\ +}\ +.ace-solarized-dark .ace_constant.ace_language {\ +color: #B58900\ +}\ +.ace-solarized-dark .ace_constant.ace_numeric {\ +color: #D33682\ +}\ +.ace-solarized-dark .ace_fold {\ +background-color: #268BD2;\ +border-color: #93A1A1\ +}\ +.ace-solarized-dark .ace_entity.ace_name.ace_function,\ +.ace-solarized-dark .ace_entity.ace_name.ace_tag,\ +.ace-solarized-dark .ace_support.ace_function,\ +.ace-solarized-dark .ace_variable,\ +.ace-solarized-dark .ace_variable.ace_language {\ +color: #268BD2\ +}\ +.ace-solarized-dark .ace_string {\ +color: #2AA198\ +}\ +.ace-solarized-dark .ace_comment {\ +font-style: italic;\ +color: #657B83\ +}\ +.ace-solarized-dark .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-solarized_light.js b/src/libs/ace/theme-solarized_light.js new file mode 100755 index 0000000..f0c078a --- /dev/null +++ b/src/libs/ace/theme-solarized_light.js @@ -0,0 +1,91 @@ +ace.define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-solarized-light"; +exports.cssText = ".ace-solarized-light .ace_gutter {\ +background: #fbf1d3;\ +color: #333\ +}\ +.ace-solarized-light .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-solarized-light {\ +background-color: #FDF6E3;\ +color: #586E75\ +}\ +.ace-solarized-light .ace_cursor {\ +color: #000000\ +}\ +.ace-solarized-light .ace_marker-layer .ace_selection {\ +background: rgba(7, 54, 67, 0.09)\ +}\ +.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FDF6E3;\ +}\ +.ace-solarized-light .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-solarized-light .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-light .ace_marker-layer .ace_active-line {\ +background: #EEE8D5\ +}\ +.ace-solarized-light .ace_gutter-active-line {\ +background-color : #EDE5C1\ +}\ +.ace-solarized-light .ace_marker-layer .ace_selected-word {\ +border: 1px solid #073642\ +}\ +.ace-solarized-light .ace_invisible {\ +color: rgba(147, 161, 161, 0.50)\ +}\ +.ace-solarized-light .ace_keyword,\ +.ace-solarized-light .ace_meta,\ +.ace-solarized-light .ace_support.ace_class,\ +.ace-solarized-light .ace_support.ace_type {\ +color: #859900\ +}\ +.ace-solarized-light .ace_constant.ace_character,\ +.ace-solarized-light .ace_constant.ace_other {\ +color: #CB4B16\ +}\ +.ace-solarized-light .ace_constant.ace_language {\ +color: #B58900\ +}\ +.ace-solarized-light .ace_constant.ace_numeric {\ +color: #D33682\ +}\ +.ace-solarized-light .ace_fold {\ +background-color: #268BD2;\ +border-color: #586E75\ +}\ +.ace-solarized-light .ace_entity.ace_name.ace_function,\ +.ace-solarized-light .ace_entity.ace_name.ace_tag,\ +.ace-solarized-light .ace_support.ace_function,\ +.ace-solarized-light .ace_variable,\ +.ace-solarized-light .ace_variable.ace_language {\ +color: #268BD2\ +}\ +.ace-solarized-light .ace_storage {\ +color: #073642\ +}\ +.ace-solarized-light .ace_string {\ +color: #2AA198\ +}\ +.ace-solarized-light .ace_string.ace_regexp {\ +color: #D30102\ +}\ +.ace-solarized-light .ace_comment,\ +.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\ +color: #93A1A1\ +}\ +.ace-solarized-light .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-sqlserver.js b/src/libs/ace/theme-sqlserver.js new file mode 100755 index 0000000..91f34f6 --- /dev/null +++ b/src/libs/ace/theme-sqlserver.js @@ -0,0 +1,138 @@ +ace.define("ace/theme/sqlserver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-sqlserver"; +exports.cssText = ".ace-sqlserver .ace_gutter {\ +background: #ebebeb;\ +color: #333;\ +overflow: hidden;\ +}\ +.ace-sqlserver .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-sqlserver {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-sqlserver .ace_identifier {\ +color: black;\ +}\ +.ace-sqlserver .ace_keyword {\ +color: #0000FF;\ +}\ +.ace-sqlserver .ace_numeric {\ +color: black;\ +}\ +.ace-sqlserver .ace_storage {\ +color: #11B7BE;\ +}\ +.ace-sqlserver .ace_keyword.ace_operator,\ +.ace-sqlserver .ace_lparen,\ +.ace-sqlserver .ace_rparen,\ +.ace-sqlserver .ace_punctuation {\ +color: #808080;\ +}\ +.ace-sqlserver .ace_set.ace_statement {\ +color: #0000FF;\ +text-decoration: underline;\ +}\ +.ace-sqlserver .ace_cursor {\ +color: black;\ +}\ +.ace-sqlserver .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-sqlserver .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-sqlserver .ace_constant.ace_language {\ +color: #979797;\ +}\ +.ace-sqlserver .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-sqlserver .ace_invalid {\ +background-color: rgb(153, 0, 0);\ +color: white;\ +}\ +.ace-sqlserver .ace_support.ace_function {\ +color: #FF00FF;\ +}\ +.ace-sqlserver .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-sqlserver .ace_class {\ +color: #008080;\ +}\ +.ace-sqlserver .ace_support.ace_other {\ +color: #6D79DE;\ +}\ +.ace-sqlserver .ace_variable.ace_parameter {\ +font-style: italic;\ +color: #FD971F;\ +}\ +.ace-sqlserver .ace_comment {\ +color: #008000;\ +}\ +.ace-sqlserver .ace_constant.ace_numeric {\ +color: black;\ +}\ +.ace-sqlserver .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-sqlserver .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-sqlserver .ace_support.ace_storedprocedure {\ +color: #800000;\ +}\ +.ace-sqlserver .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-sqlserver .ace_list {\ +color: rgb(185, 6, 144);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-sqlserver .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-sqlserver .ace_gutter-active-line {\ +background-color: #dcdcdc;\ +}\ +.ace-sqlserver .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-sqlserver .ace_meta.ace_tag {\ +color: #0000FF;\ +}\ +.ace-sqlserver .ace_string.ace_regex {\ +color: #FF0000;\ +}\ +.ace-sqlserver .ace_string {\ +color: #FF0000;\ +}\ +.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {\ +color: #994409;\ +}\ +.ace-sqlserver .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-terminal.js b/src/libs/ace/theme-terminal.js new file mode 100755 index 0000000..def9e69 --- /dev/null +++ b/src/libs/ace/theme-terminal.js @@ -0,0 +1,114 @@ +ace.define("ace/theme/terminal",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-terminal-theme"; +exports.cssText = ".ace-terminal-theme .ace_gutter {\ +background: #1a0005;\ +color: steelblue\ +}\ +.ace-terminal-theme .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-terminal-theme {\ +background-color: black;\ +color: #DEDEDE\ +}\ +.ace-terminal-theme .ace_cursor {\ +color: #9F9F9F\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_selection {\ +background: #424242\ +}\ +.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px black;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_step {\ +background: rgb(0, 0, 0)\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket {\ +background: #090;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\ +background: #090;\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #900\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_active-line {\ +background: #2A2A2A\ +}\ +.ace-terminal-theme .ace_gutter-active-line {\ +background-color: #2A112A\ +}\ +.ace-terminal-theme .ace_marker-layer .ace_selected-word {\ +border: 1px solid #424242\ +}\ +.ace-terminal-theme .ace_invisible {\ +color: #343434\ +}\ +.ace-terminal-theme .ace_keyword,\ +.ace-terminal-theme .ace_meta,\ +.ace-terminal-theme .ace_storage,\ +.ace-terminal-theme .ace_storage.ace_type,\ +.ace-terminal-theme .ace_support.ace_type {\ +color: tomato\ +}\ +.ace-terminal-theme .ace_keyword.ace_operator {\ +color: deeppink\ +}\ +.ace-terminal-theme .ace_constant.ace_character,\ +.ace-terminal-theme .ace_constant.ace_language,\ +.ace-terminal-theme .ace_constant.ace_numeric,\ +.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\ +.ace-terminal-theme .ace_support.ace_constant,\ +.ace-terminal-theme .ace_variable.ace_parameter {\ +color: #E78C45\ +}\ +.ace-terminal-theme .ace_constant.ace_other {\ +color: gold\ +}\ +.ace-terminal-theme .ace_invalid {\ +color: yellow;\ +background-color: red\ +}\ +.ace-terminal-theme .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-terminal-theme .ace_fold {\ +background-color: #7AA6DA;\ +border-color: #DEDEDE\ +}\ +.ace-terminal-theme .ace_entity.ace_name.ace_function,\ +.ace-terminal-theme .ace_support.ace_function,\ +.ace-terminal-theme .ace_variable {\ +color: #7AA6DA\ +}\ +.ace-terminal-theme .ace_support.ace_class,\ +.ace-terminal-theme .ace_support.ace_type {\ +color: #E7C547\ +}\ +.ace-terminal-theme .ace_heading,\ +.ace-terminal-theme .ace_string {\ +color: #B9CA4A\ +}\ +.ace-terminal-theme .ace_entity.ace_name.ace_tag,\ +.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\ +.ace-terminal-theme .ace_meta.ace_tag,\ +.ace-terminal-theme .ace_string.ace_regexp,\ +.ace-terminal-theme .ace_variable {\ +color: #D54E53\ +}\ +.ace-terminal-theme .ace_comment {\ +color: orangered\ +}\ +.ace-terminal-theme .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-textmate.js b/src/libs/ace/theme-textmate.js new file mode 100755 index 0000000..0033eda --- /dev/null +++ b/src/libs/ace/theme-textmate.js @@ -0,0 +1,129 @@ +ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = ".ace-tm .ace_gutter {\ +background: #f0f0f0;\ +color: #333;\ +}\ +.ace-tm .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-tm .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-tm {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-tm .ace_cursor {\ +color: black;\ +}\ +.ace-tm .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-tm .ace_storage,\ +.ace-tm .ace_keyword {\ +color: blue;\ +}\ +.ace-tm .ace_constant {\ +color: rgb(197, 6, 11);\ +}\ +.ace-tm .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-tm .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-tm .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_invalid {\ +background-color: rgba(255, 0, 0, 0.1);\ +color: red;\ +}\ +.ace-tm .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-tm .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_support.ace_type,\ +.ace-tm .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-tm .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-tm .ace_string {\ +color: rgb(3, 106, 7);\ +}\ +.ace-tm .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-tm .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-tm .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-tm .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-tm .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-tm .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-tm .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-tm .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-tm .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-tm .ace_meta.ace_tag {\ +color:rgb(0, 22, 142);\ +}\ +.ace-tm .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-tm .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-tm.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-tm .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-tm .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-tm .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-tm .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-tm .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-tm .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-tm .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-tomorrow.js b/src/libs/ace/theme-tomorrow.js new file mode 100755 index 0000000..4661be1 --- /dev/null +++ b/src/libs/ace/theme-tomorrow.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-tomorrow"; +exports.cssText = ".ace-tomorrow .ace_gutter {\ +background: #f6f6f6;\ +color: #4D4D4C\ +}\ +.ace-tomorrow .ace_print-margin {\ +width: 1px;\ +background: #f6f6f6\ +}\ +.ace-tomorrow {\ +background-color: #FFFFFF;\ +color: #4D4D4C\ +}\ +.ace-tomorrow .ace_cursor {\ +color: #AEAFAD\ +}\ +.ace-tomorrow .ace_marker-layer .ace_selection {\ +background: #D6D6D6\ +}\ +.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-tomorrow .ace_marker-layer .ace_step {\ +background: rgb(255, 255, 0)\ +}\ +.ace-tomorrow .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #D1D1D1\ +}\ +.ace-tomorrow .ace_marker-layer .ace_active-line {\ +background: #EFEFEF\ +}\ +.ace-tomorrow .ace_gutter-active-line {\ +background-color : #dcdcdc\ +}\ +.ace-tomorrow .ace_marker-layer .ace_selected-word {\ +border: 1px solid #D6D6D6\ +}\ +.ace-tomorrow .ace_invisible {\ +color: #D1D1D1\ +}\ +.ace-tomorrow .ace_keyword,\ +.ace-tomorrow .ace_meta,\ +.ace-tomorrow .ace_storage,\ +.ace-tomorrow .ace_storage.ace_type,\ +.ace-tomorrow .ace_support.ace_type {\ +color: #8959A8\ +}\ +.ace-tomorrow .ace_keyword.ace_operator {\ +color: #3E999F\ +}\ +.ace-tomorrow .ace_constant.ace_character,\ +.ace-tomorrow .ace_constant.ace_language,\ +.ace-tomorrow .ace_constant.ace_numeric,\ +.ace-tomorrow .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow .ace_support.ace_constant,\ +.ace-tomorrow .ace_variable.ace_parameter {\ +color: #F5871F\ +}\ +.ace-tomorrow .ace_constant.ace_other {\ +color: #666969\ +}\ +.ace-tomorrow .ace_invalid {\ +color: #FFFFFF;\ +background-color: #C82829\ +}\ +.ace-tomorrow .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #8959A8\ +}\ +.ace-tomorrow .ace_fold {\ +background-color: #4271AE;\ +border-color: #4D4D4C\ +}\ +.ace-tomorrow .ace_entity.ace_name.ace_function,\ +.ace-tomorrow .ace_support.ace_function,\ +.ace-tomorrow .ace_variable {\ +color: #4271AE\ +}\ +.ace-tomorrow .ace_support.ace_class,\ +.ace-tomorrow .ace_support.ace_type {\ +color: #C99E00\ +}\ +.ace-tomorrow .ace_heading,\ +.ace-tomorrow .ace_markup.ace_heading,\ +.ace-tomorrow .ace_string {\ +color: #718C00\ +}\ +.ace-tomorrow .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow .ace_meta.ace_tag,\ +.ace-tomorrow .ace_string.ace_regexp,\ +.ace-tomorrow .ace_variable {\ +color: #C82829\ +}\ +.ace-tomorrow .ace_comment {\ +color: #8E908C\ +}\ +.ace-tomorrow .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-tomorrow_night.js b/src/libs/ace/theme-tomorrow_night.js new file mode 100755 index 0000000..53e1f39 --- /dev/null +++ b/src/libs/ace/theme-tomorrow_night.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night"; +exports.cssText = ".ace-tomorrow-night .ace_gutter {\ +background: #25282c;\ +color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_print-margin {\ +width: 1px;\ +background: #25282c\ +}\ +.ace-tomorrow-night {\ +background-color: #1D1F21;\ +color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_cursor {\ +color: #AEAFAD\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_selection {\ +background: #373B41\ +}\ +.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #1D1F21;\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #4B4E55\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_active-line {\ +background: #282A2E\ +}\ +.ace-tomorrow-night .ace_gutter-active-line {\ +background-color: #282A2E\ +}\ +.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\ +border: 1px solid #373B41\ +}\ +.ace-tomorrow-night .ace_invisible {\ +color: #4B4E55\ +}\ +.ace-tomorrow-night .ace_keyword,\ +.ace-tomorrow-night .ace_meta,\ +.ace-tomorrow-night .ace_storage,\ +.ace-tomorrow-night .ace_storage.ace_type,\ +.ace-tomorrow-night .ace_support.ace_type {\ +color: #B294BB\ +}\ +.ace-tomorrow-night .ace_keyword.ace_operator {\ +color: #8ABEB7\ +}\ +.ace-tomorrow-night .ace_constant.ace_character,\ +.ace-tomorrow-night .ace_constant.ace_language,\ +.ace-tomorrow-night .ace_constant.ace_numeric,\ +.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night .ace_support.ace_constant,\ +.ace-tomorrow-night .ace_variable.ace_parameter {\ +color: #DE935F\ +}\ +.ace-tomorrow-night .ace_constant.ace_other {\ +color: #CED1CF\ +}\ +.ace-tomorrow-night .ace_invalid {\ +color: #CED2CF;\ +background-color: #DF5F5F\ +}\ +.ace-tomorrow-night .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-tomorrow-night .ace_fold {\ +background-color: #81A2BE;\ +border-color: #C5C8C6\ +}\ +.ace-tomorrow-night .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night .ace_support.ace_function,\ +.ace-tomorrow-night .ace_variable {\ +color: #81A2BE\ +}\ +.ace-tomorrow-night .ace_support.ace_class,\ +.ace-tomorrow-night .ace_support.ace_type {\ +color: #F0C674\ +}\ +.ace-tomorrow-night .ace_heading,\ +.ace-tomorrow-night .ace_markup.ace_heading,\ +.ace-tomorrow-night .ace_string {\ +color: #B5BD68\ +}\ +.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night .ace_meta.ace_tag,\ +.ace-tomorrow-night .ace_string.ace_regexp,\ +.ace-tomorrow-night .ace_variable {\ +color: #CC6666\ +}\ +.ace-tomorrow-night .ace_comment {\ +color: #969896\ +}\ +.ace-tomorrow-night .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-tomorrow_night_blue.js b/src/libs/ace/theme-tomorrow_night_blue.js new file mode 100755 index 0000000..956e221 --- /dev/null +++ b/src/libs/ace/theme-tomorrow_night_blue.js @@ -0,0 +1,106 @@ +ace.define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-blue"; +exports.cssText = ".ace-tomorrow-night-blue .ace_gutter {\ +background: #00204b;\ +color: #7388b5\ +}\ +.ace-tomorrow-night-blue .ace_print-margin {\ +width: 1px;\ +background: #00204b\ +}\ +.ace-tomorrow-night-blue {\ +background-color: #002451;\ +color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_constant.ace_other,\ +.ace-tomorrow-night-blue .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\ +background: #003F8E\ +}\ +.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #002451;\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\ +background: rgb(127, 111, 19)\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404F7D\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\ +background: #00346E\ +}\ +.ace-tomorrow-night-blue .ace_gutter-active-line {\ +background-color: #022040\ +}\ +.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\ +border: 1px solid #003F8E\ +}\ +.ace-tomorrow-night-blue .ace_invisible {\ +color: #404F7D\ +}\ +.ace-tomorrow-night-blue .ace_keyword,\ +.ace-tomorrow-night-blue .ace_meta,\ +.ace-tomorrow-night-blue .ace_storage,\ +.ace-tomorrow-night-blue .ace_storage.ace_type,\ +.ace-tomorrow-night-blue .ace_support.ace_type {\ +color: #EBBBFF\ +}\ +.ace-tomorrow-night-blue .ace_keyword.ace_operator {\ +color: #99FFFF\ +}\ +.ace-tomorrow-night-blue .ace_constant.ace_character,\ +.ace-tomorrow-night-blue .ace_constant.ace_language,\ +.ace-tomorrow-night-blue .ace_constant.ace_numeric,\ +.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-blue .ace_support.ace_constant,\ +.ace-tomorrow-night-blue .ace_variable.ace_parameter {\ +color: #FFC58F\ +}\ +.ace-tomorrow-night-blue .ace_invalid {\ +color: #FFFFFF;\ +background-color: #F99DA5\ +}\ +.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\ +color: #FFFFFF;\ +background-color: #EBBBFF\ +}\ +.ace-tomorrow-night-blue .ace_fold {\ +background-color: #BBDAFF;\ +border-color: #FFFFFF\ +}\ +.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-blue .ace_support.ace_function,\ +.ace-tomorrow-night-blue .ace_variable {\ +color: #BBDAFF\ +}\ +.ace-tomorrow-night-blue .ace_support.ace_class,\ +.ace-tomorrow-night-blue .ace_support.ace_type {\ +color: #FFEEAD\ +}\ +.ace-tomorrow-night-blue .ace_heading,\ +.ace-tomorrow-night-blue .ace_markup.ace_heading,\ +.ace-tomorrow-night-blue .ace_string {\ +color: #D1F1A9\ +}\ +.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-blue .ace_meta.ace_tag,\ +.ace-tomorrow-night-blue .ace_string.ace_regexp,\ +.ace-tomorrow-night-blue .ace_variable {\ +color: #FF9DA4\ +}\ +.ace-tomorrow-night-blue .ace_comment {\ +color: #7285B7\ +}\ +.ace-tomorrow-night-blue .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-tomorrow_night_bright.js b/src/libs/ace/theme-tomorrow_night_bright.js new file mode 100755 index 0000000..8514a0d --- /dev/null +++ b/src/libs/ace/theme-tomorrow_night_bright.js @@ -0,0 +1,121 @@ +ace.define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-bright"; +exports.cssText = ".ace-tomorrow-night-bright .ace_gutter {\ +background: #1a1a1a;\ +color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-tomorrow-night-bright {\ +background-color: #000000;\ +color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_cursor {\ +color: #9F9F9F\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\ +background: #424242\ +}\ +.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #000000;\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #888888\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\ +border: 1px solid rgb(110, 119, 0);\ +border-bottom: 0;\ +box-shadow: inset 0 -1px rgb(110, 119, 0);\ +margin: -1px 0 0 -1px;\ +background: rgba(255, 235, 0, 0.1)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\ +background: #2A2A2A\ +}\ +.ace-tomorrow-night-bright .ace_gutter-active-line {\ +background-color: #2A2A2A\ +}\ +.ace-tomorrow-night-bright .ace_stack {\ +background-color: rgb(66, 90, 44)\ +}\ +.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\ +border: 1px solid #888888\ +}\ +.ace-tomorrow-night-bright .ace_invisible {\ +color: #343434\ +}\ +.ace-tomorrow-night-bright .ace_keyword,\ +.ace-tomorrow-night-bright .ace_meta,\ +.ace-tomorrow-night-bright .ace_storage,\ +.ace-tomorrow-night-bright .ace_storage.ace_type,\ +.ace-tomorrow-night-bright .ace_support.ace_type {\ +color: #C397D8\ +}\ +.ace-tomorrow-night-bright .ace_keyword.ace_operator {\ +color: #70C0B1\ +}\ +.ace-tomorrow-night-bright .ace_constant.ace_character,\ +.ace-tomorrow-night-bright .ace_constant.ace_language,\ +.ace-tomorrow-night-bright .ace_constant.ace_numeric,\ +.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-bright .ace_support.ace_constant,\ +.ace-tomorrow-night-bright .ace_variable.ace_parameter {\ +color: #E78C45\ +}\ +.ace-tomorrow-night-bright .ace_constant.ace_other {\ +color: #EEEEEE\ +}\ +.ace-tomorrow-night-bright .ace_invalid {\ +color: #CED2CF;\ +background-color: #DF5F5F\ +}\ +.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\ +color: #CED2CF;\ +background-color: #B798BF\ +}\ +.ace-tomorrow-night-bright .ace_fold {\ +background-color: #7AA6DA;\ +border-color: #DEDEDE\ +}\ +.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-bright .ace_support.ace_function,\ +.ace-tomorrow-night-bright .ace_variable {\ +color: #7AA6DA\ +}\ +.ace-tomorrow-night-bright .ace_support.ace_class,\ +.ace-tomorrow-night-bright .ace_support.ace_type {\ +color: #E7C547\ +}\ +.ace-tomorrow-night-bright .ace_heading,\ +.ace-tomorrow-night-bright .ace_markup.ace_heading,\ +.ace-tomorrow-night-bright .ace_string {\ +color: #B9CA4A\ +}\ +.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-bright .ace_meta.ace_tag,\ +.ace-tomorrow-night-bright .ace_string.ace_regexp,\ +.ace-tomorrow-night-bright .ace_variable {\ +color: #D54E53\ +}\ +.ace-tomorrow-night-bright .ace_comment {\ +color: #969896\ +}\ +.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\ +color: #C2C280\ +}\ +.ace-tomorrow-night-bright .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-tomorrow_night_eighties.js b/src/libs/ace/theme-tomorrow_night_eighties.js new file mode 100755 index 0000000..3665e3f --- /dev/null +++ b/src/libs/ace/theme-tomorrow_night_eighties.js @@ -0,0 +1,108 @@ +ace.define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-eighties"; +exports.cssText = ".ace-tomorrow-night-eighties .ace_gutter {\ +background: #272727;\ +color: #CCC\ +}\ +.ace-tomorrow-night-eighties .ace_print-margin {\ +width: 1px;\ +background: #272727\ +}\ +.ace-tomorrow-night-eighties {\ +background-color: #2D2D2D;\ +color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_constant.ace_other,\ +.ace-tomorrow-night-eighties .ace_cursor {\ +color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\ +background: #515151\ +}\ +.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #2D2D2D;\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #6A6A6A\ +}\ +.ace-tomorrow-night-bright .ace_stack {\ +background: rgb(66, 90, 44)\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\ +background: #393939\ +}\ +.ace-tomorrow-night-eighties .ace_gutter-active-line {\ +background-color: #393939\ +}\ +.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\ +border: 1px solid #515151\ +}\ +.ace-tomorrow-night-eighties .ace_invisible {\ +color: #6A6A6A\ +}\ +.ace-tomorrow-night-eighties .ace_keyword,\ +.ace-tomorrow-night-eighties .ace_meta,\ +.ace-tomorrow-night-eighties .ace_storage,\ +.ace-tomorrow-night-eighties .ace_storage.ace_type,\ +.ace-tomorrow-night-eighties .ace_support.ace_type {\ +color: #CC99CC\ +}\ +.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\ +color: #66CCCC\ +}\ +.ace-tomorrow-night-eighties .ace_constant.ace_character,\ +.ace-tomorrow-night-eighties .ace_constant.ace_language,\ +.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\ +.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\ +.ace-tomorrow-night-eighties .ace_support.ace_constant,\ +.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\ +color: #F99157\ +}\ +.ace-tomorrow-night-eighties .ace_invalid {\ +color: #CDCDCD;\ +background-color: #F2777A\ +}\ +.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\ +color: #CDCDCD;\ +background-color: #CC99CC\ +}\ +.ace-tomorrow-night-eighties .ace_fold {\ +background-color: #6699CC;\ +border-color: #CCCCCC\ +}\ +.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\ +.ace-tomorrow-night-eighties .ace_support.ace_function,\ +.ace-tomorrow-night-eighties .ace_variable {\ +color: #6699CC\ +}\ +.ace-tomorrow-night-eighties .ace_support.ace_class,\ +.ace-tomorrow-night-eighties .ace_support.ace_type {\ +color: #FFCC66\ +}\ +.ace-tomorrow-night-eighties .ace_heading,\ +.ace-tomorrow-night-eighties .ace_markup.ace_heading,\ +.ace-tomorrow-night-eighties .ace_string {\ +color: #99CC99\ +}\ +.ace-tomorrow-night-eighties .ace_comment {\ +color: #999999\ +}\ +.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\ +.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\ +.ace-tomorrow-night-eighties .ace_meta.ace_tag,\ +.ace-tomorrow-night-eighties .ace_variable {\ +color: #F2777A\ +}\ +.ace-tomorrow-night-eighties .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-twilight.js b/src/libs/ace/theme-twilight.js new file mode 100755 index 0000000..48ec030 --- /dev/null +++ b/src/libs/ace/theme-twilight.js @@ -0,0 +1,109 @@ +ace.define("ace/theme/twilight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-twilight"; +exports.cssText = ".ace-twilight .ace_gutter {\ +background: #232323;\ +color: #E2E2E2\ +}\ +.ace-twilight .ace_print-margin {\ +width: 1px;\ +background: #232323\ +}\ +.ace-twilight {\ +background-color: #141414;\ +color: #F8F8F8\ +}\ +.ace-twilight .ace_cursor {\ +color: #A7A7A7\ +}\ +.ace-twilight .ace_marker-layer .ace_selection {\ +background: rgba(221, 240, 255, 0.20)\ +}\ +.ace-twilight.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #141414;\ +}\ +.ace-twilight .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-twilight .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgba(255, 255, 255, 0.25)\ +}\ +.ace-twilight .ace_marker-layer .ace_active-line {\ +background: rgba(255, 255, 255, 0.031)\ +}\ +.ace-twilight .ace_gutter-active-line {\ +background-color: rgba(255, 255, 255, 0.031)\ +}\ +.ace-twilight .ace_marker-layer .ace_selected-word {\ +border: 1px solid rgba(221, 240, 255, 0.20)\ +}\ +.ace-twilight .ace_invisible {\ +color: rgba(255, 255, 255, 0.25)\ +}\ +.ace-twilight .ace_keyword,\ +.ace-twilight .ace_meta {\ +color: #CDA869\ +}\ +.ace-twilight .ace_constant,\ +.ace-twilight .ace_constant.ace_character,\ +.ace-twilight .ace_constant.ace_character.ace_escape,\ +.ace-twilight .ace_constant.ace_other,\ +.ace-twilight .ace_heading,\ +.ace-twilight .ace_markup.ace_heading,\ +.ace-twilight .ace_support.ace_constant {\ +color: #CF6A4C\ +}\ +.ace-twilight .ace_invalid.ace_illegal {\ +color: #F8F8F8;\ +background-color: rgba(86, 45, 86, 0.75)\ +}\ +.ace-twilight .ace_invalid.ace_deprecated {\ +text-decoration: underline;\ +font-style: italic;\ +color: #D2A8A1\ +}\ +.ace-twilight .ace_support {\ +color: #9B859D\ +}\ +.ace-twilight .ace_fold {\ +background-color: #AC885B;\ +border-color: #F8F8F8\ +}\ +.ace-twilight .ace_support.ace_function {\ +color: #DAD085\ +}\ +.ace-twilight .ace_list,\ +.ace-twilight .ace_markup.ace_list,\ +.ace-twilight .ace_storage {\ +color: #F9EE98\ +}\ +.ace-twilight .ace_entity.ace_name.ace_function,\ +.ace-twilight .ace_meta.ace_tag,\ +.ace-twilight .ace_variable {\ +color: #AC885B\ +}\ +.ace-twilight .ace_string {\ +color: #8F9D6A\ +}\ +.ace-twilight .ace_string.ace_regexp {\ +color: #E9C062\ +}\ +.ace-twilight .ace_comment {\ +font-style: italic;\ +color: #5F5A60\ +}\ +.ace-twilight .ace_variable {\ +color: #7587A6\ +}\ +.ace-twilight .ace_xml-pe {\ +color: #494949\ +}\ +.ace-twilight .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-vibrant_ink.js b/src/libs/ace/theme-vibrant_ink.js new file mode 100755 index 0000000..db926c7 --- /dev/null +++ b/src/libs/ace/theme-vibrant_ink.js @@ -0,0 +1,94 @@ +ace.define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = true; +exports.cssClass = "ace-vibrant-ink"; +exports.cssText = ".ace-vibrant-ink .ace_gutter {\ +background: #1a1a1a;\ +color: #BEBEBE\ +}\ +.ace-vibrant-ink .ace_print-margin {\ +width: 1px;\ +background: #1a1a1a\ +}\ +.ace-vibrant-ink {\ +background-color: #0F0F0F;\ +color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_cursor {\ +color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_selection {\ +background: #6699CC\ +}\ +.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #0F0F0F;\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_step {\ +background: rgb(102, 82, 0)\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #404040\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_active-line {\ +background: #333333\ +}\ +.ace-vibrant-ink .ace_gutter-active-line {\ +background-color: #333333\ +}\ +.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\ +border: 1px solid #6699CC\ +}\ +.ace-vibrant-ink .ace_invisible {\ +color: #404040\ +}\ +.ace-vibrant-ink .ace_keyword,\ +.ace-vibrant-ink .ace_meta {\ +color: #FF6600\ +}\ +.ace-vibrant-ink .ace_constant,\ +.ace-vibrant-ink .ace_constant.ace_character,\ +.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\ +.ace-vibrant-ink .ace_constant.ace_other {\ +color: #339999\ +}\ +.ace-vibrant-ink .ace_constant.ace_numeric {\ +color: #99CC99\ +}\ +.ace-vibrant-ink .ace_invalid,\ +.ace-vibrant-ink .ace_invalid.ace_deprecated {\ +color: #CCFF33;\ +background-color: #000000\ +}\ +.ace-vibrant-ink .ace_fold {\ +background-color: #FFCC00;\ +border-color: #FFFFFF\ +}\ +.ace-vibrant-ink .ace_entity.ace_name.ace_function,\ +.ace-vibrant-ink .ace_support.ace_function,\ +.ace-vibrant-ink .ace_variable {\ +color: #FFCC00\ +}\ +.ace-vibrant-ink .ace_variable.ace_parameter {\ +font-style: italic\ +}\ +.ace-vibrant-ink .ace_string {\ +color: #66FF00\ +}\ +.ace-vibrant-ink .ace_string.ace_regexp {\ +color: #44B4CC\ +}\ +.ace-vibrant-ink .ace_comment {\ +color: #9933CC\ +}\ +.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\ +font-style: italic;\ +color: #99CC99\ +}\ +.ace-vibrant-ink .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/theme-xcode.js b/src/libs/ace/theme-xcode.js new file mode 100755 index 0000000..3604a17 --- /dev/null +++ b/src/libs/ace/theme-xcode.js @@ -0,0 +1,88 @@ +ace.define("ace/theme/xcode",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-xcode"; +exports.cssText = "\ +.ace-xcode .ace_gutter {\ +background: #e8e8e8;\ +color: #333\ +}\ +.ace-xcode .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8\ +}\ +.ace-xcode {\ +background-color: #FFFFFF;\ +color: #000000\ +}\ +.ace-xcode .ace_cursor {\ +color: #000000\ +}\ +.ace-xcode .ace_marker-layer .ace_selection {\ +background: #B5D5FF\ +}\ +.ace-xcode.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px #FFFFFF;\ +}\ +.ace-xcode .ace_marker-layer .ace_step {\ +background: rgb(198, 219, 174)\ +}\ +.ace-xcode .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid #BFBFBF\ +}\ +.ace-xcode .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.071)\ +}\ +.ace-xcode .ace_gutter-active-line {\ +background-color: rgba(0, 0, 0, 0.071)\ +}\ +.ace-xcode .ace_marker-layer .ace_selected-word {\ +border: 1px solid #B5D5FF\ +}\ +.ace-xcode .ace_constant.ace_language,\ +.ace-xcode .ace_keyword,\ +.ace-xcode .ace_meta,\ +.ace-xcode .ace_variable.ace_language {\ +color: #C800A4\ +}\ +.ace-xcode .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-xcode .ace_constant.ace_character,\ +.ace-xcode .ace_constant.ace_other {\ +color: #275A5E\ +}\ +.ace-xcode .ace_constant.ace_numeric {\ +color: #3A00DC\ +}\ +.ace-xcode .ace_entity.ace_other.ace_attribute-name,\ +.ace-xcode .ace_support.ace_constant,\ +.ace-xcode .ace_support.ace_function {\ +color: #450084\ +}\ +.ace-xcode .ace_fold {\ +background-color: #C800A4;\ +border-color: #000000\ +}\ +.ace-xcode .ace_entity.ace_name.ace_tag,\ +.ace-xcode .ace_support.ace_class,\ +.ace-xcode .ace_support.ace_type {\ +color: #790EAD\ +}\ +.ace-xcode .ace_storage {\ +color: #C900A4\ +}\ +.ace-xcode .ace_string {\ +color: #DF0002\ +}\ +.ace-xcode .ace_comment {\ +color: #008E00\ +}\ +.ace-xcode .ace_indent-guide {\ +background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\ +}"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/src/libs/ace/worker-coffee.js b/src/libs/ace/worker-coffee.js new file mode 100755 index 0000000..7fca260 --- /dev/null +++ b/src/libs/ace/worker-coffee.js @@ -0,0 +1,2157 @@ +"no use strict"; +;(function(window) { +if (typeof window.window != "undefined" && window.document) + return; +if (window.require && window.define) + return; + +if (!window.console) { + window.console = function() { + var msgs = Array.prototype.slice.call(arguments, 0); + postMessage({type: "log", data: msgs}); + }; + window.console.error = + window.console.warn = + window.console.log = + window.console.trace = window.console; +} +window.window = window; +window.ace = window; + +window.onerror = function(message, file, line, col, err) { + postMessage({type: "error", data: { + message: message, + data: err.data, + file: file, + line: line, + col: col, + stack: err.stack + }}); +}; + +window.normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = (base ? base + "/" : "") + moduleName; + + while (moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + + return moduleName; +}; + +window.require = function require(parentId, id) { + if (!id) { + id = parentId; + parentId = null; + } + if (!id.charAt) + throw new Error("worker.js require() accepts only (parentId, id) as arguments"); + + id = window.normalizeModule(parentId, id); + + var module = window.require.modules[id]; + if (module) { + if (!module.initialized) { + module.initialized = true; + module.exports = module.factory().exports; + } + return module.exports; + } + + if (!window.require.tlns) + return console.log("unable to load " + id); + + var path = resolveModuleId(id, window.require.tlns); + if (path.slice(-3) != ".js") path += ".js"; + + window.require.id = id; + window.require.modules[id] = {}; // prevent infinite loop on broken modules + importScripts(path); + return window.require(parentId, id); +}; +function resolveModuleId(id, paths) { + var testPath = id, tail = ""; + while (testPath) { + var alias = paths[testPath]; + if (typeof alias == "string") { + return alias + tail; + } else if (alias) { + return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name); + } else if (alias === false) { + return ""; + } + var i = testPath.lastIndexOf("/"); + if (i === -1) break; + tail = testPath.substr(i) + tail; + testPath = testPath.slice(0, i); + } + return id; +} +window.require.modules = {}; +window.require.tlns = {}; + +window.define = function(id, deps, factory) { + if (arguments.length == 2) { + factory = deps; + if (typeof id != "string") { + deps = id; + id = window.require.id; + } + } else if (arguments.length == 1) { + factory = id; + deps = []; + id = window.require.id; + } + + if (typeof factory != "function") { + window.require.modules[id] = { + exports: factory, + initialized: true + }; + return; + } + + if (!deps.length) + // If there is no dependencies, we inject "require", "exports" and + // "module" as dependencies, to provide CommonJS compatibility. + deps = ["require", "exports", "module"]; + + var req = function(childId) { + return window.require(id, childId); + }; + + window.require.modules[id] = { + exports: {}, + factory: function() { + var module = this; + var returnExports = factory.apply(this, deps.map(function(dep) { + switch (dep) { + // Because "require", "exports" and "module" aren't actual + // dependencies, we must handle them seperately. + case "require": return req; + case "exports": return module.exports; + case "module": return module; + // But for all other dependencies, we can just go ahead and + // require them. + default: return req(dep); + } + })); + if (returnExports) + module.exports = returnExports; + return module; + } + }; +}; +window.define.amd = {}; +require.tlns = {}; +window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { + for (var i in topLevelNamespaces) + require.tlns[i] = topLevelNamespaces[i]; +}; + +window.initSender = function initSender() { + + var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; + var oop = window.require("ace/lib/oop"); + + var Sender = function() {}; + + (function() { + + oop.implement(this, EventEmitter); + + this.callback = function(data, callbackId) { + postMessage({ + type: "call", + id: callbackId, + data: data + }); + }; + + this.emit = function(name, data) { + postMessage({ + type: "event", + name: name, + data: data + }); + }; + + }).call(Sender.prototype); + + return new Sender(); +}; + +var main = window.main = null; +var sender = window.sender = null; + +window.onmessage = function(e) { + var msg = e.data; + if (msg.event && sender) { + sender._signal(msg.event, msg.data); + } + else if (msg.command) { + if (main[msg.command]) + main[msg.command].apply(main, msg.args); + else if (window[msg.command]) + window[msg.command].apply(window, msg.args); + else + throw new Error("Unknown command:" + msg.command); + } + else if (msg.init) { + window.initBaseUrls(msg.tlns); + require("ace/lib/es5-shim"); + sender = window.sender = window.initSender(); + var clazz = require(msg.module)[msg.classname]; + main = window.main = new clazz(sender); + } +}; +})(this); + +ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define("ace/range",["require","exports","module"], function(require, exports, module) { +"use strict"; +var comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; +var Range = function(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn + }; + + this.end = { + row: endRow, + column: endColumn + }; +}; + +(function() { + this.isEqual = function(range) { + return this.start.row === range.start.row && + this.end.row === range.end.row && + this.start.column === range.start.column && + this.end.column === range.end.column; + }; + this.toString = function() { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +} +}); + +ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) + this.$splitAndapplyLargeDelta(delta, 20000); + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length; + var row = delta.start.row; + var column = delta.start.column; + var from = 0, to = 0; + do { + from = to; + to += MAX - 1; + var chunk = lines.slice(from, to); + if (to > l) { + delta.lines = chunk; + delta.start.row = row + from; + delta.start.column = column; + break; + } + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } while(true); + }; + this.revertDelta = function(delta) { + this.applyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +ace.define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i0;)1&t&&(n+=e),t>>>=1,e+=e;return n},e.compact=function(e){var t,n,i,r;for(r=[],t=0,i=e.length;i>t;t++)n=e[t],n&&r.push(n);return r},e.count=function(e,t){var n,i;if(n=i=0,!t.length)return 1/0;for(;i=1+e.indexOf(t,i);)n++;return n},e.merge=function(e,t){return n(n({},e),t)},n=e.extend=function(e,t){var n,i;for(n in t)i=t[n],e[n]=i;return e},e.flatten=i=function(e){var t,n,r,s;for(n=[],r=0,s=e.length;s>r;r++)t=e[r],t instanceof Array?n=n.concat(i(t)):n.push(t);return n},e.del=function(e,t){var n;return n=e[t],delete e[t],n},e.some=null!=(r=Array.prototype.some)?r:function(e){var t,n,i;for(n=0,i=this.length;i>n;n++)if(t=this[n],e(t))return!0;return!1},e.invertLiterate=function(e){var t,n,i;return i=!0,n=function(){var n,r,s,o;for(s=e.split("\n"),o=[],n=0,r=s.length;r>n;n++)t=s[n],i&&/^([ ]{4}|[ ]{0,3}\t)/.test(t)?o.push(t):(i=/^\s*$/.test(t))?o.push(t):o.push("# "+t);return o}(),n.join("\n")},t=function(e,t){return t?{first_line:e.first_line,first_column:e.first_column,last_line:t.last_line,last_column:t.last_column}:e},e.addLocationDataFn=function(e,n){return function(i){return"object"==typeof i&&i.updateLocationDataIfMissing&&i.updateLocationDataIfMissing(t(e,n)),i}},e.locationDataToString=function(e){var t;return"2"in e&&"first_line"in e[2]?t=e[2]:"first_line"in e&&(t=e),t?t.first_line+1+":"+(t.first_column+1)+"-"+(t.last_line+1+":"+(t.last_column+1)):"No location data"},e.baseFileName=function(e,t,n){var i,r;return null==t&&(t=!1),null==n&&(n=!1),r=n?/\\|\//:/\//,i=e.split(r),e=i[i.length-1],t&&e.indexOf(".")>=0?(i=e.split("."),i.pop(),"coffee"===i[i.length-1]&&i.length>1&&i.pop(),i.join(".")):e},e.isCoffee=function(e){return/\.((lit)?coffee|coffee\.md)$/.test(e)},e.isLiterate=function(e){return/\.(litcoffee|coffee\.md)$/.test(e)},e.throwSyntaxError=function(e,t){var n;throw n=new SyntaxError(e),n.location=t,n.toString=o,n.stack=""+n,n},e.updateSyntaxError=function(e,t,n){return e.toString===o&&(e.code||(e.code=t),e.filename||(e.filename=n),e.stack=""+e),e},o=function(){var e,t,n,i,r,o,a,c,h,l,u,p,d,f,m;return this.code&&this.location?(u=this.location,a=u.first_line,o=u.first_column,h=u.last_line,c=u.last_column,null==h&&(h=a),null==c&&(c=o),r=this.filename||"[stdin]",e=this.code.split("\n")[a],m=o,i=a===h?c+1:e.length,l=e.slice(0,m).replace(/[^\s]/g," ")+s("^",i-m),"undefined"!=typeof process&&null!==process&&(n=(null!=(p=process.stdout)?p.isTTY:void 0)&&!(null!=(d=process.env)?d.NODE_DISABLE_COLORS:void 0)),(null!=(f=this.colorful)?f:n)&&(t=function(e){return""+e+""},e=e.slice(0,m)+t(e.slice(m,i))+e.slice(i),l=t(l)),r+":"+(a+1)+":"+(o+1)+": error: "+this.message+"\n"+e+"\n"+l):Error.prototype.toString.call(this)},e.nameWhitespaceCharacter=function(e){switch(e){case" ":return"space";case"\n":return"newline";case"\r":return"carriage return";case" ":return"tab";default:return e}}}.call(this),t.exports}(),_dereq_["./rewriter"]=function(){var e={},t={exports:e};return function(){var t,n,i,r,s,o,a,c,h,l,u,p,d,f,m,g,v,y,b,k=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1},w=[].slice;for(f=function(e,t,n){var i;return i=[e,t],i.generated=!0,n&&(i.origin=n),i},e.Rewriter=function(){function e(){}return e.prototype.rewrite=function(e){return this.tokens=e,this.removeLeadingNewlines(),this.closeOpenCalls(),this.closeOpenIndexes(),this.normalizeLines(),this.tagPostfixConditionals(),this.addImplicitBracesAndParens(),this.addLocationDataToGeneratedTokens(),this.tokens},e.prototype.scanTokens=function(e){var t,n,i;for(i=this.tokens,t=0;n=i[t];)t+=e.call(this,n,t,i);return!0},e.prototype.detectEnd=function(e,t,n){var i,o,a,c,h;for(h=this.tokens,i=0;c=h[e];){if(0===i&&t.call(this,c,e))return n.call(this,c,e);if(!c||0>i)return n.call(this,c,e-1);o=c[0],k.call(s,o)>=0?i+=1:(a=c[0],k.call(r,a)>=0&&(i-=1)),e+=1}return e-1},e.prototype.removeLeadingNewlines=function(){var e,t,n,i,r;for(i=this.tokens,e=t=0,n=i.length;n>t&&(r=i[e][0],"TERMINATOR"===r);e=++t);return e?this.tokens.splice(0,e):void 0},e.prototype.closeOpenCalls=function(){var e,t;return t=function(e,t){var n;return")"===(n=e[0])||"CALL_END"===n||"OUTDENT"===e[0]&&")"===this.tag(t-1)},e=function(e,t){return this.tokens["OUTDENT"===e[0]?t-1:t][0]="CALL_END"},this.scanTokens(function(n,i){return"CALL_START"===n[0]&&this.detectEnd(i+1,t,e),1})},e.prototype.closeOpenIndexes=function(){var e,t;return t=function(e){var t;return"]"===(t=e[0])||"INDEX_END"===t},e=function(e){return e[0]="INDEX_END"},this.scanTokens(function(n,i){return"INDEX_START"===n[0]&&this.detectEnd(i+1,t,e),1})},e.prototype.indexOfTag=function(){var e,t,n,i,r,s,o;for(t=arguments[0],r=arguments.length>=2?w.call(arguments,1):[],e=0,n=i=0,s=r.length;s>=0?s>i:i>s;n=s>=0?++i:--i){for(;"HERECOMMENT"===this.tag(t+n+e);)e+=2;if(null!=r[n]&&("string"==typeof r[n]&&(r[n]=[r[n]]),o=this.tag(t+n+e),0>k.call(r[n],o)))return-1}return t+n+e-1},e.prototype.looksObjectish=function(e){var t,n;return this.indexOfTag(e,"@",null,":")>-1||this.indexOfTag(e,null,":")>-1?!0:(n=this.indexOfTag(e,s),n>-1&&(t=null,this.detectEnd(n+1,function(e){var t;return t=e[0],k.call(r,t)>=0},function(e,n){return t=n}),":"===this.tag(t+1))?!0:!1)},e.prototype.findTagsBackwards=function(e,t){var n,i,o,a,c,h,l;for(n=[];e>=0&&(n.length||(a=this.tag(e),0>k.call(t,a)&&(c=this.tag(e),0>k.call(s,c)||this.tokens[e].generated)&&(h=this.tag(e),0>k.call(u,h))));)i=this.tag(e),k.call(r,i)>=0&&n.push(this.tag(e)),o=this.tag(e),k.call(s,o)>=0&&n.length&&n.pop(),e-=1;return l=this.tag(e),k.call(t,l)>=0},e.prototype.addImplicitBracesAndParens=function(){var e,t;return e=[],t=null,this.scanTokens(function(i,l,p){var d,m,g,v,y,b,w,T,C,E,F,N,L,x,S,D,R,A,I,_,O,$,j,M,B,V,P,U;if(U=i[0],F=(N=l>0?p[l-1]:[])[0],C=(p.length-1>l?p[l+1]:[])[0],j=function(){return e[e.length-1]},M=l,g=function(e){return l-M+e},v=function(){var e,t;return null!=(e=j())?null!=(t=e[2])?t.ours:void 0:void 0},y=function(){var e;return v()&&"("===(null!=(e=j())?e[0]:void 0)},w=function(){var e;return v()&&"{"===(null!=(e=j())?e[0]:void 0)},b=function(){var e;return v&&"CONTROL"===(null!=(e=j())?e[0]:void 0)},B=function(t){var n;return n=null!=t?t:l,e.push(["(",n,{ours:!0}]),p.splice(n,0,f("CALL_START","(")),null==t?l+=1:void 0},d=function(){return e.pop(),p.splice(l,0,f("CALL_END",")",["","end of input",i[2]])),l+=1},V=function(t,n){var r,s;return null==n&&(n=!0),r=null!=t?t:l,e.push(["{",r,{sameLine:!0,startsLine:n,ours:!0}]),s=new String("{"),s.generated=!0,p.splice(r,0,f("{",s,i)),null==t?l+=1:void 0},m=function(t){return t=null!=t?t:l,e.pop(),p.splice(t,0,f("}","}",i)),l+=1},y()&&("IF"===U||"TRY"===U||"FINALLY"===U||"CATCH"===U||"CLASS"===U||"SWITCH"===U))return e.push(["CONTROL",l,{ours:!0}]),g(1);if("INDENT"===U&&v()){if("=>"!==F&&"->"!==F&&"["!==F&&"("!==F&&","!==F&&"{"!==F&&"TRY"!==F&&"ELSE"!==F&&"="!==F)for(;y();)d();return b()&&e.pop(),e.push([U,l]),g(1)}if(k.call(s,U)>=0)return e.push([U,l]),g(1);if(k.call(r,U)>=0){for(;v();)y()?d():w()?m():e.pop();t=e.pop()}if((k.call(c,U)>=0&&i.spaced||"?"===U&&l>0&&!p[l-1].spaced)&&(k.call(o,C)>=0||k.call(h,C)>=0&&!(null!=(L=p[l+1])?L.spaced:void 0)&&!(null!=(x=p[l+1])?x.newLine:void 0)))return"?"===U&&(U=i[0]="FUNC_EXIST"),B(l+1),g(2);if(k.call(c,U)>=0&&this.indexOfTag(l+1,"INDENT")>-1&&this.looksObjectish(l+2)&&!this.findTagsBackwards(l,["CLASS","EXTENDS","IF","CATCH","SWITCH","LEADING_WHEN","FOR","WHILE","UNTIL"]))return B(l+1),e.push(["INDENT",l+2]),g(3);if(":"===U){for(I=function(){var e;switch(!1){case e=this.tag(l-1),0>k.call(r,e):return t[1];case"@"!==this.tag(l-2):return l-2;default:return l-1}}.call(this);"HERECOMMENT"===this.tag(I-2);)I-=2;return this.insideForDeclaration="FOR"===C,P=0===I||(S=this.tag(I-1),k.call(u,S)>=0)||p[I-1].newLine,j()&&(D=j(),$=D[0],O=D[1],("{"===$||"INDENT"===$&&"{"===this.tag(O-1))&&(P||","===this.tag(I-1)||"{"===this.tag(I-1)))?g(1):(V(I,!!P),g(2))}if(w()&&k.call(u,U)>=0&&(j()[2].sameLine=!1),T="OUTDENT"===F||N.newLine,k.call(a,U)>=0||k.call(n,U)>=0&&T)for(;v();)if(R=j(),$=R[0],O=R[1],A=R[2],_=A.sameLine,P=A.startsLine,y()&&","!==F)d();else if(w()&&!this.insideForDeclaration&&_&&"TERMINATOR"!==U&&":"!==F)m();else{if(!w()||"TERMINATOR"!==U||","===F||P&&this.looksObjectish(l+1))break;if("HERECOMMENT"===C)return g(1);m()}if(!(","!==U||this.looksObjectish(l+1)||!w()||this.insideForDeclaration||"TERMINATOR"===C&&this.looksObjectish(l+2)))for(E="OUTDENT"===C?1:0;w();)m(l+E);return g(1)})},e.prototype.addLocationDataToGeneratedTokens=function(){return this.scanTokens(function(e,t,n){var i,r,s,o,a,c;return e[2]?1:e.generated||e.explicit?("{"===e[0]&&(s=null!=(a=n[t+1])?a[2]:void 0)?(r=s.first_line,i=s.first_column):(o=null!=(c=n[t-1])?c[2]:void 0)?(r=o.last_line,i=o.last_column):r=i=0,e[2]={first_line:r,first_column:i,last_line:r,last_column:i},1):1})},e.prototype.normalizeLines=function(){var e,t,r,s,o;return o=r=s=null,t=function(e,t){var r,s,a,c;return";"!==e[1]&&(r=e[0],k.call(p,r)>=0)&&!("TERMINATOR"===e[0]&&(s=this.tag(t+1),k.call(i,s)>=0))&&!("ELSE"===e[0]&&"THEN"!==o)&&!!("CATCH"!==(a=e[0])&&"FINALLY"!==a||"->"!==o&&"=>"!==o)||(c=e[0],k.call(n,c)>=0&&this.tokens[t-1].newLine)},e=function(e,t){return this.tokens.splice(","===this.tag(t-1)?t-1:t,0,s)},this.scanTokens(function(n,a,c){var h,l,u,p,f,m;if(m=n[0],"TERMINATOR"===m){if("ELSE"===this.tag(a+1)&&"OUTDENT"!==this.tag(a-1))return c.splice.apply(c,[a,1].concat(w.call(this.indentation()))),1;if(u=this.tag(a+1),k.call(i,u)>=0)return c.splice(a,1),0}if("CATCH"===m)for(h=l=1;2>=l;h=++l)if("OUTDENT"===(p=this.tag(a+h))||"TERMINATOR"===p||"FINALLY"===p)return c.splice.apply(c,[a+h,0].concat(w.call(this.indentation()))),2+h;return k.call(d,m)>=0&&"INDENT"!==this.tag(a+1)&&("ELSE"!==m||"IF"!==this.tag(a+1))?(o=m,f=this.indentation(c[a]),r=f[0],s=f[1],"THEN"===o&&(r.fromThen=!0),c.splice(a+1,0,r),this.detectEnd(a+2,t,e),"THEN"===m&&c.splice(a,1),1):1})},e.prototype.tagPostfixConditionals=function(){var e,t,n;return n=null,t=function(e,t){var n,i;return i=e[0],n=this.tokens[t-1][0],"TERMINATOR"===i||"INDENT"===i&&0>k.call(d,n)},e=function(e){return"INDENT"!==e[0]||e.generated&&!e.fromThen?n[0]="POST_"+n[0]:void 0},this.scanTokens(function(i,r){return"IF"!==i[0]?1:(n=i,this.detectEnd(r+1,t,e),1)})},e.prototype.indentation=function(e){var t,n;return t=["INDENT",2],n=["OUTDENT",2],e?(t.generated=n.generated=!0,t.origin=n.origin=e):t.explicit=n.explicit=!0,[t,n]},e.prototype.generate=f,e.prototype.tag=function(e){var t;return null!=(t=this.tokens[e])?t[0]:void 0},e}(),t=[["(",")"],["[","]"],["{","}"],["INDENT","OUTDENT"],["CALL_START","CALL_END"],["PARAM_START","PARAM_END"],["INDEX_START","INDEX_END"],["STRING_START","STRING_END"],["REGEX_START","REGEX_END"]],e.INVERSES=l={},s=[],r=[],m=0,v=t.length;v>m;m++)y=t[m],g=y[0],b=y[1],s.push(l[b]=g),r.push(l[g]=b);i=["CATCH","THEN","ELSE","FINALLY"].concat(r),c=["IDENTIFIER","SUPER",")","CALL_END","]","INDEX_END","@","THIS"],o=["IDENTIFIER","NUMBER","STRING","STRING_START","JS","REGEX","REGEX_START","NEW","PARAM_START","CLASS","IF","TRY","SWITCH","THIS","BOOL","NULL","UNDEFINED","UNARY","YIELD","UNARY_MATH","SUPER","THROW","@","->","=>","[","(","{","--","++"],h=["+","-"],a=["POST_IF","FOR","WHILE","UNTIL","WHEN","BY","LOOP","TERMINATOR"],d=["ELSE","->","=>","TRY","FINALLY","THEN"],p=["TERMINATOR","CATCH","FINALLY","ELSE","OUTDENT","LEADING_WHEN"],u=["TERMINATOR","INDENT","OUTDENT"],n=[".","?.","::","?::"]}.call(this),t.exports}(),_dereq_["./lexer"]=function(){var e={},t={exports:e};return function(){var t,n,i,r,s,o,a,c,h,l,u,p,d,f,m,g,v,y,b,k,w,T,C,E,F,N,L,x,S,D,R,A,I,_,O,$,j,M,B,V,P,U,G,H,q,X,W,Y,K,z,J,Q,Z,et,tt,nt,it,rt,st,ot,at,ct,ht,lt,ut=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1};ot=_dereq_("./rewriter"),P=ot.Rewriter,w=ot.INVERSES,at=_dereq_("./helpers"),nt=at.count,ht=at.starts,tt=at.compact,ct=at.repeat,it=at.invertLiterate,st=at.locationDataToString,lt=at.throwSyntaxError,e.Lexer=S=function(){function e(){}return e.prototype.tokenize=function(e,t){var n,i,r,s;for(null==t&&(t={}),this.literate=t.literate,this.indent=0,this.baseIndent=0,this.indebt=0,this.outdebt=0,this.indents=[],this.ends=[],this.tokens=[],this.chunkLine=t.line||0,this.chunkColumn=t.column||0,e=this.clean(e),r=0;this.chunk=e.slice(r);)if(n=this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.stringToken()||this.numberToken()||this.regexToken()||this.jsToken()||this.literalToken(),s=this.getLineAndColumnFromChunk(n),this.chunkLine=s[0],this.chunkColumn=s[1],r+=n,t.untilBalanced&&0===this.ends.length)return{tokens:this.tokens,index:r};return this.closeIndentation(),(i=this.ends.pop())&&this.error("missing "+i.tag,i.origin[2]),t.rewrite===!1?this.tokens:(new P).rewrite(this.tokens)},e.prototype.clean=function(e){return e.charCodeAt(0)===t&&(e=e.slice(1)),e=e.replace(/\r/g,"").replace(z,""),et.test(e)&&(e="\n"+e,this.chunkLine--),this.literate&&(e=it(e)),e},e.prototype.identifierToken=function(){var e,t,n,i,r,c,h,l,u,p,d,f,m,g,y,b;return(l=v.exec(this.chunk))?(h=l[0],r=l[1],t=l[2],c=r.length,u=void 0,"own"===r&&"FOR"===this.tag()?(this.token("OWN",r),r.length):"from"===r&&"YIELD"===this.tag()?(this.token("FROM",r),r.length):(d=this.tokens,p=d[d.length-1],i=t||null!=p&&("."===(f=p[0])||"?."===f||"::"===f||"?::"===f||!p.spaced&&"@"===p[0]),y="IDENTIFIER",!i&&(ut.call(E,r)>=0||ut.call(a,r)>=0)&&(y=r.toUpperCase(),"WHEN"===y&&(m=this.tag(),ut.call(N,m)>=0)?y="LEADING_WHEN":"FOR"===y?this.seenFor=!0:"UNLESS"===y?y="IF":ut.call(J,y)>=0?y="UNARY":ut.call(B,y)>=0&&("INSTANCEOF"!==y&&this.seenFor?(y="FOR"+y,this.seenFor=!1):(y="RELATION","!"===this.value()&&(u=this.tokens.pop(),r="!"+r)))),ut.call(C,r)>=0&&(i?(y="IDENTIFIER",r=new String(r),r.reserved=!0):ut.call(V,r)>=0&&this.error("reserved word '"+r+"'",{length:r.length})),i||(ut.call(s,r)>=0&&(e=r,r=o[r]),y=function(){switch(r){case"!":return"UNARY";case"==":case"!=":return"COMPARE";case"&&":case"||":return"LOGIC";case"true":case"false":return"BOOL";case"break":case"continue":return"STATEMENT";default:return y}}()),b=this.token(y,r,0,c),e&&(b.origin=[y,e,b[2]]),b.variable=!i,u&&(g=[u[2].first_line,u[2].first_column],b[2].first_line=g[0],b[2].first_column=g[1]),t&&(n=h.lastIndexOf(":"),this.token(":",":",n,t.length)),h.length)):0},e.prototype.numberToken=function(){var e,t,n,i,r;return(n=I.exec(this.chunk))?(i=n[0],t=i.length,/^0[BOX]/.test(i)?this.error("radix prefix in '"+i+"' must be lowercase",{offset:1}):/E/.test(i)&&!/^0x/.test(i)?this.error("exponential notation in '"+i+"' must be indicated with a lowercase 'e'",{offset:i.indexOf("E")}):/^0\d*[89]/.test(i)?this.error("decimal literal '"+i+"' must not be prefixed with '0'",{length:t}):/^0\d+/.test(i)&&this.error("octal literal '"+i+"' must be prefixed with '0o'",{length:t}),(r=/^0o([0-7]+)/.exec(i))&&(i="0x"+parseInt(r[1],8).toString(16)),(e=/^0b([01]+)/.exec(i))&&(i="0x"+parseInt(e[1],2).toString(16)),this.token("NUMBER",i,0,t),t):0},e.prototype.stringToken=function(){var e,t,n,i,r,s,o,a,c,h,l,u,m,g,v,y;if(l=(Y.exec(this.chunk)||[])[0],!l)return 0;if(g=function(){switch(l){case"'":return W;case'"':return q;case"'''":return f;case'"""':return p}}(),s=3===l.length,u=this.matchWithInterpolations(g,l),y=u.tokens,r=u.index,e=y.length-1,n=l.charAt(0),s){for(a=null,i=function(){var e,t,n;for(n=[],o=e=0,t=y.length;t>e;o=++e)v=y[o],"NEOSTRING"===v[0]&&n.push(v[1]);return n}().join("#{}");h=d.exec(i);)t=h[1],(null===a||(m=t.length)>0&&a.length>m)&&(a=t);a&&(c=RegExp("^"+a,"gm")),this.mergeInterpolationTokens(y,{delimiter:n},function(t){return function(n,i){return n=t.formatString(n),0===i&&(n=n.replace(F,"")),i===e&&(n=n.replace(K,"")),c&&(n=n.replace(c,"")),n}}(this))}else this.mergeInterpolationTokens(y,{delimiter:n},function(t){return function(n,i){return n=t.formatString(n),n=n.replace(G,function(t,r){return 0===i&&0===r||i===e&&r+t.length===n.length?"":" "})}}(this));return r},e.prototype.commentToken=function(){var e,t,n;return(n=this.chunk.match(c))?(e=n[0],t=n[1],t&&((n=u.exec(e))&&this.error("block comments cannot contain "+n[0],{offset:n.index,length:n[0].length}),t.indexOf("\n")>=0&&(t=t.replace(RegExp("\\n"+ct(" ",this.indent),"g"),"\n")),this.token("HERECOMMENT",t,0,e.length)),e.length):0},e.prototype.jsToken=function(){var e,t;return"`"===this.chunk.charAt(0)&&(e=T.exec(this.chunk))?(this.token("JS",(t=e[0]).slice(1,-1),0,t.length),t.length):0},e.prototype.regexToken=function(){var e,t,n,r,s,o,a,c,h,l,u,p,d;switch(!1){case!(o=M.exec(this.chunk)):this.error("regular expressions cannot begin with "+o[2],{offset:o.index+o[1].length});break;case!(o=this.matchWithInterpolations(m,"///")):d=o.tokens,s=o.index;break;case!(o=$.exec(this.chunk)):if(p=o[0],e=o[1],t=o[2],this.validateEscapes(e,{isRegex:!0,offsetInChunk:1}),s=p.length,h=this.tokens,c=h[h.length-1],c)if(c.spaced&&(l=c[0],ut.call(i,l)>=0)){if(!t||O.test(p))return 0}else if(u=c[0],ut.call(A,u)>=0)return 0;t||this.error("missing / (unclosed regex)");break;default:return 0}switch(r=j.exec(this.chunk.slice(s))[0],n=s+r.length,a=this.makeToken("REGEX",null,0,n),!1){case!!Z.test(r):this.error("invalid regular expression flags "+r,{offset:s,length:r.length});break;case!(p||1===d.length):null==e&&(e=this.formatHeregex(d[0][1])),this.token("REGEX",""+this.makeDelimitedLiteral(e,{delimiter:"/"})+r,0,n,a);break;default:this.token("REGEX_START","(",0,0,a),this.token("IDENTIFIER","RegExp",0,0),this.token("CALL_START","(",0,0),this.mergeInterpolationTokens(d,{delimiter:'"',"double":!0},this.formatHeregex),r&&(this.token(",",",",s,0),this.token("STRING",'"'+r+'"',s,r.length)),this.token(")",")",n,0),this.token("REGEX_END",")",n,0)}return n},e.prototype.lineToken=function(){var e,t,n,i,r;if(!(n=R.exec(this.chunk)))return 0;if(t=n[0],this.seenFor=!1,r=t.length-1-t.lastIndexOf("\n"),i=this.unfinished(),r-this.indebt===this.indent)return i?this.suppressNewlines():this.newlineToken(0),t.length;if(r>this.indent){if(i)return this.indebt=r-this.indent,this.suppressNewlines(),t.length;if(!this.tokens.length)return this.baseIndent=this.indent=r,t.length;e=r-this.indent+this.outdebt,this.token("INDENT",e,t.length-r,r),this.indents.push(e),this.ends.push({tag:"OUTDENT"}),this.outdebt=this.indebt=0,this.indent=r}else this.baseIndent>r?this.error("missing indentation",{offset:t.length}):(this.indebt=0,this.outdentToken(this.indent-r,i,t.length));return t.length},e.prototype.outdentToken=function(e,t,n){var i,r,s,o;for(i=this.indent-e;e>0;)s=this.indents[this.indents.length-1],s?s===this.outdebt?(e-=this.outdebt,this.outdebt=0):this.outdebt>s?(this.outdebt-=s,e-=s):(r=this.indents.pop()+this.outdebt,n&&(o=this.chunk[n],ut.call(y,o)>=0)&&(i-=r-e,e=r),this.outdebt=0,this.pair("OUTDENT"),this.token("OUTDENT",e,0,n),e-=r):e=0;for(r&&(this.outdebt-=e);";"===this.value();)this.tokens.pop();return"TERMINATOR"===this.tag()||t||this.token("TERMINATOR","\n",n,0),this.indent=i,this},e.prototype.whitespaceToken=function(){var e,t,n,i;return(e=et.exec(this.chunk))||(t="\n"===this.chunk.charAt(0))?(i=this.tokens,n=i[i.length-1],n&&(n[e?"spaced":"newLine"]=!0),e?e[0].length:0):0},e.prototype.newlineToken=function(e){for(;";"===this.value();)this.tokens.pop();return"TERMINATOR"!==this.tag()&&this.token("TERMINATOR","\n",e,0),this},e.prototype.suppressNewlines=function(){return"\\"===this.value()&&this.tokens.pop(),this},e.prototype.literalToken=function(){var e,t,n,s,o,a,c,u,p,d;if((e=_.exec(this.chunk))?(d=e[0],r.test(d)&&this.tagParameters()):d=this.chunk.charAt(0),u=d,n=this.tokens,t=n[n.length-1],"="===d&&t&&(!t[1].reserved&&(s=t[1],ut.call(C,s)>=0)&&(t.origin&&(t=t.origin),this.error("reserved word '"+t[1]+"' can't be assigned",t[2])),"||"===(o=t[1])||"&&"===o))return t[0]="COMPOUND_ASSIGN",t[1]+="=",d.length;if(";"===d)this.seenFor=!1,u="TERMINATOR";else if(ut.call(D,d)>=0)u="MATH";else if(ut.call(h,d)>=0)u="COMPARE";else if(ut.call(l,d)>=0)u="COMPOUND_ASSIGN";else if(ut.call(J,d)>=0)u="UNARY";else if(ut.call(Q,d)>=0)u="UNARY_MATH";else if(ut.call(U,d)>=0)u="SHIFT";else if(ut.call(x,d)>=0||"?"===d&&(null!=t?t.spaced:void 0))u="LOGIC";else if(t&&!t.spaced)if("("===d&&(a=t[0],ut.call(i,a)>=0))"?"===t[0]&&(t[0]="FUNC_EXIST"),u="CALL_START";else if("["===d&&(c=t[0],ut.call(b,c)>=0))switch(u="INDEX_START",t[0]){case"?":t[0]="INDEX_SOAK"}switch(p=this.makeToken(u,d),d){case"(":case"{":case"[":this.ends.push({tag:w[d],origin:p});break;case")":case"}":case"]":this.pair(d)}return this.tokens.push(p),d.length},e.prototype.tagParameters=function(){var e,t,n,i;if(")"!==this.tag())return this;for(t=[],i=this.tokens,e=i.length,i[--e][0]="PARAM_END";n=i[--e];)switch(n[0]){case")":t.push(n);break;case"(":case"CALL_START":if(!t.length)return"("===n[0]?(n[0]="PARAM_START",this):this;t.pop()}return this},e.prototype.closeIndentation=function(){return this.outdentToken(this.indent)},e.prototype.matchWithInterpolations=function(t,n){var i,r,s,o,a,c,h,l,u,p,d,f,m,g,v;if(v=[],l=n.length,this.chunk.slice(0,l)!==n)return null;for(m=this.chunk.slice(l);;){if(g=t.exec(m)[0],this.validateEscapes(g,{isRegex:"/"===n.charAt(0),offsetInChunk:l}),v.push(this.makeToken("NEOSTRING",g,l)),m=m.slice(g.length),l+=g.length,"#{"!==m.slice(0,2))break;p=this.getLineAndColumnFromChunk(l+1),c=p[0],r=p[1],d=(new e).tokenize(m.slice(1),{line:c,column:r,untilBalanced:!0}),h=d.tokens,o=d.index,o+=1,u=h[0],i=h[h.length-1],u[0]=u[1]="(",i[0]=i[1]=")",i.origin=["","end of interpolation",i[2]],"TERMINATOR"===(null!=(f=h[1])?f[0]:void 0)&&h.splice(1,1),v.push(["TOKENS",h]),m=m.slice(o),l+=o}return m.slice(0,n.length)!==n&&this.error("missing "+n,{length:n.length}),s=v[0],a=v[v.length-1],s[2].first_column-=n.length,a[2].last_column+=n.length,0===a[1].length&&(a[2].last_column-=1),{tokens:v,index:l+n.length}},e.prototype.mergeInterpolationTokens=function(e,t,n){var i,r,s,o,a,c,h,l,u,p,d,f,m,g,v,y;for(e.length>1&&(u=this.token("STRING_START","(",0,0)),s=this.tokens.length,o=a=0,h=e.length;h>a;o=++a){switch(g=e[o],m=g[0],y=g[1],m){case"TOKENS":if(2===y.length)continue;l=y[0],v=y;break;case"NEOSTRING":if(i=n(g[1],o),0===i.length){if(0!==o)continue;r=this.tokens.length}2===o&&null!=r&&this.tokens.splice(r,2),g[0]="STRING",g[1]=this.makeDelimitedLiteral(i,t),l=g,v=[g]}this.tokens.length>s&&(p=this.token("+","+"),p[2]={first_line:l[2].first_line,first_column:l[2].first_column,last_line:l[2].first_line,last_column:l[2].first_column}),(d=this.tokens).push.apply(d,v)}return u?(c=e[e.length-1],u.origin=["STRING",null,{first_line:u[2].first_line,first_column:u[2].first_column,last_line:c[2].last_line,last_column:c[2].last_column}],f=this.token("STRING_END",")"),f[2]={first_line:c[2].last_line,first_column:c[2].last_column,last_line:c[2].last_line,last_column:c[2].last_column}):void 0},e.prototype.pair=function(e){var t,n,i,r,s;return i=this.ends,n=i[i.length-1],e!==(s=null!=n?n.tag:void 0)?("OUTDENT"!==s&&this.error("unmatched "+e),r=this.indents,t=r[r.length-1],this.outdentToken(t,!0),this.pair(e)):this.ends.pop()},e.prototype.getLineAndColumnFromChunk=function(e){var t,n,i,r,s;return 0===e?[this.chunkLine,this.chunkColumn]:(s=e>=this.chunk.length?this.chunk:this.chunk.slice(0,+(e-1)+1||9e9),i=nt(s,"\n"),t=this.chunkColumn,i>0?(r=s.split("\n"),n=r[r.length-1],t=n.length):t+=s.length,[this.chunkLine+i,t])},e.prototype.makeToken=function(e,t,n,i){var r,s,o,a,c;return null==n&&(n=0),null==i&&(i=t.length),s={},o=this.getLineAndColumnFromChunk(n),s.first_line=o[0],s.first_column=o[1],r=Math.max(0,i-1),a=this.getLineAndColumnFromChunk(n+r),s.last_line=a[0],s.last_column=a[1],c=[e,t,s]},e.prototype.token=function(e,t,n,i,r){var s;return s=this.makeToken(e,t,n,i),r&&(s.origin=r),this.tokens.push(s),s},e.prototype.tag=function(){var e,t;return e=this.tokens,t=e[e.length-1],null!=t?t[0]:void 0},e.prototype.value=function(){var e,t;return e=this.tokens,t=e[e.length-1],null!=t?t[1]:void 0},e.prototype.unfinished=function(){var e;return L.test(this.chunk)||"\\"===(e=this.tag())||"."===e||"?."===e||"?::"===e||"UNARY"===e||"MATH"===e||"UNARY_MATH"===e||"+"===e||"-"===e||"YIELD"===e||"**"===e||"SHIFT"===e||"RELATION"===e||"COMPARE"===e||"LOGIC"===e||"THROW"===e||"EXTENDS"===e},e.prototype.formatString=function(e){return e.replace(X,"$1")},e.prototype.formatHeregex=function(e){return e.replace(g,"$1$2")},e.prototype.validateEscapes=function(e,t){var n,i,r,s,o,a,c,h;return null==t&&(t={}),s=k.exec(e),!s||(s[0],n=s[1],a=s[2],i=s[3],h=s[4],t.isRegex&&a&&"0"!==a.charAt(0))?void 0:(o=a?"octal escape sequences are not allowed":"invalid escape sequence",r="\\"+(a||i||h),this.error(o+" "+r,{offset:(null!=(c=t.offsetInChunk)?c:0)+s.index+n.length,length:r.length}))},e.prototype.makeDelimitedLiteral=function(e,t){var n;return null==t&&(t={}),""===e&&"/"===t.delimiter&&(e="(?:)"),n=RegExp("(\\\\\\\\)|(\\\\0(?=[1-7]))|\\\\?("+t.delimiter+")|\\\\?(?:(\\n)|(\\r)|(\\u2028)|(\\u2029))|(\\\\.)","g"),e=e.replace(n,function(e,n,i,r,s,o,a,c,h){switch(!1){case!n:return t.double?n+n:n;case!i:return"\\x00";case!r:return"\\"+r;case!s:return"\\n";case!o:return"\\r";case!a:return"\\u2028";case!c:return"\\u2029";case!h:return t.double?"\\"+h:h}}),""+t.delimiter+e+t.delimiter},e.prototype.error=function(e,t){var n,i,r,s,o,a;return null==t&&(t={}),r="first_line"in t?t:(o=this.getLineAndColumnFromChunk(null!=(s=t.offset)?s:0),i=o[0],n=o[1],o,{first_line:i,first_column:n,last_column:n+(null!=(a=t.length)?a:1)-1}),lt(e,r)},e}(),E=["true","false","null","this","new","delete","typeof","in","instanceof","return","throw","break","continue","debugger","yield","if","else","switch","for","while","do","try","catch","finally","class","extends","super"],a=["undefined","then","unless","until","loop","of","by","when"],o={and:"&&",or:"||",is:"==",isnt:"!=",not:"!",yes:"true",no:"false",on:"true",off:"false"},s=function(){var e;e=[];for(rt in o)e.push(rt);return e}(),a=a.concat(s),V=["case","default","function","var","void","with","const","let","enum","export","import","native","implements","interface","package","private","protected","public","static"],H=["arguments","eval","yield*"],C=E.concat(V).concat(H),e.RESERVED=V.concat(E).concat(a).concat(H),e.STRICT_PROSCRIBED=H,t=65279,v=/^(?!\d)((?:(?!\s)[$\w\x7f-\uffff])+)([^\n\S]*:(?!:))?/,I=/^0b[01]+|^0o[0-7]+|^0x[\da-f]+|^\d*\.?\d+(?:e[+-]?\d+)?/i,_=/^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>*\/%])\2=?|\?(\.|::)|\.{2,3})/,et=/^[^\n\S]+/,c=/^###([^#][\s\S]*?)(?:###[^\n\S]*|###$)|^(?:\s*#(?!##[^#]).*)+/,r=/^[-=]>/,R=/^(?:\n[^\n\S]*)+/,T=/^`[^\\`]*(?:\\.[^\\`]*)*`/,Y=/^(?:'''|"""|'|")/,W=/^(?:[^\\']|\\[\s\S])*/,q=/^(?:[^\\"#]|\\[\s\S]|\#(?!\{))*/,f=/^(?:[^\\']|\\[\s\S]|'(?!''))*/,p=/^(?:[^\\"#]|\\[\s\S]|"(?!"")|\#(?!\{))*/,X=/((?:\\\\)+)|\\[^\S\n]*\n\s*/g,G=/\s*\n\s*/g,d=/\n+([^\n\S]*)(?=\S)/g,$=/^\/(?!\/)((?:[^[\/\n\\]|\\[^\n]|\[(?:\\[^\n]|[^\]\n\\])*\])*)(\/)?/,j=/^\w*/,Z=/^(?!.*(.).*\1)[imgy]*$/,m=/^(?:[^\\\/#]|\\[\s\S]|\/(?!\/\/)|\#(?!\{))*/,g=/((?:\\\\)+)|\\(\s)|\s+(?:#.*)?/g,M=/^(\/|\/{3}\s*)(\*)/,O=/^\/=?\s/,u=/\*\//,L=/^\s*(?:,|\??\.(?![.\d])|::)/,k=/((?:^|[^\\])(?:\\\\)*)\\(?:(0[0-7]|[1-7])|(x(?![\da-fA-F]{2}).{0,2})|(u(?![\da-fA-F]{4}).{0,4}))/,F=/^[^\n\S]*\n/,K=/\n[^\n\S]*$/,z=/\s+$/,l=["-=","+=","/=","*=","%=","||=","&&=","?=","<<=",">>=",">>>=","&=","^=","|=","**=","//=","%%="],J=["NEW","TYPEOF","DELETE","DO"],Q=["!","~"],x=["&&","||","&","|","^"],U=["<<",">>",">>>"],h=["==","!=","<",">","<=",">="],D=["*","/","%","//","%%"],B=["IN","OF","INSTANCEOF"],n=["TRUE","FALSE"],i=["IDENTIFIER",")","]","?","@","THIS","SUPER"],b=i.concat(["NUMBER","STRING","STRING_END","REGEX","REGEX_END","BOOL","NULL","UNDEFINED","}","::"]),A=b.concat(["++","--"]),N=["INDENT","OUTDENT","TERMINATOR"],y=[")","}","]"]}.call(this),t.exports}(),_dereq_["./parser"]=function(){var e={},t={exports:e},n=function(){function e(){this.yy={}}var t=function(e,t,n,i){for(n=n||{},i=e.length;i--;n[e[i]]=t);return n},n=[1,20],i=[1,75],r=[1,71],s=[1,76],o=[1,77],a=[1,73],c=[1,74],h=[1,50],l=[1,52],u=[1,53],p=[1,54],d=[1,55],f=[1,45],m=[1,46],g=[1,27],v=[1,60],y=[1,61],b=[1,70],k=[1,43],w=[1,26],T=[1,58],C=[1,59],E=[1,57],F=[1,38],N=[1,44],L=[1,56],x=[1,65],S=[1,66],D=[1,67],R=[1,68],A=[1,42],I=[1,64],_=[1,29],O=[1,30],$=[1,31],j=[1,32],M=[1,33],B=[1,34],V=[1,35],P=[1,78],U=[1,6,26,34,108],G=[1,88],H=[1,81],q=[1,80],X=[1,79],W=[1,82],Y=[1,83],K=[1,84],z=[1,85],J=[1,86],Q=[1,87],Z=[1,91],et=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],tt=[1,97],nt=[1,98],it=[1,99],rt=[1,100],st=[1,102],ot=[1,103],at=[1,96],ct=[2,112],ht=[1,6,25,26,34,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],lt=[2,79],ut=[1,108],pt=[2,58],dt=[1,112],ft=[1,117],mt=[1,118],gt=[1,120],vt=[1,6,25,26,34,46,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],yt=[2,76],bt=[1,6,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],kt=[1,155],wt=[1,157],Tt=[1,152],Ct=[1,6,25,26,34,46,55,60,63,72,73,74,75,77,79,80,84,86,90,91,92,97,99,108,110,111,112,116,117,132,135,136,139,140,141,142,143,144,145,146,147,148],Et=[2,95],Ft=[1,6,25,26,34,49,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],Nt=[1,6,25,26,34,46,49,55,60,63,72,73,74,75,77,79,80,84,86,90,91,92,97,99,108,110,111,112,116,117,123,124,132,135,136,139,140,141,142,143,144,145,146,147,148],Lt=[1,206],xt=[1,205],St=[1,6,25,26,34,38,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],Dt=[2,56],Rt=[1,216],At=[6,25,26,55,60],It=[6,25,26,46,55,60,63],_t=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,142,144,145,146,147],Ot=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132],$t=[72,73,74,75,77,80,90,91],jt=[1,235],Mt=[2,133],Bt=[1,6,25,26,34,46,55,60,63,72,73,74,75,77,79,80,84,90,91,92,97,99,108,110,111,112,116,117,123,124,132,135,136,141,142,143,144,145,146,147],Vt=[1,244],Pt=[6,25,26,60,92,97],Ut=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,117,132],Gt=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,111,117,132],Ht=[123,124],qt=[60,123,124],Xt=[1,255],Wt=[6,25,26,60,84],Yt=[6,25,26,49,60,84],Kt=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,144,145,146,147],zt=[11,28,30,32,33,36,37,40,41,42,43,44,51,52,53,57,58,79,82,85,89,94,95,96,102,106,107,110,112,114,116,125,131,133,134,135,136,137,139,140],Jt=[2,122],Qt=[6,25,26],Zt=[2,57],en=[1,268],tn=[1,269],nn=[1,6,25,26,34,55,60,63,79,84,92,97,99,104,105,108,110,111,112,116,117,127,129,132,135,136,141,142,143,144,145,146,147],rn=[26,127,129],sn=[1,6,26,34,55,60,63,79,84,92,97,99,108,111,117,132],on=[2,71],an=[1,291],cn=[1,292],hn=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,127,132,135,136,141,142,143,144,145,146,147],ln=[1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,112,116,117,132],un=[1,303],pn=[1,304],dn=[6,25,26,60],fn=[1,6,25,26,34,55,60,63,79,84,92,97,99,104,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],mn=[25,60],gn={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Line:5,TERMINATOR:6,Expression:7,Statement:8,Return:9,Comment:10,STATEMENT:11,Value:12,Invocation:13,Code:14,Operation:15,Assign:16,If:17,Try:18,While:19,For:20,Switch:21,Class:22,Throw:23,Block:24,INDENT:25,OUTDENT:26,Identifier:27,IDENTIFIER:28,AlphaNumeric:29,NUMBER:30,String:31,STRING:32,STRING_START:33,STRING_END:34,Regex:35,REGEX:36,REGEX_START:37,REGEX_END:38,Literal:39,JS:40,DEBUGGER:41,UNDEFINED:42,NULL:43,BOOL:44,Assignable:45,"=":46,AssignObj:47,ObjAssignable:48,":":49,ThisProperty:50,RETURN:51,HERECOMMENT:52,PARAM_START:53,ParamList:54,PARAM_END:55,FuncGlyph:56,"->":57,"=>":58,OptComma:59,",":60,Param:61,ParamVar:62,"...":63,Array:64,Object:65,Splat:66,SimpleAssignable:67,Accessor:68,Parenthetical:69,Range:70,This:71,".":72,"?.":73,"::":74,"?::":75,Index:76,INDEX_START:77,IndexValue:78,INDEX_END:79,INDEX_SOAK:80,Slice:81,"{":82,AssignList:83,"}":84,CLASS:85,EXTENDS:86,OptFuncExist:87,Arguments:88,SUPER:89,FUNC_EXIST:90,CALL_START:91,CALL_END:92,ArgList:93,THIS:94,"@":95,"[":96,"]":97,RangeDots:98,"..":99,Arg:100,SimpleArgs:101,TRY:102,Catch:103,FINALLY:104,CATCH:105,THROW:106,"(":107,")":108,WhileSource:109,WHILE:110,WHEN:111,UNTIL:112,Loop:113,LOOP:114,ForBody:115,FOR:116,BY:117,ForStart:118,ForSource:119,ForVariables:120,OWN:121,ForValue:122,FORIN:123,FOROF:124,SWITCH:125,Whens:126,ELSE:127,When:128,LEADING_WHEN:129,IfBlock:130,IF:131,POST_IF:132,UNARY:133,UNARY_MATH:134,"-":135,"+":136,YIELD:137,FROM:138,"--":139,"++":140,"?":141,MATH:142,"**":143,SHIFT:144,COMPARE:145,LOGIC:146,RELATION:147,COMPOUND_ASSIGN:148,$accept:0,$end:1},terminals_:{2:"error",6:"TERMINATOR",11:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",32:"STRING",33:"STRING_START",34:"STRING_END",36:"REGEX",37:"REGEX_START",38:"REGEX_END",40:"JS",41:"DEBUGGER",42:"UNDEFINED",43:"NULL",44:"BOOL",46:"=",49:":",51:"RETURN",52:"HERECOMMENT",53:"PARAM_START",55:"PARAM_END",57:"->",58:"=>",60:",",63:"...",72:".",73:"?.",74:"::",75:"?::",77:"INDEX_START",79:"INDEX_END",80:"INDEX_SOAK",82:"{",84:"}",85:"CLASS",86:"EXTENDS",89:"SUPER",90:"FUNC_EXIST",91:"CALL_START",92:"CALL_END",94:"THIS",95:"@",96:"[",97:"]",99:"..",102:"TRY",104:"FINALLY",105:"CATCH",106:"THROW",107:"(",108:")",110:"WHILE",111:"WHEN",112:"UNTIL",114:"LOOP",116:"FOR",117:"BY",121:"OWN",123:"FORIN",124:"FOROF",125:"SWITCH",127:"ELSE",129:"LEADING_WHEN",131:"IF",132:"POST_IF",133:"UNARY",134:"UNARY_MATH",135:"-",136:"+",137:"YIELD",138:"FROM",139:"--",140:"++",141:"?",142:"MATH",143:"**",144:"SHIFT",145:"COMPARE",146:"LOGIC",147:"RELATION",148:"COMPOUND_ASSIGN"},productions_:[0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[8,1],[8,1],[8,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[24,2],[24,3],[27,1],[29,1],[29,1],[31,1],[31,3],[35,1],[35,3],[39,1],[39,1],[39,1],[39,1],[39,1],[39,1],[39,1],[16,3],[16,4],[16,5],[47,1],[47,3],[47,5],[47,1],[48,1],[48,1],[48,1],[9,2],[9,1],[10,1],[14,5],[14,2],[56,1],[56,1],[59,0],[59,1],[54,0],[54,1],[54,3],[54,4],[54,6],[61,1],[61,2],[61,3],[61,1],[62,1],[62,1],[62,1],[62,1],[66,2],[67,1],[67,2],[67,2],[67,1],[45,1],[45,1],[45,1],[12,1],[12,1],[12,1],[12,1],[12,1],[68,2],[68,2],[68,2],[68,2],[68,1],[68,1],[76,3],[76,2],[78,1],[78,1],[65,4],[83,0],[83,1],[83,3],[83,4],[83,6],[22,1],[22,2],[22,3],[22,4],[22,2],[22,3],[22,4],[22,5],[13,3],[13,3],[13,1],[13,2],[87,0],[87,1],[88,2],[88,4],[71,1],[71,1],[50,2],[64,2],[64,4],[98,1],[98,1],[70,5],[81,3],[81,2],[81,2],[81,1],[93,1],[93,3],[93,4],[93,4],[93,6],[100,1],[100,1],[100,1],[101,1],[101,3],[18,2],[18,3],[18,4],[18,5],[103,3],[103,3],[103,2],[23,2],[69,3],[69,5],[109,2],[109,4],[109,2],[109,4],[19,2],[19,2],[19,2],[19,1],[113,2],[113,2],[20,2],[20,2],[20,2],[115,2],[115,4],[115,2],[118,2],[118,3],[122,1],[122,1],[122,1],[122,1],[120,1],[120,3],[119,2],[119,2],[119,4],[119,4],[119,4],[119,6],[119,6],[21,5],[21,7],[21,4],[21,6],[126,1],[126,2],[128,3],[128,4],[130,3],[130,5],[17,1],[17,3],[17,3],[17,3],[15,2],[15,2],[15,2],[15,2],[15,2],[15,2],[15,3],[15,2],[15,2],[15,2],[15,2],[15,2],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,5],[15,4],[15,3]],performAction:function(e,t,n,i,r,s,o){var a=s.length-1; +switch(r){case 1:return this.$=i.addLocationDataFn(o[a],o[a])(new i.Block);case 2:return this.$=s[a];case 3:this.$=i.addLocationDataFn(o[a],o[a])(i.Block.wrap([s[a]]));break;case 4:this.$=i.addLocationDataFn(o[a-2],o[a])(s[a-2].push(s[a]));break;case 5:this.$=s[a-1];break;case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 27:case 32:case 34:case 45:case 46:case 47:case 48:case 56:case 57:case 67:case 68:case 69:case 70:case 75:case 76:case 79:case 83:case 89:case 133:case 134:case 136:case 166:case 167:case 183:case 189:this.$=s[a];break;case 10:case 25:case 26:case 28:case 30:case 33:case 35:this.$=i.addLocationDataFn(o[a],o[a])(new i.Literal(s[a]));break;case 23:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Block);break;case 24:case 31:case 90:this.$=i.addLocationDataFn(o[a-2],o[a])(s[a-1]);break;case 29:case 146:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Parens(s[a-1]));break;case 36:this.$=i.addLocationDataFn(o[a],o[a])(new i.Undefined);break;case 37:this.$=i.addLocationDataFn(o[a],o[a])(new i.Null);break;case 38:this.$=i.addLocationDataFn(o[a],o[a])(new i.Bool(s[a]));break;case 39:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Assign(s[a-2],s[a]));break;case 40:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.Assign(s[a-3],s[a]));break;case 41:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Assign(s[a-4],s[a-1]));break;case 42:case 72:case 77:case 78:case 80:case 81:case 82:case 168:case 169:this.$=i.addLocationDataFn(o[a],o[a])(new i.Value(s[a]));break;case 43:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Assign(i.addLocationDataFn(o[a-2])(new i.Value(s[a-2])),s[a],"object"));break;case 44:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Assign(i.addLocationDataFn(o[a-4])(new i.Value(s[a-4])),s[a-1],"object"));break;case 49:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Return(s[a]));break;case 50:this.$=i.addLocationDataFn(o[a],o[a])(new i.Return);break;case 51:this.$=i.addLocationDataFn(o[a],o[a])(new i.Comment(s[a]));break;case 52:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Code(s[a-3],s[a],s[a-1]));break;case 53:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Code([],s[a],s[a-1]));break;case 54:this.$=i.addLocationDataFn(o[a],o[a])("func");break;case 55:this.$=i.addLocationDataFn(o[a],o[a])("boundfunc");break;case 58:case 95:this.$=i.addLocationDataFn(o[a],o[a])([]);break;case 59:case 96:case 128:case 170:this.$=i.addLocationDataFn(o[a],o[a])([s[a]]);break;case 60:case 97:case 129:this.$=i.addLocationDataFn(o[a-2],o[a])(s[a-2].concat(s[a]));break;case 61:case 98:case 130:this.$=i.addLocationDataFn(o[a-3],o[a])(s[a-3].concat(s[a]));break;case 62:case 99:case 132:this.$=i.addLocationDataFn(o[a-5],o[a])(s[a-5].concat(s[a-2]));break;case 63:this.$=i.addLocationDataFn(o[a],o[a])(new i.Param(s[a]));break;case 64:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Param(s[a-1],null,!0));break;case 65:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Param(s[a-2],s[a]));break;case 66:case 135:this.$=i.addLocationDataFn(o[a],o[a])(new i.Expansion);break;case 71:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Splat(s[a-1]));break;case 73:this.$=i.addLocationDataFn(o[a-1],o[a])(s[a-1].add(s[a]));break;case 74:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Value(s[a-1],[].concat(s[a])));break;case 84:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Access(s[a]));break;case 85:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Access(s[a],"soak"));break;case 86:this.$=i.addLocationDataFn(o[a-1],o[a])([i.addLocationDataFn(o[a-1])(new i.Access(new i.Literal("prototype"))),i.addLocationDataFn(o[a])(new i.Access(s[a]))]);break;case 87:this.$=i.addLocationDataFn(o[a-1],o[a])([i.addLocationDataFn(o[a-1])(new i.Access(new i.Literal("prototype"),"soak")),i.addLocationDataFn(o[a])(new i.Access(s[a]))]);break;case 88:this.$=i.addLocationDataFn(o[a],o[a])(new i.Access(new i.Literal("prototype")));break;case 91:this.$=i.addLocationDataFn(o[a-1],o[a])(i.extend(s[a],{soak:!0}));break;case 92:this.$=i.addLocationDataFn(o[a],o[a])(new i.Index(s[a]));break;case 93:this.$=i.addLocationDataFn(o[a],o[a])(new i.Slice(s[a]));break;case 94:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.Obj(s[a-2],s[a-3].generated));break;case 100:this.$=i.addLocationDataFn(o[a],o[a])(new i.Class);break;case 101:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Class(null,null,s[a]));break;case 102:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Class(null,s[a]));break;case 103:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.Class(null,s[a-1],s[a]));break;case 104:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Class(s[a]));break;case 105:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Class(s[a-1],null,s[a]));break;case 106:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.Class(s[a-2],s[a]));break;case 107:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Class(s[a-3],s[a-1],s[a]));break;case 108:case 109:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Call(s[a-2],s[a],s[a-1]));break;case 110:this.$=i.addLocationDataFn(o[a],o[a])(new i.Call("super",[new i.Splat(new i.Literal("arguments"))]));break;case 111:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Call("super",s[a]));break;case 112:this.$=i.addLocationDataFn(o[a],o[a])(!1);break;case 113:this.$=i.addLocationDataFn(o[a],o[a])(!0);break;case 114:this.$=i.addLocationDataFn(o[a-1],o[a])([]);break;case 115:case 131:this.$=i.addLocationDataFn(o[a-3],o[a])(s[a-2]);break;case 116:case 117:this.$=i.addLocationDataFn(o[a],o[a])(new i.Value(new i.Literal("this")));break;case 118:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Value(i.addLocationDataFn(o[a-1])(new i.Literal("this")),[i.addLocationDataFn(o[a])(new i.Access(s[a]))],"this"));break;case 119:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Arr([]));break;case 120:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.Arr(s[a-2]));break;case 121:this.$=i.addLocationDataFn(o[a],o[a])("inclusive");break;case 122:this.$=i.addLocationDataFn(o[a],o[a])("exclusive");break;case 123:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Range(s[a-3],s[a-1],s[a-2]));break;case 124:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Range(s[a-2],s[a],s[a-1]));break;case 125:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Range(s[a-1],null,s[a]));break;case 126:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Range(null,s[a],s[a-1]));break;case 127:this.$=i.addLocationDataFn(o[a],o[a])(new i.Range(null,null,s[a]));break;case 137:this.$=i.addLocationDataFn(o[a-2],o[a])([].concat(s[a-2],s[a]));break;case 138:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Try(s[a]));break;case 139:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Try(s[a-1],s[a][0],s[a][1]));break;case 140:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.Try(s[a-2],null,null,s[a]));break;case 141:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Try(s[a-3],s[a-2][0],s[a-2][1],s[a]));break;case 142:this.$=i.addLocationDataFn(o[a-2],o[a])([s[a-1],s[a]]);break;case 143:this.$=i.addLocationDataFn(o[a-2],o[a])([i.addLocationDataFn(o[a-1])(new i.Value(s[a-1])),s[a]]);break;case 144:this.$=i.addLocationDataFn(o[a-1],o[a])([null,s[a]]);break;case 145:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Throw(s[a]));break;case 147:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Parens(s[a-2]));break;case 148:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.While(s[a]));break;case 149:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.While(s[a-2],{guard:s[a]}));break;case 150:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.While(s[a],{invert:!0}));break;case 151:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.While(s[a-2],{invert:!0,guard:s[a]}));break;case 152:this.$=i.addLocationDataFn(o[a-1],o[a])(s[a-1].addBody(s[a]));break;case 153:case 154:this.$=i.addLocationDataFn(o[a-1],o[a])(s[a].addBody(i.addLocationDataFn(o[a-1])(i.Block.wrap([s[a-1]]))));break;case 155:this.$=i.addLocationDataFn(o[a],o[a])(s[a]);break;case 156:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.While(i.addLocationDataFn(o[a-1])(new i.Literal("true"))).addBody(s[a]));break;case 157:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.While(i.addLocationDataFn(o[a-1])(new i.Literal("true"))).addBody(i.addLocationDataFn(o[a])(i.Block.wrap([s[a]]))));break;case 158:case 159:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.For(s[a-1],s[a]));break;case 160:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.For(s[a],s[a-1]));break;case 161:this.$=i.addLocationDataFn(o[a-1],o[a])({source:i.addLocationDataFn(o[a])(new i.Value(s[a]))});break;case 162:this.$=i.addLocationDataFn(o[a-3],o[a])({source:i.addLocationDataFn(o[a-2])(new i.Value(s[a-2])),step:s[a]});break;case 163:this.$=i.addLocationDataFn(o[a-1],o[a])(function(){return s[a].own=s[a-1].own,s[a].name=s[a-1][0],s[a].index=s[a-1][1],s[a]}());break;case 164:this.$=i.addLocationDataFn(o[a-1],o[a])(s[a]);break;case 165:this.$=i.addLocationDataFn(o[a-2],o[a])(function(){return s[a].own=!0,s[a]}());break;case 171:this.$=i.addLocationDataFn(o[a-2],o[a])([s[a-2],s[a]]);break;case 172:this.$=i.addLocationDataFn(o[a-1],o[a])({source:s[a]});break;case 173:this.$=i.addLocationDataFn(o[a-1],o[a])({source:s[a],object:!0});break;case 174:this.$=i.addLocationDataFn(o[a-3],o[a])({source:s[a-2],guard:s[a]});break;case 175:this.$=i.addLocationDataFn(o[a-3],o[a])({source:s[a-2],guard:s[a],object:!0});break;case 176:this.$=i.addLocationDataFn(o[a-3],o[a])({source:s[a-2],step:s[a]});break;case 177:this.$=i.addLocationDataFn(o[a-5],o[a])({source:s[a-4],guard:s[a-2],step:s[a]});break;case 178:this.$=i.addLocationDataFn(o[a-5],o[a])({source:s[a-4],step:s[a-2],guard:s[a]});break;case 179:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Switch(s[a-3],s[a-1]));break;case 180:this.$=i.addLocationDataFn(o[a-6],o[a])(new i.Switch(s[a-5],s[a-3],s[a-1]));break;case 181:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.Switch(null,s[a-1]));break;case 182:this.$=i.addLocationDataFn(o[a-5],o[a])(new i.Switch(null,s[a-3],s[a-1]));break;case 184:this.$=i.addLocationDataFn(o[a-1],o[a])(s[a-1].concat(s[a]));break;case 185:this.$=i.addLocationDataFn(o[a-2],o[a])([[s[a-1],s[a]]]);break;case 186:this.$=i.addLocationDataFn(o[a-3],o[a])([[s[a-2],s[a-1]]]);break;case 187:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.If(s[a-1],s[a],{type:s[a-2]}));break;case 188:this.$=i.addLocationDataFn(o[a-4],o[a])(s[a-4].addElse(i.addLocationDataFn(o[a-2],o[a])(new i.If(s[a-1],s[a],{type:s[a-2]}))));break;case 190:this.$=i.addLocationDataFn(o[a-2],o[a])(s[a-2].addElse(s[a]));break;case 191:case 192:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.If(s[a],i.addLocationDataFn(o[a-2])(i.Block.wrap([s[a-2]])),{type:s[a-1],statement:!0}));break;case 193:case 194:case 197:case 198:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Op(s[a-1],s[a]));break;case 195:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Op("-",s[a]));break;case 196:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Op("+",s[a]));break;case 199:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Op(s[a-2].concat(s[a-1]),s[a]));break;case 200:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Op("--",s[a]));break;case 201:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Op("++",s[a]));break;case 202:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Op("--",s[a-1],null,!0));break;case 203:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Op("++",s[a-1],null,!0));break;case 204:this.$=i.addLocationDataFn(o[a-1],o[a])(new i.Existence(s[a-1]));break;case 205:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Op("+",s[a-2],s[a]));break;case 206:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Op("-",s[a-2],s[a]));break;case 207:case 208:case 209:case 210:case 211:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Op(s[a-1],s[a-2],s[a]));break;case 212:this.$=i.addLocationDataFn(o[a-2],o[a])(function(){return"!"===s[a-1].charAt(0)?new i.Op(s[a-1].slice(1),s[a-2],s[a]).invert():new i.Op(s[a-1],s[a-2],s[a])}());break;case 213:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Assign(s[a-2],s[a],s[a-1]));break;case 214:this.$=i.addLocationDataFn(o[a-4],o[a])(new i.Assign(s[a-4],s[a-1],s[a-3]));break;case 215:this.$=i.addLocationDataFn(o[a-3],o[a])(new i.Assign(s[a-3],s[a],s[a-2]));break;case 216:this.$=i.addLocationDataFn(o[a-2],o[a])(new i.Extends(s[a-2],s[a]))}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{1:[3]},{1:[2,2],6:P},t(U,[2,3]),t(U,[2,6],{118:69,109:89,115:90,110:x,112:S,116:R,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(U,[2,7],{118:69,109:92,115:93,110:x,112:S,116:R,132:Z}),t(et,[2,11],{87:94,68:95,76:101,72:tt,73:nt,74:it,75:rt,77:st,80:ot,90:at,91:ct}),t(et,[2,12],{76:101,87:104,68:105,72:tt,73:nt,74:it,75:rt,77:st,80:ot,90:at,91:ct}),t(et,[2,13]),t(et,[2,14]),t(et,[2,15]),t(et,[2,16]),t(et,[2,17]),t(et,[2,18]),t(et,[2,19]),t(et,[2,20]),t(et,[2,21]),t(et,[2,22]),t(et,[2,8]),t(et,[2,9]),t(et,[2,10]),t(ht,lt,{46:[1,106]}),t(ht,[2,80]),t(ht,[2,81]),t(ht,[2,82]),t(ht,[2,83]),t([1,6,25,26,34,38,55,60,63,72,73,74,75,77,79,80,84,90,92,97,99,108,110,111,112,116,117,132,135,136,141,142,143,144,145,146,147],[2,110],{88:107,91:ut}),t([6,25,55,60],pt,{54:109,61:110,62:111,27:113,50:114,64:115,65:116,28:i,63:dt,82:b,95:ft,96:mt}),{24:119,25:gt},{7:121,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:123,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:124,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:125,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:127,8:126,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,138:[1,128],139:B,140:V},{12:130,13:131,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:132,50:63,64:47,65:48,67:129,69:23,70:24,71:25,82:b,89:w,94:T,95:C,96:E,107:L},{12:130,13:131,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:132,50:63,64:47,65:48,67:133,69:23,70:24,71:25,82:b,89:w,94:T,95:C,96:E,107:L},t(vt,yt,{86:[1,137],139:[1,134],140:[1,135],148:[1,136]}),t(et,[2,189],{127:[1,138]}),{24:139,25:gt},{24:140,25:gt},t(et,[2,155]),{24:141,25:gt},{7:142,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,143],27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(bt,[2,100],{39:22,69:23,70:24,71:25,64:47,65:48,29:49,35:51,27:62,50:63,31:72,12:130,13:131,45:132,24:144,67:146,25:gt,28:i,30:r,32:s,33:o,36:a,37:c,40:h,41:l,42:u,43:p,44:d,82:b,86:[1,145],89:w,94:T,95:C,96:E,107:L}),{7:147,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,141,142,143,144,145,146,147],[2,50],{12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,9:18,10:19,45:21,39:22,69:23,70:24,71:25,56:28,67:36,130:37,109:39,113:40,115:41,64:47,65:48,29:49,35:51,27:62,50:63,118:69,31:72,8:122,7:148,11:n,28:i,30:r,32:s,33:o,36:a,37:c,40:h,41:l,42:u,43:p,44:d,51:f,52:m,53:g,57:v,58:y,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,114:D,125:A,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V}),t(et,[2,51]),t(vt,[2,77]),t(vt,[2,78]),t(ht,[2,32]),t(ht,[2,33]),t(ht,[2,34]),t(ht,[2,35]),t(ht,[2,36]),t(ht,[2,37]),t(ht,[2,38]),{4:149,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,150],27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:151,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:kt,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,63:wt,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:k,89:w,93:153,94:T,95:C,96:E,97:Tt,100:154,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(ht,[2,116]),t(ht,[2,117],{27:158,28:i}),{25:[2,54]},{25:[2,55]},t(Ct,[2,72]),t(Ct,[2,75]),{7:159,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:160,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:161,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:163,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:162,25:gt,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{27:168,28:i,50:169,64:170,65:171,70:164,82:b,95:ft,96:E,120:165,121:[1,166],122:167},{119:172,123:[1,173],124:[1,174]},t([6,25,60,84],Et,{31:72,83:175,47:176,48:177,10:178,27:179,29:180,50:181,28:i,30:r,32:s,33:o,52:m,95:ft}),t(Ft,[2,26]),t(Ft,[2,27]),t(ht,[2,30]),{12:130,13:182,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:132,50:63,64:47,65:48,67:183,69:23,70:24,71:25,82:b,89:w,94:T,95:C,96:E,107:L},t(Nt,[2,25]),t(Ft,[2,28]),{4:184,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(U,[2,5],{7:4,8:5,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,9:18,10:19,45:21,39:22,69:23,70:24,71:25,56:28,67:36,130:37,109:39,113:40,115:41,64:47,65:48,29:49,35:51,27:62,50:63,118:69,31:72,5:185,11:n,28:i,30:r,32:s,33:o,36:a,37:c,40:h,41:l,42:u,43:p,44:d,51:f,52:m,53:g,57:v,58:y,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,110:x,112:S,114:D,116:R,125:A,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V}),t(et,[2,204]),{7:186,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:187,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:188,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:189,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:190,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:191,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:192,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:193,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:194,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(et,[2,154]),t(et,[2,159]),{7:195,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(et,[2,153]),t(et,[2,158]),{88:196,91:ut},t(Ct,[2,73]),{91:[2,113]},{27:197,28:i},{27:198,28:i},t(Ct,[2,88],{27:199,28:i}),{27:200,28:i},t(Ct,[2,89]),{7:202,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,63:Lt,64:47,65:48,67:36,69:23,70:24,71:25,78:201,81:203,82:b,85:k,89:w,94:T,95:C,96:E,98:204,99:xt,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{76:207,77:st,80:ot},{88:208,91:ut},t(Ct,[2,74]),{6:[1,210],7:209,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,211],27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(St,[2,111]),{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:kt,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,63:wt,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:k,89:w,92:[1,212],93:213,94:T,95:C,96:E,100:154,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t([6,25],Dt,{59:217,55:[1,215],60:Rt}),t(At,[2,59]),t(At,[2,63],{46:[1,219],63:[1,218]}),t(At,[2,66]),t(It,[2,67]),t(It,[2,68]),t(It,[2,69]),t(It,[2,70]),{27:158,28:i},{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:kt,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,63:wt,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:k,89:w,93:153,94:T,95:C,96:E,97:Tt,100:154,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(et,[2,53]),{4:221,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,26:[1,220],27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,135,136,142,143,144,145,146,147],[2,193],{118:69,109:89,115:90,141:X}),{109:92,110:x,112:S,115:93,116:R,118:69,132:Z},t(_t,[2,194],{118:69,109:89,115:90,141:X,143:Y}),t(_t,[2,195],{118:69,109:89,115:90,141:X,143:Y}),t(_t,[2,196],{118:69,109:89,115:90,141:X,143:Y}),t(et,[2,197],{118:69,109:92,115:93}),t(Ot,[2,198],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{7:222,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(et,[2,200],{72:yt,73:yt,74:yt,75:yt,77:yt,80:yt,90:yt,91:yt}),{68:95,72:tt,73:nt,74:it,75:rt,76:101,77:st,80:ot,87:94,90:at,91:ct},{68:105,72:tt,73:nt,74:it,75:rt,76:101,77:st,80:ot,87:104,90:at,91:ct},t($t,lt),t(et,[2,201],{72:yt,73:yt,74:yt,75:yt,77:yt,80:yt,90:yt,91:yt}),t(et,[2,202]),t(et,[2,203]),{6:[1,225],7:223,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,224],27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:226,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{24:227,25:gt,131:[1,228]},t(et,[2,138],{103:229,104:[1,230],105:[1,231]}),t(et,[2,152]),t(et,[2,160]),{25:[1,232],109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},{126:233,128:234,129:jt},t(et,[2,101]),{7:236,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(bt,[2,104],{24:237,25:gt,72:yt,73:yt,74:yt,75:yt,77:yt,80:yt,90:yt,91:yt,86:[1,238]}),t(Ot,[2,145],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Ot,[2,49],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{6:P,108:[1,239]},{4:240,5:3,7:4,8:5,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t([6,25,60,97],Mt,{118:69,109:89,115:90,98:241,63:[1,242],99:xt,110:x,112:S,116:R,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Bt,[2,119]),t([6,25,97],Dt,{59:243,60:Vt}),t(Pt,[2,128]),{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:kt,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,63:wt,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:k,89:w,93:245,94:T,95:C,96:E,100:154,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(Pt,[2,134]),t(Pt,[2,135]),t(Nt,[2,118]),{24:246,25:gt,109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},t(Ut,[2,148],{118:69,109:89,115:90,110:x,111:[1,247],112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Ut,[2,150],{118:69,109:89,115:90,110:x,111:[1,248],112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(et,[2,156]),t(Gt,[2,157],{118:69,109:89,115:90,110:x,112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,132,135,136,141,142,143,144,145,146,147],[2,161],{117:[1,249]}),t(Ht,[2,164]),{27:168,28:i,50:169,64:170,65:171,82:b,95:ft,96:mt,120:250,122:167},t(Ht,[2,170],{60:[1,251]}),t(qt,[2,166]),t(qt,[2,167]),t(qt,[2,168]),t(qt,[2,169]),t(et,[2,163]),{7:252,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:253,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t([6,25,84],Dt,{59:254,60:Xt}),t(Wt,[2,96]),t(Wt,[2,42],{49:[1,256]}),t(Wt,[2,45]),t(Yt,[2,46]),t(Yt,[2,47]),t(Yt,[2,48]),{38:[1,257],68:105,72:tt,73:nt,74:it,75:rt,76:101,77:st,80:ot,87:104,90:at,91:ct},t($t,yt),{6:P,34:[1,258]},t(U,[2,4]),t(Kt,[2,205],{118:69,109:89,115:90,141:X,142:W,143:Y}),t(Kt,[2,206],{118:69,109:89,115:90,141:X,142:W,143:Y}),t(_t,[2,207],{118:69,109:89,115:90,141:X,143:Y}),t(_t,[2,208],{118:69,109:89,115:90,141:X,143:Y}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,144,145,146,147],[2,209],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,145,146],[2,210],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,147:Q}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,146],[2,211],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,147:Q}),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,117,132,145,146,147],[2,212],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K}),t(Gt,[2,192],{118:69,109:89,115:90,110:x,112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Gt,[2,191],{118:69,109:89,115:90,110:x,112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(St,[2,108]),t(Ct,[2,84]),t(Ct,[2,85]),t(Ct,[2,86]),t(Ct,[2,87]),{79:[1,259]},{63:Lt,79:[2,92],98:260,99:xt,109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},{79:[2,93]},{7:261,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,79:[2,127],82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(zt,[2,121]),t(zt,Jt),t(Ct,[2,91]),t(St,[2,109]),t(Ot,[2,39],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{7:262,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:263,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(St,[2,114]),t([6,25,92],Dt,{59:264,60:Vt}),t(Pt,Mt,{118:69,109:89,115:90,63:[1,265],110:x,112:S,116:R,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{56:266,57:v,58:y},t(Qt,Zt,{62:111,27:113,50:114,64:115,65:116,61:267,28:i,63:dt,82:b,95:ft,96:mt}),{6:en,25:tn},t(At,[2,64]),{7:270,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(nn,[2,23]),{6:P,26:[1,271]},t(Ot,[2,199],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Ot,[2,213],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{7:272,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:273,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(Ot,[2,216],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(et,[2,190]),{7:274,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(et,[2,139],{104:[1,275]}),{24:276,25:gt},{24:279,25:gt,27:277,28:i,65:278,82:b},{126:280,128:234,129:jt},{26:[1,281],127:[1,282],128:283,129:jt},t(rn,[2,183]),{7:285,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,101:284,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(sn,[2,102],{118:69,109:89,115:90,24:286,25:gt,110:x,112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(et,[2,105]),{7:287,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(ht,[2,146]),{6:P,26:[1,288]},{7:289,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t([11,28,30,32,33,36,37,40,41,42,43,44,51,52,53,57,58,82,85,89,94,95,96,102,106,107,110,112,114,116,125,131,133,134,135,136,137,139,140],Jt,{6:on,25:on,60:on,97:on}),{6:an,25:cn,97:[1,290]},t([6,25,26,92,97],Zt,{12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,9:18,10:19,45:21,39:22,69:23,70:24,71:25,56:28,67:36,130:37,109:39,113:40,115:41,64:47,65:48,29:49,35:51,27:62,50:63,118:69,31:72,8:122,66:156,7:214,100:293,11:n,28:i,30:r,32:s,33:o,36:a,37:c,40:h,41:l,42:u,43:p,44:d,51:f,52:m,53:g,57:v,58:y,63:wt,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,110:x,112:S,114:D,116:R,125:A,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V}),t(Qt,Dt,{59:294,60:Vt}),t(hn,[2,187]),{7:295,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:296,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:297,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(Ht,[2,165]),{27:168,28:i,50:169,64:170,65:171,82:b,95:ft,96:mt,122:298},t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,112,116,132],[2,172],{118:69,109:89,115:90,111:[1,299],117:[1,300],135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(ln,[2,173],{118:69,109:89,115:90,111:[1,301],135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{6:un,25:pn,84:[1,302]},t([6,25,26,84],Zt,{31:72,48:177,10:178,27:179,29:180,50:181,47:305,28:i,30:r,32:s,33:o,52:m,95:ft}),{7:306,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,307],27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(ht,[2,31]),t(Ft,[2,29]),t(Ct,[2,90]),{7:308,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,79:[2,125],82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{79:[2,126],109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},t(Ot,[2,40],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{26:[1,309],109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},{6:an,25:cn,92:[1,310]},t(Pt,on),{24:311,25:gt},t(At,[2,60]),{27:113,28:i,50:114,61:312,62:111,63:dt,64:115,65:116,82:b,95:ft,96:mt},t(dn,pt,{61:110,62:111,27:113,50:114,64:115,65:116,54:313,28:i,63:dt,82:b,95:ft,96:mt}),t(At,[2,65],{118:69,109:89,115:90,110:x,112:S,116:R,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(nn,[2,24]),{26:[1,314],109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},t(Ot,[2,215],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{24:315,25:gt,109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},{24:316,25:gt},t(et,[2,140]),{24:317,25:gt},{24:318,25:gt},t(fn,[2,144]),{26:[1,319],127:[1,320],128:283,129:jt},t(et,[2,181]),{24:321,25:gt},t(rn,[2,184]),{24:322,25:gt,60:[1,323]},t(mn,[2,136],{118:69,109:89,115:90,110:x,112:S,116:R,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(et,[2,103]),t(sn,[2,106],{118:69,109:89,115:90,24:324,25:gt,110:x,112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{108:[1,325]},{97:[1,326],109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},t(Bt,[2,120]),{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,63:wt,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,100:327,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:214,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:kt,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,63:wt,64:47,65:48,66:156,67:36,69:23,70:24,71:25,82:b,85:k,89:w,93:328,94:T,95:C,96:E,100:154,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(Pt,[2,129]),{6:an,25:cn,26:[1,329]},t(Gt,[2,149],{118:69,109:89,115:90,110:x,112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Gt,[2,151],{118:69,109:89,115:90,110:x,112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Gt,[2,162],{118:69,109:89,115:90,110:x,112:S,116:R,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Ht,[2,171]),{7:330,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:331,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:332,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(Bt,[2,94]),{10:178,27:179,28:i,29:180,30:r,31:72,32:s,33:o,47:333,48:177,50:181,52:m,95:ft},t(dn,Et,{31:72,47:176,48:177,10:178,27:179,29:180,50:181,83:334,28:i,30:r,32:s,33:o,52:m,95:ft}),t(Wt,[2,97]),t(Wt,[2,43],{118:69,109:89,115:90,110:x,112:S,116:R,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{7:335,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{79:[2,124],109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},t(et,[2,41]),t(St,[2,115]),t(et,[2,52]),t(At,[2,61]),t(Qt,Dt,{59:336,60:Rt}),t(et,[2,214]),t(hn,[2,188]),t(et,[2,141]),t(fn,[2,142]),t(fn,[2,143]),t(et,[2,179]),{24:337,25:gt},{26:[1,338]},t(rn,[2,185],{6:[1,339]}),{7:340,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},t(et,[2,107]),t(ht,[2,147]),t(ht,[2,123]),t(Pt,[2,130]),t(Qt,Dt,{59:341,60:Vt}),t(Pt,[2,131]),t([1,6,25,26,34,55,60,63,79,84,92,97,99,108,110,111,112,116,132],[2,174],{118:69,109:89,115:90,117:[1,342],135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(ln,[2,176],{118:69,109:89,115:90,111:[1,343],135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Ot,[2,175],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Wt,[2,98]),t(Qt,Dt,{59:344,60:Xt}),{26:[1,345],109:89,110:x,112:S,115:90,116:R,118:69,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q},{6:en,25:tn,26:[1,346]},{26:[1,347]},t(et,[2,182]),t(rn,[2,186]),t(mn,[2,137],{118:69,109:89,115:90,110:x,112:S,116:R,132:G,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),{6:an,25:cn,26:[1,348]},{7:349,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{7:350,8:122,9:18,10:19,11:n,12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:62,28:i,29:49,30:r,31:72,32:s,33:o,35:51,36:a,37:c,39:22,40:h,41:l,42:u,43:p,44:d,45:21,50:63,51:f,52:m,53:g,56:28,57:v,58:y,64:47,65:48,67:36,69:23,70:24,71:25,82:b,85:k,89:w,94:T,95:C,96:E,102:F,106:N,107:L,109:39,110:x,112:S,113:40,114:D,115:41,116:R,118:69,125:A,130:37,131:I,133:_,134:O,135:$,136:j,137:M,139:B,140:V},{6:un,25:pn,26:[1,351]},t(Wt,[2,44]),t(At,[2,62]),t(et,[2,180]),t(Pt,[2,132]),t(Ot,[2,177],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Ot,[2,178],{118:69,109:89,115:90,135:H,136:q,141:X,142:W,143:Y,144:K,145:z,146:J,147:Q}),t(Wt,[2,99])],defaultActions:{60:[2,54],61:[2,55],96:[2,113],203:[2,93]},parseError:function(e,t){if(!t.recoverable)throw Error(e); +this.trace(e)},parse:function(e){function t(){var e;return e=f.lex()||p,"number"!=typeof e&&(e=n.symbols_[e]||e),e}var n=this,i=[0],r=[null],s=[],o=this.table,a="",c=0,h=0,l=0,u=2,p=1,d=s.slice.call(arguments,1),f=Object.create(this.lexer),m={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(m.yy[g]=this.yy[g]);f.setInput(e,m.yy),m.yy.lexer=f,m.yy.parser=this,f.yylloc===void 0&&(f.yylloc={});var v=f.yylloc;s.push(v);var y=f.options&&f.options.ranges;this.parseError="function"==typeof m.yy.parseError?m.yy.parseError:Object.getPrototypeOf(this).parseError;for(var b,k,w,T,C,E,F,N,L,x={};;){if(w=i[i.length-1],this.defaultActions[w]?T=this.defaultActions[w]:((null===b||b===void 0)&&(b=t()),T=o[w]&&o[w][b]),T===void 0||!T.length||!T[0]){var S="";L=[];for(E in o[w])this.terminals_[E]&&E>u&&L.push("'"+this.terminals_[E]+"'");S=f.showPosition?"Parse error on line "+(c+1)+":\n"+f.showPosition()+"\nExpecting "+L.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(c+1)+": Unexpected "+(b==p?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(S,{text:f.match,token:this.terminals_[b]||b,line:f.yylineno,loc:v,expected:L})}if(T[0]instanceof Array&&T.length>1)throw Error("Parse Error: multiple actions possible at state: "+w+", token: "+b);switch(T[0]){case 1:i.push(b),r.push(f.yytext),s.push(f.yylloc),i.push(T[1]),b=null,k?(b=k,k=null):(h=f.yyleng,a=f.yytext,c=f.yylineno,v=f.yylloc,l>0&&l--);break;case 2:if(F=this.productions_[T[1]][1],x.$=r[r.length-F],x._$={first_line:s[s.length-(F||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(F||1)].first_column,last_column:s[s.length-1].last_column},y&&(x._$.range=[s[s.length-(F||1)].range[0],s[s.length-1].range[1]]),C=this.performAction.apply(x,[a,h,c,m.yy,T[1],r,s].concat(d)),C!==void 0)return C;F&&(i=i.slice(0,2*-1*F),r=r.slice(0,-1*F),s=s.slice(0,-1*F)),i.push(this.productions_[T[1]][0]),r.push(x.$),s.push(x._$),N=o[i[i.length-2]][i[i.length-1]],i.push(N);break;case 3:return!0}}return!0}};return e.prototype=gn,gn.Parser=e,new e}();return _dereq_!==void 0&&e!==void 0&&(e.parser=n,e.Parser=n.Parser,e.parse=function(){return n.parse.apply(n,arguments)},e.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),process.exit(1));var n=_dereq_("fs").readFileSync(_dereq_("path").normalize(t[1]),"utf8");return e.parser.parse(n)},t!==void 0&&_dereq_.main===t&&e.main(process.argv.slice(1))),t.exports}(),_dereq_["./scope"]=function(){var e={},t={exports:e};return function(){var t,n=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1};e.Scope=t=function(){function e(e,t,n,i){var r,s;this.parent=e,this.expressions=t,this.method=n,this.referencedVars=i,this.variables=[{name:"arguments",type:"arguments"}],this.positions={},this.parent||(this.utilities={}),this.root=null!=(r=null!=(s=this.parent)?s.root:void 0)?r:this}return e.prototype.add=function(e,t,n){return this.shared&&!n?this.parent.add(e,t,n):Object.prototype.hasOwnProperty.call(this.positions,e)?this.variables[this.positions[e]].type=t:this.positions[e]=this.variables.push({name:e,type:t})-1},e.prototype.namedMethod=function(){var e;return(null!=(e=this.method)?e.name:void 0)||!this.parent?this.method:this.parent.namedMethod()},e.prototype.find=function(e){return this.check(e)?!0:(this.add(e,"var"),!1)},e.prototype.parameter=function(e){return this.shared&&this.parent.check(e,!0)?void 0:this.add(e,"param")},e.prototype.check=function(e){var t;return!!(this.type(e)||(null!=(t=this.parent)?t.check(e):void 0))},e.prototype.temporary=function(e,t,n){return null==n&&(n=!1),n?(t+parseInt(e,36)).toString(36).replace(/\d/g,"a"):e+(t||"")},e.prototype.type=function(e){var t,n,i,r;for(i=this.variables,t=0,n=i.length;n>t;t++)if(r=i[t],r.name===e)return r.type;return null},e.prototype.freeVariable=function(e,t){var i,r,s;for(null==t&&(t={}),i=0;;){if(s=this.temporary(e,i,t.single),!(this.check(s)||n.call(this.root.referencedVars,s)>=0))break;i++}return(null!=(r=t.reserve)?r:!0)&&this.add(s,"var",!0),s},e.prototype.assign=function(e,t){return this.add(e,{value:t,assigned:!0},!0),this.hasAssignments=!0},e.prototype.hasDeclarations=function(){return!!this.declaredVariables().length},e.prototype.declaredVariables=function(){var e;return function(){var t,n,i,r;for(i=this.variables,r=[],t=0,n=i.length;n>t;t++)e=i[t],"var"===e.type&&r.push(e.name);return r}.call(this).sort()},e.prototype.assignedVariables=function(){var e,t,n,i,r;for(n=this.variables,i=[],e=0,t=n.length;t>e;e++)r=n[e],r.type.assigned&&i.push(r.name+" = "+r.type.value);return i},e}()}.call(this),t.exports}(),_dereq_["./nodes"]=function(){var e={},t={exports:e};return function(){var t,n,i,r,s,o,a,c,h,l,u,p,d,f,m,g,v,y,b,k,w,T,C,E,F,N,L,x,S,D,R,A,I,_,O,$,j,M,B,V,P,U,G,H,q,X,W,Y,K,z,J,Q,Z,et,tt,nt,it,rt,st,ot,at,ct,ht,lt,ut,pt,dt,ft,mt,gt,vt,yt,bt,kt=function(e,t){function n(){this.constructor=e}for(var i in t)wt.call(t,i)&&(e[i]=t[i]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},wt={}.hasOwnProperty,Tt=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1},Ct=[].slice;Error.stackTraceLimit=1/0,P=_dereq_("./scope").Scope,dt=_dereq_("./lexer"),$=dt.RESERVED,V=dt.STRICT_PROSCRIBED,ft=_dereq_("./helpers"),et=ft.compact,rt=ft.flatten,it=ft.extend,lt=ft.merge,tt=ft.del,gt=ft.starts,nt=ft.ends,mt=ft.some,Z=ft.addLocationDataFn,ht=ft.locationDataToString,vt=ft.throwSyntaxError,e.extend=it,e.addLocationDataFn=Z,Q=function(){return!0},D=function(){return!1},X=function(){return this},S=function(){return this.negated=!this.negated,this},e.CodeFragment=h=function(){function e(e,t){var n;this.code=""+t,this.locationData=null!=e?e.locationData:void 0,this.type=(null!=e?null!=(n=e.constructor)?n.name:void 0:void 0)||"unknown"}return e.prototype.toString=function(){return""+this.code+(this.locationData?": "+ht(this.locationData):"")},e}(),st=function(e){var t;return function(){var n,i,r;for(r=[],n=0,i=e.length;i>n;n++)t=e[n],r.push(t.code);return r}().join("")},e.Base=r=function(){function e(){}return e.prototype.compile=function(e,t){return st(this.compileToFragments(e,t))},e.prototype.compileToFragments=function(e,t){var n;return e=it({},e),t&&(e.level=t),n=this.unfoldSoak(e)||this,n.tab=e.indent,e.level!==L&&n.isStatement(e)?n.compileClosure(e):n.compileNode(e)},e.prototype.compileClosure=function(e){var n,i,r,a,h,l,u;return(a=this.jumps())&&a.error("cannot use a pure statement in an expression"),e.sharedScope=!0,r=new c([],s.wrap([this])),n=[],((i=this.contains(at))||this.contains(ct))&&(n=[new x("this")],i?(h="apply",n.push(new x("arguments"))):h="call",r=new z(r,[new t(new x(h))])),l=new o(r,n).compileNode(e),(r.isGenerator||(null!=(u=r.base)?u.isGenerator:void 0))&&(l.unshift(this.makeCode("(yield* ")),l.push(this.makeCode(")"))),l},e.prototype.cache=function(e,t,n){var r,s,o;return r=null!=n?n(this):this.isComplex(),r?(s=new x(e.scope.freeVariable("ref")),o=new i(s,this),t?[o.compileToFragments(e,t),[this.makeCode(s.value)]]:[o,s]):(s=t?this.compileToFragments(e,t):this,[s,s])},e.prototype.cacheToCodeFragments=function(e){return[st(e[0]),st(e[1])]},e.prototype.makeReturn=function(e){var t;return t=this.unwrapAll(),e?new o(new x(e+".push"),[t]):new M(t)},e.prototype.contains=function(e){var t;return t=void 0,this.traverseChildren(!1,function(n){return e(n)?(t=n,!1):void 0}),t},e.prototype.lastNonComment=function(e){var t;for(t=e.length;t--;)if(!(e[t]instanceof l))return e[t];return null},e.prototype.toString=function(e,t){var n;return null==e&&(e=""),null==t&&(t=this.constructor.name),n="\n"+e+t,this.soak&&(n+="?"),this.eachChild(function(t){return n+=t.toString(e+q)}),n},e.prototype.eachChild=function(e){var t,n,i,r,s,o,a,c;if(!this.children)return this;for(a=this.children,i=0,s=a.length;s>i;i++)if(t=a[i],this[t])for(c=rt([this[t]]),r=0,o=c.length;o>r;r++)if(n=c[r],e(n)===!1)return this;return this},e.prototype.traverseChildren=function(e,t){return this.eachChild(function(n){var i;return i=t(n),i!==!1?n.traverseChildren(e,t):void 0})},e.prototype.invert=function(){return new I("!",this)},e.prototype.unwrapAll=function(){var e;for(e=this;e!==(e=e.unwrap()););return e},e.prototype.children=[],e.prototype.isStatement=D,e.prototype.jumps=D,e.prototype.isComplex=Q,e.prototype.isChainable=D,e.prototype.isAssignable=D,e.prototype.unwrap=X,e.prototype.unfoldSoak=D,e.prototype.assigns=D,e.prototype.updateLocationDataIfMissing=function(e){return this.locationData?this:(this.locationData=e,this.eachChild(function(t){return t.updateLocationDataIfMissing(e)}))},e.prototype.error=function(e){return vt(e,this.locationData)},e.prototype.makeCode=function(e){return new h(this,e)},e.prototype.wrapInBraces=function(e){return[].concat(this.makeCode("("),e,this.makeCode(")"))},e.prototype.joinFragmentArrays=function(e,t){var n,i,r,s,o;for(n=[],r=s=0,o=e.length;o>s;r=++s)i=e[r],r&&n.push(this.makeCode(t)),n=n.concat(i);return n},e}(),e.Block=s=function(e){function t(e){this.expressions=et(rt(e||[]))}return kt(t,e),t.prototype.children=["expressions"],t.prototype.push=function(e){return this.expressions.push(e),this},t.prototype.pop=function(){return this.expressions.pop()},t.prototype.unshift=function(e){return this.expressions.unshift(e),this},t.prototype.unwrap=function(){return 1===this.expressions.length?this.expressions[0]:this},t.prototype.isEmpty=function(){return!this.expressions.length},t.prototype.isStatement=function(e){var t,n,i,r;for(r=this.expressions,n=0,i=r.length;i>n;n++)if(t=r[n],t.isStatement(e))return!0;return!1},t.prototype.jumps=function(e){var t,n,i,r,s;for(s=this.expressions,n=0,r=s.length;r>n;n++)if(t=s[n],i=t.jumps(e))return i},t.prototype.makeReturn=function(e){var t,n;for(n=this.expressions.length;n--;)if(t=this.expressions[n],!(t instanceof l)){this.expressions[n]=t.makeReturn(e),t instanceof M&&!t.expression&&this.expressions.splice(n,1);break}return this},t.prototype.compileToFragments=function(e,n){return null==e&&(e={}),e.scope?t.__super__.compileToFragments.call(this,e,n):this.compileRoot(e)},t.prototype.compileNode=function(e){var n,i,r,s,o,a,c,h,l;for(this.tab=e.indent,l=e.level===L,i=[],h=this.expressions,s=o=0,a=h.length;a>o;s=++o)c=h[s],c=c.unwrapAll(),c=c.unfoldSoak(e)||c,c instanceof t?i.push(c.compileNode(e)):l?(c.front=!0,r=c.compileToFragments(e),c.isStatement(e)||(r.unshift(this.makeCode(""+this.tab)),r.push(this.makeCode(";"))),i.push(r)):i.push(c.compileToFragments(e,E));return l?this.spaced?[].concat(this.joinFragmentArrays(i,"\n\n"),this.makeCode("\n")):this.joinFragmentArrays(i,"\n"):(n=i.length?this.joinFragmentArrays(i,", "):[this.makeCode("void 0")],i.length>1&&e.level>=E?this.wrapInBraces(n):n)},t.prototype.compileRoot=function(e){var t,n,i,r,s,o,a,c,h,u,p;for(e.indent=e.bare?"":q,e.level=L,this.spaced=!0,e.scope=new P(null,this,null,null!=(h=e.referencedVars)?h:[]),u=e.locals||[],r=0,s=u.length;s>r;r++)o=u[r],e.scope.parameter(o);return a=[],e.bare||(c=function(){var e,n,r,s;for(r=this.expressions,s=[],i=e=0,n=r.length;n>e&&(t=r[i],t.unwrap()instanceof l);i=++e)s.push(t);return s}.call(this),p=this.expressions.slice(c.length),this.expressions=c,c.length&&(a=this.compileNode(lt(e,{indent:""})),a.push(this.makeCode("\n"))),this.expressions=p),n=this.compileWithDeclarations(e),e.bare?n:[].concat(a,this.makeCode("(function() {\n"),n,this.makeCode("\n}).call(this);\n"))},t.prototype.compileWithDeclarations=function(e){var t,n,i,r,s,o,a,c,h,u,p,d,f,m;for(r=[],c=[],h=this.expressions,s=o=0,a=h.length;a>o&&(i=h[s],i=i.unwrap(),i instanceof l||i instanceof x);s=++o);return e=lt(e,{level:L}),s&&(d=this.expressions.splice(s,9e9),u=[this.spaced,!1],m=u[0],this.spaced=u[1],p=[this.compileNode(e),m],r=p[0],this.spaced=p[1],this.expressions=d),c=this.compileNode(e),f=e.scope,f.expressions===this&&(n=e.scope.hasDeclarations(),t=f.hasAssignments,n||t?(s&&r.push(this.makeCode("\n")),r.push(this.makeCode(this.tab+"var ")),n&&r.push(this.makeCode(f.declaredVariables().join(", "))),t&&(n&&r.push(this.makeCode(",\n"+(this.tab+q))),r.push(this.makeCode(f.assignedVariables().join(",\n"+(this.tab+q))))),r.push(this.makeCode(";\n"+(this.spaced?"\n":"")))):r.length&&c.length&&r.push(this.makeCode("\n"))),r.concat(c)},t.wrap=function(e){return 1===e.length&&e[0]instanceof t?e[0]:new t(e)},t}(r),e.Literal=x=function(e){function t(e){this.value=e}return kt(t,e),t.prototype.makeReturn=function(){return this.isStatement()?this:t.__super__.makeReturn.apply(this,arguments)},t.prototype.isAssignable=function(){return g.test(this.value)},t.prototype.isStatement=function(){var e;return"break"===(e=this.value)||"continue"===e||"debugger"===e},t.prototype.isComplex=D,t.prototype.assigns=function(e){return e===this.value},t.prototype.jumps=function(e){return"break"!==this.value||(null!=e?e.loop:void 0)||(null!=e?e.block:void 0)?"continue"!==this.value||(null!=e?e.loop:void 0)?void 0:this:this},t.prototype.compileNode=function(e){var t,n,i;return n="this"===this.value?(null!=(i=e.scope.method)?i.bound:void 0)?e.scope.method.context:this.value:this.value.reserved?'"'+this.value+'"':this.value,t=this.isStatement()?""+this.tab+n+";":n,[this.makeCode(t)]},t.prototype.toString=function(){return' "'+this.value+'"'},t}(r),e.Undefined=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return kt(t,e),t.prototype.isAssignable=D,t.prototype.isComplex=D,t.prototype.compileNode=function(e){return[this.makeCode(e.level>=T?"(void 0)":"void 0")]},t}(r),e.Null=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return kt(t,e),t.prototype.isAssignable=D,t.prototype.isComplex=D,t.prototype.compileNode=function(){return[this.makeCode("null")]},t}(r),e.Bool=function(e){function t(e){this.val=e}return kt(t,e),t.prototype.isAssignable=D,t.prototype.isComplex=D,t.prototype.compileNode=function(){return[this.makeCode(this.val)]},t}(r),e.Return=M=function(e){function t(e){this.expression=e}return kt(t,e),t.prototype.children=["expression"],t.prototype.isStatement=Q,t.prototype.makeReturn=X,t.prototype.jumps=X,t.prototype.compileToFragments=function(e,n){var i,r;return i=null!=(r=this.expression)?r.makeReturn():void 0,!i||i instanceof t?t.__super__.compileToFragments.call(this,e,n):i.compileToFragments(e,n)},t.prototype.compileNode=function(e){var t,n,i;return t=[],n=null!=(i=this.expression)?"function"==typeof i.isYieldReturn?i.isYieldReturn():void 0:void 0,n||t.push(this.makeCode(this.tab+("return"+(this.expression?" ":"")))),this.expression&&(t=t.concat(this.expression.compileToFragments(e,N))),n||t.push(this.makeCode(";")),t},t}(r),e.Value=z=function(e){function t(e,n,i){return!n&&e instanceof t?e:(this.base=e,this.properties=n||[],i&&(this[i]=!0),this)}return kt(t,e),t.prototype.children=["base","properties"],t.prototype.add=function(e){return this.properties=this.properties.concat(e),this},t.prototype.hasProperties=function(){return!!this.properties.length},t.prototype.bareLiteral=function(e){return!this.properties.length&&this.base instanceof e},t.prototype.isArray=function(){return this.bareLiteral(n)},t.prototype.isRange=function(){return this.bareLiteral(j)},t.prototype.isComplex=function(){return this.hasProperties()||this.base.isComplex()},t.prototype.isAssignable=function(){return this.hasProperties()||this.base.isAssignable()},t.prototype.isSimpleNumber=function(){return this.bareLiteral(x)&&B.test(this.base.value)},t.prototype.isString=function(){return this.bareLiteral(x)&&y.test(this.base.value)},t.prototype.isRegex=function(){return this.bareLiteral(x)&&v.test(this.base.value)},t.prototype.isAtomic=function(){var e,t,n,i;for(i=this.properties.concat(this.base),e=0,t=i.length;t>e;e++)if(n=i[e],n.soak||n instanceof o)return!1;return!0},t.prototype.isNotCallable=function(){return this.isSimpleNumber()||this.isString()||this.isRegex()||this.isArray()||this.isRange()||this.isSplice()||this.isObject()},t.prototype.isStatement=function(e){return!this.properties.length&&this.base.isStatement(e)},t.prototype.assigns=function(e){return!this.properties.length&&this.base.assigns(e)},t.prototype.jumps=function(e){return!this.properties.length&&this.base.jumps(e)},t.prototype.isObject=function(e){return this.properties.length?!1:this.base instanceof A&&(!e||this.base.generated)},t.prototype.isSplice=function(){var e,t;return t=this.properties,e=t[t.length-1],e instanceof U},t.prototype.looksStatic=function(e){var t;return this.base.value===e&&1===this.properties.length&&"prototype"!==(null!=(t=this.properties[0].name)?t.value:void 0)},t.prototype.unwrap=function(){return this.properties.length?this:this.base},t.prototype.cacheReference=function(e){var n,r,s,o,a;return a=this.properties,s=a[a.length-1],2>this.properties.length&&!this.base.isComplex()&&!(null!=s?s.isComplex():void 0)?[this,this]:(n=new t(this.base,this.properties.slice(0,-1)),n.isComplex()&&(r=new x(e.scope.freeVariable("base")),n=new t(new O(new i(r,n)))),s?(s.isComplex()&&(o=new x(e.scope.freeVariable("name")),s=new w(new i(o,s.index)),o=new w(o)),[n.add(s),new t(r||n.base,[o||s])]):[n,r])},t.prototype.compileNode=function(e){var t,n,i,r,s;for(this.base.front=this.front,s=this.properties,t=this.base.compileToFragments(e,s.length?T:null),(this.base instanceof O||s.length)&&B.test(st(t))&&t.push(this.makeCode(".")),n=0,i=s.length;i>n;n++)r=s[n],t.push.apply(t,r.compileToFragments(e));return t},t.prototype.unfoldSoak=function(e){return null!=this.unfoldedSoak?this.unfoldedSoak:this.unfoldedSoak=function(n){return function(){var r,s,o,a,c,h,l,p,d,f;if(o=n.base.unfoldSoak(e))return(p=o.body.properties).push.apply(p,n.properties),o;for(d=n.properties,s=a=0,c=d.length;c>a;s=++a)if(h=d[s],h.soak)return h.soak=!1,r=new t(n.base,n.properties.slice(0,s)),f=new t(n.base,n.properties.slice(s)),r.isComplex()&&(l=new x(e.scope.freeVariable("ref")),r=new O(new i(l,r)),f.base=l),new b(new u(r),f,{soak:!0});return!1}}(this)()},t}(r),e.Comment=l=function(e){function t(e){this.comment=e}return kt(t,e),t.prototype.isStatement=Q,t.prototype.makeReturn=X,t.prototype.compileNode=function(e,t){var n,i;return i=this.comment.replace(/^(\s*)#(?=\s)/gm,"$1 *"),n="/*"+ut(i,this.tab)+(Tt.call(i,"\n")>=0?"\n"+this.tab:"")+" */",(t||e.level)===L&&(n=e.indent+n),[this.makeCode("\n"),this.makeCode(n)]},t}(r),e.Call=o=function(e){function n(e,t,n){this.args=null!=t?t:[],this.soak=n,this.isNew=!1,this.isSuper="super"===e,this.variable=this.isSuper?null:e,e instanceof z&&e.isNotCallable()&&e.error("literal is not a function")}return kt(n,e),n.prototype.children=["variable","args"],n.prototype.newInstance=function(){var e,t;return e=(null!=(t=this.variable)?t.base:void 0)||this.variable,e instanceof n&&!e.isNew?e.newInstance():this.isNew=!0,this},n.prototype.superReference=function(e){var n,r,s,o,a,c,h,l;return a=e.scope.namedMethod(),(null!=a?a.klass:void 0)?(o=a.klass,c=a.name,l=a.variable,o.isComplex()&&(s=new x(e.scope.parent.freeVariable("base")),r=new z(new O(new i(s,o))),l.base=r,l.properties.splice(0,o.properties.length)),(c.isComplex()||c instanceof w&&c.index.isAssignable())&&(h=new x(e.scope.parent.freeVariable("name")),c=new w(new i(h,c.index)),l.properties.pop(),l.properties.push(c)),n=[new t(new x("__super__"))],a["static"]&&n.push(new t(new x("constructor"))),n.push(null!=h?new w(h):c),new z(null!=s?s:o,n).compile(e)):(null!=a?a.ctor:void 0)?a.name+".__super__.constructor":this.error("cannot call super outside of an instance method.")},n.prototype.superThis=function(e){var t;return t=e.scope.method,t&&!t.klass&&t.context||"this"},n.prototype.unfoldSoak=function(e){var t,i,r,s,o,a,c,h,l;if(this.soak){if(this.variable){if(i=yt(e,this,"variable"))return i;c=new z(this.variable).cacheReference(e),s=c[0],l=c[1]}else s=new x(this.superReference(e)),l=new z(s);return l=new n(l,this.args),l.isNew=this.isNew,s=new x("typeof "+s.compile(e)+' === "function"'),new b(s,new z(l),{soak:!0})}for(t=this,a=[];;)if(t.variable instanceof n)a.push(t),t=t.variable;else{if(!(t.variable instanceof z))break;if(a.push(t),!((t=t.variable.base)instanceof n))break}for(h=a.reverse(),r=0,o=h.length;o>r;r++)t=h[r],i&&(t.variable instanceof n?t.variable=i:t.variable.base=i),i=yt(e,t,"variable");return i},n.prototype.compileNode=function(e){var t,n,i,r,s,o,a,c,h,l;if(null!=(h=this.variable)&&(h.front=this.front),r=G.compileSplattedArray(e,this.args,!0),r.length)return this.compileSplat(e,r);for(i=[],l=this.args,n=o=0,a=l.length;a>o;n=++o)t=l[n],n&&i.push(this.makeCode(", ")),i.push.apply(i,t.compileToFragments(e,E));return s=[],this.isSuper?(c=this.superReference(e)+(".call("+this.superThis(e)),i.length&&(c+=", "),s.push(this.makeCode(c))):(this.isNew&&s.push(this.makeCode("new ")),s.push.apply(s,this.variable.compileToFragments(e,T)),s.push(this.makeCode("("))),s.push.apply(s,i),s.push(this.makeCode(")")),s},n.prototype.compileSplat=function(e,t){var n,i,r,s,o,a;return this.isSuper?[].concat(this.makeCode(this.superReference(e)+".apply("+this.superThis(e)+", "),t,this.makeCode(")")):this.isNew?(s=this.tab+q,[].concat(this.makeCode("(function(func, args, ctor) {\n"+s+"ctor.prototype = func.prototype;\n"+s+"var child = new ctor, result = func.apply(child, args);\n"+s+"return Object(result) === result ? result : child;\n"+this.tab+"})("),this.variable.compileToFragments(e,E),this.makeCode(", "),t,this.makeCode(", function(){})"))):(n=[],i=new z(this.variable),(o=i.properties.pop())&&i.isComplex()?(a=e.scope.freeVariable("ref"),n=n.concat(this.makeCode("("+a+" = "),i.compileToFragments(e,E),this.makeCode(")"),o.compileToFragments(e))):(r=i.compileToFragments(e,T),B.test(st(r))&&(r=this.wrapInBraces(r)),o?(a=st(r),r.push.apply(r,o.compileToFragments(e))):a="null",n=n.concat(r)),n=n.concat(this.makeCode(".apply("+a+", "),t,this.makeCode(")")))},n}(r),e.Extends=d=function(e){function t(e,t){this.child=e,this.parent=t}return kt(t,e),t.prototype.children=["child","parent"],t.prototype.compileToFragments=function(e){return new o(new z(new x(bt("extend",e))),[this.child,this.parent]).compileToFragments(e)},t}(r),e.Access=t=function(e){function t(e,t){this.name=e,this.name.asKey=!0,this.soak="soak"===t}return kt(t,e),t.prototype.children=["name"],t.prototype.compileToFragments=function(e){var t;return t=this.name.compileToFragments(e),g.test(st(t))?t.unshift(this.makeCode(".")):(t.unshift(this.makeCode("[")),t.push(this.makeCode("]"))),t},t.prototype.isComplex=D,t}(r),e.Index=w=function(e){function t(e){this.index=e}return kt(t,e),t.prototype.children=["index"],t.prototype.compileToFragments=function(e){return[].concat(this.makeCode("["),this.index.compileToFragments(e,N),this.makeCode("]"))},t.prototype.isComplex=function(){return this.index.isComplex()},t}(r),e.Range=j=function(e){function t(e,t,n){this.from=e,this.to=t,this.exclusive="exclusive"===n,this.equals=this.exclusive?"":"="}return kt(t,e),t.prototype.children=["from","to"],t.prototype.compileVariables=function(e){var t,n,i,r,s,o;return e=lt(e,{top:!0}),t=tt(e,"isComplex"),n=this.cacheToCodeFragments(this.from.cache(e,E,t)),this.fromC=n[0],this.fromVar=n[1],i=this.cacheToCodeFragments(this.to.cache(e,E,t)),this.toC=i[0],this.toVar=i[1],(o=tt(e,"step"))&&(r=this.cacheToCodeFragments(o.cache(e,E,t)),this.step=r[0],this.stepVar=r[1]),s=[this.fromVar.match(R),this.toVar.match(R)],this.fromNum=s[0],this.toNum=s[1],this.stepVar?this.stepNum=this.stepVar.match(R):void 0},t.prototype.compileNode=function(e){var t,n,i,r,s,o,a,c,h,l,u,p,d,f;return this.fromVar||this.compileVariables(e),e.index?(a=this.fromNum&&this.toNum,s=tt(e,"index"),o=tt(e,"name"),h=o&&o!==s,f=s+" = "+this.fromC,this.toC!==this.toVar&&(f+=", "+this.toC),this.step!==this.stepVar&&(f+=", "+this.step),l=[s+" <"+this.equals,s+" >"+this.equals],c=l[0],r=l[1],n=this.stepNum?pt(this.stepNum[0])>0?c+" "+this.toVar:r+" "+this.toVar:a?(u=[pt(this.fromNum[0]),pt(this.toNum[0])],i=u[0],d=u[1],u,d>=i?c+" "+d:r+" "+d):(t=this.stepVar?this.stepVar+" > 0":this.fromVar+" <= "+this.toVar,t+" ? "+c+" "+this.toVar+" : "+r+" "+this.toVar),p=this.stepVar?s+" += "+this.stepVar:a?h?d>=i?"++"+s:"--"+s:d>=i?s+"++":s+"--":h?t+" ? ++"+s+" : --"+s:t+" ? "+s+"++ : "+s+"--",h&&(f=o+" = "+f),h&&(p=o+" = "+p),[this.makeCode(f+"; "+n+"; "+p)]):this.compileArray(e)},t.prototype.compileArray=function(e){var t,n,i,r,s,o,a,c,h,l,u,p,d;return this.fromNum&&this.toNum&&20>=Math.abs(this.fromNum-this.toNum)?(h=function(){p=[];for(var e=l=+this.fromNum,t=+this.toNum;t>=l?t>=e:e>=t;t>=l?e++:e--)p.push(e);return p}.apply(this),this.exclusive&&h.pop(),[this.makeCode("["+h.join(", ")+"]")]):(o=this.tab+q,s=e.scope.freeVariable("i",{single:!0}),u=e.scope.freeVariable("results"),c="\n"+o+u+" = [];",this.fromNum&&this.toNum?(e.index=s,n=st(this.compileNode(e))):(d=s+" = "+this.fromC+(this.toC!==this.toVar?", "+this.toC:""),i=this.fromVar+" <= "+this.toVar,n="var "+d+"; "+i+" ? "+s+" <"+this.equals+" "+this.toVar+" : "+s+" >"+this.equals+" "+this.toVar+"; "+i+" ? "+s+"++ : "+s+"--"),a="{ "+u+".push("+s+"); }\n"+o+"return "+u+";\n"+e.indent,r=function(e){return null!=e?e.contains(at):void 0},(r(this.from)||r(this.to))&&(t=", arguments"),[this.makeCode("(function() {"+c+"\n"+o+"for ("+n+")"+a+"}).apply(this"+(null!=t?t:"")+")")])},t}(r),e.Slice=U=function(e){function t(e){this.range=e,t.__super__.constructor.call(this)}return kt(t,e),t.prototype.children=["range"],t.prototype.compileNode=function(e){var t,n,i,r,s,o,a;return s=this.range,o=s.to,i=s.from,r=i&&i.compileToFragments(e,N)||[this.makeCode("0")],o&&(t=o.compileToFragments(e,N),n=st(t),(this.range.exclusive||-1!==+n)&&(a=", "+(this.range.exclusive?n:B.test(n)?""+(+n+1):(t=o.compileToFragments(e,T),"+"+st(t)+" + 1 || 9e9")))),[this.makeCode(".slice("+st(r)+(a||"")+")")]},t}(r),e.Obj=A=function(e){function n(e,t){this.generated=null!=t?t:!1,this.objects=this.properties=e||[]}return kt(n,e),n.prototype.children=["properties"],n.prototype.compileNode=function(e){var n,r,s,o,a,c,h,u,p,d,f,m,g,v,y,b,k,w,T,C,E;if(T=this.properties,this.generated)for(h=0,g=T.length;g>h;h++)b=T[h],b instanceof z&&b.error("cannot have an implicit value in an implicit object");for(r=p=0,v=T.length;v>p&&(w=T[r],!((w.variable||w).base instanceof O));r=++p);for(s=T.length>r,a=e.indent+=q,m=this.lastNonComment(this.properties),n=[],s&&(k=e.scope.freeVariable("obj"),n.push(this.makeCode("(\n"+a+k+" = "))),n.push(this.makeCode("{"+(0===T.length||0===r?"}":"\n"))),o=f=0,y=T.length;y>f;o=++f)w=T[o],o===r&&(0!==o&&n.push(this.makeCode("\n"+a+"}")),n.push(this.makeCode(",\n"))),u=o===T.length-1||o===r-1?"":w===m||w instanceof l?"\n":",\n",c=w instanceof l?"":a,s&&r>o&&(c+=q),w instanceof i&&w.variable instanceof z&&w.variable.hasProperties()&&w.variable.error("invalid object key"),w instanceof z&&w["this"]&&(w=new i(w.properties[0].name,w,"object")),w instanceof l||(r>o?(w instanceof i||(w=new i(w,w,"object")),(w.variable.base||w.variable).asKey=!0):(w instanceof i?(d=w.variable,E=w.value):(C=w.base.cache(e),d=C[0],E=C[1]),w=new i(new z(new x(k),[new t(d)]),E))),c&&n.push(this.makeCode(c)),n.push.apply(n,w.compileToFragments(e,L)),u&&n.push(this.makeCode(u));return s?n.push(this.makeCode(",\n"+a+k+"\n"+this.tab+")")):0!==T.length&&n.push(this.makeCode("\n"+this.tab+"}")),this.front&&!s?this.wrapInBraces(n):n},n.prototype.assigns=function(e){var t,n,i,r;for(r=this.properties,t=0,n=r.length;n>t;t++)if(i=r[t],i.assigns(e))return!0;return!1},n}(r),e.Arr=n=function(e){function t(e){this.objects=e||[]}return kt(t,e),t.prototype.children=["objects"],t.prototype.compileNode=function(e){var t,n,i,r,s,o,a;if(!this.objects.length)return[this.makeCode("[]")];if(e.indent+=q,t=G.compileSplattedArray(e,this.objects),t.length)return t;for(t=[],n=function(){var t,n,i,r;for(i=this.objects,r=[],t=0,n=i.length;n>t;t++)a=i[t],r.push(a.compileToFragments(e,E));return r}.call(this),r=s=0,o=n.length;o>s;r=++s)i=n[r],r&&t.push(this.makeCode(", ")),t.push.apply(t,i);return st(t).indexOf("\n")>=0?(t.unshift(this.makeCode("[\n"+e.indent)),t.push(this.makeCode("\n"+this.tab+"]"))):(t.unshift(this.makeCode("[")),t.push(this.makeCode("]"))),t},t.prototype.assigns=function(e){var t,n,i,r;for(r=this.objects,t=0,n=r.length;n>t;t++)if(i=r[t],i.assigns(e))return!0;return!1},t}(r),e.Class=a=function(e){function n(e,t,n){this.variable=e,this.parent=t,this.body=null!=n?n:new s,this.boundFuncs=[],this.body.classBody=!0}return kt(n,e),n.prototype.children=["variable","parent","body"],n.prototype.determineName=function(){var e,n,i;return this.variable?(n=this.variable.properties,i=n[n.length-1],e=i?i instanceof t&&i.name.value:this.variable.base.value,Tt.call(V,e)>=0&&this.variable.error("class variable name may not be "+e),e&&(e=g.test(e)&&e)):null},n.prototype.setContext=function(e){return this.body.traverseChildren(!1,function(t){return t.classBody?!1:t instanceof x&&"this"===t.value?t.value=e:t instanceof c&&t.bound?t.context=e:void 0})},n.prototype.addBoundFunctions=function(e){var n,i,r,s,o;for(o=this.boundFuncs,i=0,r=o.length;r>i;i++)n=o[i],s=new z(new x("this"),[new t(n)]).compile(e),this.ctor.body.unshift(new x(s+" = "+bt("bind",e)+"("+s+", this)"))},n.prototype.addProperties=function(e,n,r){var s,o,a,h,l,u;return u=e.base.properties.slice(0),h=function(){var e;for(e=[];o=u.shift();)o instanceof i&&(a=o.variable.base,delete o.context,l=o.value,"constructor"===a.value?(this.ctor&&o.error("cannot define more than one constructor in a class"),l.bound&&o.error("cannot define a constructor as a bound function"),l instanceof c?o=this.ctor=l:(this.externalCtor=r.classScope.freeVariable("class"),o=new i(new x(this.externalCtor),l))):o.variable["this"]?l["static"]=!0:(s=a.isComplex()?new w(a):new t(a),o.variable=new z(new x(n),[new t(new x("prototype")),s]),l instanceof c&&l.bound&&(this.boundFuncs.push(a),l.bound=!1))),e.push(o);return e}.call(this),et(h)},n.prototype.walkBody=function(e,t){return this.traverseChildren(!1,function(r){return function(o){var a,c,h,l,u,p,d;if(a=!0,o instanceof n)return!1;if(o instanceof s){for(d=c=o.expressions,h=l=0,u=d.length;u>l;h=++l)p=d[h],p instanceof i&&p.variable.looksStatic(e)?p.value["static"]=!0:p instanceof z&&p.isObject(!0)&&(a=!1,c[h]=r.addProperties(p,e,t));o.expressions=c=rt(c)}return a&&!(o instanceof n)}}(this))},n.prototype.hoistDirectivePrologue=function(){var e,t,n;for(t=0,e=this.body.expressions;(n=e[t])&&n instanceof l||n instanceof z&&n.isString();)++t;return this.directives=e.splice(0,t)},n.prototype.ensureConstructor=function(e){return this.ctor||(this.ctor=new c,this.externalCtor?this.ctor.body.push(new x(this.externalCtor+".apply(this, arguments)")):this.parent&&this.ctor.body.push(new x(e+".__super__.constructor.apply(this, arguments)")),this.ctor.body.makeReturn(),this.body.expressions.unshift(this.ctor)),this.ctor.ctor=this.ctor.name=e,this.ctor.klass=null,this.ctor.noReturn=!0},n.prototype.compileNode=function(e){var t,n,r,a,h,l,u,p,f;return(a=this.body.jumps())&&a.error("Class bodies cannot contain pure statements"),(n=this.body.contains(at))&&n.error("Class bodies shouldn't reference arguments"),u=this.determineName()||"_Class",u.reserved&&(u="_"+u),l=new x(u),r=new c([],s.wrap([this.body])),t=[],e.classScope=r.makeScope(e.scope),this.hoistDirectivePrologue(),this.setContext(u),this.walkBody(u,e),this.ensureConstructor(u),this.addBoundFunctions(e),this.body.spaced=!0,this.body.expressions.push(l),this.parent&&(f=new x(e.classScope.freeVariable("superClass",{reserve:!1})),this.body.expressions.unshift(new d(l,f)),r.params.push(new _(f)),t.push(this.parent)),(p=this.body.expressions).unshift.apply(p,this.directives),h=new O(new o(r,t)),this.variable&&(h=new i(this.variable,h)),h.compileToFragments(e)},n}(r),e.Assign=i=function(e){function n(e,t,n,i){var r,s,o;this.variable=e,this.value=t,this.context=n,this.param=i&&i.param,this.subpattern=i&&i.subpattern,o=s=this.variable.unwrapAll().value,r=Tt.call(V,o)>=0,r&&"object"!==this.context&&this.variable.error('variable name may not be "'+s+'"')}return kt(n,e),n.prototype.children=["variable","value"],n.prototype.isStatement=function(e){return(null!=e?e.level:void 0)===L&&null!=this.context&&Tt.call(this.context,"?")>=0 +},n.prototype.assigns=function(e){return this["object"===this.context?"value":"variable"].assigns(e)},n.prototype.unfoldSoak=function(e){return yt(e,this,"variable")},n.prototype.compileNode=function(e){var t,n,i,r,s,o,a,h,l,u,p,d,f,m;if(i=this.variable instanceof z){if(this.variable.isArray()||this.variable.isObject())return this.compilePatternMatch(e);if(this.variable.isSplice())return this.compileSplice(e);if("||="===(h=this.context)||"&&="===h||"?="===h)return this.compileConditional(e);if("**="===(l=this.context)||"//="===l||"%%="===l)return this.compileSpecialMath(e)}return this.value instanceof c&&(this.value["static"]?(this.value.klass=this.variable.base,this.value.name=this.variable.properties[0],this.value.variable=this.variable):(null!=(u=this.variable.properties)?u.length:void 0)>=2&&(p=this.variable.properties,o=p.length>=3?Ct.call(p,0,r=p.length-2):(r=0,[]),a=p[r++],s=p[r++],"prototype"===(null!=(d=a.name)?d.value:void 0)&&(this.value.klass=new z(this.variable.base,o),this.value.name=s,this.value.variable=this.variable))),this.context||(m=this.variable.unwrapAll(),m.isAssignable()||this.variable.error('"'+this.variable.compile(e)+'" cannot be assigned'),("function"==typeof m.hasProperties?m.hasProperties():void 0)||(this.param?e.scope.add(m.value,"var"):e.scope.find(m.value))),f=this.value.compileToFragments(e,E),n=this.variable.compileToFragments(e,E),"object"===this.context?n.concat(this.makeCode(": "),f):(t=n.concat(this.makeCode(" "+(this.context||"=")+" "),f),E>=e.level?t:this.wrapInBraces(t))},n.prototype.compilePatternMatch=function(e){var i,r,s,o,a,c,h,l,u,d,f,m,v,y,b,k,T,C,N,S,D,R,A,I,_,j,M,B;if(I=e.level===L,j=this.value,y=this.variable.base.objects,!(b=y.length))return s=j.compileToFragments(e),e.level>=F?this.wrapInBraces(s):s;if(l=this.variable.isObject(),I&&1===b&&!((v=y[0])instanceof G))return v instanceof n?(T=v,C=T.variable,h=C.base,v=T.value):h=l?v["this"]?v.properties[0].name:v:new x(0),i=g.test(h.unwrap().value||0),j=new z(j),j.properties.push(new(i?t:w)(h)),N=v.unwrap().value,Tt.call($,N)>=0&&v.error("assignment to a reserved word: "+v.compile(e)),new n(v,j,null,{param:this.param}).compileToFragments(e,L);for(M=j.compileToFragments(e,E),B=st(M),r=[],o=!1,(!g.test(B)||this.variable.assigns(B))&&(r.push([this.makeCode((k=e.scope.freeVariable("ref"))+" = ")].concat(Ct.call(M))),M=[this.makeCode(k)],B=k),c=d=0,f=y.length;f>d;c=++d){if(v=y[c],h=c,l&&(v instanceof n?(S=v,D=S.variable,h=D.base,v=S.value):v.base instanceof O?(R=new z(v.unwrapAll()).cacheReference(e),v=R[0],h=R[1]):h=v["this"]?v.properties[0].name:v),!o&&v instanceof G)m=v.name.unwrap().value,v=v.unwrap(),_=b+" <= "+B+".length ? "+bt("slice",e)+".call("+B+", "+c,(A=b-c-1)?(u=e.scope.freeVariable("i",{single:!0}),_+=", "+u+" = "+B+".length - "+A+") : ("+u+" = "+c+", [])"):_+=") : []",_=new x(_),o=u+"++";else{if(!o&&v instanceof p){(A=b-c-1)&&(1===A?o=B+".length - 1":(u=e.scope.freeVariable("i",{single:!0}),_=new x(u+" = "+B+".length - "+A),o=u+"++",r.push(_.compileToFragments(e,E))));continue}m=v.unwrap().value,(v instanceof G||v instanceof p)&&v.error("multiple splats/expansions are disallowed in an assignment"),"number"==typeof h?(h=new x(o||h),i=!1):i=l&&g.test(h.unwrap().value||0),_=new z(new x(B),[new(i?t:w)(h)])}null!=m&&Tt.call($,m)>=0&&v.error("assignment to a reserved word: "+v.compile(e)),r.push(new n(v,_,null,{param:this.param,subpattern:!0}).compileToFragments(e,E))}return I||this.subpattern||r.push(M),a=this.joinFragmentArrays(r,", "),E>e.level?a:this.wrapInBraces(a)},n.prototype.compileConditional=function(e){var t,i,r,s;return r=this.variable.cacheReference(e),i=r[0],s=r[1],!i.properties.length&&i.base instanceof x&&"this"!==i.base.value&&!e.scope.check(i.base.value)&&this.variable.error('the variable "'+i.base.value+"\" can't be assigned with "+this.context+" because it has not been declared before"),Tt.call(this.context,"?")>=0?(e.isExistentialEquals=!0,new b(new u(i),s,{type:"if"}).addElse(new n(s,this.value,"=")).compileToFragments(e)):(t=new I(this.context.slice(0,-1),i,new n(s,this.value,"=")).compileToFragments(e),E>=e.level?t:this.wrapInBraces(t))},n.prototype.compileSpecialMath=function(e){var t,i,r;return i=this.variable.cacheReference(e),t=i[0],r=i[1],new n(t,new I(this.context.slice(0,-1),r,this.value)).compileToFragments(e)},n.prototype.compileSplice=function(e){var t,n,i,r,s,o,a,c,h,l,u,p;return a=this.variable.properties.pop().range,i=a.from,l=a.to,n=a.exclusive,o=this.variable.compile(e),i?(c=this.cacheToCodeFragments(i.cache(e,F)),r=c[0],s=c[1]):r=s="0",l?i instanceof z&&i.isSimpleNumber()&&l instanceof z&&l.isSimpleNumber()?(l=l.compile(e)-s,n||(l+=1)):(l=l.compile(e,T)+" - "+s,n||(l+=" + 1")):l="9e9",h=this.value.cache(e,E),u=h[0],p=h[1],t=[].concat(this.makeCode("[].splice.apply("+o+", ["+r+", "+l+"].concat("),u,this.makeCode(")), "),p),e.level>L?this.wrapInBraces(t):t},n}(r),e.Code=c=function(e){function t(e,t,n){this.params=e||[],this.body=t||new s,this.bound="boundfunc"===n,this.isGenerator=!!this.body.contains(function(e){var t;return e instanceof I&&("yield"===(t=e.operator)||"yield*"===t)})}return kt(t,e),t.prototype.children=["params","body"],t.prototype.isStatement=function(){return!!this.ctor},t.prototype.jumps=D,t.prototype.makeScope=function(e){return new P(e,this.body,this)},t.prototype.compileNode=function(e){var r,a,c,h,l,u,d,f,m,g,v,y,k,w,C,E,F,N,L,S,D,R,A,O,$,j,M,B,V,P,U,G,H;if(this.bound&&(null!=(A=e.scope.method)?A.bound:void 0)&&(this.context=e.scope.method.context),this.bound&&!this.context)return this.context="_this",H=new t([new _(new x(this.context))],new s([this])),a=new o(H,[new x("this")]),a.updateLocationDataIfMissing(this.locationData),a.compileNode(e);for(e.scope=tt(e,"classScope")||this.makeScope(e.scope),e.scope.shared=tt(e,"sharedScope"),e.indent+=q,delete e.bare,delete e.isExistentialEquals,L=[],h=[],O=this.params,u=0,m=O.length;m>u;u++)N=O[u],N instanceof p||e.scope.parameter(N.asReference(e));for($=this.params,d=0,g=$.length;g>d;d++)if(N=$[d],N.splat||N instanceof p){for(j=this.params,f=0,v=j.length;v>f;f++)F=j[f],F instanceof p||!F.name.value||e.scope.add(F.name.value,"var",!0);V=new i(new z(new n(function(){var t,n,i,r;for(i=this.params,r=[],n=0,t=i.length;t>n;n++)F=i[n],r.push(F.asReference(e));return r}.call(this))),new z(new x("arguments")));break}for(M=this.params,E=0,y=M.length;y>E;E++)N=M[E],N.isComplex()?(U=R=N.asReference(e),N.value&&(U=new I("?",R,N.value)),h.push(new i(new z(N.name),U,"=",{param:!0}))):(R=N,N.value&&(C=new x(R.name.value+" == null"),U=new i(new z(N.name),N.value,"="),h.push(new b(C,U)))),V||L.push(R);for(G=this.body.isEmpty(),V&&h.unshift(V),h.length&&(B=this.body.expressions).unshift.apply(B,h),l=S=0,k=L.length;k>S;l=++S)F=L[l],L[l]=F.compileToFragments(e),e.scope.parameter(st(L[l]));for(P=[],this.eachParamName(function(e,t){return Tt.call(P,e)>=0&&t.error("multiple parameters named "+e),P.push(e)}),G||this.noReturn||this.body.makeReturn(),c="function",this.isGenerator&&(c+="*"),this.ctor&&(c+=" "+this.name),c+="(",r=[this.makeCode(c)],l=D=0,w=L.length;w>D;l=++D)F=L[l],l&&r.push(this.makeCode(", ")),r.push.apply(r,F);return r.push(this.makeCode(") {")),this.body.isEmpty()||(r=r.concat(this.makeCode("\n"),this.body.compileWithDeclarations(e),this.makeCode("\n"+this.tab))),r.push(this.makeCode("}")),this.ctor?[this.makeCode(this.tab)].concat(Ct.call(r)):this.front||e.level>=T?this.wrapInBraces(r):r},t.prototype.eachParamName=function(e){var t,n,i,r,s;for(r=this.params,s=[],t=0,n=r.length;n>t;t++)i=r[t],s.push(i.eachName(e));return s},t.prototype.traverseChildren=function(e,n){return e?t.__super__.traverseChildren.call(this,e,n):void 0},t}(r),e.Param=_=function(e){function t(e,t,n){var i,r;this.name=e,this.value=t,this.splat=n,r=i=this.name.unwrapAll().value,Tt.call(V,r)>=0&&this.name.error('parameter name "'+i+'" is not allowed')}return kt(t,e),t.prototype.children=["name","value"],t.prototype.compileToFragments=function(e){return this.name.compileToFragments(e,E)},t.prototype.asReference=function(e){var t,n;return this.reference?this.reference:(n=this.name,n["this"]?(t=n.properties[0].name.value,t.reserved&&(t="_"+t),n=new x(e.scope.freeVariable(t))):n.isComplex()&&(n=new x(e.scope.freeVariable("arg"))),n=new z(n),this.splat&&(n=new G(n)),n.updateLocationDataIfMissing(this.locationData),this.reference=n)},t.prototype.isComplex=function(){return this.name.isComplex()},t.prototype.eachName=function(e,t){var n,r,s,o,a,c;if(null==t&&(t=this.name),n=function(t){return e("@"+t.properties[0].name.value,t)},t instanceof x)return e(t.value,t);if(t instanceof z)return n(t);for(c=t.objects,r=0,s=c.length;s>r;r++)a=c[r],a instanceof i?this.eachName(e,a.value.unwrap()):a instanceof G?(o=a.name.unwrap(),e(o.value,o)):a instanceof z?a.isArray()||a.isObject()?this.eachName(e,a.base):a["this"]?n(a):e(a.base.value,a.base):a instanceof p||a.error("illegal parameter "+a.compile())},t}(r),e.Splat=G=function(e){function t(e){this.name=e.compile?e:new x(e)}return kt(t,e),t.prototype.children=["name"],t.prototype.isAssignable=Q,t.prototype.assigns=function(e){return this.name.assigns(e)},t.prototype.compileToFragments=function(e){return this.name.compileToFragments(e)},t.prototype.unwrap=function(){return this.name},t.compileSplattedArray=function(e,n,i){var r,s,o,a,c,h,l,u,p,d,f;for(l=-1;(f=n[++l])&&!(f instanceof t););if(l>=n.length)return[];if(1===n.length)return f=n[0],c=f.compileToFragments(e,E),i?c:[].concat(f.makeCode(bt("slice",e)+".call("),c,f.makeCode(")"));for(r=n.slice(l),h=u=0,d=r.length;d>u;h=++u)f=r[h],o=f.compileToFragments(e,E),r[h]=f instanceof t?[].concat(f.makeCode(bt("slice",e)+".call("),o,f.makeCode(")")):[].concat(f.makeCode("["),o,f.makeCode("]"));return 0===l?(f=n[0],a=f.joinFragmentArrays(r.slice(1),", "),r[0].concat(f.makeCode(".concat("),a,f.makeCode(")"))):(s=function(){var t,i,r,s;for(r=n.slice(0,l),s=[],t=0,i=r.length;i>t;t++)f=r[t],s.push(f.compileToFragments(e,E));return s}(),s=n[0].joinFragmentArrays(s,", "),a=n[l].joinFragmentArrays(r,", "),p=n[n.length-1],[].concat(n[0].makeCode("["),s,n[l].makeCode("].concat("),a,p.makeCode(")")))},t}(r),e.Expansion=p=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return kt(t,e),t.prototype.isComplex=D,t.prototype.compileNode=function(){return this.error("Expansion must be used inside a destructuring assignment or parameter list")},t.prototype.asReference=function(){return this},t.prototype.eachName=function(){},t}(r),e.While=J=function(e){function t(e,t){this.condition=(null!=t?t.invert:void 0)?e.invert():e,this.guard=null!=t?t.guard:void 0}return kt(t,e),t.prototype.children=["condition","guard","body"],t.prototype.isStatement=Q,t.prototype.makeReturn=function(e){return e?t.__super__.makeReturn.apply(this,arguments):(this.returns=!this.jumps({loop:!0}),this)},t.prototype.addBody=function(e){return this.body=e,this},t.prototype.jumps=function(){var e,t,n,i,r;if(e=this.body.expressions,!e.length)return!1;for(t=0,i=e.length;i>t;t++)if(r=e[t],n=r.jumps({loop:!0}))return n;return!1},t.prototype.compileNode=function(e){var t,n,i,r;return e.indent+=q,r="",n=this.body,n.isEmpty()?n=this.makeCode(""):(this.returns&&(n.makeReturn(i=e.scope.freeVariable("results")),r=""+this.tab+i+" = [];\n"),this.guard&&(n.expressions.length>1?n.expressions.unshift(new b(new O(this.guard).invert(),new x("continue"))):this.guard&&(n=s.wrap([new b(this.guard,n)]))),n=[].concat(this.makeCode("\n"),n.compileToFragments(e,L),this.makeCode("\n"+this.tab))),t=[].concat(this.makeCode(r+this.tab+"while ("),this.condition.compileToFragments(e,N),this.makeCode(") {"),n,this.makeCode("}")),this.returns&&t.push(this.makeCode("\n"+this.tab+"return "+i+";")),t},t}(r),e.Op=I=function(e){function n(e,t,n,i){if("in"===e)return new k(t,n);if("do"===e)return this.generateDo(t);if("new"===e){if(t instanceof o&&!t["do"]&&!t.isNew)return t.newInstance();(t instanceof c&&t.bound||t["do"])&&(t=new O(t))}return this.operator=r[e]||e,this.first=t,this.second=n,this.flip=!!i,this}var r,s;return kt(n,e),r={"==":"===","!=":"!==",of:"in",yieldfrom:"yield*"},s={"!==":"===","===":"!=="},n.prototype.children=["first","second"],n.prototype.isSimpleNumber=D,n.prototype.isYield=function(){var e;return"yield"===(e=this.operator)||"yield*"===e},n.prototype.isYieldReturn=function(){return this.isYield()&&this.first instanceof M},n.prototype.isUnary=function(){return!this.second},n.prototype.isComplex=function(){var e;return!(this.isUnary()&&("+"===(e=this.operator)||"-"===e)&&this.first instanceof z&&this.first.isSimpleNumber())},n.prototype.isChainable=function(){var e;return"<"===(e=this.operator)||">"===e||">="===e||"<="===e||"==="===e||"!=="===e},n.prototype.invert=function(){var e,t,i,r,o;if(this.isChainable()&&this.first.isChainable()){for(e=!0,t=this;t&&t.operator;)e&&(e=t.operator in s),t=t.first;if(!e)return new O(this).invert();for(t=this;t&&t.operator;)t.invert=!t.invert,t.operator=s[t.operator],t=t.first;return this}return(r=s[this.operator])?(this.operator=r,this.first.unwrap()instanceof n&&this.first.invert(),this):this.second?new O(this).invert():"!"===this.operator&&(i=this.first.unwrap())instanceof n&&("!"===(o=i.operator)||"in"===o||"instanceof"===o)?i:new n("!",this)},n.prototype.unfoldSoak=function(e){var t;return("++"===(t=this.operator)||"--"===t||"delete"===t)&&yt(e,this,"first")},n.prototype.generateDo=function(e){var t,n,r,s,a,h,l,u;for(h=[],n=e instanceof i&&(l=e.value.unwrap())instanceof c?l:e,u=n.params||[],r=0,s=u.length;s>r;r++)a=u[r],a.value?(h.push(a.value),delete a.value):h.push(a);return t=new o(e,h),t["do"]=!0,t},n.prototype.compileNode=function(e){var t,n,i,r,s,o;if(n=this.isChainable()&&this.first.isChainable(),n||(this.first.front=this.front),"delete"===this.operator&&e.scope.check(this.first.unwrapAll().value)&&this.error("delete operand may not be argument or var"),("--"===(r=this.operator)||"++"===r)&&(s=this.first.unwrapAll().value,Tt.call(V,s)>=0)&&this.error('cannot increment/decrement "'+this.first.unwrapAll().value+'"'),this.isYield())return this.compileYield(e);if(this.isUnary())return this.compileUnary(e);if(n)return this.compileChain(e);switch(this.operator){case"?":return this.compileExistence(e);case"**":return this.compilePower(e);case"//":return this.compileFloorDivision(e);case"%%":return this.compileModulo(e);default:return i=this.first.compileToFragments(e,F),o=this.second.compileToFragments(e,F),t=[].concat(i,this.makeCode(" "+this.operator+" "),o),F>=e.level?t:this.wrapInBraces(t)}},n.prototype.compileChain=function(e){var t,n,i,r;return i=this.first.second.cache(e),this.first.second=i[0],r=i[1],n=this.first.compileToFragments(e,F),t=n.concat(this.makeCode(" "+(this.invert?"&&":"||")+" "),r.compileToFragments(e),this.makeCode(" "+this.operator+" "),this.second.compileToFragments(e,F)),this.wrapInBraces(t)},n.prototype.compileExistence=function(e){var t,n;return this.first.isComplex()?(n=new x(e.scope.freeVariable("ref")),t=new O(new i(n,this.first))):(t=this.first,n=t),new b(new u(t),n,{type:"if"}).addElse(this.second).compileToFragments(e)},n.prototype.compileUnary=function(e){var t,i,r;return i=[],t=this.operator,i.push([this.makeCode(t)]),"!"===t&&this.first instanceof u?(this.first.negated=!this.first.negated,this.first.compileToFragments(e)):e.level>=T?new O(this).compileToFragments(e):(r="+"===t||"-"===t,("new"===t||"typeof"===t||"delete"===t||r&&this.first instanceof n&&this.first.operator===t)&&i.push([this.makeCode(" ")]),(r&&this.first instanceof n||"new"===t&&this.first.isStatement(e))&&(this.first=new O(this.first)),i.push(this.first.compileToFragments(e,F)),this.flip&&i.reverse(),this.joinFragmentArrays(i,""))},n.prototype.compileYield=function(e){var t,n;return n=[],t=this.operator,null==e.scope.parent&&this.error("yield statements must occur within a function generator."),Tt.call(Object.keys(this.first),"expression")>=0&&!(this.first instanceof W)?this.isYieldReturn()?n.push(this.first.compileToFragments(e,L)):null!=this.first.expression&&n.push(this.first.expression.compileToFragments(e,F)):(n.push([this.makeCode("("+t+" ")]),n.push(this.first.compileToFragments(e,F)),n.push([this.makeCode(")")])),this.joinFragmentArrays(n,"")},n.prototype.compilePower=function(e){var n;return n=new z(new x("Math"),[new t(new x("pow"))]),new o(n,[this.first,this.second]).compileToFragments(e)},n.prototype.compileFloorDivision=function(e){var i,r;return r=new z(new x("Math"),[new t(new x("floor"))]),i=new n("/",this.first,this.second),new o(r,[i]).compileToFragments(e)},n.prototype.compileModulo=function(e){var t;return t=new z(new x(bt("modulo",e))),new o(t,[this.first,this.second]).compileToFragments(e)},n.prototype.toString=function(e){return n.__super__.toString.call(this,e,this.constructor.name+" "+this.operator)},n}(r),e.In=k=function(e){function t(e,t){this.object=e,this.array=t}return kt(t,e),t.prototype.children=["object","array"],t.prototype.invert=S,t.prototype.compileNode=function(e){var t,n,i,r,s;if(this.array instanceof z&&this.array.isArray()&&this.array.base.objects.length){for(s=this.array.base.objects,n=0,i=s.length;i>n;n++)if(r=s[n],r instanceof G){t=!0;break}if(!t)return this.compileOrTest(e)}return this.compileLoopTest(e)},t.prototype.compileOrTest=function(e){var t,n,i,r,s,o,a,c,h,l,u,p;for(c=this.object.cache(e,F),u=c[0],a=c[1],h=this.negated?[" !== "," && "]:[" === "," || "],t=h[0],n=h[1],p=[],l=this.array.base.objects,i=s=0,o=l.length;o>s;i=++s)r=l[i],i&&p.push(this.makeCode(n)),p=p.concat(i?a:u,this.makeCode(t),r.compileToFragments(e,T));return F>e.level?p:this.wrapInBraces(p)},t.prototype.compileLoopTest=function(e){var t,n,i,r;return i=this.object.cache(e,E),r=i[0],n=i[1],t=[].concat(this.makeCode(bt("indexOf",e)+".call("),this.array.compileToFragments(e,E),this.makeCode(", "),n,this.makeCode(") "+(this.negated?"< 0":">= 0"))),st(r)===st(n)?t:(t=r.concat(this.makeCode(", "),t),E>e.level?t:this.wrapInBraces(t))},t.prototype.toString=function(e){return t.__super__.toString.call(this,e,this.constructor.name+(this.negated?"!":""))},t}(r),e.Try=Y=function(e){function t(e,t,n,i){this.attempt=e,this.errorVariable=t,this.recovery=n,this.ensure=i}return kt(t,e),t.prototype.children=["attempt","recovery","ensure"],t.prototype.isStatement=Q,t.prototype.jumps=function(e){var t;return this.attempt.jumps(e)||(null!=(t=this.recovery)?t.jumps(e):void 0)},t.prototype.makeReturn=function(e){return this.attempt&&(this.attempt=this.attempt.makeReturn(e)),this.recovery&&(this.recovery=this.recovery.makeReturn(e)),this},t.prototype.compileNode=function(e){var t,n,r,s;return e.indent+=q,s=this.attempt.compileToFragments(e,L),t=this.recovery?(r=new x("_error"),this.errorVariable?this.recovery.unshift(new i(this.errorVariable,r)):void 0,[].concat(this.makeCode(" catch ("),r.compileToFragments(e),this.makeCode(") {\n"),this.recovery.compileToFragments(e,L),this.makeCode("\n"+this.tab+"}"))):this.ensure||this.recovery?[]:[this.makeCode(" catch (_error) {}")],n=this.ensure?[].concat(this.makeCode(" finally {\n"),this.ensure.compileToFragments(e,L),this.makeCode("\n"+this.tab+"}")):[],[].concat(this.makeCode(this.tab+"try {\n"),s,this.makeCode("\n"+this.tab+"}"),t,n)},t}(r),e.Throw=W=function(e){function t(e){this.expression=e}return kt(t,e),t.prototype.children=["expression"],t.prototype.isStatement=Q,t.prototype.jumps=D,t.prototype.makeReturn=X,t.prototype.compileNode=function(e){return[].concat(this.makeCode(this.tab+"throw "),this.expression.compileToFragments(e),this.makeCode(";"))},t}(r),e.Existence=u=function(e){function t(e){this.expression=e}return kt(t,e),t.prototype.children=["expression"],t.prototype.invert=S,t.prototype.compileNode=function(e){var t,n,i,r;return this.expression.front=this.front,i=this.expression.compile(e,F),g.test(i)&&!e.scope.check(i)?(r=this.negated?["===","||"]:["!==","&&"],t=r[0],n=r[1],i="typeof "+i+" "+t+' "undefined" '+n+" "+i+" "+t+" null"):i=i+" "+(this.negated?"==":"!=")+" null",[this.makeCode(C>=e.level?i:"("+i+")")]},t}(r),e.Parens=O=function(e){function t(e){this.body=e}return kt(t,e),t.prototype.children=["body"],t.prototype.unwrap=function(){return this.body},t.prototype.isComplex=function(){return this.body.isComplex()},t.prototype.compileNode=function(e){var t,n,i;return n=this.body.unwrap(),n instanceof z&&n.isAtomic()?(n.front=this.front,n.compileToFragments(e)):(i=n.compileToFragments(e,N),t=F>e.level&&(n instanceof I||n instanceof o||n instanceof f&&n.returns),t?i:this.wrapInBraces(i))},t}(r),e.For=f=function(e){function t(e,t){var n;this.source=t.source,this.guard=t.guard,this.step=t.step,this.name=t.name,this.index=t.index,this.body=s.wrap([e]),this.own=!!t.own,this.object=!!t.object,this.object&&(n=[this.index,this.name],this.name=n[0],this.index=n[1]),this.index instanceof z&&this.index.error("index cannot be a pattern matching expression"),this.range=this.source instanceof z&&this.source.base instanceof j&&!this.source.properties.length,this.pattern=this.name instanceof z,this.range&&this.index&&this.index.error("indexes do not apply to range loops"),this.range&&this.pattern&&this.name.error("cannot pattern match over range loops"),this.own&&!this.object&&this.name.error("cannot use own with for-in"),this.returns=!1}return kt(t,e),t.prototype.children=["body","source","guard","step"],t.prototype.compileNode=function(e){var t,n,r,o,a,c,h,l,u,p,d,f,m,v,y,k,w,T,C,F,N,S,D,A,I,_,$,j,B,V,P,U,G,H;return t=s.wrap([this.body]),D=t.expressions,T=D[D.length-1],(null!=T?T.jumps():void 0)instanceof M&&(this.returns=!1),B=this.range?this.source.base:this.source,j=e.scope,this.pattern||(F=this.name&&this.name.compile(e,E)),v=this.index&&this.index.compile(e,E),F&&!this.pattern&&j.find(F),v&&j.find(v),this.returns&&($=j.freeVariable("results")),y=this.object&&v||j.freeVariable("i",{single:!0}),k=this.range&&F||v||y,w=k!==y?k+" = ":"",this.step&&!this.range&&(A=this.cacheToCodeFragments(this.step.cache(e,E,ot)),V=A[0],U=A[1],P=U.match(R)),this.pattern&&(F=y),H="",d="",h="",f=this.tab+q,this.range?p=B.compileToFragments(lt(e,{index:y,name:F,step:this.step,isComplex:ot})):(G=this.source.compile(e,E),!F&&!this.own||g.test(G)||(h+=""+this.tab+(S=j.freeVariable("ref"))+" = "+G+";\n",G=S),F&&!this.pattern&&(N=F+" = "+G+"["+k+"]"),this.object||(V!==U&&(h+=""+this.tab+V+";\n"),this.step&&P&&(u=0>pt(P[0]))||(C=j.freeVariable("len")),a=""+w+y+" = 0, "+C+" = "+G+".length",c=""+w+y+" = "+G+".length - 1",r=y+" < "+C,o=y+" >= 0",this.step?(P?u&&(r=o,a=c):(r=U+" > 0 ? "+r+" : "+o,a="("+U+" > 0 ? ("+a+") : "+c+")"),m=y+" += "+U):m=""+(k!==y?"++"+y:y+"++"),p=[this.makeCode(a+"; "+r+"; "+w+m)])),this.returns&&(I=""+this.tab+$+" = [];\n",_="\n"+this.tab+"return "+$+";",t.makeReturn($)),this.guard&&(t.expressions.length>1?t.expressions.unshift(new b(new O(this.guard).invert(),new x("continue"))):this.guard&&(t=s.wrap([new b(this.guard,t)]))),this.pattern&&t.expressions.unshift(new i(this.name,new x(G+"["+k+"]"))),l=[].concat(this.makeCode(h),this.pluckDirectCall(e,t)),N&&(H="\n"+f+N+";"),this.object&&(p=[this.makeCode(k+" in "+G)],this.own&&(d="\n"+f+"if (!"+bt("hasProp",e)+".call("+G+", "+k+")) continue;")),n=t.compileToFragments(lt(e,{indent:f}),L),n&&n.length>0&&(n=[].concat(this.makeCode("\n"),n,this.makeCode("\n"))),[].concat(l,this.makeCode(""+(I||"")+this.tab+"for ("),p,this.makeCode(") {"+d+H),n,this.makeCode(this.tab+"}"+(_||"")))},t.prototype.pluckDirectCall=function(e,t){var n,r,s,a,h,l,u,p,d,f,m,g,v,y,b,k;for(r=[],d=t.expressions,h=l=0,u=d.length;u>l;h=++l)s=d[h],s=s.unwrapAll(),s instanceof o&&(k=null!=(f=s.variable)?f.unwrapAll():void 0,(k instanceof c||k instanceof z&&(null!=(m=k.base)?m.unwrapAll():void 0)instanceof c&&1===k.properties.length&&("call"===(g=null!=(v=k.properties[0].name)?v.value:void 0)||"apply"===g))&&(a=(null!=(y=k.base)?y.unwrapAll():void 0)||k,p=new x(e.scope.freeVariable("fn")),n=new z(p),k.base&&(b=[n,k],k.base=b[0],n=b[1]),t.expressions[h]=new o(n,s.args),r=r.concat(this.makeCode(this.tab),new i(p,a).compileToFragments(e,L),this.makeCode(";\n"))));return r},t}(J),e.Switch=H=function(e){function t(e,t,n){this.subject=e,this.cases=t,this.otherwise=n}return kt(t,e),t.prototype.children=["subject","cases","otherwise"],t.prototype.isStatement=Q,t.prototype.jumps=function(e){var t,n,i,r,s,o,a,c;for(null==e&&(e={block:!0}),o=this.cases,i=0,s=o.length;s>i;i++)if(a=o[i],n=a[0],t=a[1],r=t.jumps(e))return r;return null!=(c=this.otherwise)?c.jumps(e):void 0},t.prototype.makeReturn=function(e){var t,n,i,r,o;for(r=this.cases,t=0,n=r.length;n>t;t++)i=r[t],i[1].makeReturn(e);return e&&(this.otherwise||(this.otherwise=new s([new x("void 0")]))),null!=(o=this.otherwise)&&o.makeReturn(e),this},t.prototype.compileNode=function(e){var t,n,i,r,s,o,a,c,h,l,u,p,d,f,m,g;for(c=e.indent+q,h=e.indent=c+q,o=[].concat(this.makeCode(this.tab+"switch ("),this.subject?this.subject.compileToFragments(e,N):this.makeCode("false"),this.makeCode(") {\n")),f=this.cases,a=l=0,p=f.length;p>l;a=++l){for(m=f[a],r=m[0],t=m[1],g=rt([r]),u=0,d=g.length;d>u;u++)i=g[u],this.subject||(i=i.invert()),o=o.concat(this.makeCode(c+"case "),i.compileToFragments(e,N),this.makeCode(":\n"));if((n=t.compileToFragments(e,L)).length>0&&(o=o.concat(n,this.makeCode("\n"))),a===this.cases.length-1&&!this.otherwise)break;s=this.lastNonComment(t.expressions),s instanceof M||s instanceof x&&s.jumps()&&"debugger"!==s.value||o.push(i.makeCode(h+"break;\n"))}return this.otherwise&&this.otherwise.expressions.length&&o.push.apply(o,[this.makeCode(c+"default:\n")].concat(Ct.call(this.otherwise.compileToFragments(e,L)),[this.makeCode("\n")])),o.push(this.makeCode(this.tab+"}")),o},t}(r),e.If=b=function(e){function t(e,t,n){this.body=t,null==n&&(n={}),this.condition="unless"===n.type?e.invert():e,this.elseBody=null,this.isChain=!1,this.soak=n.soak}return kt(t,e),t.prototype.children=["condition","body","elseBody"],t.prototype.bodyNode=function(){var e;return null!=(e=this.body)?e.unwrap():void 0},t.prototype.elseBodyNode=function(){var e;return null!=(e=this.elseBody)?e.unwrap():void 0},t.prototype.addElse=function(e){return this.isChain?this.elseBodyNode().addElse(e):(this.isChain=e instanceof t,this.elseBody=this.ensureBlock(e),this.elseBody.updateLocationDataIfMissing(e.locationData)),this},t.prototype.isStatement=function(e){var t;return(null!=e?e.level:void 0)===L||this.bodyNode().isStatement(e)||(null!=(t=this.elseBodyNode())?t.isStatement(e):void 0)},t.prototype.jumps=function(e){var t;return this.body.jumps(e)||(null!=(t=this.elseBody)?t.jumps(e):void 0)},t.prototype.compileNode=function(e){return this.isStatement(e)?this.compileStatement(e):this.compileExpression(e)},t.prototype.makeReturn=function(e){return e&&(this.elseBody||(this.elseBody=new s([new x("void 0")]))),this.body&&(this.body=new s([this.body.makeReturn(e)])),this.elseBody&&(this.elseBody=new s([this.elseBody.makeReturn(e)])),this},t.prototype.ensureBlock=function(e){return e instanceof s?e:new s([e])},t.prototype.compileStatement=function(e){var n,i,r,s,o,a,c;return r=tt(e,"chainChild"),(o=tt(e,"isExistentialEquals"))?new t(this.condition.invert(),this.elseBodyNode(),{type:"if"}).compileToFragments(e):(c=e.indent+q,s=this.condition.compileToFragments(e,N),i=this.ensureBlock(this.body).compileToFragments(lt(e,{indent:c})),a=[].concat(this.makeCode("if ("),s,this.makeCode(") {\n"),i,this.makeCode("\n"+this.tab+"}")),r||a.unshift(this.makeCode(this.tab)),this.elseBody?(n=a.concat(this.makeCode(" else ")),this.isChain?(e.chainChild=!0,n=n.concat(this.elseBody.unwrap().compileToFragments(e,L))):n=n.concat(this.makeCode("{\n"),this.elseBody.compileToFragments(lt(e,{indent:c}),L),this.makeCode("\n"+this.tab+"}")),n):a)},t.prototype.compileExpression=function(e){var t,n,i,r;return i=this.condition.compileToFragments(e,C),n=this.bodyNode().compileToFragments(e,E),t=this.elseBodyNode()?this.elseBodyNode().compileToFragments(e,E):[this.makeCode("void 0")],r=i.concat(this.makeCode(" ? "),n,this.makeCode(" : "),t),e.level>=C?this.wrapInBraces(r):r},t.prototype.unfoldSoak=function(){return this.soak&&this},t}(r),K={extend:function(e){return"function(child, parent) { for (var key in parent) { if ("+bt("hasProp",e)+".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }"},bind:function(){return"function(fn, me){ return function(){ return fn.apply(me, arguments); }; }"},indexOf:function(){return"[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"},modulo:function(){return"function(a, b) { return (+a % (b = +b) + b) % b; }"},hasProp:function(){return"{}.hasOwnProperty"},slice:function(){return"[].slice"}},L=1,N=2,E=3,C=4,F=5,T=6,q=" ",g=/^(?!\d)[$\w\x7f-\uffff]+$/,B=/^[+-]?\d+$/,m=/^[+-]?0x[\da-f]+/i,R=/^[+-]?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)$/i,y=/^['"]/,v=/^\//,bt=function(e,t){var n,i;return i=t.scope.root,e in i.utilities?i.utilities[e]:(n=i.freeVariable(e),i.assign(n,K[e](t)),i.utilities[e]=n)},ut=function(e,t){return e=e.replace(/\n/g,"$&"+t),e.replace(/\s+$/,"")},pt=function(e){return null==e?0:e.match(m)?parseInt(e,16):parseFloat(e)},at=function(e){return e instanceof x&&"arguments"===e.value&&!e.asKey},ct=function(e){return e instanceof x&&"this"===e.value&&!e.asKey||e instanceof c&&e.bound||e instanceof o&&e.isSuper},ot=function(e){return e.isComplex()||("function"==typeof e.isAssignable?e.isAssignable():void 0)},yt=function(e,t,n){var i;if(i=t[n].unfoldSoak(e))return t[n]=i.body,i.body=new z(t),i}}.call(this),t.exports}(),_dereq_["./sourcemap"]=function(){var e={},t={exports:e};return function(){var e,n;e=function(){function e(e){this.line=e,this.columns=[]}return e.prototype.add=function(e,t,n){var i,r;return r=t[0],i=t[1],null==n&&(n={}),this.columns[e]&&n.noReplace?void 0:this.columns[e]={line:this.line,column:e,sourceLine:r,sourceColumn:i}},e.prototype.sourceLocation=function(e){for(var t;!((t=this.columns[e])||0>=e);)e--;return t&&[t.sourceLine,t.sourceColumn]},e}(),n=function(){function t(){this.lines=[]}var n,i,r,s;return t.prototype.add=function(t,n,i){var r,s,o,a;return null==i&&(i={}),o=n[0],s=n[1],a=(r=this.lines)[o]||(r[o]=new e(o)),a.add(s,t,i)},t.prototype.sourceLocation=function(e){var t,n,i;for(n=e[0],t=e[1];!((i=this.lines[n])||0>=n);)n--;return i&&i.sourceLocation(t)},t.prototype.generate=function(e,t){var n,i,r,s,o,a,c,h,l,u,p,d,f,m,g,v;for(null==e&&(e={}),null==t&&(t=null),v=0,s=0,a=0,o=0,d=!1,n="",f=this.lines,u=i=0,c=f.length;c>i;u=++i)if(l=f[u])for(m=l.columns,r=0,h=m.length;h>r;r++)if(p=m[r]){for(;p.line>v;)s=0,d=!1,n+=";",v++;d&&(n+=",",d=!1),n+=this.encodeVlq(p.column-s),s=p.column,n+=this.encodeVlq(0),n+=this.encodeVlq(p.sourceLine-a),a=p.sourceLine,n+=this.encodeVlq(p.sourceColumn-o),o=p.sourceColumn,d=!0}return g={version:3,file:e.generatedFile||"",sourceRoot:e.sourceRoot||"",sources:e.sourceFiles||[""],names:[],mappings:n},e.inline&&(g.sourcesContent=[t]),JSON.stringify(g,null,2)},r=5,i=1<e?1:0,a=(Math.abs(e)<<1)+o;a||!t;)n=a&s,a>>=r,a&&(n|=i),t+=this.encodeBase64(n);return t},n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t.prototype.encodeBase64=function(e){return n[e]||function(){throw Error("Cannot Base64 encode value: "+e)}()},t}(),t.exports=n}.call(this),t.exports}(),_dereq_["./coffee-script"]=function(){var e={},t={exports:e};return function(){var t,n,i,r,s,o,a,c,h,l,u,p,d,f,m,g,v,y,b={}.hasOwnProperty,k=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1};if(a=_dereq_("fs"),v=_dereq_("vm"),f=_dereq_("path"),t=_dereq_("./lexer").Lexer,d=_dereq_("./parser").parser,h=_dereq_("./helpers"),n=_dereq_("./sourcemap"),e.VERSION="1.9.3",e.FILE_EXTENSIONS=[".coffee",".litcoffee",".coffee.md"],e.helpers=h,y=function(e){return function(t,n){var i;null==n&&(n={});try{return e.call(this,t,n) +}catch(r){if(i=r,"string"!=typeof t)throw i;throw h.updateSyntaxError(i,t,n.filename)}}},e.compile=r=y(function(e,t){var i,r,s,o,a,c,l,u,f,m,g,v,y,b,k;for(v=h.merge,o=h.extend,t=o({},t),t.sourceMap&&(g=new n),k=p.tokenize(e,t),t.referencedVars=function(){var e,t,n;for(n=[],e=0,t=k.length;t>e;e++)b=k[e],b.variable&&n.push(b[1]);return n}(),c=d.parse(k).compileToFragments(t),s=0,t.header&&(s+=1),t.shiftLine&&(s+=1),r=0,f="",u=0,m=c.length;m>u;u++)a=c[u],t.sourceMap&&(a.locationData&&!/^[;\s]*$/.test(a.code)&&g.add([a.locationData.first_line,a.locationData.first_column],[s,r],{noReplace:!0}),y=h.count(a.code,"\n"),s+=y,y?r=a.code.length-(a.code.lastIndexOf("\n")+1):r+=a.code.length),f+=a.code;return t.header&&(l="Generated by CoffeeScript "+this.VERSION,f="// "+l+"\n"+f),t.sourceMap?(i={js:f},i.sourceMap=g,i.v3SourceMap=g.generate(t,e),i):f}),e.tokens=y(function(e,t){return p.tokenize(e,t)}),e.nodes=y(function(e,t){return"string"==typeof e?d.parse(p.tokenize(e,t)):d.parse(e)}),e.run=function(e,t){var n,i,s,o;return null==t&&(t={}),s=_dereq_.main,s.filename=process.argv[1]=t.filename?a.realpathSync(t.filename):".",s.moduleCache&&(s.moduleCache={}),i=t.filename?f.dirname(a.realpathSync(t.filename)):a.realpathSync("."),s.paths=_dereq_("module")._nodeModulePaths(i),(!h.isCoffee(s.filename)||_dereq_.extensions)&&(n=r(e,t),e=null!=(o=n.js)?o:n),s._compile(e,s.filename)},e.eval=function(e,t){var n,i,s,o,a,c,h,l,u,p,d,m,g,y,k,w,T;if(null==t&&(t={}),e=e.trim()){if(o=null!=(m=v.Script.createContext)?m:v.createContext,c=null!=(g=v.isContext)?g:function(){return t.sandbox instanceof o().constructor},o){if(null!=t.sandbox){if(c(t.sandbox))w=t.sandbox;else{w=o(),y=t.sandbox;for(l in y)b.call(y,l)&&(T=y[l],w[l]=T)}w.global=w.root=w.GLOBAL=w}else w=global;if(w.__filename=t.filename||"eval",w.__dirname=f.dirname(w.__filename),w===global&&!w.module&&!w.require){for(n=_dereq_("module"),w.module=i=new n(t.modulename||"eval"),w.require=s=function(e){return n._load(e,i,!0)},i.filename=w.__filename,k=Object.getOwnPropertyNames(_dereq_),a=0,u=k.length;u>a;a++)d=k[a],"paths"!==d&&(s[d]=_dereq_[d]);s.paths=i.paths=n._nodeModulePaths(process.cwd()),s.resolve=function(e){return n._resolveFilename(e,i)}}}p={};for(l in t)b.call(t,l)&&(T=t[l],p[l]=T);return p.bare=!0,h=r(e,p),w===global?v.runInThisContext(h):v.runInContext(h,w)}},e.register=function(){return _dereq_("./register")},_dereq_.extensions)for(m=this.FILE_EXTENSIONS,l=0,u=m.length;u>l;l++)s=m[l],null==(i=_dereq_.extensions)[s]&&(i[s]=function(){throw Error("Use CoffeeScript.register() or require the coffee-script/register module to require "+s+" files.")});e._compileFile=function(e,t){var n,i,s,o;null==t&&(t=!1),s=a.readFileSync(e,"utf8"),o=65279===s.charCodeAt(0)?s.substring(1):s;try{n=r(o,{filename:e,sourceMap:t,literate:h.isLiterate(e)})}catch(c){throw i=c,h.updateSyntaxError(i,o,e)}return n},p=new t,d.lexer={lex:function(){var e,t;return t=d.tokens[this.pos++],t?(e=t[0],this.yytext=t[1],this.yylloc=t[2],d.errorToken=t.origin||t,this.yylineno=this.yylloc.first_line):e="",e},setInput:function(e){return d.tokens=e,this.pos=0},upcomingInput:function(){return""}},d.yy=_dereq_("./nodes"),d.yy.parseError=function(e,t){var n,i,r,s,o,a;return o=t.token,s=d.errorToken,a=d.tokens,i=s[0],r=s[1],n=s[2],r=function(){switch(!1){case s!==a[a.length-1]:return"end of input";case"INDENT"!==i&&"OUTDENT"!==i:return"indentation";case"IDENTIFIER"!==i&&"NUMBER"!==i&&"STRING"!==i&&"STRING_START"!==i&&"REGEX"!==i&&"REGEX_START"!==i:return i.replace(/_START$/,"").toLowerCase();default:return h.nameWhitespaceCharacter(r)}}(),h.throwSyntaxError("unexpected "+r,n)},o=function(e,t){var n,i,r,s,o,a,c,h,l,u,p,d;return s=void 0,r="",e.isNative()?r="native":(e.isEval()?(s=e.getScriptNameOrSourceURL(),s||(r=e.getEvalOrigin()+", ")):s=e.getFileName(),s||(s=""),h=e.getLineNumber(),i=e.getColumnNumber(),u=t(s,h,i),r=u?s+":"+u[0]+":"+u[1]:s+":"+h+":"+i),o=e.getFunctionName(),a=e.isConstructor(),c=!(e.isToplevel()||a),c?(l=e.getMethodName(),d=e.getTypeName(),o?(p=n="",d&&o.indexOf(d)&&(p=d+"."),l&&o.indexOf("."+l)!==o.length-l.length-1&&(n=" [as "+l+"]"),""+p+o+n+" ("+r+")"):d+"."+(l||"")+" ("+r+")"):a?"new "+(o||"")+" ("+r+")":o?o+" ("+r+")":r},g={},c=function(t){var n,i;if(g[t])return g[t];if(i=null!=f?f.extname(t):void 0,!(0>k.call(e.FILE_EXTENSIONS,i)))return n=e._compileFile(t,!0),g[t]=n.sourceMap},Error.prepareStackTrace=function(t,n){var i,r,s;return s=function(e,t,n){var i,r;return r=c(e),r&&(i=r.sourceLocation([t-1,n-1])),i?[i[0]+1,i[1]+1]:null},r=function(){var t,r,a;for(a=[],t=0,r=n.length;r>t&&(i=n[t],i.getFunction()!==e.run);t++)a.push(" at "+o(i,s));return a}(),""+t+"\n"+r.join("\n")+"\n"}}.call(this),t.exports}(),_dereq_["./browser"]=function(){var exports={},module={exports:exports};return function(){var CoffeeScript,compile,runScripts,indexOf=[].indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(t in this&&this[t]===e)return t;return-1};CoffeeScript=_dereq_("./coffee-script"),CoffeeScript.require=_dereq_,compile=CoffeeScript.compile,CoffeeScript.eval=function(code,options){return null==options&&(options={}),null==options.bare&&(options.bare=!0),eval(compile(code,options))},CoffeeScript.run=function(e,t){return null==t&&(t={}),t.bare=!0,t.shiftLine=!0,Function(compile(e,t))()},"undefined"!=typeof window&&null!==window&&("undefined"!=typeof btoa&&null!==btoa&&"undefined"!=typeof JSON&&null!==JSON&&"undefined"!=typeof unescape&&null!==unescape&&"undefined"!=typeof encodeURIComponent&&null!==encodeURIComponent&&(compile=function(e,t){var n,i,r;return null==t&&(t={}),t.sourceMap=!0,t.inline=!0,i=CoffeeScript.compile(e,t),n=i.js,r=i.v3SourceMap,n+"\n//# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(r)))+"\n//# sourceURL=coffeescript"}),CoffeeScript.load=function(e,t,n,i){var r;return null==n&&(n={}),null==i&&(i=!1),n.sourceFiles=[e],r=window.ActiveXObject?new window.ActiveXObject("Microsoft.XMLHTTP"):new window.XMLHttpRequest,r.open("GET",e,!0),"overrideMimeType"in r&&r.overrideMimeType("text/plain"),r.onreadystatechange=function(){var s,o;if(4===r.readyState){if(0!==(o=r.status)&&200!==o)throw Error("Could not load "+e);if(s=[r.responseText,n],i||CoffeeScript.run.apply(CoffeeScript,s),t)return t(s)}},r.send(null)},runScripts=function(){var e,t,n,i,r,s,o,a,c,h,l;for(l=window.document.getElementsByTagName("script"),t=["text/coffeescript","text/literate-coffeescript"],e=function(){var e,n,i,r;for(r=[],e=0,n=l.length;n>e;e++)c=l[e],i=c.type,indexOf.call(t,i)>=0&&r.push(c);return r}(),s=0,n=function(){var t;return t=e[s],t instanceof Array?(CoffeeScript.run.apply(CoffeeScript,t),s++,n()):void 0},i=function(i,r){var s,o;return s={literate:i.type===t[1]},o=i.src||i.getAttribute("data-src"),o?CoffeeScript.load(o,function(t){return e[r]=t,n()},s,!0):(s.sourceFiles=["embedded"],e[r]=[i.innerHTML,s])},r=o=0,a=e.length;a>o;r=++o)h=e[r],i(h,r);return n()},window.addEventListener?window.addEventListener("DOMContentLoaded",runScripts,!1):window.attachEvent("onload",runScripts))}.call(this),module.exports}(),_dereq_["./coffee-script"]}();"function"==typeof define&&define.amd?define(function(){return CoffeeScript}):root.CoffeeScript=CoffeeScript})(this); +}); + +ace.define("ace/mode/coffee_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/coffee/coffee"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var Mirror = require("../worker/mirror").Mirror; +var coffee = require("../mode/coffee/coffee"); + +window.addEventListener = function() {}; + + +var Worker = exports.Worker = function(sender) { + Mirror.call(this, sender); + this.setTimeout(250); +}; + +oop.inherits(Worker, Mirror); + +(function() { + + this.onUpdate = function() { + var value = this.doc.getValue(); + var errors = []; + try { + coffee.compile(value); + } catch(e) { + var loc = e.location; + if (loc) { + errors.push({ + row: loc.first_line, + column: loc.first_column, + endRow: loc.last_line, + endColumn: loc.last_column, + text: e.message, + type: "error" + }); + } + } + this.sender.emit("annotate", errors); + }; + +}).call(Worker.prototype); + +}); + +ace.define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) { + +function Empty() {} + +if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { // .length is 1 + var target = this; + if (typeof target != "function") { + throw new TypeError("Function.prototype.bind called on incompatible " + target); + } + var args = slice.call(arguments, 1); // for normal call + var bound = function () { + + if (this instanceof bound) { + + var result = target.apply( + this, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + + } else { + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + if(target.prototype) { + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + return bound; + }; +} +var call = Function.prototype.call; +var prototypeOfArray = Array.prototype; +var prototypeOfObject = Object.prototype; +var slice = prototypeOfArray.slice; +var _toString = call.bind(prototypeOfObject.toString); +var owns = call.bind(prototypeOfObject.hasOwnProperty); +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors; +if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); +} +if ([1,2].splice(0).length != 2) { + if(function() { // test IE < 9 to splice bug - see issue #138 + function makeArray(l) { + var a = new Array(l+2); + a[0] = a[1] = 0; + return a; + } + var array = [], lengthBefore; + + array.splice.apply(array, makeArray(20)); + array.splice.apply(array, makeArray(26)); + + lengthBefore = array.length; //46 + array.splice(5, 0, "XXX"); // add one element + + lengthBefore + 1 == array.length + + if (lengthBefore + 1 == array.length) { + return true;// has right splice implementation without bugs + } + }()) {//IE 6/7 + var array_splice = Array.prototype.splice; + Array.prototype.splice = function(start, deleteCount) { + if (!arguments.length) { + return []; + } else { + return array_splice.apply(this, [ + start === void 0 ? 0 : start, + deleteCount === void 0 ? (this.length - start) : deleteCount + ].concat(slice.call(arguments, 2))) + } + }; + } else {//IE8 + Array.prototype.splice = function(pos, removeCount){ + var length = this.length; + if (pos > 0) { + if (pos > length) + pos = length; + } else if (pos == void 0) { + pos = 0; + } else if (pos < 0) { + pos = Math.max(length + pos, 0); + } + + if (!(pos+removeCount < length)) + removeCount = length - pos; + + var removed = this.slice(pos, pos+removeCount); + var insert = slice.call(arguments, 2); + var add = insert.length; + if (pos === length) { + if (add) { + this.push.apply(this, insert); + } + } else { + var remove = Math.min(removeCount, length - pos); + var tailOldPos = pos + remove; + var tailNewPos = tailOldPos + add - remove; + var tailCount = length - tailOldPos; + var lengthAfterRemove = length - remove; + + if (tailNewPos < tailOldPos) { // case A + for (var i = 0; i < tailCount; ++i) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } else if (tailNewPos > tailOldPos) { // case B + for (i = tailCount; i--; ) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } // else, add == remove (nothing to do) + + if (add && pos === lengthAfterRemove) { + this.length = lengthAfterRemove; // truncate array + this.push.apply(this, insert); + } else { + this.length = lengthAfterRemove + add; // reserves space + for (i = 0; i < add; ++i) { + this[pos+i] = insert[i]; + } + } + } + return removed; + }; + } +} +if (!Array.isArray) { + Array.isArray = function isArray(obj) { + return _toString(obj) == "[object Array]"; + }; +} +var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + +if (!Array.prototype.forEach) { + Array.prototype.forEach = function forEach(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + thisp = arguments[1], + i = -1, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + while (++i < length) { + if (i in self) { + fun.call(thisp, self[i], i, object); + } + } + }; +} +if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; +} +if (!Array.prototype.filter) { + Array.prototype.filter = function filter(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = [], + value, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) { + value = self[i]; + if (fun.call(thisp, value, i, object)) { + result.push(value); + } + } + } + return result; + }; +} +if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; +} +if (!Array.prototype.some) { + Array.prototype.some = function some(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, object)) { + return true; + } + } + return false; + }; +} +if (!Array.prototype.reduce) { + Array.prototype.reduce = function reduce(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduce of empty array with no initial value"); + } + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + if (++i >= length) { + throw new TypeError("reduce of empty array with no initial value"); + } + } while (true); + } + + for (; i < length; i++) { + if (i in self) { + result = fun.call(void 0, result, self[i], i, object); + } + } + + return result; + }; +} +if (!Array.prototype.reduceRight) { + Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + + var result, i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + if (--i < 0) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + } while (true); + } + + do { + if (i in this) { + result = fun.call(void 0, result, self[i], i, object); + } + } while (i--); + + return result; + }; +} +if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { + Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + + var i = 0; + if (arguments.length > 1) { + i = toInteger(arguments[1]); + } + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + }; +} +if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { + Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + var i = length - 1; + if (arguments.length > 1) { + i = Math.min(i, toInteger(arguments[1])); + } + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && sought === self[i]) { + return i; + } + } + return -1; + }; +} +if (!Object.getPrototypeOf) { + Object.getPrototypeOf = function getPrototypeOf(object) { + return object.__proto__ || ( + object.constructor ? + object.constructor.prototype : + prototypeOfObject + ); + }; +} +if (!Object.getOwnPropertyDescriptor) { + var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + + "non-object: "; + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT + object); + if (!owns(object, property)) + return; + + var descriptor, getter, setter; + descriptor = { enumerable: true, configurable: true }; + if (supportsAccessors) { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + object.__proto__ = prototype; + + if (getter || setter) { + if (getter) descriptor.get = getter; + if (setter) descriptor.set = setter; + return descriptor; + } + } + descriptor.value = object[property]; + return descriptor; + }; +} +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} +if (!Object.create) { + var createEmpty; + if (Object.prototype.__proto__ === null) { + createEmpty = function () { + return { "__proto__": null }; + }; + } else { + createEmpty = function () { + var empty = {}; + for (var i in empty) + empty[i] = null; + empty.constructor = + empty.hasOwnProperty = + empty.propertyIsEnumerable = + empty.isPrototypeOf = + empty.toLocaleString = + empty.toString = + empty.valueOf = + empty.__proto__ = null; + return empty; + } + } + + Object.create = function create(prototype, properties) { + var object; + if (prototype === null) { + object = createEmpty(); + } else { + if (typeof prototype != "object") + throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); + var Type = function () {}; + Type.prototype = prototype; + object = new Type(); + object.__proto__ = prototype; + } + if (properties !== void 0) + Object.defineProperties(object, properties); + return object; + }; +} + +function doesDefinePropertyWork(object) { + try { + Object.defineProperty(object, "sentinel", {}); + return "sentinel" in object; + } catch (exception) { + } +} +if (Object.defineProperty) { + var definePropertyWorksOnObject = doesDefinePropertyWork({}); + var definePropertyWorksOnDom = typeof document == "undefined" || + doesDefinePropertyWork(document.createElement("div")); + if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { + var definePropertyFallback = Object.defineProperty; + } +} + +if (!Object.defineProperty || definePropertyFallback) { + var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; + var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " + var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + + "on this javascript engine"; + + Object.defineProperty = function defineProperty(object, property, descriptor) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT_TARGET + object); + if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) + throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); + if (definePropertyFallback) { + try { + return definePropertyFallback.call(Object, object, property, descriptor); + } catch (exception) { + } + } + if (owns(descriptor, "value")) { + + if (supportsAccessors && (lookupGetter(object, property) || + lookupSetter(object, property))) + { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + delete object[property]; + object[property] = descriptor.value; + object.__proto__ = prototype; + } else { + object[property] = descriptor.value; + } + } else { + if (!supportsAccessors) + throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); + if (owns(descriptor, "get")) + defineGetter(object, property, descriptor.get); + if (owns(descriptor, "set")) + defineSetter(object, property, descriptor.set); + } + + return object; + }; +} +if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (owns(properties, property)) + Object.defineProperty(object, property, properties[property]); + } + return object; + }; +} +if (!Object.seal) { + Object.seal = function seal(object) { + return object; + }; +} +if (!Object.freeze) { + Object.freeze = function freeze(object) { + return object; + }; +} +try { + Object.freeze(function () {}); +} catch (exception) { + Object.freeze = (function freeze(freezeObject) { + return function freeze(object) { + if (typeof object == "function") { + return object; + } else { + return freezeObject(object); + } + }; + })(Object.freeze); +} +if (!Object.preventExtensions) { + Object.preventExtensions = function preventExtensions(object) { + return object; + }; +} +if (!Object.isSealed) { + Object.isSealed = function isSealed(object) { + return false; + }; +} +if (!Object.isFrozen) { + Object.isFrozen = function isFrozen(object) { + return false; + }; +} +if (!Object.isExtensible) { + Object.isExtensible = function isExtensible(object) { + if (Object(object) === object) { + throw new TypeError(); // TODO message + } + var name = ''; + while (owns(object, name)) { + name += '?'; + } + object[name] = true; + var returnValue = owns(object, name); + delete object[name]; + return returnValue; + }; +} +if (!Object.keys) { + var hasDontEnumBug = true, + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + for (var key in {"toString": null}) { + hasDontEnumBug = false; + } + + Object.keys = function keys(object) { + + if ( + (typeof object != "object" && typeof object != "function") || + object === null + ) { + throw new TypeError("Object.keys called on a non-object"); + } + + var keys = []; + for (var name in object) { + if (owns(object, name)) { + keys.push(name); + } + } + + if (hasDontEnumBug) { + for (var i = 0, ii = dontEnumsLength; i < ii; i++) { + var dontEnum = dontEnums[i]; + if (owns(object, dontEnum)) { + keys.push(dontEnum); + } + } + } + return keys; + }; + +} +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} +var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + + "\u2029\uFEFF"; +if (!String.prototype.trim || ws.trim()) { + ws = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), + trimEndRegexp = new RegExp(ws + ws + "*$"); + String.prototype.trim = function trim() { + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + }; +} + +function toInteger(n) { + n = +n; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; +} + +function isPrimitive(input) { + var type = typeof input; + return ( + input === null || + type === "undefined" || + type === "boolean" || + type === "number" || + type === "string" + ); +} + +function toPrimitive(input) { + var val, valueOf, toString; + if (isPrimitive(input)) { + return input; + } + valueOf = input.valueOf; + if (typeof valueOf === "function") { + val = valueOf.call(input); + if (isPrimitive(val)) { + return val; + } + } + toString = input.toString; + if (typeof toString === "function") { + val = toString.call(input); + if (isPrimitive(val)) { + return val; + } + } + throw new TypeError(); +} +var toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert "+o+" to object"); + } + return Object(o); +}; + +}); diff --git a/src/libs/ace/worker-css.js b/src/libs/ace/worker-css.js new file mode 100755 index 0000000..7bee71a --- /dev/null +++ b/src/libs/ace/worker-css.js @@ -0,0 +1,8760 @@ +"no use strict"; +;(function(window) { +if (typeof window.window != "undefined" && window.document) + return; +if (window.require && window.define) + return; + +if (!window.console) { + window.console = function() { + var msgs = Array.prototype.slice.call(arguments, 0); + postMessage({type: "log", data: msgs}); + }; + window.console.error = + window.console.warn = + window.console.log = + window.console.trace = window.console; +} +window.window = window; +window.ace = window; + +window.onerror = function(message, file, line, col, err) { + postMessage({type: "error", data: { + message: message, + data: err.data, + file: file, + line: line, + col: col, + stack: err.stack + }}); +}; + +window.normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = (base ? base + "/" : "") + moduleName; + + while (moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + + return moduleName; +}; + +window.require = function require(parentId, id) { + if (!id) { + id = parentId; + parentId = null; + } + if (!id.charAt) + throw new Error("worker.js require() accepts only (parentId, id) as arguments"); + + id = window.normalizeModule(parentId, id); + + var module = window.require.modules[id]; + if (module) { + if (!module.initialized) { + module.initialized = true; + module.exports = module.factory().exports; + } + return module.exports; + } + + if (!window.require.tlns) + return console.log("unable to load " + id); + + var path = resolveModuleId(id, window.require.tlns); + if (path.slice(-3) != ".js") path += ".js"; + + window.require.id = id; + window.require.modules[id] = {}; // prevent infinite loop on broken modules + importScripts(path); + return window.require(parentId, id); +}; +function resolveModuleId(id, paths) { + var testPath = id, tail = ""; + while (testPath) { + var alias = paths[testPath]; + if (typeof alias == "string") { + return alias + tail; + } else if (alias) { + return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name); + } else if (alias === false) { + return ""; + } + var i = testPath.lastIndexOf("/"); + if (i === -1) break; + tail = testPath.substr(i) + tail; + testPath = testPath.slice(0, i); + } + return id; +} +window.require.modules = {}; +window.require.tlns = {}; + +window.define = function(id, deps, factory) { + if (arguments.length == 2) { + factory = deps; + if (typeof id != "string") { + deps = id; + id = window.require.id; + } + } else if (arguments.length == 1) { + factory = id; + deps = []; + id = window.require.id; + } + + if (typeof factory != "function") { + window.require.modules[id] = { + exports: factory, + initialized: true + }; + return; + } + + if (!deps.length) + // If there is no dependencies, we inject "require", "exports" and + // "module" as dependencies, to provide CommonJS compatibility. + deps = ["require", "exports", "module"]; + + var req = function(childId) { + return window.require(id, childId); + }; + + window.require.modules[id] = { + exports: {}, + factory: function() { + var module = this; + var returnExports = factory.apply(this, deps.map(function(dep) { + switch (dep) { + // Because "require", "exports" and "module" aren't actual + // dependencies, we must handle them seperately. + case "require": return req; + case "exports": return module.exports; + case "module": return module; + // But for all other dependencies, we can just go ahead and + // require them. + default: return req(dep); + } + })); + if (returnExports) + module.exports = returnExports; + return module; + } + }; +}; +window.define.amd = {}; +require.tlns = {}; +window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { + for (var i in topLevelNamespaces) + require.tlns[i] = topLevelNamespaces[i]; +}; + +window.initSender = function initSender() { + + var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; + var oop = window.require("ace/lib/oop"); + + var Sender = function() {}; + + (function() { + + oop.implement(this, EventEmitter); + + this.callback = function(data, callbackId) { + postMessage({ + type: "call", + id: callbackId, + data: data + }); + }; + + this.emit = function(name, data) { + postMessage({ + type: "event", + name: name, + data: data + }); + }; + + }).call(Sender.prototype); + + return new Sender(); +}; + +var main = window.main = null; +var sender = window.sender = null; + +window.onmessage = function(e) { + var msg = e.data; + if (msg.event && sender) { + sender._signal(msg.event, msg.data); + } + else if (msg.command) { + if (main[msg.command]) + main[msg.command].apply(main, msg.args); + else if (window[msg.command]) + window[msg.command].apply(window, msg.args); + else + throw new Error("Unknown command:" + msg.command); + } + else if (msg.init) { + window.initBaseUrls(msg.tlns); + require("ace/lib/es5-shim"); + sender = window.sender = window.initSender(); + var clazz = require(msg.module)[msg.classname]; + main = window.main = new clazz(sender); + } +}; +})(this); + +ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +} +}); + +ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) + this.$splitAndapplyLargeDelta(delta, 20000); + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length; + var row = delta.start.row; + var column = delta.start.column; + var from = 0, to = 0; + do { + from = to; + to += MAX - 1; + var chunk = lines.slice(from, to); + if (to > l) { + delta.lines = chunk; + delta.start.row = row + from; + delta.start.column = column; + break; + } + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } while(true); + }; + this.revertDelta = function(delta) { + this.applyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +ace.define("ace/worker/mirror",["require","exports","module","ace/range","ace/document","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var Document = require("../document").Document; +var lang = require("../lib/lang"); + +var Mirror = exports.Mirror = function(sender) { + this.sender = sender; + var doc = this.doc = new Document(""); + + var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this)); + + var _self = this; + sender.on("change", function(e) { + var data = e.data; + if (data[0].start) { + doc.applyDeltas(data); + } else { + for (var i = 0; i < data.length; i += 2) { + if (Array.isArray(data[i+1])) { + var d = {action: "insert", start: data[i], lines: data[i+1]}; + } else { + var d = {action: "remove", start: data[i], end: data[i+1]}; + } + doc.applyDelta(d, true); + } + } + if (_self.$timeout) + return deferredUpdate.schedule(_self.$timeout); + _self.onUpdate(); + }); +}; + +(function() { + + this.$timeout = 500; + + this.setTimeout = function(timeout) { + this.$timeout = timeout; + }; + + this.setValue = function(value) { + this.doc.setValue(value); + this.deferredUpdate.schedule(this.$timeout); + }; + + this.getValue = function(callbackId) { + this.sender.callback(this.doc.getValue(), callbackId); + }; + + this.onUpdate = function() { + }; + + this.isPending = function() { + return this.deferredUpdate.isPending(); + }; + +}).call(Mirror.prototype); + +}); + +ace.define("ace/mode/css/csslint",["require","exports","module"], function(require, exports, module) { +var parserlib = {}; +(function(){ +function EventTarget(){ + this._listeners = {}; +} + +EventTarget.prototype = { + constructor: EventTarget, + addListener: function(type, listener){ + if (!this._listeners[type]){ + this._listeners[type] = []; + } + + this._listeners[type].push(listener); + }, + fire: function(event){ + if (typeof event == "string"){ + event = { type: event }; + } + if (typeof event.target != "undefined"){ + event.target = this; + } + + if (typeof event.type == "undefined"){ + throw new Error("Event object missing 'type' property."); + } + + if (this._listeners[event.type]){ + var listeners = this._listeners[event.type].concat(); + for (var i=0, len=listeners.length; i < len; i++){ + listeners[i].call(this, event); + } + } + }, + removeListener: function(type, listener){ + if (this._listeners[type]){ + var listeners = this._listeners[type]; + for (var i=0, len=listeners.length; i < len; i++){ + if (listeners[i] === listener){ + listeners.splice(i, 1); + break; + } + } + + + } + } +}; +function StringReader(text){ + this._input = text.replace(/\n\r?/g, "\n"); + this._line = 1; + this._col = 1; + this._cursor = 0; +} + +StringReader.prototype = { + constructor: StringReader, + getCol: function(){ + return this._col; + }, + getLine: function(){ + return this._line ; + }, + eof: function(){ + return (this._cursor == this._input.length); + }, + peek: function(count){ + var c = null; + count = (typeof count == "undefined" ? 1 : count); + if (this._cursor < this._input.length){ + c = this._input.charAt(this._cursor + count - 1); + } + + return c; + }, + read: function(){ + var c = null; + if (this._cursor < this._input.length){ + if (this._input.charAt(this._cursor) == "\n"){ + this._line++; + this._col=1; + } else { + this._col++; + } + c = this._input.charAt(this._cursor++); + } + + return c; + }, + mark: function(){ + this._bookmark = { + cursor: this._cursor, + line: this._line, + col: this._col + }; + }, + + reset: function(){ + if (this._bookmark){ + this._cursor = this._bookmark.cursor; + this._line = this._bookmark.line; + this._col = this._bookmark.col; + delete this._bookmark; + } + }, + readTo: function(pattern){ + + var buffer = "", + c; + while (buffer.length < pattern.length || buffer.lastIndexOf(pattern) != buffer.length - pattern.length){ + c = this.read(); + if (c){ + buffer += c; + } else { + throw new Error("Expected \"" + pattern + "\" at line " + this._line + ", col " + this._col + "."); + } + } + + return buffer; + + }, + readWhile: function(filter){ + + var buffer = "", + c = this.read(); + + while(c !== null && filter(c)){ + buffer += c; + c = this.read(); + } + + return buffer; + + }, + readMatch: function(matcher){ + + var source = this._input.substring(this._cursor), + value = null; + if (typeof matcher == "string"){ + if (source.indexOf(matcher) === 0){ + value = this.readCount(matcher.length); + } + } else if (matcher instanceof RegExp){ + if (matcher.test(source)){ + value = this.readCount(RegExp.lastMatch.length); + } + } + + return value; + }, + readCount: function(count){ + var buffer = ""; + + while(count--){ + buffer += this.read(); + } + + return buffer; + } + +}; +function SyntaxError(message, line, col){ + this.col = col; + this.line = line; + this.message = message; + +} +SyntaxError.prototype = new Error(); +function SyntaxUnit(text, line, col, type){ + this.col = col; + this.line = line; + this.text = text; + this.type = type; +} +SyntaxUnit.fromToken = function(token){ + return new SyntaxUnit(token.value, token.startLine, token.startCol); +}; + +SyntaxUnit.prototype = { + constructor: SyntaxUnit, + valueOf: function(){ + return this.text; + }, + toString: function(){ + return this.text; + } + +}; +function TokenStreamBase(input, tokenData){ + this._reader = input ? new StringReader(input.toString()) : null; + this._token = null; + this._tokenData = tokenData; + this._lt = []; + this._ltIndex = 0; + + this._ltIndexCache = []; +} +TokenStreamBase.createTokenData = function(tokens){ + + var nameMap = [], + typeMap = {}, + tokenData = tokens.concat([]), + i = 0, + len = tokenData.length+1; + + tokenData.UNKNOWN = -1; + tokenData.unshift({name:"EOF"}); + + for (; i < len; i++){ + nameMap.push(tokenData[i].name); + tokenData[tokenData[i].name] = i; + if (tokenData[i].text){ + typeMap[tokenData[i].text] = i; + } + } + + tokenData.name = function(tt){ + return nameMap[tt]; + }; + + tokenData.type = function(c){ + return typeMap[c]; + }; + + return tokenData; +}; + +TokenStreamBase.prototype = { + constructor: TokenStreamBase, + match: function(tokenTypes, channel){ + if (!(tokenTypes instanceof Array)){ + tokenTypes = [tokenTypes]; + } + + var tt = this.get(channel), + i = 0, + len = tokenTypes.length; + + while(i < len){ + if (tt == tokenTypes[i++]){ + return true; + } + } + this.unget(); + return false; + }, + mustMatch: function(tokenTypes, channel){ + + var token; + if (!(tokenTypes instanceof Array)){ + tokenTypes = [tokenTypes]; + } + + if (!this.match.apply(this, arguments)){ + token = this.LT(1); + throw new SyntaxError("Expected " + this._tokenData[tokenTypes[0]].name + + " at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); + } + }, + advance: function(tokenTypes, channel){ + + while(this.LA(0) !== 0 && !this.match(tokenTypes, channel)){ + this.get(); + } + + return this.LA(0); + }, + get: function(channel){ + + var tokenInfo = this._tokenData, + reader = this._reader, + value, + i =0, + len = tokenInfo.length, + found = false, + token, + info; + if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length){ + + i++; + this._token = this._lt[this._ltIndex++]; + info = tokenInfo[this._token.type]; + while((info.channel !== undefined && channel !== info.channel) && + this._ltIndex < this._lt.length){ + this._token = this._lt[this._ltIndex++]; + info = tokenInfo[this._token.type]; + i++; + } + if ((info.channel === undefined || channel === info.channel) && + this._ltIndex <= this._lt.length){ + this._ltIndexCache.push(i); + return this._token.type; + } + } + token = this._getToken(); + if (token.type > -1 && !tokenInfo[token.type].hide){ + token.channel = tokenInfo[token.type].channel; + this._token = token; + this._lt.push(token); + this._ltIndexCache.push(this._lt.length - this._ltIndex + i); + if (this._lt.length > 5){ + this._lt.shift(); + } + if (this._ltIndexCache.length > 5){ + this._ltIndexCache.shift(); + } + this._ltIndex = this._lt.length; + } + info = tokenInfo[token.type]; + if (info && + (info.hide || + (info.channel !== undefined && channel !== info.channel))){ + return this.get(channel); + } else { + return token.type; + } + }, + LA: function(index){ + var total = index, + tt; + if (index > 0){ + if (index > 5){ + throw new Error("Too much lookahead."); + } + while(total){ + tt = this.get(); + total--; + } + while(total < index){ + this.unget(); + total++; + } + } else if (index < 0){ + + if(this._lt[this._ltIndex+index]){ + tt = this._lt[this._ltIndex+index].type; + } else { + throw new Error("Too much lookbehind."); + } + + } else { + tt = this._token.type; + } + + return tt; + + }, + LT: function(index){ + this.LA(index); + return this._lt[this._ltIndex+index-1]; + }, + peek: function(){ + return this.LA(1); + }, + token: function(){ + return this._token; + }, + tokenName: function(tokenType){ + if (tokenType < 0 || tokenType > this._tokenData.length){ + return "UNKNOWN_TOKEN"; + } else { + return this._tokenData[tokenType].name; + } + }, + tokenType: function(tokenName){ + return this._tokenData[tokenName] || -1; + }, + unget: function(){ + if (this._ltIndexCache.length){ + this._ltIndex -= this._ltIndexCache.pop();//--; + this._token = this._lt[this._ltIndex - 1]; + } else { + throw new Error("Too much lookahead."); + } + } + +}; + + +parserlib.util = { +StringReader: StringReader, +SyntaxError : SyntaxError, +SyntaxUnit : SyntaxUnit, +EventTarget : EventTarget, +TokenStreamBase : TokenStreamBase +}; +})(); +(function(){ +var EventTarget = parserlib.util.EventTarget, +TokenStreamBase = parserlib.util.TokenStreamBase, +StringReader = parserlib.util.StringReader, +SyntaxError = parserlib.util.SyntaxError, +SyntaxUnit = parserlib.util.SyntaxUnit; + +var Colors = { + aliceblue :"#f0f8ff", + antiquewhite :"#faebd7", + aqua :"#00ffff", + aquamarine :"#7fffd4", + azure :"#f0ffff", + beige :"#f5f5dc", + bisque :"#ffe4c4", + black :"#000000", + blanchedalmond :"#ffebcd", + blue :"#0000ff", + blueviolet :"#8a2be2", + brown :"#a52a2a", + burlywood :"#deb887", + cadetblue :"#5f9ea0", + chartreuse :"#7fff00", + chocolate :"#d2691e", + coral :"#ff7f50", + cornflowerblue :"#6495ed", + cornsilk :"#fff8dc", + crimson :"#dc143c", + cyan :"#00ffff", + darkblue :"#00008b", + darkcyan :"#008b8b", + darkgoldenrod :"#b8860b", + darkgray :"#a9a9a9", + darkgrey :"#a9a9a9", + darkgreen :"#006400", + darkkhaki :"#bdb76b", + darkmagenta :"#8b008b", + darkolivegreen :"#556b2f", + darkorange :"#ff8c00", + darkorchid :"#9932cc", + darkred :"#8b0000", + darksalmon :"#e9967a", + darkseagreen :"#8fbc8f", + darkslateblue :"#483d8b", + darkslategray :"#2f4f4f", + darkslategrey :"#2f4f4f", + darkturquoise :"#00ced1", + darkviolet :"#9400d3", + deeppink :"#ff1493", + deepskyblue :"#00bfff", + dimgray :"#696969", + dimgrey :"#696969", + dodgerblue :"#1e90ff", + firebrick :"#b22222", + floralwhite :"#fffaf0", + forestgreen :"#228b22", + fuchsia :"#ff00ff", + gainsboro :"#dcdcdc", + ghostwhite :"#f8f8ff", + gold :"#ffd700", + goldenrod :"#daa520", + gray :"#808080", + grey :"#808080", + green :"#008000", + greenyellow :"#adff2f", + honeydew :"#f0fff0", + hotpink :"#ff69b4", + indianred :"#cd5c5c", + indigo :"#4b0082", + ivory :"#fffff0", + khaki :"#f0e68c", + lavender :"#e6e6fa", + lavenderblush :"#fff0f5", + lawngreen :"#7cfc00", + lemonchiffon :"#fffacd", + lightblue :"#add8e6", + lightcoral :"#f08080", + lightcyan :"#e0ffff", + lightgoldenrodyellow :"#fafad2", + lightgray :"#d3d3d3", + lightgrey :"#d3d3d3", + lightgreen :"#90ee90", + lightpink :"#ffb6c1", + lightsalmon :"#ffa07a", + lightseagreen :"#20b2aa", + lightskyblue :"#87cefa", + lightslategray :"#778899", + lightslategrey :"#778899", + lightsteelblue :"#b0c4de", + lightyellow :"#ffffe0", + lime :"#00ff00", + limegreen :"#32cd32", + linen :"#faf0e6", + magenta :"#ff00ff", + maroon :"#800000", + mediumaquamarine:"#66cdaa", + mediumblue :"#0000cd", + mediumorchid :"#ba55d3", + mediumpurple :"#9370d8", + mediumseagreen :"#3cb371", + mediumslateblue :"#7b68ee", + mediumspringgreen :"#00fa9a", + mediumturquoise :"#48d1cc", + mediumvioletred :"#c71585", + midnightblue :"#191970", + mintcream :"#f5fffa", + mistyrose :"#ffe4e1", + moccasin :"#ffe4b5", + navajowhite :"#ffdead", + navy :"#000080", + oldlace :"#fdf5e6", + olive :"#808000", + olivedrab :"#6b8e23", + orange :"#ffa500", + orangered :"#ff4500", + orchid :"#da70d6", + palegoldenrod :"#eee8aa", + palegreen :"#98fb98", + paleturquoise :"#afeeee", + palevioletred :"#d87093", + papayawhip :"#ffefd5", + peachpuff :"#ffdab9", + peru :"#cd853f", + pink :"#ffc0cb", + plum :"#dda0dd", + powderblue :"#b0e0e6", + purple :"#800080", + red :"#ff0000", + rosybrown :"#bc8f8f", + royalblue :"#4169e1", + saddlebrown :"#8b4513", + salmon :"#fa8072", + sandybrown :"#f4a460", + seagreen :"#2e8b57", + seashell :"#fff5ee", + sienna :"#a0522d", + silver :"#c0c0c0", + skyblue :"#87ceeb", + slateblue :"#6a5acd", + slategray :"#708090", + slategrey :"#708090", + snow :"#fffafa", + springgreen :"#00ff7f", + steelblue :"#4682b4", + tan :"#d2b48c", + teal :"#008080", + thistle :"#d8bfd8", + tomato :"#ff6347", + turquoise :"#40e0d0", + violet :"#ee82ee", + wheat :"#f5deb3", + white :"#ffffff", + whitesmoke :"#f5f5f5", + yellow :"#ffff00", + yellowgreen :"#9acd32", + activeBorder :"Active window border.", + activecaption :"Active window caption.", + appworkspace :"Background color of multiple document interface.", + background :"Desktop background.", + buttonface :"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.", + buttonhighlight :"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.", + buttonshadow :"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.", + buttontext :"Text on push buttons.", + captiontext :"Text in caption, size box, and scrollbar arrow box.", + graytext :"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.", + greytext :"Greyed (disabled) text. This color is set to #000 if the current display driver does not support a solid grey color.", + highlight :"Item(s) selected in a control.", + highlighttext :"Text of item(s) selected in a control.", + inactiveborder :"Inactive window border.", + inactivecaption :"Inactive window caption.", + inactivecaptiontext :"Color of text in an inactive caption.", + infobackground :"Background color for tooltip controls.", + infotext :"Text color for tooltip controls.", + menu :"Menu background.", + menutext :"Text in menus.", + scrollbar :"Scroll bar gray area.", + threeddarkshadow :"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + threedface :"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + threedhighlight :"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + threedlightshadow :"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + threedshadow :"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.", + window :"Window background.", + windowframe :"Window frame.", + windowtext :"Text in windows." +}; +function Combinator(text, line, col){ + + SyntaxUnit.call(this, text, line, col, Parser.COMBINATOR_TYPE); + this.type = "unknown"; + if (/^\s+$/.test(text)){ + this.type = "descendant"; + } else if (text == ">"){ + this.type = "child"; + } else if (text == "+"){ + this.type = "adjacent-sibling"; + } else if (text == "~"){ + this.type = "sibling"; + } + +} + +Combinator.prototype = new SyntaxUnit(); +Combinator.prototype.constructor = Combinator; +function MediaFeature(name, value){ + + SyntaxUnit.call(this, "(" + name + (value !== null ? ":" + value : "") + ")", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE); + this.name = name; + this.value = value; +} + +MediaFeature.prototype = new SyntaxUnit(); +MediaFeature.prototype.constructor = MediaFeature; +function MediaQuery(modifier, mediaType, features, line, col){ + + SyntaxUnit.call(this, (modifier ? modifier + " ": "") + (mediaType ? mediaType : "") + (mediaType && features.length > 0 ? " and " : "") + features.join(" and "), line, col, Parser.MEDIA_QUERY_TYPE); + this.modifier = modifier; + this.mediaType = mediaType; + this.features = features; + +} + +MediaQuery.prototype = new SyntaxUnit(); +MediaQuery.prototype.constructor = MediaQuery; +function Parser(options){ + EventTarget.call(this); + + + this.options = options || {}; + + this._tokenStream = null; +} +Parser.DEFAULT_TYPE = 0; +Parser.COMBINATOR_TYPE = 1; +Parser.MEDIA_FEATURE_TYPE = 2; +Parser.MEDIA_QUERY_TYPE = 3; +Parser.PROPERTY_NAME_TYPE = 4; +Parser.PROPERTY_VALUE_TYPE = 5; +Parser.PROPERTY_VALUE_PART_TYPE = 6; +Parser.SELECTOR_TYPE = 7; +Parser.SELECTOR_PART_TYPE = 8; +Parser.SELECTOR_SUB_PART_TYPE = 9; + +Parser.prototype = function(){ + + var proto = new EventTarget(), //new prototype + prop, + additions = { + constructor: Parser, + DEFAULT_TYPE : 0, + COMBINATOR_TYPE : 1, + MEDIA_FEATURE_TYPE : 2, + MEDIA_QUERY_TYPE : 3, + PROPERTY_NAME_TYPE : 4, + PROPERTY_VALUE_TYPE : 5, + PROPERTY_VALUE_PART_TYPE : 6, + SELECTOR_TYPE : 7, + SELECTOR_PART_TYPE : 8, + SELECTOR_SUB_PART_TYPE : 9, + + _stylesheet: function(){ + + var tokenStream = this._tokenStream, + charset = null, + count, + token, + tt; + + this.fire("startstylesheet"); + this._charset(); + + this._skipCruft(); + while (tokenStream.peek() == Tokens.IMPORT_SYM){ + this._import(); + this._skipCruft(); + } + while (tokenStream.peek() == Tokens.NAMESPACE_SYM){ + this._namespace(); + this._skipCruft(); + } + tt = tokenStream.peek(); + while(tt > Tokens.EOF){ + + try { + + switch(tt){ + case Tokens.MEDIA_SYM: + this._media(); + this._skipCruft(); + break; + case Tokens.PAGE_SYM: + this._page(); + this._skipCruft(); + break; + case Tokens.FONT_FACE_SYM: + this._font_face(); + this._skipCruft(); + break; + case Tokens.KEYFRAMES_SYM: + this._keyframes(); + this._skipCruft(); + break; + case Tokens.VIEWPORT_SYM: + this._viewport(); + this._skipCruft(); + break; + case Tokens.UNKNOWN_SYM: //unknown @ rule + tokenStream.get(); + if (!this.options.strict){ + this.fire({ + type: "error", + error: null, + message: "Unknown @ rule: " + tokenStream.LT(0).value + ".", + line: tokenStream.LT(0).startLine, + col: tokenStream.LT(0).startCol + }); + count=0; + while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE){ + count++; //keep track of nesting depth + } + + while(count){ + tokenStream.advance([Tokens.RBRACE]); + count--; + } + + } else { + throw new SyntaxError("Unknown @ rule.", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol); + } + break; + case Tokens.S: + this._readWhitespace(); + break; + default: + if(!this._ruleset()){ + switch(tt){ + case Tokens.CHARSET_SYM: + token = tokenStream.LT(1); + this._charset(false); + throw new SyntaxError("@charset not allowed here.", token.startLine, token.startCol); + case Tokens.IMPORT_SYM: + token = tokenStream.LT(1); + this._import(false); + throw new SyntaxError("@import not allowed here.", token.startLine, token.startCol); + case Tokens.NAMESPACE_SYM: + token = tokenStream.LT(1); + this._namespace(false); + throw new SyntaxError("@namespace not allowed here.", token.startLine, token.startCol); + default: + tokenStream.get(); //get the last token + this._unexpectedToken(tokenStream.token()); + } + + } + } + } catch(ex) { + if (ex instanceof SyntaxError && !this.options.strict){ + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + } else { + throw ex; + } + } + + tt = tokenStream.peek(); + } + + if (tt != Tokens.EOF){ + this._unexpectedToken(tokenStream.token()); + } + + this.fire("endstylesheet"); + }, + + _charset: function(emit){ + var tokenStream = this._tokenStream, + charset, + token, + line, + col; + + if (tokenStream.match(Tokens.CHARSET_SYM)){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.STRING); + + token = tokenStream.token(); + charset = token.value; + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.SEMICOLON); + + if (emit !== false){ + this.fire({ + type: "charset", + charset:charset, + line: line, + col: col + }); + } + } + }, + + _import: function(emit){ + + var tokenStream = this._tokenStream, + tt, + uri, + importToken, + mediaList = []; + tokenStream.mustMatch(Tokens.IMPORT_SYM); + importToken = tokenStream.token(); + this._readWhitespace(); + + tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); + uri = tokenStream.token().value.replace(/^(?:url\()?["']?([^"']+?)["']?\)?$/, "$1"); + + this._readWhitespace(); + + mediaList = this._media_query_list(); + tokenStream.mustMatch(Tokens.SEMICOLON); + this._readWhitespace(); + + if (emit !== false){ + this.fire({ + type: "import", + uri: uri, + media: mediaList, + line: importToken.startLine, + col: importToken.startCol + }); + } + + }, + + _namespace: function(emit){ + + var tokenStream = this._tokenStream, + line, + col, + prefix, + uri; + tokenStream.mustMatch(Tokens.NAMESPACE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + this._readWhitespace(); + if (tokenStream.match(Tokens.IDENT)){ + prefix = tokenStream.token().value; + this._readWhitespace(); + } + + tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); + uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1"); + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.SEMICOLON); + this._readWhitespace(); + + if (emit !== false){ + this.fire({ + type: "namespace", + prefix: prefix, + uri: uri, + line: line, + col: col + }); + } + + }, + + _media: function(){ + var tokenStream = this._tokenStream, + line, + col, + mediaList;// = []; + tokenStream.mustMatch(Tokens.MEDIA_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + mediaList = this._media_query_list(); + + tokenStream.mustMatch(Tokens.LBRACE); + this._readWhitespace(); + + this.fire({ + type: "startmedia", + media: mediaList, + line: line, + col: col + }); + + while(true) { + if (tokenStream.peek() == Tokens.PAGE_SYM){ + this._page(); + } else if (tokenStream.peek() == Tokens.FONT_FACE_SYM){ + this._font_face(); + } else if (tokenStream.peek() == Tokens.VIEWPORT_SYM){ + this._viewport(); + } else if (!this._ruleset()){ + break; + } + } + + tokenStream.mustMatch(Tokens.RBRACE); + this._readWhitespace(); + + this.fire({ + type: "endmedia", + media: mediaList, + line: line, + col: col + }); + }, + _media_query_list: function(){ + var tokenStream = this._tokenStream, + mediaList = []; + + + this._readWhitespace(); + + if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){ + mediaList.push(this._media_query()); + } + + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + mediaList.push(this._media_query()); + } + + return mediaList; + }, + _media_query: function(){ + var tokenStream = this._tokenStream, + type = null, + ident = null, + token = null, + expressions = []; + + if (tokenStream.match(Tokens.IDENT)){ + ident = tokenStream.token().value.toLowerCase(); + if (ident != "only" && ident != "not"){ + tokenStream.unget(); + ident = null; + } else { + token = tokenStream.token(); + } + } + + this._readWhitespace(); + + if (tokenStream.peek() == Tokens.IDENT){ + type = this._media_type(); + if (token === null){ + token = tokenStream.token(); + } + } else if (tokenStream.peek() == Tokens.LPAREN){ + if (token === null){ + token = tokenStream.LT(1); + } + expressions.push(this._media_expression()); + } + + if (type === null && expressions.length === 0){ + return null; + } else { + this._readWhitespace(); + while (tokenStream.match(Tokens.IDENT)){ + if (tokenStream.token().value.toLowerCase() != "and"){ + this._unexpectedToken(tokenStream.token()); + } + + this._readWhitespace(); + expressions.push(this._media_expression()); + } + } + + return new MediaQuery(ident, type, expressions, token.startLine, token.startCol); + }, + _media_type: function(){ + return this._media_feature(); + }, + _media_expression: function(){ + var tokenStream = this._tokenStream, + feature = null, + token, + expression = null; + + tokenStream.mustMatch(Tokens.LPAREN); + + feature = this._media_feature(); + this._readWhitespace(); + + if (tokenStream.match(Tokens.COLON)){ + this._readWhitespace(); + token = tokenStream.LT(1); + expression = this._expression(); + } + + tokenStream.mustMatch(Tokens.RPAREN); + this._readWhitespace(); + + return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null)); + }, + _media_feature: function(){ + var tokenStream = this._tokenStream; + + tokenStream.mustMatch(Tokens.IDENT); + + return SyntaxUnit.fromToken(tokenStream.token()); + }, + _page: function(){ + var tokenStream = this._tokenStream, + line, + col, + identifier = null, + pseudoPage = null; + tokenStream.mustMatch(Tokens.PAGE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + if (tokenStream.match(Tokens.IDENT)){ + identifier = tokenStream.token().value; + if (identifier.toLowerCase() === "auto"){ + this._unexpectedToken(tokenStream.token()); + } + } + if (tokenStream.peek() == Tokens.COLON){ + pseudoPage = this._pseudo_page(); + } + + this._readWhitespace(); + + this.fire({ + type: "startpage", + id: identifier, + pseudo: pseudoPage, + line: line, + col: col + }); + + this._readDeclarations(true, true); + + this.fire({ + type: "endpage", + id: identifier, + pseudo: pseudoPage, + line: line, + col: col + }); + + }, + _margin: function(){ + var tokenStream = this._tokenStream, + line, + col, + marginSym = this._margin_sym(); + + if (marginSym){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this.fire({ + type: "startpagemargin", + margin: marginSym, + line: line, + col: col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endpagemargin", + margin: marginSym, + line: line, + col: col + }); + return true; + } else { + return false; + } + }, + _margin_sym: function(){ + + var tokenStream = this._tokenStream; + + if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM, + Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM, + Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM, + Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM, + Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM, + Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM, + Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM])) + { + return SyntaxUnit.fromToken(tokenStream.token()); + } else { + return null; + } + + }, + + _pseudo_page: function(){ + + var tokenStream = this._tokenStream; + + tokenStream.mustMatch(Tokens.COLON); + tokenStream.mustMatch(Tokens.IDENT); + + return tokenStream.token().value; + }, + + _font_face: function(){ + var tokenStream = this._tokenStream, + line, + col; + tokenStream.mustMatch(Tokens.FONT_FACE_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + this.fire({ + type: "startfontface", + line: line, + col: col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endfontface", + line: line, + col: col + }); + }, + + _viewport: function(){ + var tokenStream = this._tokenStream, + line, + col; + + tokenStream.mustMatch(Tokens.VIEWPORT_SYM); + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + + this._readWhitespace(); + + this.fire({ + type: "startviewport", + line: line, + col: col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endviewport", + line: line, + col: col + }); + + }, + + _operator: function(inFunction){ + + var tokenStream = this._tokenStream, + token = null; + + if (tokenStream.match([Tokens.SLASH, Tokens.COMMA]) || + (inFunction && tokenStream.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS]))){ + token = tokenStream.token(); + this._readWhitespace(); + } + return token ? PropertyValuePart.fromToken(token) : null; + + }, + + _combinator: function(){ + + var tokenStream = this._tokenStream, + value = null, + token; + + if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){ + token = tokenStream.token(); + value = new Combinator(token.value, token.startLine, token.startCol); + this._readWhitespace(); + } + + return value; + }, + + _unary_operator: function(){ + + var tokenStream = this._tokenStream; + + if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){ + return tokenStream.token().value; + } else { + return null; + } + }, + + _property: function(){ + + var tokenStream = this._tokenStream, + value = null, + hack = null, + tokenValue, + token, + line, + col; + if (tokenStream.peek() == Tokens.STAR && this.options.starHack){ + tokenStream.get(); + token = tokenStream.token(); + hack = token.value; + line = token.startLine; + col = token.startCol; + } + + if(tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + tokenValue = token.value; + if (tokenValue.charAt(0) == "_" && this.options.underscoreHack){ + hack = "_"; + tokenValue = tokenValue.substring(1); + } + + value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol)); + this._readWhitespace(); + } + + return value; + }, + _ruleset: function(){ + + var tokenStream = this._tokenStream, + tt, + selectors; + try { + selectors = this._selectors_group(); + } catch (ex){ + if (ex instanceof SyntaxError && !this.options.strict){ + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + tt = tokenStream.advance([Tokens.RBRACE]); + if (tt == Tokens.RBRACE){ + } else { + throw ex; + } + + } else { + throw ex; + } + return true; + } + if (selectors){ + + this.fire({ + type: "startrule", + selectors: selectors, + line: selectors[0].line, + col: selectors[0].col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endrule", + selectors: selectors, + line: selectors[0].line, + col: selectors[0].col + }); + + } + + return selectors; + + }, + _selectors_group: function(){ + var tokenStream = this._tokenStream, + selectors = [], + selector; + + selector = this._selector(); + if (selector !== null){ + + selectors.push(selector); + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + selector = this._selector(); + if (selector !== null){ + selectors.push(selector); + } else { + this._unexpectedToken(tokenStream.LT(1)); + } + } + } + + return selectors.length ? selectors : null; + }, + _selector: function(){ + + var tokenStream = this._tokenStream, + selector = [], + nextSelector = null, + combinator = null, + ws = null; + nextSelector = this._simple_selector_sequence(); + if (nextSelector === null){ + return null; + } + + selector.push(nextSelector); + + do { + combinator = this._combinator(); + + if (combinator !== null){ + selector.push(combinator); + nextSelector = this._simple_selector_sequence(); + if (nextSelector === null){ + this._unexpectedToken(tokenStream.LT(1)); + } else { + selector.push(nextSelector); + } + } else { + if (this._readWhitespace()){ + ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol); + combinator = this._combinator(); + nextSelector = this._simple_selector_sequence(); + if (nextSelector === null){ + if (combinator !== null){ + this._unexpectedToken(tokenStream.LT(1)); + } + } else { + + if (combinator !== null){ + selector.push(combinator); + } else { + selector.push(ws); + } + + selector.push(nextSelector); + } + } else { + break; + } + + } + } while(true); + + return new Selector(selector, selector[0].line, selector[0].col); + }, + _simple_selector_sequence: function(){ + + var tokenStream = this._tokenStream, + elementName = null, + modifiers = [], + selectorText= "", + components = [ + function(){ + return tokenStream.match(Tokens.HASH) ? + new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : + null; + }, + this._class, + this._attrib, + this._pseudo, + this._negation + ], + i = 0, + len = components.length, + component = null, + found = false, + line, + col; + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + + elementName = this._type_selector(); + if (!elementName){ + elementName = this._universal(); + } + + if (elementName !== null){ + selectorText += elementName; + } + + while(true){ + if (tokenStream.peek() === Tokens.S){ + break; + } + while(i < len && component === null){ + component = components[i++].call(this); + } + + if (component === null){ + if (selectorText === ""){ + return null; + } else { + break; + } + } else { + i = 0; + modifiers.push(component); + selectorText += component.toString(); + component = null; + } + } + + + return selectorText !== "" ? + new SelectorPart(elementName, modifiers, selectorText, line, col) : + null; + }, + _type_selector: function(){ + + var tokenStream = this._tokenStream, + ns = this._namespace_prefix(), + elementName = this._element_name(); + + if (!elementName){ + if (ns){ + tokenStream.unget(); + if (ns.length > 1){ + tokenStream.unget(); + } + } + + return null; + } else { + if (ns){ + elementName.text = ns + elementName.text; + elementName.col -= ns.length; + } + return elementName; + } + }, + _class: function(){ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.DOT)){ + tokenStream.mustMatch(Tokens.IDENT); + token = tokenStream.token(); + return new SelectorSubPart("." + token.value, "class", token.startLine, token.startCol - 1); + } else { + return null; + } + + }, + _element_name: function(){ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + return new SelectorSubPart(token.value, "elementName", token.startLine, token.startCol); + + } else { + return null; + } + }, + _namespace_prefix: function(){ + var tokenStream = this._tokenStream, + value = ""; + if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){ + + if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){ + value += tokenStream.token().value; + } + + tokenStream.mustMatch(Tokens.PIPE); + value += "|"; + + } + + return value.length ? value : null; + }, + _universal: function(){ + var tokenStream = this._tokenStream, + value = "", + ns; + + ns = this._namespace_prefix(); + if(ns){ + value += ns; + } + + if(tokenStream.match(Tokens.STAR)){ + value += "*"; + } + + return value.length ? value : null; + + }, + _attrib: function(){ + + var tokenStream = this._tokenStream, + value = null, + ns, + token; + + if (tokenStream.match(Tokens.LBRACKET)){ + token = tokenStream.token(); + value = token.value; + value += this._readWhitespace(); + + ns = this._namespace_prefix(); + + if (ns){ + value += ns; + } + + tokenStream.mustMatch(Tokens.IDENT); + value += tokenStream.token().value; + value += this._readWhitespace(); + + if(tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH, + Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])){ + + value += tokenStream.token().value; + value += this._readWhitespace(); + + tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); + value += tokenStream.token().value; + value += this._readWhitespace(); + } + + tokenStream.mustMatch(Tokens.RBRACKET); + + return new SelectorSubPart(value + "]", "attribute", token.startLine, token.startCol); + } else { + return null; + } + }, + _pseudo: function(){ + + var tokenStream = this._tokenStream, + pseudo = null, + colons = ":", + line, + col; + + if (tokenStream.match(Tokens.COLON)){ + + if (tokenStream.match(Tokens.COLON)){ + colons += ":"; + } + + if (tokenStream.match(Tokens.IDENT)){ + pseudo = tokenStream.token().value; + line = tokenStream.token().startLine; + col = tokenStream.token().startCol - colons.length; + } else if (tokenStream.peek() == Tokens.FUNCTION){ + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol - colons.length; + pseudo = this._functional_pseudo(); + } + + if (pseudo){ + pseudo = new SelectorSubPart(colons + pseudo, "pseudo", line, col); + } + } + + return pseudo; + }, + _functional_pseudo: function(){ + + var tokenStream = this._tokenStream, + value = null; + + if(tokenStream.match(Tokens.FUNCTION)){ + value = tokenStream.token().value; + value += this._readWhitespace(); + value += this._expression(); + tokenStream.mustMatch(Tokens.RPAREN); + value += ")"; + } + + return value; + }, + _expression: function(){ + + var tokenStream = this._tokenStream, + value = ""; + + while(tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION, + Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH, + Tokens.FREQ, Tokens.ANGLE, Tokens.TIME, + Tokens.RESOLUTION, Tokens.SLASH])){ + + value += tokenStream.token().value; + value += this._readWhitespace(); + } + + return value.length ? value : null; + + }, + _negation: function(){ + + var tokenStream = this._tokenStream, + line, + col, + value = "", + arg, + subpart = null; + + if (tokenStream.match(Tokens.NOT)){ + value = tokenStream.token().value; + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + value += this._readWhitespace(); + arg = this._negation_arg(); + value += arg; + value += this._readWhitespace(); + tokenStream.match(Tokens.RPAREN); + value += tokenStream.token().value; + + subpart = new SelectorSubPart(value, "not", line, col); + subpart.args.push(arg); + } + + return subpart; + }, + _negation_arg: function(){ + + var tokenStream = this._tokenStream, + args = [ + this._type_selector, + this._universal, + function(){ + return tokenStream.match(Tokens.HASH) ? + new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : + null; + }, + this._class, + this._attrib, + this._pseudo + ], + arg = null, + i = 0, + len = args.length, + elementName, + line, + col, + part; + + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + + while(i < len && arg === null){ + + arg = args[i].call(this); + i++; + } + if (arg === null){ + this._unexpectedToken(tokenStream.LT(1)); + } + if (arg.type == "elementName"){ + part = new SelectorPart(arg, [], arg.toString(), line, col); + } else { + part = new SelectorPart(null, [arg], arg.toString(), line, col); + } + + return part; + }, + + _declaration: function(){ + + var tokenStream = this._tokenStream, + property = null, + expr = null, + prio = null, + error = null, + invalid = null, + propertyName= ""; + + property = this._property(); + if (property !== null){ + + tokenStream.mustMatch(Tokens.COLON); + this._readWhitespace(); + + expr = this._expr(); + if (!expr || expr.length === 0){ + this._unexpectedToken(tokenStream.LT(1)); + } + + prio = this._prio(); + propertyName = property.toString(); + if (this.options.starHack && property.hack == "*" || + this.options.underscoreHack && property.hack == "_") { + + propertyName = property.text; + } + + try { + this._validateProperty(propertyName, expr); + } catch (ex) { + invalid = ex; + } + + this.fire({ + type: "property", + property: property, + value: expr, + important: prio, + line: property.line, + col: property.col, + invalid: invalid + }); + + return true; + } else { + return false; + } + }, + + _prio: function(){ + + var tokenStream = this._tokenStream, + result = tokenStream.match(Tokens.IMPORTANT_SYM); + + this._readWhitespace(); + return result; + }, + + _expr: function(inFunction){ + + var tokenStream = this._tokenStream, + values = [], + value = null, + operator = null; + + value = this._term(inFunction); + if (value !== null){ + + values.push(value); + + do { + operator = this._operator(inFunction); + if (operator){ + values.push(operator); + } /*else { + values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col)); + valueParts = []; + }*/ + + value = this._term(inFunction); + + if (value === null){ + break; + } else { + values.push(value); + } + } while(true); + } + + return values.length > 0 ? new PropertyValue(values, values[0].line, values[0].col) : null; + }, + + _term: function(inFunction){ + + var tokenStream = this._tokenStream, + unary = null, + value = null, + endChar = null, + token, + line, + col; + unary = this._unary_operator(); + if (unary !== null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + if (tokenStream.peek() == Tokens.IE_FUNCTION && this.options.ieFilters){ + + value = this._ie_function(); + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + } else if (inFunction && tokenStream.match([Tokens.LPAREN, Tokens.LBRACE, Tokens.LBRACKET])){ + + token = tokenStream.token(); + endChar = token.endChar; + value = token.value + this._expr(inFunction).text; + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + tokenStream.mustMatch(Tokens.type(endChar)); + value += endChar; + this._readWhitespace(); + } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH, + Tokens.ANGLE, Tokens.TIME, + Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])){ + + value = tokenStream.token().value; + if (unary === null){ + line = tokenStream.token().startLine; + col = tokenStream.token().startCol; + } + this._readWhitespace(); + } else { + token = this._hexcolor(); + if (token === null){ + if (unary === null){ + line = tokenStream.LT(1).startLine; + col = tokenStream.LT(1).startCol; + } + if (value === null){ + if (tokenStream.LA(3) == Tokens.EQUALS && this.options.ieFilters){ + value = this._ie_function(); + } else { + value = this._function(); + } + } + + } else { + value = token.value; + if (unary === null){ + line = token.startLine; + col = token.startCol; + } + } + + } + + return value !== null ? + new PropertyValuePart(unary !== null ? unary + value : value, line, col) : + null; + + }, + + _function: function(){ + + var tokenStream = this._tokenStream, + functionText = null, + expr = null, + lt; + + if (tokenStream.match(Tokens.FUNCTION)){ + functionText = tokenStream.token().value; + this._readWhitespace(); + expr = this._expr(true); + functionText += expr; + if (this.options.ieFilters && tokenStream.peek() == Tokens.EQUALS){ + do { + + if (this._readWhitespace()){ + functionText += tokenStream.token().value; + } + if (tokenStream.LA(0) == Tokens.COMMA){ + functionText += tokenStream.token().value; + } + + tokenStream.match(Tokens.IDENT); + functionText += tokenStream.token().value; + + tokenStream.match(Tokens.EQUALS); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ + tokenStream.get(); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + } + } while(tokenStream.match([Tokens.COMMA, Tokens.S])); + } + + tokenStream.match(Tokens.RPAREN); + functionText += ")"; + this._readWhitespace(); + } + + return functionText; + }, + + _ie_function: function(){ + + var tokenStream = this._tokenStream, + functionText = null, + expr = null, + lt; + if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])){ + functionText = tokenStream.token().value; + + do { + + if (this._readWhitespace()){ + functionText += tokenStream.token().value; + } + if (tokenStream.LA(0) == Tokens.COMMA){ + functionText += tokenStream.token().value; + } + + tokenStream.match(Tokens.IDENT); + functionText += tokenStream.token().value; + + tokenStream.match(Tokens.EQUALS); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ + tokenStream.get(); + functionText += tokenStream.token().value; + lt = tokenStream.peek(); + } + } while(tokenStream.match([Tokens.COMMA, Tokens.S])); + + tokenStream.match(Tokens.RPAREN); + functionText += ")"; + this._readWhitespace(); + } + + return functionText; + }, + + _hexcolor: function(){ + + var tokenStream = this._tokenStream, + token = null, + color; + + if(tokenStream.match(Tokens.HASH)){ + + token = tokenStream.token(); + color = token.value; + if (!/#[a-f0-9]{3,6}/i.test(color)){ + throw new SyntaxError("Expected a hex color but found '" + color + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); + } + this._readWhitespace(); + } + + return token; + }, + + _keyframes: function(){ + var tokenStream = this._tokenStream, + token, + tt, + name, + prefix = ""; + + tokenStream.mustMatch(Tokens.KEYFRAMES_SYM); + token = tokenStream.token(); + if (/^@\-([^\-]+)\-/.test(token.value)) { + prefix = RegExp.$1; + } + + this._readWhitespace(); + name = this._keyframe_name(); + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.LBRACE); + + this.fire({ + type: "startkeyframes", + name: name, + prefix: prefix, + line: token.startLine, + col: token.startCol + }); + + this._readWhitespace(); + tt = tokenStream.peek(); + while(tt == Tokens.IDENT || tt == Tokens.PERCENTAGE) { + this._keyframe_rule(); + this._readWhitespace(); + tt = tokenStream.peek(); + } + + this.fire({ + type: "endkeyframes", + name: name, + prefix: prefix, + line: token.startLine, + col: token.startCol + }); + + this._readWhitespace(); + tokenStream.mustMatch(Tokens.RBRACE); + + }, + + _keyframe_name: function(){ + var tokenStream = this._tokenStream, + token; + + tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); + return SyntaxUnit.fromToken(tokenStream.token()); + }, + + _keyframe_rule: function(){ + var tokenStream = this._tokenStream, + token, + keyList = this._key_list(); + + this.fire({ + type: "startkeyframerule", + keys: keyList, + line: keyList[0].line, + col: keyList[0].col + }); + + this._readDeclarations(true); + + this.fire({ + type: "endkeyframerule", + keys: keyList, + line: keyList[0].line, + col: keyList[0].col + }); + + }, + + _key_list: function(){ + var tokenStream = this._tokenStream, + token, + key, + keyList = []; + keyList.push(this._key()); + + this._readWhitespace(); + + while(tokenStream.match(Tokens.COMMA)){ + this._readWhitespace(); + keyList.push(this._key()); + this._readWhitespace(); + } + + return keyList; + }, + + _key: function(){ + + var tokenStream = this._tokenStream, + token; + + if (tokenStream.match(Tokens.PERCENTAGE)){ + return SyntaxUnit.fromToken(tokenStream.token()); + } else if (tokenStream.match(Tokens.IDENT)){ + token = tokenStream.token(); + + if (/from|to/i.test(token.value)){ + return SyntaxUnit.fromToken(token); + } + + tokenStream.unget(); + } + this._unexpectedToken(tokenStream.LT(1)); + }, + _skipCruft: function(){ + while(this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])){ + } + }, + _readDeclarations: function(checkStart, readMargins){ + var tokenStream = this._tokenStream, + tt; + + + this._readWhitespace(); + + if (checkStart){ + tokenStream.mustMatch(Tokens.LBRACE); + } + + this._readWhitespace(); + + try { + + while(true){ + + if (tokenStream.match(Tokens.SEMICOLON) || (readMargins && this._margin())){ + } else if (this._declaration()){ + if (!tokenStream.match(Tokens.SEMICOLON)){ + break; + } + } else { + break; + } + this._readWhitespace(); + } + + tokenStream.mustMatch(Tokens.RBRACE); + this._readWhitespace(); + + } catch (ex) { + if (ex instanceof SyntaxError && !this.options.strict){ + this.fire({ + type: "error", + error: ex, + message: ex.message, + line: ex.line, + col: ex.col + }); + tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]); + if (tt == Tokens.SEMICOLON){ + this._readDeclarations(false, readMargins); + } else if (tt != Tokens.RBRACE){ + throw ex; + } + + } else { + throw ex; + } + } + + }, + _readWhitespace: function(){ + + var tokenStream = this._tokenStream, + ws = ""; + + while(tokenStream.match(Tokens.S)){ + ws += tokenStream.token().value; + } + + return ws; + }, + _unexpectedToken: function(token){ + throw new SyntaxError("Unexpected token '" + token.value + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); + }, + _verifyEnd: function(){ + if (this._tokenStream.LA(1) != Tokens.EOF){ + this._unexpectedToken(this._tokenStream.LT(1)); + } + }, + _validateProperty: function(property, value){ + Validation.validate(property, value); + }, + + parse: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + this._stylesheet(); + }, + + parseStyleSheet: function(input){ + return this.parse(input); + }, + + parseMediaQuery: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + var result = this._media_query(); + this._verifyEnd(); + return result; + }, + parsePropertyValue: function(input){ + + this._tokenStream = new TokenStream(input, Tokens); + this._readWhitespace(); + + var result = this._expr(); + this._readWhitespace(); + this._verifyEnd(); + return result; + }, + parseRule: function(input){ + this._tokenStream = new TokenStream(input, Tokens); + this._readWhitespace(); + + var result = this._ruleset(); + this._readWhitespace(); + this._verifyEnd(); + return result; + }, + parseSelector: function(input){ + + this._tokenStream = new TokenStream(input, Tokens); + this._readWhitespace(); + + var result = this._selector(); + this._readWhitespace(); + this._verifyEnd(); + return result; + }, + parseStyleAttribute: function(input){ + input += "}"; // for error recovery in _readDeclarations() + this._tokenStream = new TokenStream(input, Tokens); + this._readDeclarations(); + } + }; + for (prop in additions){ + if (additions.hasOwnProperty(prop)){ + proto[prop] = additions[prop]; + } + } + + return proto; +}(); +var Properties = { + "align-items" : "flex-start | flex-end | center | baseline | stretch", + "align-content" : "flex-start | flex-end | center | space-between | space-around | stretch", + "align-self" : "auto | flex-start | flex-end | center | baseline | stretch", + "-webkit-align-items" : "flex-start | flex-end | center | baseline | stretch", + "-webkit-align-content" : "flex-start | flex-end | center | space-between | space-around | stretch", + "-webkit-align-self" : "auto | flex-start | flex-end | center | baseline | stretch", + "alignment-adjust" : "auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | | ", + "alignment-baseline" : "baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical", + "animation" : 1, + "animation-delay" : { multi: "