From 47097d9e8fc3618410e4c2bc5cc32169fc2b0a0d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com>
Date: Tue, 5 Nov 2013 11:20:35 +0100
Subject: [PATCH] Update ace editor

Using https://github.com/ajaxorg/ace-builds/commit/45d3068aa7190f08396bcfe134e505fe144c1ccb
---
 .../erp5_ace_editor/ace/ace.js.xml            | 2569 +++--
 .../erp5_ace_editor/ace/ext-chromevox.js.xml  |  581 ++
 .../ace/ext-elastic_tabstops_lite.js.xml      |    2 +-
 .../erp5_ace_editor/ace/ext-emmet.js.xml      |  900 +-
 .../ace/ext-keybinding_menu.js.xml            |    6 +-
 .../ace/ext-language_tools.js.xml             | 1664 +++
 .../erp5_ace_editor/ace/ext-modelist.js.xml   |   43 +-
 .../erp5_ace_editor/ace/ext-old_ie.js.xml     |  543 +
 .../erp5_ace_editor/ace/ext-options.js.xml    |    2 +-
 .../erp5_ace_editor/ace/ext-searchbox.js.xml  |   77 +-
 .../ace/ext-settings_menu.js.xml              |   45 +-
 .../erp5_ace_editor/ace/ext-spellcheck.js.xml |    7 +-
 .../erp5_ace_editor/ace/ext-split.js.xml      |  315 +
 .../ace/ext-static_highlight.js.xml           |   74 +-
 .../erp5_ace_editor/ace/ext-statusbar.js.xml  |    2 +-
 .../erp5_ace_editor/ace/ext-textarea.js.xml   |   36 +-
 .../erp5_ace_editor/ace/ext-themelist.js.xml  |    4 +-
 .../erp5_ace_editor/ace/ext-whitespace.js.xml |   22 +-
 .../ace/keybinding-emacs.js.xml               |   10 +-
 .../erp5_ace_editor/ace/keybinding-vim.js.xml |   51 +-
 .../erp5_ace_editor/ace/mode-abap.js.xml      |    6 +-
 .../ace/mode-actionscript.js.xml              |    7 +-
 .../erp5_ace_editor/ace/mode-ada.js.xml       |    6 +-
 .../erp5_ace_editor/ace/mode-asciidoc.js.xml  |    8 +-
 .../ace/mode-assembly_x86.js.xml              |    7 +-
 .../ace/mode-autohotkey.js.xml                |    7 +-
 .../erp5_ace_editor/ace/mode-batchfile.js.xml |   10 +-
 .../erp5_ace_editor/ace/mode-c9search.js.xml  |    6 +-
 .../erp5_ace_editor/ace/mode-c_cpp.js.xml     |   10 +-
 .../erp5_ace_editor/ace/mode-clojure.js.xml   |    8 +-
 .../erp5_ace_editor/ace/mode-cobol.js.xml     |    6 +-
 .../erp5_ace_editor/ace/mode-coffee.js.xml    |    8 +-
 .../ace/mode-coldfusion.js.xml                |  587 +-
 .../erp5_ace_editor/ace/mode-csharp.js.xml    |  124 +-
 .../erp5_ace_editor/ace/mode-css.js.xml       |  181 +-
 .../erp5_ace_editor/ace/mode-curly.js.xml     |  881 +-
 .../erp5_ace_editor/ace/mode-d.js.xml         |    7 +-
 .../erp5_ace_editor/ace/mode-dart.js.xml      |   20 +-
 .../erp5_ace_editor/ace/mode-diff.js.xml      |    9 +-
 .../erp5_ace_editor/ace/mode-django.js.xml    |  848 +-
 .../erp5_ace_editor/ace/mode-dot.js.xml       |    9 +-
 .../erp5_ace_editor/ace/mode-ejs.js.xml       |  861 +-
 .../erp5_ace_editor/ace/mode-erlang.js.xml    |   12 +-
 .../erp5_ace_editor/ace/mode-forth.js.xml     |    7 +-
 .../erp5_ace_editor/ace/mode-ftl.js.xml       |  567 +-
 .../erp5_ace_editor/ace/mode-glsl.js.xml      |   13 +-
 .../erp5_ace_editor/ace/mode-golang.js.xml    |   69 +-
 .../erp5_ace_editor/ace/mode-groovy.js.xml    |   28 +-
 .../erp5_ace_editor/ace/mode-haml.js.xml      |   10 +-
 .../ace/mode-handlebars.js.xml                | 2442 +++++
 .../erp5_ace_editor/ace/mode-haskell.js.xml   |    7 +-
 .../erp5_ace_editor/ace/mode-haxe.js.xml      |    9 +-
 .../erp5_ace_editor/ace/mode-html.js.xml      |  843 +-
 .../ace/mode-html_completions.js.xml          |  353 +
 .../erp5_ace_editor/ace/mode-html_ruby.js.xml |  907 +-
 .../erp5_ace_editor/ace/mode-ini.js.xml       |  189 +-
 .../erp5_ace_editor/ace/mode-jack.js.xml      |  650 ++
 .../erp5_ace_editor/ace/mode-jade.js.xml      |  636 +-
 .../erp5_ace_editor/ace/mode-java.js.xml      |   29 +-
 .../ace/mode-javascript.js.xml                |   26 +-
 .../erp5_ace_editor/ace/mode-json.js.xml      |    6 +-
 .../erp5_ace_editor/ace/mode-jsoniq.js.xml    |  114 +-
 .../erp5_ace_editor/ace/mode-jsp.js.xml       |  571 +-
 .../erp5_ace_editor/ace/mode-jsx.js.xml       |    8 +-
 .../erp5_ace_editor/ace/mode-julia.js.xml     |    7 +-
 .../erp5_ace_editor/ace/mode-latex.js.xml     |    6 +-
 .../erp5_ace_editor/ace/mode-less.js.xml      |    8 +-
 .../erp5_ace_editor/ace/mode-liquid.js.xml    |  564 +-
 .../erp5_ace_editor/ace/mode-lisp.js.xml      |    8 +-
 .../ace/mode-livescript.js.xml                |    2 +-
 .../erp5_ace_editor/ace/mode-logiql.js.xml    |   11 +-
 .../erp5_ace_editor/ace/mode-lsl.js.xml       |  275 +-
 .../erp5_ace_editor/ace/mode-lua.js.xml       |   19 +-
 .../erp5_ace_editor/ace/mode-luapage.js.xml   |  898 +-
 .../erp5_ace_editor/ace/mode-lucene.js.xml    |    2 +-
 .../erp5_ace_editor/ace/mode-makefile.js.xml  |   38 +-
 .../erp5_ace_editor/ace/mode-markdown.js.xml  |  995 +-
 .../erp5_ace_editor/ace/mode-matlab.js.xml    |    6 +-
 .../erp5_ace_editor/ace/mode-mushcode.js.xml  |   12 +-
 .../ace/mode-mushcode_high_rules.js.xml       |    6 +-
 .../erp5_ace_editor/ace/mode-mysql.js.xml     |    8 +-
 .../erp5_ace_editor/ace/mode-nix.js.xml       |  930 ++
 .../ace/mode-objectivec.js.xml                |    8 +-
 .../erp5_ace_editor/ace/mode-ocaml.js.xml     |    9 +-
 .../erp5_ace_editor/ace/mode-pascal.js.xml    |    7 +-
 .../erp5_ace_editor/ace/mode-perl.js.xml      |   17 +-
 .../erp5_ace_editor/ace/mode-pgsql.js.xml     |   16 +-
 .../erp5_ace_editor/ace/mode-php.js.xml       |  572 +-
 .../ace/mode-plain_text.js.xml                |   94 +
 .../ace/mode-powershell.js.xml                |    8 +-
 .../erp5_ace_editor/ace/mode-prolog.js.xml    |    7 +-
 .../ace/mode-properties.js.xml                |    9 +-
 .../erp5_ace_editor/ace/mode-protobuf.js.xml  |  880 ++
 .../erp5_ace_editor/ace/mode-python.js.xml    |   10 +-
 .../erp5_ace_editor/ace/mode-r.js.xml         |   36 +-
 .../erp5_ace_editor/ace/mode-rdoc.js.xml      |   41 +-
 .../erp5_ace_editor/ace/mode-rhtml.js.xml     |  884 +-
 .../erp5_ace_editor/ace/mode-ruby.js.xml      |    8 +-
 .../erp5_ace_editor/ace/mode-rust.js.xml      |    7 +-
 .../erp5_ace_editor/ace/mode-sass.js.xml      |    6 +-
 .../erp5_ace_editor/ace/mode-scad.js.xml      |    8 +-
 .../erp5_ace_editor/ace/mode-scala.js.xml     |   28 +-
 .../erp5_ace_editor/ace/mode-scheme.js.xml    |    8 +-
 .../erp5_ace_editor/ace/mode-scss.js.xml      |    8 +-
 .../erp5_ace_editor/ace/mode-sh.js.xml        |   36 +-
 .../erp5_ace_editor/ace/mode-sjs.js.xml       | 1150 +++
 .../erp5_ace_editor/ace/mode-snippets.js.xml  |   13 +-
 .../ace/mode-soy_template.js.xml              | 2715 +++++
 .../erp5_ace_editor/ace/mode-space.js.xml     |  203 +
 .../erp5_ace_editor/ace/mode-sql.js.xml       |    6 +-
 .../erp5_ace_editor/ace/mode-stylus.js.xml    |  183 +-
 .../erp5_ace_editor/ace/mode-svg.js.xml       |  264 +-
 .../erp5_ace_editor/ace/mode-tcl.js.xml       |    8 +-
 .../erp5_ace_editor/ace/mode-tex.js.xml       |   38 +-
 .../erp5_ace_editor/ace/mode-text.js.xml      |    2 +-
 .../erp5_ace_editor/ace/mode-textile.js.xml   |    6 +-
 .../erp5_ace_editor/ace/mode-tmsnippet.js.xml |    2 +-
 .../erp5_ace_editor/ace/mode-toml.js.xml      |   78 +-
 .../erp5_ace_editor/ace/mode-twig.js.xml      |  603 +-
 .../ace/mode-typescript.js.xml                |   29 +-
 .../erp5_ace_editor/ace/mode-vbscript.js.xml  |   10 +-
 .../erp5_ace_editor/ace/mode-velocity.js.xml  |  994 +-
 .../erp5_ace_editor/ace/mode-verilog.js.xml   |    6 +-
 .../erp5_ace_editor/ace/mode-vhdl.js.xml      |  182 +
 .../erp5_ace_editor/ace/mode-xml.js.xml       |  213 +-
 .../erp5_ace_editor/ace/mode-xquery.js.xml    |  114 +-
 .../erp5_ace_editor/ace/mode-yaml.js.xml      |    8 +-
 .../erp5_ace_editor/ace/theme-ambiance.js.xml |    2 +-
 .../erp5_ace_editor/ace/theme-chaos.js.xml    |    2 +-
 .../erp5_ace_editor/ace/theme-chrome.js.xml   |   14 +-
 .../erp5_ace_editor/ace/theme-clouds.js.xml   |   13 +-
 .../ace/theme-clouds_midnight.js.xml          |   13 +-
 .../erp5_ace_editor/ace/theme-cobalt.js.xml   |   17 +-
 .../ace/theme-crimson_editor.js.xml           |   10 +-
 .../erp5_ace_editor/ace/theme-dawn.js.xml     |   17 +-
 .../ace/theme-dreamweaver.js.xml              |   14 +-
 .../erp5_ace_editor/ace/theme-eclipse.js.xml  |    6 +-
 .../erp5_ace_editor/ace/theme-github.js.xml   |   10 +-
 .../ace/theme-idle_fingers.js.xml             |   16 +-
 .../erp5_ace_editor/ace/theme-kr.js.xml       |   15 +-
 .../ace/theme-merbivore.js.xml                |   13 +-
 .../ace/theme-merbivore_soft.js.xml           |   13 +-
 .../ace/theme-mono_industrial.js.xml          |   13 +-
 .../erp5_ace_editor/ace/theme-monokai.js.xml  |   17 +-
 .../ace/theme-pastel_on_dark.js.xml           |   13 +-
 .../ace/theme-solarized_dark.js.xml           |   16 +-
 .../ace/theme-solarized_light.js.xml          |   13 +-
 .../erp5_ace_editor/ace/theme-terminal.js.xml |   15 +-
 .../erp5_ace_editor/ace/theme-textmate.js.xml |  165 +-
 .../erp5_ace_editor/ace/theme-tomorrow.js.xml |   18 +-
 .../ace/theme-tomorrow_night.js.xml           |   15 +-
 .../ace/theme-tomorrow_night_blue.js.xml      |   15 +-
 .../ace/theme-tomorrow_night_bright.js.xml    |   18 +-
 .../ace/theme-tomorrow_night_eighties.js.xml  |   18 +-
 .../erp5_ace_editor/ace/theme-twilight.js.xml |   17 +-
 .../ace/theme-vibrant_ink.js.xml              |   10 +-
 .../erp5_ace_editor/ace/theme-xcode.js.xml    |   10 +-
 .../erp5_ace_editor/ace/worker-coffee.js.xml  | 1064 +-
 .../erp5_ace_editor/ace/worker-css.js.xml     |  412 +-
 .../ace/worker-javascript.js.xml              | 8931 ++++++++++++-----
 .../erp5_ace_editor/ace/worker-json.js.xml    |  409 +-
 .../erp5_ace_editor/ace/worker-lua.js.xml     |  761 +-
 .../erp5_ace_editor/ace/worker-php.js.xml     |  654 +-
 .../erp5_ace_editor/ace/worker-xquery.js.xml  |  791 +-
 bt5/erp5_ace_editor/bt/change_log             |    3 +
 bt5/erp5_ace_editor/bt/description            |    2 +-
 bt5/erp5_ace_editor/bt/revision               |    2 +-
 167 files changed, 34761 insertions(+), 10210 deletions(-)
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-chromevox.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-language_tools.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-old_ie.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-split.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-handlebars.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html_completions.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jack.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-nix.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-plain_text.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-protobuf.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sjs.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-soy_template.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-space.js.xml
 create mode 100644 bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-vhdl.js.xml

diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ace.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ace.js.xml
index 0aeaff1686..c470867974 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ace.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ace.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155552.54</string> </value>
+            <value> <string>ts83646622.73</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>545508</int> </value>
+            <value> <int>580350</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -246,7 +246,7 @@ exports.edit = function(el) {\n
         var _id = el;\n
         var el = document.getElementById(_id);\n
         if (!el)\n
-            throw "ace.edit can\'t find div #" + _id;\n
+            throw new Error("ace.edit can\'t find div #" + _id);\n
     }\n
 \n
     if (el.env && el.env.editor instanceof Editor)\n
@@ -1303,7 +1303,7 @@ exports.addListener = function(elem, type, callback) {\n
     }\n
     if (elem.attachEvent) {\n
         var wrapper = function() {\n
-            callback(window.event);\n
+            callback.call(elem, window.event);\n
         };\n
         callback._wrapper = wrapper;\n
         elem.attachEvent("on" + type, wrapper);\n
@@ -1350,51 +1350,25 @@ exports.getButton = function(e) {\n
     }\n
 };\n
 \n
-if (document.documentElement.setCapture) {\n
-    exports.capture = function(el, eventHandler, releaseCaptureHandler) {\n
-        var called = false;\n
-        function onReleaseCapture(e) {\n
-            eventHandler(e);\n
+exports.capture = function(el, eventHandler, releaseCaptureHandler) {\n
+    function onMouseUp(e) {\n
+        eventHandler && eventHandler(e);\n
+        releaseCaptureHandler && releaseCaptureHandler(e);\n
 \n
-            if (!called) {\n
-                called = true;\n
-                releaseCaptureHandler(e);\n
-            }\n
-\n
-            exports.removeListener(el, "mousemove", eventHandler);\n
-            exports.removeListener(el, "mouseup", onReleaseCapture);\n
-            exports.removeListener(el, "losecapture", onReleaseCapture);\n
-\n
-            el.releaseCapture();\n
-        }\n
-\n
-        exports.addListener(el, "mousemove", eventHandler);\n
-        exports.addListener(el, "mouseup", onReleaseCapture);\n
-        exports.addListener(el, "losecapture", onReleaseCapture);\n
-        el.setCapture();\n
-    };\n
-}\n
-else {\n
-    exports.capture = function(el, eventHandler, releaseCaptureHandler) {\n
-        function onMouseUp(e) {\n
-            eventHandler && eventHandler(e);\n
-            releaseCaptureHandler && releaseCaptureHandler(e);\n
-\n
-            document.removeEventListener("mousemove", eventHandler, true);\n
-            document.removeEventListener("mouseup", onMouseUp, true);\n
-\n
-            e.stopPropagation();\n
-        }\n
+        exports.removeListener(document, "mousemove", eventHandler, true);\n
+        exports.removeListener(document, "mouseup", onMouseUp, true);\n
+        exports.removeListener(document, "dragstart", onMouseUp, true);\n
+    }\n
 \n
-        document.addEventListener("mousemove", eventHandler, true);\n
-        document.addEventListener("mouseup", onMouseUp, true);\n
-    };\n
-}\n
+    exports.addListener(document, "mousemove", eventHandler, true);\n
+    exports.addListener(document, "mouseup", onMouseUp, true);\n
+    exports.addListener(document, "dragstart", onMouseUp, true);\n
+};\n
 \n
 exports.addMouseWheelListener = function(el, callback) {\n
-    var factor = 8;\n
-    var listener = function(e) {\n
-        if (e.wheelDelta !== undefined) {\n
+    if ("onmousewheel" in el) {\n
+        var factor = 8;\n
+        exports.addListener(el, "mousewheel", function(e) {\n
             if (e.wheelDeltaX !== undefined) {\n
                 e.wheelX = -e.wheelDeltaX / factor;\n
                 e.wheelY = -e.wheelDeltaY / factor;\n
@@ -1402,8 +1376,16 @@ exports.addMouseWheelListener = function(el, callback) {\n
                 e.wheelX = 0;\n
                 e.wheelY = -e.wheelDelta / factor;\n
             }\n
-        }\n
-        else {\n
+            callback(e);\n
+        });\n
+    } else if ("onwheel" in el) {\n
+        exports.addListener(el, "wheel",  function(e) {\n
+            e.wheelX = (e.deltaX || 0) * 5;\n
+            e.wheelY = (e.deltaY || 0) * 5;\n
+            callback(e);\n
+        });\n
+    } else {\n
+        exports.addListener(el, "DOMMouseScroll", function(e) {\n
             if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n
                 e.wheelX = (e.detail || 0) * 5;\n
                 e.wheelY = 0;\n
@@ -1411,11 +1393,9 @@ exports.addMouseWheelListener = function(el, callback) {\n
                 e.wheelX = 0;\n
                 e.wheelY = (e.detail || 0) * 5;\n
             }\n
-        }\n
-        callback(e);\n
-    };\n
-    exports.addListener(el, "DOMMouseScroll", listener);\n
-    exports.addListener(el, "mousewheel", listener);\n
+            callback(e);\n
+        });\n
+    }\n
 };\n
 \n
 exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) {\n
@@ -1430,21 +1410,22 @@ exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbac
     exports.addListener(el, "mousedown", function(e) {\n
         if (exports.getButton(e) != 0) {\n
             clicks = 0;\n
+        } else if (e.detail > 1) {\n
+            clicks++;\n
+            if (clicks > 4)\n
+                clicks = 1;\n
         } else {\n
-            var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n
-\n
-            if (!timer || isNewClick)\n
-                clicks = 0;\n
-\n
-            clicks += 1;\n
-\n
-            if (timer)\n
-                clearTimeout(timer)\n
-            timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n
+            clicks = 1;\n
         }\n
-        if (clicks == 1) {\n
-            startX = e.clientX;\n
-            startY = e.clientY;\n
+        if (useragent.isIE) {\n
+            var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n
+            if (isNewClick) {\n
+                clicks = 1;\n
+            }\n
+            if (clicks == 1) {\n
+                startX = e.clientX;\n
+                startY = e.clientY;\n
+            }\n
         }\n
 \n
         eventHandler[callbackName]("mousedown", e);\n
@@ -1477,6 +1458,29 @@ function normalizeCommandKeys(callback, e, keyCode) {\n
             | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n
     }\n
 \n
+    if (!useragent.isMac && pressedKeys) {\n
+        if (pressedKeys[91] || pressedKeys[92])\n
+            hashId |= 8;\n
+        if (pressedKeys.altGr) {\n
+            if ((3 & hashId) != 3)\n
+                pressedKeys.altGr = 0\n
+            else\n
+                return;\n
+        }\n
+        if (keyCode === 18 || keyCode === 17) {\n
+            var location = e.location || e.keyLocation;\n
+            if (keyCode === 17 && location === 1) {\n
+                ts = e.timeStamp;\n
+            } else if (keyCode === 18 && hashId === 3 && location === 2) {\n
+                var dt = -ts;\n
+                ts = e.timeStamp;\n
+                dt += ts;\n
+                if (dt < 3)\n
+                    pressedKeys.altGr = true;\n
+            }\n
+        }\n
+    }\n
+    \n
     if (keyCode in keys.MODIFIER_KEYS) {\n
         switch (keys.MODIFIER_KEYS[keyCode]) {\n
             case "Alt":\n
@@ -1495,19 +1499,28 @@ function normalizeCommandKeys(callback, e, keyCode) {\n
         keyCode = 0;\n
     }\n
 \n
-    if (!useragent.isMac && pressedKeys[91] || pressedKeys[92])\n
-        hashId |= 8;\n
-\n
-    if (hashId & 8 && (keyCode == 91 || keyCode == 93)) {\n
+    if (hashId & 8 && (keyCode === 91 || keyCode === 93)) {\n
         keyCode = 0;\n
     }\n
+    \n
+    if (!hashId && keyCode === 13) {\n
+        if (e.location || e.keyLocation === 3) {\n
+            callback(e, hashId, -keyCode)\n
+            if (e.defaultPrevented)\n
+                return;\n
+        }\n
+    }\n
     if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n
         return false;\n
     }\n
+    \n
+    \n
+    \n
     return callback(e, hashId, keyCode);\n
 }\n
 \n
-var pressedKeys = Object.create(null);\n
+var pressedKeys = null;\n
+var ts = 0;\n
 exports.addCommandKeyListener = function(el, callback) {\n
     var addListener = exports.addListener;\n
     if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) {\n
@@ -1539,9 +1552,12 @@ exports.addCommandKeyListener = function(el, callback) {\n
             pressedKeys[e.keyCode] = null;\n
         });\n
 \n
-        addListener(el, "focus", function(e) {\n
+        if (!pressedKeys) {\n
             pressedKeys = Object.create(null);\n
-        });\n
+            addListener(window, "focus", function(e) {\n
+                pressedKeys = Object.create(null);\n
+            });\n
+        }\n
     }\n
 };\n
 \n
@@ -1619,6 +1635,7 @@ var Keys = (function() {\n
             103: "Numpad7",\n
             104: "Numpad8",\n
             105: "Numpad9",\n
+            \'-13\': "NumpadEnter",\n
             112: "F1",\n
             113: "F2",\n
             114: "F3",\n
@@ -1773,6 +1790,20 @@ var Editor = function(renderer, session) {\n
     this.$search = new Search().set({\n
         wrap: true\n
     });\n
+\n
+    this.$historyTracker = this.$historyTracker.bind(this);\n
+    this.commands.on("exec", this.$historyTracker);\n
+\n
+    this.$initOperationListeners();\n
+    \n
+    this._$emitInputEvent = lang.delayedCall(function() {\n
+        this._signal("input", {});\n
+        this.session.bgTokenizer && this.session.bgTokenizer.scheduleStart();\n
+    }.bind(this));\n
+    \n
+    this.on("change", function(_, _self) {\n
+        _self._$emitInputEvent.schedule(31);\n
+    });\n
 \n
     this.setSession(session || new EditSession(""));\n
     config.resetOptions(this);\n
@@ -1782,6 +1813,114 @@ var Editor = function(renderer, session) {\n
 (function(){\n
 \n
     oop.implement(this, EventEmitter);\n
+\n
+    this.$initOperationListeners = function() {\n
+        function last(a) {return a[a.length - 1]};\n
+\n
+        this.selections = [];\n
+        this.commands.on("exec", function(e) {\n
+            this.startOperation(e);\n
+\n
+            var command = e.command;\n
+            if (command.group == "fileJump") {\n
+                var prev = this.prevOp;\n
+                if (!prev || prev.command.group != "fileJump") {\n
+                    this.lastFileJumpPos = last(this.selections)\n
+                }\n
+            } else {\n
+                this.lastFileJumpPos = null;\n
+            }\n
+        }.bind(this), true);\n
+\n
+        this.commands.on("afterExec", function(e) {\n
+            var command = e.command;\n
+\n
+            if (command.group == "fileJump") {\n
+                if (this.lastFileJumpPos && !this.curOp.selectionChanged) {\n
+                    this.selection.fromJSON(this.lastFileJumpPos);\n
+                    return\n
+                }\n
+            }\n
+            this.endOperation(e);\n
+        }.bind(this), true);\n
+\n
+        this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n
+\n
+        this.on("change", function() {\n
+            this.curOp || this.startOperation();\n
+            this.curOp.docChanged = true;\n
+        }.bind(this), true);\n
+\n
+        this.on("changeSelection", function() {\n
+            this.curOp || this.startOperation();\n
+            this.curOp.selectionChanged = true;\n
+        }.bind(this), true);\n
+    }\n
+\n
+    this.curOp = null;\n
+    this.prevOp = {};\n
+    this.startOperation = function(commadEvent) {\n
+        if (this.curOp) {\n
+            if (!commadEvent || this.curOp.command)\n
+                return;\n
+            this.prevOp = this.curOp;\n
+        }\n
+        if (!commadEvent) {\n
+            this.previousCommand = null;\n
+            commadEvent = {};\n
+        }\n
+\n
+        this.$opResetTimer.schedule();\n
+        this.curOp = {\n
+            command: commadEvent.command || {},\n
+            args: commadEvent.args\n
+        };\n
+\n
+        this.selections.push(this.selection.toJSON());\n
+    };\n
+\n
+    this.endOperation = function() {\n
+        if (this.curOp) {\n
+            this.prevOp = this.curOp;\n
+            this.curOp = null;\n
+        }\n
+    };\n
+\n
+    this.$historyTracker = function(e) {\n
+        if (!this.$mergeUndoDeltas)\n
+            return;\n
+\n
+\n
+        var prev = this.prevOp;\n
+        var mergeableCommands = ["backspace", "del", "insertstring"];\n
+        var shouldMerge = prev.command && (e.command.name == prev.command.name);\n
+        if (e.command.name == "insertstring") {\n
+            var text = e.args;\n
+            if (this.mergeNextCommand === undefined)\n
+                this.mergeNextCommand = true;\n
+\n
+            shouldMerge = shouldMerge\n
+                && this.mergeNextCommand // previous command allows to coalesce with\n
+                && (!/\\s/.test(text) || /\\s/.test(prev.args)) // previous insertion was of same type\n
+\n
+            this.mergeNextCommand = true;\n
+        } else {\n
+            shouldMerge = shouldMerge\n
+                && mergeableCommands.indexOf(e.command.name) !== -1// the command is mergeable\n
+        }\n
+\n
+        if (\n
+            this.$mergeUndoDeltas != "always"\n
+            && Date.now() - this.sequenceStartTime > 2000\n
+        ) {\n
+            shouldMerge = false; // the sequence is too long\n
+        }\n
+\n
+        if (shouldMerge)\n
+            this.session.mergeUndoDeltas = true;\n
+        else if (mergeableCommands.indexOf(e.command.name) !== -1)\n
+            this.sequenceStartTime = Date.now();\n
+    };\n
     this.setKeyboardHandler = function(keyboardHandler) {\n
         if (!keyboardHandler) {\n
             this.keyBinding.setKeyboardHandler(null);\n
@@ -1793,7 +1932,7 @@ var Editor = function(renderer, session) {\n
                     _self.keyBinding.setKeyboardHandler(module && module.handler);\n
             });\n
         } else {\n
-            delete this.$keybindingId;\n
+            this.$keybindingId = null;\n
             this.keyBinding.setKeyboardHandler(keyboardHandler);\n
         }\n
     };\n
@@ -2046,6 +2185,8 @@ var Editor = function(renderer, session) {\n
         if (this.$highlightActiveLine) {\n
             if ((this.$selectionStyle != "line" || !this.selection.isMultiLine()))\n
                 highlight = this.getCursorPosition();\n
+            if (this.renderer.$maxLines && this.session.getLength() === 1)\n
+                highlight = false;\n
         }\n
 \n
         if (session.$highlightLineMarker && !highlight) {\n
@@ -2153,13 +2294,12 @@ var Editor = function(renderer, session) {\n
         this.$updateHighlightActiveLine();\n
         this.renderer.updateFull();\n
     };\n
-\n
+    this.getSelectedText = function() {\n
+        return this.session.getTextRange(this.getSelectionRange());\n
+    };\n
     this.getCopyText = function() {\n
-        var text = "";\n
-        if (!this.selection.isEmpty())\n
-            text = this.session.getTextRange(this.getSelectionRange());\n
-\n
-        this._emit("copy", text);\n
+        var text = this.getSelectedText();\n
+        this._signal("copy", text);\n
         return text;\n
     };\n
     this.onCopy = function() {\n
@@ -2186,13 +2326,21 @@ var Editor = function(renderer, session) {\n
 \n
         if (this.getBehavioursEnabled()) {\n
             var transform = mode.transformAction(session.getState(cursor.row), \'insertion\', this, session, text);\n
-            if (transform)\n
+            if (transform) {\n
+                if (text !== transform.text) {\n
+                    this.session.mergeUndoDeltas = false;\n
+                    this.$mergeNextCommand = false;\n
+                }\n
                 text = transform.text;\n
-        }\n
 \n
-        text = text.replace("\\t", this.session.getTabString());\n
+            }\n
+        }\n
+        \n
+        if (text == "\\t")\n
+            text = this.session.getTabString();\n
         if (!this.selection.isEmpty()) {\n
-            cursor = this.session.remove(this.getSelectionRange());\n
+            var range = this.getSelectionRange();\n
+            cursor = this.session.remove(range);\n
             this.clearSelection();\n
         }\n
         else if (this.session.getOverwrite()) {\n
@@ -2201,6 +2349,13 @@ var Editor = function(renderer, session) {\n
             this.session.remove(range);\n
         }\n
 \n
+        if (text == "\\n" || text == "\\r\\n") {\n
+            var line = session.getLine(cursor.row)\n
+            if (cursor.column > line.search(/\\S|$/)) {\n
+                var d = line.substr(cursor.column).search(/\\S|$/);\n
+                session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n
+            }\n
+        }\n
         this.clearSelection();\n
 \n
         var start = cursor.column;\n
@@ -2222,41 +2377,11 @@ var Editor = function(renderer, session) {\n
                               transform.selection[3]));\n
             }\n
         }\n
+\n
         if (session.getDocument().isNewLine(text)) {\n
             var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n
 \n
-            this.moveCursorTo(cursor.row+1, 0);\n
-\n
-            var size = session.getTabSize();\n
-            var minIndent = Number.MAX_VALUE;\n
-\n
-            for (var row = cursor.row + 1; row <= end.row; ++row) {\n
-                var indent = 0;\n
-\n
-                line = session.getLine(row);\n
-                for (var i = 0; i < line.length; ++i)\n
-                    if (line.charAt(i) == \'\\t\')\n
-                        indent += size;\n
-                    else if (line.charAt(i) == \' \')\n
-                        indent += 1;\n
-                    else\n
-                        break;\n
-                if (/[^\\s]/.test(line))\n
-                    minIndent = Math.min(indent, minIndent);\n
-            }\n
-\n
-            for (var row = cursor.row + 1; row <= end.row; ++row) {\n
-                var outdent = minIndent;\n
-\n
-                line = session.getLine(row);\n
-                for (var i = 0; i < line.length && outdent > 0; ++i)\n
-                    if (line.charAt(i) == \'\\t\')\n
-                        outdent -= size;\n
-                    else if (line.charAt(i) == \' \')\n
-                        outdent -= 1;\n
-                session.remove(new Range(row, 0, row, i));\n
-            }\n
-            session.indentRows(cursor.row + 1, end.row, lineIndent);\n
+            session.insert({row: cursor.row+1, column: 0}, lineIndent);\n
         }\n
         if (shouldOutdent)\n
             mode.autoOutdent(lineState, session, cursor.row);\n
@@ -2395,6 +2520,16 @@ var Editor = function(renderer, session) {\n
             var session = this.session;\n
             var state = session.getState(range.start.row);\n
             var new_range = session.getMode().transformAction(state, \'deletion\', this, session, range);\n
+\n
+            if (range.end.column == 0) {\n
+                var text = session.getTextRange(range);\n
+                if (text[text.length - 1] == "\\n") {\n
+                    var line = session.getLine(range.end.row)\n
+                    if (/^\\s+$/.test(line)) {\n
+                        range.end.column = line.length\n
+                    }\n
+                }\n
+            }\n
             if (new_range)\n
                 range = new_range;\n
         }\n
@@ -2494,23 +2629,37 @@ var Editor = function(renderer, session) {\n
         var session = this.session;\n
         var range = this.getSelectionRange();\n
 \n
-        if (range.start.row < range.end.row || range.start.column < range.end.column) {\n
+        if (range.start.row < range.end.row) {\n
             var rows = this.$getSelectedRows();\n
             session.indentRows(rows.first, rows.last, "\\t");\n
+            return;\n
+        } else if (range.start.column < range.end.column) {\n
+            var text = session.getTextRange(range)\n
+            if (!/^\\s+$/.test(text)) {\n
+                var rows = this.$getSelectedRows();\n
+                session.indentRows(rows.first, rows.last, "\\t");\n
+                return;\n
+            }\n
+        }\n
+        \n
+        var line = session.getLine(range.start.row)\n
+        var position = range.start;\n
+        var size = session.getTabSize();\n
+        var column = session.documentToScreenColumn(position.row, position.column);\n
+\n
+        if (this.session.getUseSoftTabs()) {\n
+            var count = (size - column % size);\n
+            var indentString = lang.stringRepeat(" ", count);\n
         } else {\n
-            var indentString;\n
-\n
-            if (this.session.getUseSoftTabs()) {\n
-                var size        = session.getTabSize(),\n
-                    position    = this.getCursorPosition(),\n
-                    column      = session.documentToScreenColumn(position.row, position.column),\n
-                    count       = (size - column % size);\n
-\n
-                indentString = lang.stringRepeat(" ", count);\n
-            } else\n
-                indentString = "\\t";\n
-            return this.insert(indentString);\n
+            var count = column % size;\n
+            while (line[range.start.column] == " " && count) {\n
+                range.start.column--;\n
+                count--;\n
+            }\n
+            this.selection.setSelectionRange(range);\n
+            indentString = "\\t";\n
         }\n
+        return this.insert(indentString);\n
     };\n
     this.blockIndent = function() {\n
         var rows = this.$getSelectedRows();\n
@@ -2646,8 +2795,8 @@ var Editor = function(renderer, session) {\n
             return this.session.moveLinesUp(firstRow, lastRow);\n
         });\n
     };\n
-    this.moveText = function(range, toPosition) {\n
-        return this.session.moveText(range, toPosition);\n
+    this.moveText = function(range, toPosition, copy) {\n
+        return this.session.moveText(range, toPosition, copy);\n
     };\n
     this.copyLinesUp = function() {\n
         this.$moveLines(function(firstRow, lastRow) {\n
@@ -2710,30 +2859,7 @@ var Editor = function(renderer, session) {\n
     };\n
 \n
     this.onCompositionUpdate = function(text) {\n
-        this.renderer.setCompositionText(tex
-
-]]></string> </value>
-        </item>
-        <item>
-            <key> <string>next</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="3" aka="AAAAAAAAAAM=">
-    <pickle>
-      <global name="Pdata" module="OFS.Image"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value> <string encoding="cdata"><![CDATA[
-
-t);\n
+        this.renderer.setCompositionText(text);\n
     };\n
 \n
     this.onCompositionEnd = function() {\n
@@ -3165,7 +3291,10 @@ config.defineOptions(Editor.prototype, "editor", {\n
         initialValue: true\n
     },\n
     readOnly: {\n
-        set: function(readOnly) { this.$resetCursorStyle(); },\n
+        set: function(readOnly) {\n
+            this.textInput.setReadOnly(readOnly); \n
+            this.$resetCursorStyle(); \n
+        },\n
         initialValue: false\n
     },\n
     cursorStyle: {\n
@@ -3173,10 +3302,15 @@ config.defineOptions(Editor.prototype, "editor", {\n
         values: ["ace", "slim", "smooth", "wide"],\n
         initialValue: "ace"\n
     },\n
+    mergeUndoDeltas: {\n
+        values: [false, true, "always"],\n
+        initialValue: true\n
+    },\n
     behavioursEnabled: {initialValue: true},\n
     wrapBehavioursEnabled: {initialValue: true},\n
 \n
     hScrollBarAlwaysVisible: "renderer",\n
+    vScrollBarAlwaysVisible: "renderer",\n
     highlightGutterLine: "renderer",\n
     animatedScroll: "renderer",\n
     showInvisibles: "renderer",\n
@@ -3189,9 +3323,14 @@ config.defineOptions(Editor.prototype, "editor", {\n
     displayIndentGuides: "renderer",\n
     fontSize: "renderer",\n
     fontFamily: "renderer",\n
+    maxLines: "renderer",\n
+    minLines: "renderer",\n
+    scrollPastEnd: "renderer",\n
+    fixedWidthGutter: "renderer",\n
 \n
     scrollSpeed: "$mouseHandler",\n
     dragDelay: "$mouseHandler",\n
+    dragEnabled: "$mouseHandler",\n
     focusTimout: "$mouseHandler",\n
 \n
     firstLineNumber: "session",\n
@@ -3396,6 +3535,7 @@ var BROKEN_SETDATA = useragent.isChrome < 18;\n
 var TextInput = function(parentNode, host) {\n
     var text = dom.createElement("textarea");\n
     text.className = "ace_text-input";\n
+\n
     if (useragent.isTouchPad)\n
         text.setAttribute("x-palm-disable-auto-cap", true);\n
 \n
@@ -3404,7 +3544,7 @@ var TextInput = function(parentNode, host) {\n
     text.autocapitalize = "off";\n
     text.spellcheck = false;\n
 \n
-    text.style.bottom = "2000em";\n
+    text.style.opacity = "0";\n
     parentNode.insertBefore(text, parentNode.firstChild);\n
 \n
     var PLACEHOLDER = "\\x01\\x01";\n
@@ -3519,10 +3659,13 @@ var TextInput = function(parentNode, host) {\n
             if (inComposition && (!text.value || keytable[e.keyCode]))\n
                 setTimeout(onCompositionEnd, 0);\n
             if ((text.value.charCodeAt(0)||0) < 129) {\n
-                return;\n
+                return syncProperty.call();\n
             }\n
             inComposition ? onCompositionUpdate() : onCompositionStart();\n
         });\n
+        event.addListener(text, "keydown", function (e) {\n
+            syncProperty.schedule(50);\n
+        });\n
     }\n
 \n
     var onSelect = function(e) {\n
@@ -3553,17 +3696,17 @@ var TextInput = function(parentNode, host) {\n
             if (data)\n
                 host.onPaste(data);\n
             pasted = false;\n
-        } else if (data == PLACEHOLDER[0]) {\n
+        } else if (data == PLACEHOLDER.charAt(0)) {\n
             if (afterContextMenu)\n
                 host.execCommand("del", {source: "ace"});\n
         } else {\n
             if (data.substring(0, 2) == PLACEHOLDER)\n
                 data = data.substr(2);\n
-            else if (data[0] == PLACEHOLDER[0])\n
+            else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n
                 data = data.substr(1);\n
-            else if (data[data.length - 1] == PLACEHOLDER[0])\n
+            else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n
                 data = data.slice(0, -1);\n
-            if (data[data.length - 1] == PLACEHOLDER[0])\n
+            if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n
                 data = data.slice(0, -1);\n
             \n
             if (data)\n
@@ -3698,11 +3841,37 @@ var TextInput = function(parentNode, host) {\n
 \n
     var onCompositionUpdate = function() {\n
         if (!inComposition) return;\n
-        host.onCompositionUpdate(text.value);\n
+        var val = text.value.replace(/\\x01/g, "");\n
+        if (inComposition.lastValue === val) return;\n
+        \n
+        host.onCompositionUpdate(val);\n
         if (inComposition.lastValue)\n
             host.undo();\n
-        inComposition.lastValue = text.value.replace(/\\x01/g, "")\n
-        if (inComposition.lastValue) {\n
+        inComposition.lastValue = val;\n
+        if (inComposi
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+tion.lastValue) {\n
             var r = host.selection.getRange();\n
             host.insert(inComposition.lastValue);\n
             host.session.markUndoGroup();\n
@@ -3716,6 +3885,7 @@ var TextInput = function(parentNode, host) {\n
         var c = inComposition;\n
         inComposition = false;\n
         var timer = setTimeout(function() {\n
+            timer = null;\n
             var str = text.value.replace(/\\x01/g, "");\n
             if (inComposition)\n
                 return\n
@@ -3727,14 +3897,15 @@ var TextInput = function(parentNode, host) {\n
             }\n
         });\n
         inputHandler = function compositionInputHandler(str) {\n
-            clearTimeout(timer);\n
+            if (timer)\n
+                clearTimeout(timer);\n
             str = str.replace(/\\x01/g, "");\n
             if (str == c.lastValue)\n
                 return "";\n
-            if (c.lastValue)\n
+            if (c.lastValue && timer)\n
                 host.undo();\n
             return str;\n
-        }        \n
+        };\n
         host.onCompositionEnd();\n
         host.removeListener("mousedown", onCompositionEnd);\n
         if (e.type == "compositionend" && c.range) {\n
@@ -3747,7 +3918,12 @@ var TextInput = function(parentNode, host) {\n
     var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n
 \n
     event.addListener(text, "compositionstart", onCompositionStart);\n
-    event.addListener(text, useragent.isGecko ? "text" : "keyup", function(){syncComposition.schedule()});\n
+    if (useragent.isGecko) {\n
+        event.addListener(text, "text", function(){syncComposition.schedule()});\n
+    } else {\n
+        event.addListener(text, "keyup", function(){syncComposition.schedule()});\n
+        event.addListener(text, "keydown", function(){syncComposition.schedule()});\n
+    }\n
     event.addListener(text, "compositionend", onCompositionEnd);\n
 \n
     this.getElement = function() {\n
@@ -3766,7 +3942,7 @@ var TextInput = function(parentNode, host) {\n
         text.style.cssText = "z-index:100000;" + (useragent.isIE ? "opacity:0.1;" : "");\n
 \n
         resetSelection(host.selection.isEmpty());\n
-        host._emit("nativecontextmenu", {target: host});\n
+        host._emit("nativecontextmenu", {target: host, domEvent: e});\n
         var rect = host.container.getBoundingClientRect();\n
         var style = dom.computedStyle(host.container);\n
         var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n
@@ -3800,18 +3976,20 @@ var TextInput = function(parentNode, host) {\n
             }\n
         }, 0);\n
     }\n
-    if (!useragent.isGecko) {\n
-        event.addListener(text, "contextmenu", function(e) {\n
+    if (!useragent.isGecko || useragent.isMac) {\n
+        var onContextMenu = function(e) {\n
             host.textInput.onContextMenu(e);\n
             onContextMenuClose();\n
-        });\n
+        };\n
+        event.addListener(host.renderer.scroller, "contextmenu", onContextMenu);\n
+        event.addListener(text, "contextmenu", onContextMenu);\n
     }\n
 };\n
 \n
 exports.TextInput = TextInput;\n
 });\n
 \n
-define(\'ace/mouse/mouse_handler\', [\'require\', \'exports\', \'module\' , \'ace/lib/event\', \'ace/lib/useragent\', \'ace/mouse/default_handlers\', \'ace/mouse/default_gutter_handler\', \'ace/mouse/mouse_event\', \'ace/mouse/dragdrop\', \'ace/config\'], function(require, exports, module) {\n
+define(\'ace/mouse/mouse_handler\', [\'require\', \'exports\', \'module\' , \'ace/lib/event\', \'ace/lib/useragent\', \'ace/mouse/default_handlers\', \'ace/mouse/default_gutter_handler\', \'ace/mouse/mouse_event\', \'ace/mouse/dragdrop_handler\', \'ace/config\'], function(require, exports, module) {\n
 \n
 \n
 var event = require("../lib/event");\n
@@ -3819,7 +3997,7 @@ var useragent = require("../lib/useragent");\n
 var DefaultHandlers = require("./default_handlers").DefaultHandlers;\n
 var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler;\n
 var MouseEvent = require("./mouse_event").MouseEvent;\n
-var DragdropHandler = require("./dragdrop").DragdropHandler;\n
+var DragdropHandler = require("./dragdrop_handler").DragdropHandler;\n
 var config = require("../config");\n
 \n
 var MouseHandler = function(editor) {\n
@@ -3828,16 +4006,15 @@ var MouseHandler = function(editor) {\n
     new DefaultHandlers(this);\n
     new DefaultGutterHandler(this);\n
     new DragdropHandler(this);\n
-\n
-    event.addListener(editor.container, "mousedown", function(e) {\n
-        editor.focus();\n
-        return event.preventDefault(e);\n
-    });\n
 \n
     var mouseTarget = editor.renderer.getMouseEventTarget();\n
     event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"));\n
     event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"));\n
     event.addMultiMouseDownListener(mouseTarget, [300, 300, 250], this, "onMouseEvent");\n
+    if (editor.renderer.scrollBarV) {\n
+        event.addMultiMouseDownListener(editor.renderer.scrollBarV.inner, [300, 300, 250], this, "onMouseEvent");\n
+        event.addMultiMouseDownListener(editor.renderer.scrollBarH.inner, [300, 300, 250], this, "onMouseEvent");\n
+    }\n
     event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"));\n
 \n
     var gutterEl = editor.renderer.$gutter;\n
@@ -3845,6 +4022,15 @@ var MouseHandler = function(editor) {\n
     event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick"));\n
     event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"));\n
     event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"));\n
+\n
+    event.addListener(mouseTarget, "mousedown", function(e) {\n
+        editor.focus();\n
+    });\n
+\n
+    event.addListener(gutterEl, "mousedown", function(e) {\n
+        editor.focus();\n
+        return event.preventDefault(e);\n
+    });\n
 };\n
 \n
 (function() {\n
@@ -3873,13 +4059,10 @@ var MouseHandler = function(editor) {\n
         this.state = state;\n
     };\n
 \n
-    this.captureMouse = function(ev, state) {\n
-        if (state)\n
-            this.setState(state);\n
-\n
+    this.captureMouse = function(ev, mouseMoveHandler) {\n
         this.x = ev.x;\n
         this.y = ev.y;\n
-        \n
+\n
         this.isMousePressed = true;\n
         var renderer = this.editor.renderer;\n
         if (renderer.$keepTextAreaAtCursor)\n
@@ -3889,6 +4072,7 @@ var MouseHandler = function(editor) {\n
         var onMouseMove = function(e) {\n
             self.x = e.clientX;\n
             self.y = e.clientY;\n
+            mouseMoveHandler && mouseMoveHandler(e);\n
         };\n
 \n
         var onCaptureEnd = function(e) {\n
@@ -3901,15 +4085,15 @@ var MouseHandler = function(editor) {\n
                 renderer.$moveTextAreaToCursor();\n
             }\n
             self.isMousePressed = false;\n
-            self.onMouseEvent("mouseup", e)\n
+            self.onMouseEvent("mouseup", e);\n
         };\n
 \n
         var onCaptureInterval = function() {\n
             self[self.state] && self[self.state]();\n
         };\n
-        \n
+\n
         if (useragent.isOldIE && ev.domEvent.type == "dblclick") {\n
-            return setTimeout(function() {onCaptureEnd(ev.domEvent);});\n
+            return setTimeout(function() {onCaptureEnd(ev);});\n
         }\n
 \n
         event.capture(this.editor.container, onMouseMove, onCaptureEnd);\n
@@ -3920,6 +4104,7 @@ var MouseHandler = function(editor) {\n
 config.defineOptions(MouseHandler.prototype, "mouseHandler", {\n
     scrollSpeed: {initialValue: 2},\n
     dragDelay: {initialValue: 150},\n
+    dragEnabled: {initialValue: true},\n
     focusTimout: {initialValue: 0}\n
 });\n
 \n
@@ -3927,10 +4112,11 @@ config.defineOptions(MouseHandler.prototype, "mouseHandler", {\n
 exports.MouseHandler = MouseHandler;\n
 });\n
 \n
-define(\'ace/mouse/default_handlers\', [\'require\', \'exports\', \'module\' , \'ace/lib/dom\', \'ace/lib/useragent\'], function(require, exports, module) {\n
+define(\'ace/mouse/default_handlers\', [\'require\', \'exports\', \'module\' , \'ace/lib/dom\', \'ace/lib/event\', \'ace/lib/useragent\'], function(require, exports, module) {\n
 \n
 \n
 var dom = require("../lib/dom");\n
+var event = require("../lib/event");\n
 var useragent = require("../lib/useragent");\n
 \n
 var DRAG_OFFSET = 0; // pixels\n
@@ -3945,8 +4131,8 @@ function DefaultHandlers(mouseHandler) {\n
     editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler));\n
     editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler));\n
 \n
-    var exports = ["select", "startSelect", "drag", "dragEnd", "dragWait",\n
-        "dragWaitEnd", "startDrag", "focusWait"];\n
+    var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd",\n
+        "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"];\n
 \n
     exports.forEach(function(x) {\n
         mouseHandler[x] = this[x];\n
@@ -3979,9 +4165,10 @@ function DefaultHandlers(mouseHandler) {\n
         if (inSelection && !editor.isFocused()) {\n
             editor.focus();\n
             if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\n
+                this.mousedownEvent.time = (new Date()).getTime();\n
                 this.setState("focusWait");\n
                 this.captureMouse(ev);\n
-                return ev.preventDefault();\n
+                return;\n
             }\n
         }\n
 \n
@@ -3989,22 +4176,28 @@ function DefaultHandlers(mouseHandler) {\n
             this.startSelect(pos);\n
         } else if (inSelection) {\n
             this.mousedownEvent.time = (new Date()).getTime();\n
-            this.setState("dragWait");\n
+            this.startSelect(pos);\n
         }\n
-\n
         this.captureMouse(ev);\n
         return ev.preventDefault();\n
     };\n
 \n
     this.startSelect = function(pos) {\n
         pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n
-        if (this.mousedownEvent.getShiftKey()) {\n
-            this.editor.selection.selectToPosition(pos);\n
-        }\n
-        else if (!this.$clickSelection) {\n
-            this.editor.moveCursorToPosition(pos);\n
-            this.editor.selection.clearSelection();\n
+        var editor = this.editor;\n
+        setTimeout(function(){\n
+            if (this.mousedownEvent.getShiftKey()) {\n
+                editor.selection.selectToPosition(pos);\n
+            }\n
+            else if (!this.$clickSelection) {\n
+                editor.moveCursorToPosition(pos);\n
+                editor.selection.clearSelection();\n
+            }\n
+        }.bind(this), 0);\n
+        if (editor.renderer.scroller.setCapture) {\n
+            editor.renderer.scroller.setCapture();\n
         }\n
+        editor.setStyle("ace_selecting");\n
         this.setState("select");\n
     };\n
 \n
@@ -4063,32 +4256,14 @@ function DefaultHandlers(mouseHandler) {\n
         editor.renderer.scrollCursorIntoView();\n
     };\n
 \n
-    this.startDrag = function() {\n
-        var editor = this.editor;\n
-        this.setState("drag");\n
-        this.dragRange = editor.getSelectionRange();\n
-        var style = editor.getSelectionStyle();\n
-        this.dragSelectionMarker = editor.session.addMarker(this.dragRange, "ace_selection", style);\n
-        editor.clearSelection();\n
-        dom.addCssClass(editor.container, "ace_dragging");\n
-        if (!this.$dragKeybinding) {\n
-            this.$dragKeybinding = {\n
-                handleKeyboard: function(data, hashId, keyString, keyCode) {\n
-                    if (keyString == "esc")\n
-                        return {command: this.command};\n
-                },\n
-                command: {\n
-                    exec: function(editor) {\n
-                        var self = editor.$mouseHandler;\n
-                        self.dragCursor = null;\n
-                        self.dragEnd();\n
-                        self.startSelect();\n
-                    }\n
-                }\n
-            }\n
+    this.selectEnd =\n
+    this.selectAllEnd =\n
+    this.selectByWordsEnd =\n
+    this.selectByLinesEnd = function() {\n
+        this.editor.unsetStyle("ace_selecting");\n
+        if (this.editor.renderer.scroller.releaseCapture) {\n
+            this.editor.renderer.scroller.releaseCapture();\n
         }\n
-\n
-        editor.keyBinding.addKeyboardHandler(this.$dragKeybinding);\n
     };\n
 \n
     this.focusWait = function() {\n
@@ -4098,59 +4273,6 @@ function DefaultHandlers(mouseHandler) {\n
         if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n
             this.startSelect(this.mousedownEvent.getDocumentPosition());\n
     };\n
-\n
-    this.dragWait = function(e) {\n
-        var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n
-        var time = (new Date()).getTime();\n
-        var editor = this.editor;\n
-\n
-        if (distance > DRAG_OFFSET) {\n
-            this.startSelect(this.mousedownEvent.getDocumentPosition());\n
-        } else if (time - this.mousedownEvent.time > editor.$mouseHandler.$dragDelay) {\n
-            this.startDrag();\n
-        }\n
-    };\n
-\n
-    this.dragWaitEnd = function(e) {\n
-        this.mousedownEvent.domEvent = e;\n
-        this.startSelect();\n
-    };\n
-\n
-    this.drag = function() {\n
-        var editor = this.editor;\n
-        this.dragCursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n
-        editor.moveCursorToPosition(this.dragCursor);\n
-        editor.renderer.scrollCursorIntoView();\n
-    };\n
-\n
-    this.dragEnd = function(e) {\n
-        var editor = this.editor;\n
-        var dragCursor = this.dragCursor;\n
-        var dragRange = this.dragRange;\n
-        dom.removeCssClass(editor.container, "ace_dragging");\n
-        editor.session.removeMarker(this.dragSelectionMarker);\n
-        editor.keyBinding.removeKeyboardHandler(this.$dragKeybinding);\n
-\n
-        if (!dragCursor)\n
-            return;\n
-\n
-        editor.clearSelection();\n
-        if (e && (e.ctrlKey || e.altKey)) {\n
-            var session = editor.session;\n
-            var newRange = dragRange;\n
-            newRange.end = session.insert(dragCursor, session.getTextRange(dragRange));\n
-            newRange.start = dragCursor;\n
-        } else if (dragRange.contains(dragCursor.row, dragCursor.column)) {\n
-            return;\n
-        } else {\n
-            var newRange = editor.moveText(dragRange, dragCursor);\n
-        }\n
-\n
-        if (!newRange)\n
-            return;\n
-\n
-        editor.selection.setSelectionRange(newRange);\n
-    };\n
 \n
     this.onDoubleClick = function(ev) {\n
         var pos = ev.getDocumentPosition();\n
@@ -4185,7 +4307,7 @@ function DefaultHandlers(mouseHandler) {\n
 \n
         editor.selectAll();\n
         this.$clickSelection = editor.getSelectionRange();\n
-        this.setState("null");\n
+        this.setState("selectAll");\n
     };\n
 \n
     this.onMouseWheel = function(ev) {\n
@@ -4237,7 +4359,7 @@ function GutterHandler(mouseHandler) {\n
     var gutter = editor.renderer.$gutterLayer;\n
 \n
     mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) {\n
-        if (!editor.isFocused())\n
+        if (!editor.isFocused() || e.getButton() != 0)\n
             return;\n
         var gutterRegion = gutter.getRegion(e);\n
 \n
@@ -4256,7 +4378,8 @@ function GutterHandler(mouseHandler) {\n
             }\n
             mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n
         }\n
-        mouseHandler.captureMouse(e, "selectByLines");\n
+        mouseHandler.setState("selectByLines");\n
+        mouseHandler.captureMouse(e);\n
         return e.preventDefault();\n
     });\n
 \n
@@ -4311,11 +4434,12 @@ function GutterHandler(mouseHandler) {\n
         var rect = editor.renderer.$gutter.getBoundingClientRect();\n
         tooltip.style.left = e.x + 15 + "px";\n
         if (e.y + 3 * editor.renderer.lineHeight + 15 < rect.bottom) {\n
-            tooltip.style.bottom =  "";\n
+            tooltip.style.bottom = "";\n
             tooltip.style.top =  e.y + 15 + "px";\n
         } else {\n
-            tooltip.style.top =  "";\n
-            tooltip.style.bottom = rect.bottom - e.y + 5 + "px";\n
+            tooltip.style.top = "";\n
+            var innerHeight = window.innerHeight || document.documentElement.clientHeight;\n
+            tooltip.style.bottom = innerHeight - e.y + 5 + "px";\n
         }\n
     }\n
 \n
@@ -4349,7 +4473,8 @@ function GutterHandler(mouseHandler) {\n
             hideTooltip();\n
         }, 50);\n
     });\n
-\n
+    \n
+    editor.on("changeSession", hideTooltip);\n
 }\n
 \n
 exports.GutterHandler = GutterHandler;\n
@@ -4404,18 +4529,15 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n
             \n
         var editor = this.editor;\n
         \n
-        if (editor.getReadOnly()) {\n
+\n
+        var selectionRange = editor.getSelectionRange();\n
+        if (selectionRange.isEmpty())\n
             this.$inSelection = false;\n
-        }\n
         else {\n
-            var selectionRange = editor.getSelectionRange();\n
-            if (selectionRange.isEmpty())\n
-                this.$inSelection = false;\n
-            else {\n
-                var pos = this.getDocumentPosition();\n
-                this.$inSelection = selectionRange.contains(pos.row, pos.column);\n
-            }\n
+            var pos = this.getDocumentPosition();\n
+            this.$inSelection = selectionRange.contains(pos.row, pos.column);\n
         }\n
+\n
         return this.$inSelection;\n
     };\n
     this.getButton = function() {\n
@@ -4433,82 +4555,250 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n
 \n
 });\n
 \n
-define(\'ace/mouse/dragdrop\', [\'require\', \'exports\', \'module\' , \'ace/lib/event\'], function(require, exports, module) {\n
+define(\'ace/mouse/dragdrop_handler\', [\'require\', \'exports\', \'module\' , \'ace/lib/dom\', \'ace/lib/event\', \'ace/lib/useragent\'], function(require, exports, module) {\n
 \n
 \n
+var dom = require("../lib/dom");\n
 var event = require("../lib/event");\n
+var useragent = require("../lib/useragent");\n
+\n
+var AUTOSCROLL_DELAY = 200;\n
+var SCROLL_CURSOR_DELAY = 200;\n
+var SCROLL_CURSOR_HYSTERESIS = 5;\n
+\n
+function DragdropHandler(mouseHandler) {\n
 \n
-var DragdropHandler = function(mouseHandler) {\n
     var editor = mouseHandler.editor;\n
+\n
+    var blankImage = dom.createElement("img");\n
+    blankImage.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";\n
+    if (useragent.isOpera)\n
+        blankImage.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;";\n
+\n
+    var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"];\n
+\n
+     exports.forEach(function(x) {\n
+         mouseHandler[x] = this[x];\n
+    }, this);\n
+    editor.addEventListener("mousedown", this.onMouseDown.bind(mouseHandler));\n
+\n
+\n
+    var mouseTarget = editor.container;\n
     var dragSelectionMarker, x, y;\n
     var timerId, range;\n
     var dragCursor, counter = 0;\n
+    var dragOperation;\n
+    var isInternal;\n
+    var autoScrollStartTime;\n
+    var cursorMovedTime;\n
+    var cursorPointOnCaretMoved;\n
+\n
+    this.onDragStart = function(e) {\n
+        if (this.cancelDrag || !mouseTarget.draggable) {\n
+            var self = this;\n
+            setTimeout(function(){\n
+                self.startSelect();\n
+                self.captureMouse(e);\n
+            }, 0);\n
+            return e.preventDefault();\n
+        }\n
+        range = editor.getSelectionRange();\n
 \n
-    var mouseTarget = editor.container;\n
-    event.addListener(mouseTarget, "dragenter", function(e) {\n
-        if (editor.getReadOnly())\n
-            return;\n
-        var types = e.dataTransfer.types;\n
-        if (types && Array.prototype.indexOf.call(types, "text/plain") === -1)\n
+        var dataTransfer = e.dataTransfer;\n
+        dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove";\n
+        if (useragent.isOpera) {\n
+            editor.container.appendChild(blankImage);\n
+            blankImage._top = blankImage.offsetTop;\n
+        }\n
+        dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n
+        if (useragent.isOpera) {\n
+            editor.container.removeChild(blankImage);\n
+        }\n
+        dataTransfer.clearData();\n
+        dataTransfer.setData("Text", editor.session.getTextRange());\n
+\n
+        isInternal = true;\n
+        this.setState("drag");\n
+    };\n
+\n
+    this.onDragEnd = function(e) {\n
+        mouseTarget.draggable = false;\n
+        isInternal = false;\n
+        this.setState(null);\n
+        if (!editor.getReadOnly()) {\n
+            var dropEffect = e.dataTransfer.dropEffect;\n
+            if (!dragOperation && dropEffect == "move")\n
+                editor.session.remove(editor.getSelectionRange());\n
+            editor.renderer.$cursorLayer.setBlinking(true);\n
+        }\n
+        this.editor.unsetStyle("ace_dragging");\n
+    };\n
+\n
+    this.onDragEnter = function(e) {\n
+        if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n
             return;\n
         if (!dragSelectionMarker)\n
             addDragMarker();\n
         counter++;\n
+        e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n
         return event.preventDefault(e);\n
-    });\n
+    };\n
 \n
-    event.addListener(mouseTarget, "dragover", function(e) {\n
-        if (editor.getReadOnly())\n
-            return;\n
-        var types = e.dataTransfer.types;\n
-        if (types && Array.prototype.indexOf.call(types, "text/plain") === -1)\n
+    this.onDragOver = function(e) {\n
+        if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n
             return;\n
+        if (!dragSelectionMarker) {\n
+            addDragMarker();\n
+            counter++;\n
+        }\n
         if (onMouseMoveTimer !== null)\n
             onMouseMoveTimer = null;\n
         x = e.clientX;\n
         y = e.clientY;\n
-        return event.preventDefault(e);\n
-    });\n
 \n
-    var onDragInterval =  function() {\n
-        dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n
-        editor.moveCursorToPosition(dragCursor);\n
-        editor.renderer.scrollCursorIntoView();\n
+        e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n
+        return event.preventDefault(e);\n
     };\n
 \n
-    event.addListener(mouseTarget, "dragleave", function(e) {\n
+    this.onDragLeave = function(e) {\n
         counter--;\n
         if (counter <= 0 && dragSelectionMarker) {\n
             clearDragMarker();\n
+            dragOperation = null;\n
             return event.preventDefault(e);\n
         }\n
-    });\n
+    };\n
 \n
-    event.addListener(mouseTarget, "drop", function(e) {\n
+    this.onDrop = function(e) {\n
         if (!dragSelectionMarker)\n
             return;\n
-        range.end = editor.session.insert(dragCursor, e.dataTransfer.getData(\'Text\'));\n
-        range.start = dragCursor;\n
+        var dataTransfer = e.dataTransfer;\n
+        if (isInternal) {\n
+            switch (dragOperation) {\n
+                case "move":\n
+                    if (range.contains(dragCursor.row, dragCursor.column)) {\n
+                        range = {\n
+                            start: dragCursor,\n
+                            end: dragCursor\n
+                        };\n
+                    } else {\n
+                        range = editor.moveText(range, dragCursor);\n
+                    }\n
+                    break;\n
+                case "copy":\n
+                    range = editor.moveText(range, dragCursor, true);\n
+                    break;\n
+            }\n
+        } else {\n
+            var dropData = dataTransfer.getData(\'Text\');\n
+            range = {\n
+                start: dragCursor,\n
+                end: editor.session.insert(dragCursor, dropData)\n
+            };\n
+            editor.focus();\n
+            dragOperation = null;\n
+        }\n
         clearDragMarker();\n
-        editor.focus();\n
         return event.preventDefault(e);\n
-    });\n
+    };\n
+\n
+    event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler));\n
+    event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler));\n
+    event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler));\n
+    event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler));\n
+    event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler));\n
+    event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler));\n
+\n
+    function scrollCursorIntoView(cursor, prevCursor) {\n
+        var now = new Date().getTime();\n
+        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n
+        var hMovement = !prevCursor || cursor.column != prevCursor.column;\n
+        if (!cursorMovedTime || vMovement || hMovement) {\n
+            editor.$blockScrolling += 1;\n
+            editor.moveCursorToPosition(cursor);\n
+            editor.$blockScrolling -= 1;\n
+            cursorMovedTime = now;\n
+            cursorPointOnCaretMoved = {x: x, y: y};\n
+        } else {\n
+            var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n
+            if (distance > SCROLL_CURSOR_HYSTERESIS) {\n
+                cursorMovedTime = null;\n
+            } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n
+                editor.renderer.scrollCursorIntoView();\n
+                cursorMovedTime = null;\n
+            }\n
+        }\n
+    }\n
+\n
+    function autoScroll(cursor, prevCursor) {\n
+        var now = new Date().getTime();\n
+        var lineHeight = editor.renderer.layerConfig.lineHeight;\n
+        var characterWidth = editor.renderer.layerConfig.characterWidth;\n
+        var editorRect = editor.renderer.scroller.getBoundingClientRect();\n
+        var offsets = {\n
+           x: {\n
+               left: x - editorRect.left,\n
+               right: editorRect.right - x\n
+           },\n
+           y: {\n
+               top: y - editorRect.top,\n
+               bottom: editorRect.bottom - y\n
+           }\n
+        };\n
+        var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n
+        var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n
+        var scrollCursor = {row: cursor.row, column: cursor.column};\n
+        if (nearestXOffset / characterWidth <= 2) {\n
+            scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n
+        }\n
+        if (nearestYOffset / lineHeight <= 1) {\n
+            scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n
+        }\n
+        var vScroll = cursor.row != scrollCursor.row;\n
+        var hScroll = cursor.column != scrollCursor.column;\n
+        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n
+        if (vScroll || (hScroll && !vMovement)) {\n
+            if (!autoScrollStartTime)\n
+                autoScrollStartTime = now;\n
+            else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n
+                editor.renderer.scrollCursorIntoView(scrollCursor);\n
+        } else {\n
+            autoScrollStartTime = null;\n
+        }\n
+    }\n
+\n
+    function onDragInterval() {\n
+        var prevCursor = dragCursor;\n
+        dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n
+        scrollCursorIntoView(dragCursor, prevCursor);\n
+        autoScroll(dragCursor, prevCursor);\n
+    }\n
 \n
     function addDragMarker() {\n
         range = editor.selection.toOrientedRange();\n
         dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle());\n
         editor.clearSelection();\n
+        if (editor.isFocused())\n
+            editor.renderer.$cursorLayer.setBlinking(false);\n
         clearInterval(timerId);\n
         timerId = setInterval(onDragInterval, 20);\n
         counter = 0;\n
         event.addListener(document, "mousemove", onMouseMove);\n
     }\n
+\n
     function clearDragMarker() {\n
         clearInterval(timerId);\n
         editor.session.removeMarker(dragSelectionMarker);\n
         dragSelectionMarker = null;\n
+        editor.$blockScrolling += 1;\n
         editor.selection.fromOrientedRange(range);\n
+        editor.$blockScrolling -= 1;\n
+        if (editor.isFocused() && !isInternal)\n
+            editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n
+        range = null;\n
         counter = 0;\n
+        autoScrollStartTime = null;\n
+        cursorMovedTime = null;\n
         event.removeListener(document, "mousemove", onMouseMove);\n
     }\n
     var onMouseMoveTimer = null;\n
@@ -4520,9 +4810,120 @@ var DragdropHandler = function(mouseHandler) {\n
             }, 20);\n
         }\n
     }\n
-};\n
+\n
+    function canAccept(dataTransfer) {\n
+        var types = dataTransfer.types;\n
+        return !types || Array.prototype.some.call(types, function(type) {\n
+            return type == \'text/plain\' || type == \'Text\';\n
+        });\n
+    }\n
+\n
+    function getDropEffect(e) {\n
+        var copyAllowed = [\'copy\', \'copymove\', \'all\', \'uninitialized\'];\n
+        var moveAllowed = [\'move\', \'copymove\', \'linkmove\', \'all\', \'uninitialized\'];\n
+\n
+        var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n
+        var effectAllowed = "uninitialized";\n
+        try {\n
+            effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n
+        } catch (e) {}\n
+        var dropEffect = "none";\n
+\n
+        if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n
+            dropEffect = "copy";\n
+        else if (moveAllowed.indexOf(effectAllowed) >= 0)\n
+            dropEffect = "move";\n
+        else if (copyAllowed.indexOf(effectAllowed) >= 0)\n
+            dropEffect = "copy";\n
+\n
+        return dropEffect;\n
+    }\n
+}\n
+\n
+(function() {\n
+\n
+    this.dragWait = function() {\n
+        var interval = (new Date()).getTime() - this.mousedownEvent.time;\n
+        if (interval > this.editor.getDragDelay())\n
+            this.startDrag();\n
+    };\n
+\n
+    this.dragWaitEnd = function() {\n
+        var target = this.editor.container;\n
+        target.draggable = false;\n
+        this.startSelect(this.mousedownEvent.getDocumentPosition());\n
+        this.selectEnd();\n
+    };\n
+\n
+    this.dragReadyEnd = function(e) {\n
+        this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n
+        this.editor.unsetStyle("ace_dragging");\n
+        this.dragWaitEnd();\n
+    };\n
+\n
+    this.startDrag = function(){\n
+        this.cancelDrag = false;\n
+        var target = this.editor.container;\n
+        target.draggable = true;\n
+        this.editor.renderer.$cursorLayer.setBlinking(false);\n
+        this.editor.setStyle("ace_dragging");\n
+        this.setState("dragReady");\n
+    };\n
+\n
+    this.onMouseDrag = function(e) {\n
+        var target = this.editor.container;\n
+        if (useragent.isIE && this.state == "dragReady") {\n
+            var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n
+            if (distance > 3)\n
+                target.dragDrop();\n
+        }\n
+        if (this.state === "dragWait") {\n
+            var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n
+            if (distance > 0) {\n
+                target.draggable = false;\n
+                this.startSelect(this.mousedownEvent.getDocumentPosition());\n
+            }\n
+        }\n
+    };\n
+\n
+    this.onMouseDown = function(e) {\n
+        if (!this.$dragEnabled)\n
+            return;\n
+        this.mousedownEvent = e;\n
+        var editor = this.editor;\n
+\n
+        var inSelection = e.inSelection();\n
+        var button = e.getButton();\n
+        var clickCount = e.domEvent.detail || 1;\n
+        if (clickCount === 1 && button === 0 && inSelection) {\n
+            this.mousedownEvent.time = (new Date()).getTime();\n
+            var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n
+            if ("unselectable" in eventTarget)\n
+                eventTarget.unselectable = "on";\n
+            if (editor.getDragDelay()) {\n
+                if (useragent.isWebKit) {\n
+                    self.cancelDrag = true;\n
+                    var mouseTarget = editor.container;\n
+                    mouseTarget.draggable = true;\n
+                }\n
+                this.setState("dragWait");\n
+            } else {\n
+                this.startDrag();\n
+            }\n
+            this.captureMouse(e, this.onMouseDrag.bind(this));\n
+            e.defaultPrevented = true;\n
+        }\n
+    };\n
+\n
+}).call(DragdropHandler.prototype);\n
+\n
+\n
+function calcDistance(ax, ay, bx, by) {\n
+    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n
+}\n
 \n
 exports.DragdropHandler = DragdropHandler;\n
+\n
 });\n
 \n
 define(\'ace/config\', [\'require\', \'exports\', \'module\' , \'ace/lib/lang\', \'ace/lib/oop\', \'ace/lib/net\', \'ace/lib/event_emitter\'], function(require, exports, module) {\n
@@ -4572,16 +4973,24 @@ exports.moduleUrl = function(name, component) {\n
 \n
     var parts = name.split("/");\n
     component = component || parts[parts.length - 2] || "";\n
-    var base = parts[parts.length - 1].replace(component, "").replace(/(^[\\-_])|([\\-_]$)/, "");\n
+    var sep = component == "snippets" ? "/" : "-";\n
+    var base = parts[parts.length - 1];    \n
+    if (sep == "-") {\n
+        var re = new RegExp("^" + component + "[\\\\-_]|[\\\\-_]" + component + "$", "g");\n
+        base = base.replace(re, "");\n
+    }\n
 \n
-    if (!base && parts.length > 1)\n
+    if ((!base || base == component) && parts.length > 1)\n
         base = parts[parts.length - 2];\n
     var path = options[component + "Path"];\n
-    if (path == null)\n
+    if (path == null) {\n
         path = options.basePath;\n
+    } else if (sep == "/") {\n
+        component = sep = "";\n
+    }\n
     if (path && path.slice(-1) != "/")\n
         path += "/";\n
-    return path + component + "-" + base + this.get("suffix");\n
+    return path + component + sep + base + this.get("suffix");\n
 };\n
 \n
 exports.setModuleUrl = function(name, subst) {\n
@@ -4598,7 +5007,7 @@ exports.loadModule = function(moduleName, onLoad) {\n
 \n
     try {\n
         module = require(moduleName);\n
-    } catch (e) {};\n
+    } catch (e) {}\n
     if (module && !exports.$loading[moduleName])\n
         return onLoad && onLoad(module);\n
 \n
@@ -4698,8 +5107,11 @@ var optionsProvider = {\n
         if (this["$" + name] === value)\n
             return;\n
         var opt = this.$options[name];\n
-        if (!opt)\n
+        if (!opt) {\n
+            if (typeof console != "undefined" && console.warn)\n
+                console.warn(\'misspelled option "\' + name + \'"\');\n
             return undefined;\n
+        }\n
         if (opt.forwardTo)\n
             return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value);\n
 \n
@@ -4710,8 +5122,11 @@ var optionsProvider = {\n
     },\n
     getOption: function(name) {\n
         var opt = this.$options[name];\n
-        if (!opt)\n
+        if (!opt) {\n
+            if (typeof console != "undefined" && console.warn)\n
+                console.warn(\'misspelled option "\' + name + \'"\');\n
             return undefined;\n
+        }\n
         if (opt.forwardTo)\n
             return this[opt.forwardTo] && this[opt.forwardTo].getOption(name);\n
         return opt && opt.get ? opt.get.call(this) : this["$" + name];\n
@@ -4750,7 +5165,7 @@ exports.setDefaultValue = function(path, name, value) {\n
     var opts = defaultOptions[path] || (defaultOptions[path] = {});\n
     if (opts[name]) {\n
         if (opts.forwardTo)\n
-            exports.setDefaultValue(opts.forwardTo, name, value)\n
+            exports.setDefaultValue(opts.forwardTo, name, value);\n
         else\n
             opts[name].value = value;\n
     }\n
@@ -4809,30 +5224,7 @@ EventEmitter._dispatchEvent = function(eventName, e) {\n
     this._defaultHandlers || (this._defaultHandlers = {});\n
 \n
     var listeners = this._eventRegistry[eventName] || [];\n
-    var defaultHand
-
-]]></string> </value>
-        </item>
-        <item>
-            <key> <string>next</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="4" aka="AAAAAAAAAAQ=">
-    <pickle>
-      <global name="Pdata" module="OFS.Image"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value> <string encoding="cdata"><![CDATA[
-
-ler = this._defaultHandlers[eventName];\n
+    var defaultHandler = this._defaultHandlers[eventName];\n
     if (!listeners.length && !defaultHandler)\n
         return;\n
 \n
@@ -4846,6 +5238,7 @@ ler = this._defaultHandlers[eventName];\n
     if (!e.preventDefault)\n
         e.preventDefault = preventDefault;\n
 \n
+    listeners = listeners.slice();\n
     for (var i=0; i<listeners.length; i++) {\n
         listeners[i](e, this);\n
         if (e.propagationStopped)\n
@@ -4861,7 +5254,7 @@ EventEmitter._signal = function(eventName, e) {\n
     var listeners = (this._eventRegistry || {})[eventName];\n
     if (!listeners)\n
         return;\n
-\n
+    listeners = listeners.slice();\n
     for (var i=0; i<listeners.length; i++)\n
         listeners[i](e, this);\n
 };\n
@@ -5083,8 +5476,11 @@ var KeyBinding = function(editor) {\n
             } else {\n
                 success = commands.exec(toExecute.command, this.$editor, toExecute.args, e);                \n
             }\n
-            if (success && e && hashId != -1 && toExecute.passEvent != true)\n
+            if (success && e && hashId != -1 && \n
+                toExecute.passEvent != true && toExecute.command.passEvent != true\n
+            ) {\n
                 event.stopEvent(e);\n
+            }\n
             if (success)\n
                 break;\n
         }\n
@@ -5313,10 +5709,11 @@ var EditSession = function(text, mode) {\n
                 if (self.$deltas.length > 0) {\n
                     undoManager.execute({\n
                         action: "aceupdate",\n
-                        args: [self.$deltas, self]\n
+                        args: [self.$deltas, self],\n
+                        merge: self.mergeUndoDeltas\n
                     });\n
                 }\n
-\n
+                self.mergeUndoDeltas = false;\n
                 self.$deltas = [];\n
             }\n
             this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n
@@ -5346,7 +5743,7 @@ var EditSession = function(text, mode) {\n
         this.setOption("useSoftTabs", val);\n
     };\n
     this.getUseSoftTabs = function() {\n
-         return this.$useSoftTabs;\n
+        return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n
     };\n
     this.setTabSize = function(tabSize) {\n
         this.setOption("tabSize", tabSize)\n
@@ -5487,7 +5884,30 @@ var EditSession = function(text, mode) {\n
     };\n
     this.clearAnnotations = function() {\n
         this.setAnnotations([]);\n
-    };\n
+  
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+  };\n
     this.$detectNewLine = function(text) {\n
         var match = text.match(/^.*?(\\r?\\n)/m);\n
         if (match) {\n
@@ -5555,7 +5975,7 @@ var EditSession = function(text, mode) {\n
     this.$modes = {};\n
     this.$mode = null;\n
     this.$modeId = null;\n
-    this.setMode = function(mode) {\n
+    this.setMode = function(mode, cb) {\n
         if (mode && typeof mode === "object") {\n
             if (mode.getTokenizer)\n
                 return this.$onChangeMode(mode);\n
@@ -5567,12 +5987,15 @@ var EditSession = function(text, mode) {\n
         if (!this.$modes["ace/mode/text"])\n
             this.$modes["ace/mode/text"] = new TextMode();\n
 \n
-        if (this.$modes[path] && !options)\n
-            return this.$onChangeMode(this.$modes[path]);\n
+        if (this.$modes[path] && !options) {\n
+            this.$onChangeMode(this.$modes[path]);\n
+            cb && cb();\n
+            return;\n
+        }\n
         this.$modeId = path;\n
         config.loadModule(["mode", path], function(m) {\n
             if (this.$modeId !== path)\n
-                return;\n
+                return cb && cb();\n
             if (this.$modes[path] && !options)\n
                 return this.$onChangeMode(this.$modes[path]);\n
             if (m && m.Mode) {\n
@@ -5581,7 +6004,8 @@ var EditSession = function(text, mode) {\n
                     this.$modes[path] = m;\n
                     m.$id = path;\n
                 }\n
-                this.$onChangeMode(m)\n
+                this.$onChangeMode(m);\n
+                cb && cb();\n
             }\n
         }.bind(this));\n
         if (!this.$mode)\n
@@ -5589,7 +6013,11 @@ var EditSession = function(text, mode) {\n
     };\n
 \n
     this.$onChangeMode = function(mode, $isPlaceholder) {\n
-        if (this.$mode === mode) return;\n
+        if (!$isPlaceholder)\n
+            this.$modeId = mode.$id;\n
+        if (this.$mode === mode) \n
+            return;\n
+\n
         this.$mode = mode;\n
 \n
         this.$stopWorker();\n
@@ -5619,9 +6047,9 @@ var EditSession = function(text, mode) {\n
         this.tokenRe = mode.tokenRe;\n
         this.nonTokenRe = mode.nonTokenRe;\n
 \n
-\n
+        this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n
+        \n
         if (!$isPlaceholder) {\n
-            this.$modeId = mode.$id;\n
             this.$setFolding(mode.foldingRules);\n
             this._emit("changeMode");\n
             this.bgTokenizer.start(0);\n
@@ -5655,7 +6083,6 @@ var EditSession = function(text, mode) {\n
 \n
     this.$scrollTop = 0;\n
     this.setScrollTop = function(scrollTop) {\n
-        scrollTop = Math.round(Math.max(0, scrollTop));\n
         if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n
             return;\n
 \n
@@ -5668,7 +6095,6 @@ var EditSession = function(text, mode) {\n
 \n
     this.$scrollLeft = 0;\n
     this.setScrollLeft = function(scrollLeft) {\n
-        scrollLeft = Math.round(Math.max(0, scrollLeft));\n
         if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n
             return;\n
 \n
@@ -5795,7 +6221,7 @@ var EditSession = function(text, mode) {\n
         var range, point;\n
         var lastDeltaIsInsert = false;\n
         if (isInsert(delta)) {\n
-            range = delta.range.clone();\n
+            range = Range.fromPoints(delta.range.start, delta.range.end);\n
             lastDeltaIsInsert = true;\n
         } else {\n
             range = Range.fromPoints(delta.range.start, delta.range.start);\n
@@ -5824,6 +6250,11 @@ var EditSession = function(text, mode) {\n
             }\n
         }\n
         if (lastUndoRange != null) {\n
+            if (Range.comparePoints(lastUndoRange.start, range.start) == 0) {\n
+                lastUndoRange.start.column += range.end.column - range.start.column;\n
+                lastUndoRange.end.column += range.end.column - range.start.column;\n
+            }\n
+\n
             var cmp = lastUndoRange.compareRange(range);\n
             if (cmp == 1) {\n
                 range.setStart(lastUndoRange.start);\n
@@ -5858,7 +6289,7 @@ var EditSession = function(text, mode) {\n
             }\n
         }\n
 \n
-        this.insert(toRange.start, text);\n
+        toRange.end = this.insert(toRange.start, text);\n
         if (folds.length) {\n
             var oldStart = fromRange.start;\n
             var newStart = toRange.start;\n
@@ -6034,8 +6465,10 @@ var EditSession = function(text, mode) {\n
     };\n
     this.setWrapLimitRange = function(min, max) {\n
         if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n
-            this.$wrapLimitRange.min = min;\n
-            this.$wrapLimitRange.max = max;\n
+            this.$wrapLimitRange = {\n
+                min: min,\n
+                max: max\n
+            };\n
             this.$modified = true;\n
             this._emit("changeWrapMode");\n
         }\n
@@ -6213,7 +6646,7 @@ var EditSession = function(text, mode) {\n
         while (row <= lastRow) {\n
             foldLine = this.getFoldLine(row, foldLine);\n
             if (!foldLine) {\n
-                tokens = this.$getDisplayTokens(lang.stringTrimRight(lines[row]));\n
+                tokens = this.$getDisplayTokens(lines[row]);\n
                 wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n
                 row ++;\n
             } else {\n
@@ -6237,8 +6670,6 @@ var EditSession = function(text, mode) {\n
                     foldLine.end.row,\n
                     lines[foldLine.end.row].length + 1\n
                 );\n
-                while (tokens.length != 0 && tokens[tokens.length - 1] >= SPACE)\n
-                    tokens.pop();\n
 \n
                 wrapData[foldLine.start.row]\n
                     = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n
@@ -6264,6 +6695,8 @@ var EditSession = function(text, mode) {\n
         var splits = [];\n
         var displayLength = tokens.length;\n
         var lastSplit = 0, lastDocSplit = 0;\n
+\n
+        var isCode = this.$wrapAsCode;\n
 \n
         function addSplit(screenPos) {\n
             var displayed = tokens.slice(lastSplit, screenPos);\n
@@ -6283,16 +6716,11 @@ var EditSession = function(text, mode) {\n
 \n
         while (displayLength - lastSplit > wrapLimit) {\n
             var split = lastSplit + wrapLimit;\n
-            if (tokens[split] >= SPACE) {\n
-                while (tokens[split] >= SPACE) {\n
-                    split ++;\n
-                }\n
+            if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n
                 addSplit(split);\n
                 continue;\n
             }\n
-            if (tokens[split] == PLACEHOLDER_START\n
-                || tokens[split] == PLACEHOLDER_BODY)\n
-            {\n
+            if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n
                 for (split; split != lastSplit - 1; split--) {\n
                     if (tokens[split] == PLACEHOLDER_START) {\n
                         break;\n
@@ -6304,8 +6732,7 @@ var EditSession = function(text, mode) {\n
                 }\n
                 split = lastSplit + wrapLimit;\n
                 for (split; split < tokens.length; split++) {\n
-                    if (tokens[split] != PLACEHOLDER_BODY)\n
-                    {\n
+                    if (tokens[split] != PLACEHOLDER_BODY) {\n
                         break;\n
                     }\n
                 }\n
@@ -6315,12 +6742,21 @@ var EditSession = function(text, mode) {\n
                 addSplit(split);\n
                 continue;\n
             }\n
-            var minSplit = Math.max(split - 10, lastSplit - 1);\n
+            var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1);\n
             while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n
                 split --;\n
             }\n
-            while (split > minSplit && tokens[split] == PUNCTUATION) {\n
-                split --;\n
+            if (isCode) {\n
+                while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n
+                    split --;\n
+                }\n
+                while (split > minSplit && tokens[split] == PUNCTUATION) {\n
+                    split --;\n
+                }\n
+            } else {\n
+                while (split > minSplit && tokens[split] < SPACE) {\n
+                    split --;\n
+                }\n
             }\n
             if (split > minSplit) {\n
                 addSplit(++split);\n
@@ -6686,6 +7122,15 @@ config.defineOptions(EditSession.prototype, "session", {\n
             return this.getUseWrapMode() ? this.getWrapLimitRange().min || "free" : "off";\n
         },\n
         handlesSet: true\n
+    },    \n
+    wrapMethod: {\n
+        set: function(val) {\n
+            if (val == "auto")\n
+                this.$wrapAsCode = this.$mode.type != "text";\n
+            else\n
+                this.$wrapAsCode = val != "text";\n
+        },\n
+        initialValue: "auto"\n
     },\n
     firstLineNumber: {\n
         set: function() {this._emit("changeBreakpoint");},\n
@@ -6853,36 +7298,15 @@ var Selection = function(session) {\n
             this.setSelectionAnchor(range.start.row, range.start.column);\n
             this.selectTo(range.end.row, range.end.column);\n
         }\n
+        if (this.getRange().isEmpty())\n
+            this.$isEmpty = true;\n
         this.$desiredColumn = null;\n
     };\n
 \n
     this.$moveSelection = function(mover) {\n
         var lead = this.lead;\n
         if (this.$isEmpty)\n
-            this.setSelectionAnchor(lead.r
-
-]]></string> </value>
-        </item>
-        <item>
-            <key> <string>next</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="5" aka="AAAAAAAAAAU=">
-    <pickle>
-      <global name="Pdata" module="OFS.Image"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value> <string encoding="cdata"><![CDATA[
-
-ow, lead.column);\n
+            this.setSelectionAnchor(lead.row, lead.column);\n
 \n
         mover.call(this);\n
     };\n
@@ -6954,7 +7378,7 @@ ow, lead.column);\n
         } else {\n
             rowEnd = rowStart;\n
         }\n
-        if (excludeLastChar)\n
+        if (excludeLastChar === true)\n
             return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n
         else\n
             return new Range(rowStart, 0, rowEnd + 1, 0);\n
@@ -7127,7 +7551,7 @@ ow, lead.column);\n
             while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n
                 index ++;\n
 \n
-            if (index <= 1) {\n
+            if (index < 1) {\n
                 tokenRe.lastIndex = 0;\n
                  while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n
                     tokenRe.lastIndex = 0;\n
@@ -7163,11 +7587,11 @@ ow, lead.column);\n
 \n
         if (column == line.length) {\n
             var l = this.doc.getLength();\n
-            do {    \n
+            do {\n
                 row++;\n
                 rightOfCursor = this.doc.getLine(row)\n
             } while (row < l && /^\\s*$/.test(rightOfCursor))\n
-            \n
+\n
             if (!/^\\s+/.test(rightOfCursor))\n
                 rightOfCursor = ""\n
             column = 0;\n
@@ -7188,11 +7612,11 @@ ow, lead.column);\n
 \n
         var line = this.session.getLine(row).substring(0, column);\n
         if (column == 0) {\n
-            do {    \n
+            do {\n
                 row--;\n
                 line = this.doc.getLine(row);\n
             } while (row > 0 && /^\\s*$/.test(line))\n
-            \n
+\n
             column = line.length;\n
             if (!/\\s+$/.test(line))\n
                 line = ""\n
@@ -7280,6 +7704,52 @@ ow, lead.column);\n
         range.desiredColumn = this.$desiredColumn;\n
         return range;\n
     }\n
+\n
+    this.toJSON = function() {\n
+        if (this.rangeCount) {\n
+            var data = this.ranges.map(function(r) {\n
+                var r1 = r.clone();\n
+                r1.isBackwards = r.cursor == r.start;\n
+                return r1;\n
+            });\n
+        } else {\n
+            var data = this.getRange();\n
+            data.isBackwards = this.isBackwards();\n
+        }\n
+        return data;\n
+    };\n
+\n
+    this.fromJSON = function(data) {\n
+        if (data.start == undefined) {\n
+            if (this.rangeList) {\n
+                this.toSingleRange(data[0]);\n
+                for (var i = data.length; i--; ) {\n
+                    var r = Range.fromPoints(data[i].start, data[i].end);\n
+                    if (data.isBackwards)\n
+                        r.cursor = r.start;\n
+                    this.addRange(r, true);\n
+                }\n
+                return;\n
+            } else\n
+                data = data[0];\n
+        }\n
+        if (this.rangeList)\n
+            this.toSingleRange(data);\n
+        this.setSelectionRange(data, data.isBackwards);\n
+    };\n
+\n
+    this.isEqual = function(data) {\n
+        if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n
+            return false;\n
+        if (!data.length || !this.ranges)\n
+            return this.getRange().isEqual(data);\n
+\n
+        for (var i = this.ranges.length; i--; ) {\n
+            if (!this.ranges[i].isEqual(data[i]))\n
+                return false\n
+        }\n
+        return true;\n
+    }\n
 \n
 }).call(Selection.prototype);\n
 \n
@@ -7402,7 +7872,30 @@ var Range = function(startRow, startColumn, endRow, endColumn) {\n
     };\n
     this.insideEnd = function(row, column) {\n
         if (this.compare(row, column) == 0) {\n
-            if (this.isStart(row, column)) {\n
+            if (this.isStart(
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+row, column)) {\n
                 return false;\n
             } else {\n
                 return true;\n
@@ -7537,7 +8030,7 @@ var TokenIterator = require("../token_iterator").TokenIterator;\n
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new TextHighlightRules().getRules());\n
+    this.HighlightRules = TextHighlightRules;\n
     this.$behaviour = new Behaviour();\n
 };\n
 \n
@@ -7558,6 +8051,10 @@ var Mode = function() {\n
     );\n
 \n
     this.getTokenizer = function() {\n
+        if (!this.$tokenizer) {\n
+            this.$highlightRules = new this.HighlightRules();\n
+            this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n
+        }\n
         return this.$tokenizer;\n
     };\n
 \n
@@ -7767,17 +8264,16 @@ var Mode = function() {\n
     };\n
 \n
     this.createModeDelegates = function (mapping) {\n
-        if (!this.$embeds) {\n
-            return;\n
-        }\n
+        this.$embeds = [];\n
         this.$modes = {};\n
-        for (var i = 0; i < this.$embeds.length; i++) {\n
-            if (mapping[this.$embeds[i]]) {\n
-                this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]]();\n
+        for (var i in mapping) {\n
+            if (mapping[i]) {\n
+                this.$embeds.push(i);\n
+                this.$modes[i] = new mapping[i]();\n
             }\n
         }\n
 \n
-        var delegations = [\'toggleCommentLines\', \'getNextLineIndent\', \'checkOutdent\', \'autoOutdent\', \'transformAction\'];\n
+        var delegations = [\'toggleCommentLines\', \'getNextLineIndent\', \'checkOutdent\', \'autoOutdent\', \'transformAction\', \'getCompletions\'];\n
 \n
         for (var i = 0; i < delegations.length; i++) {\n
             (function(scope) {\n
@@ -7821,6 +8317,52 @@ var Mode = function() {\n
             }\n
         }\n
     };\n
+    \n
+    this.getKeywords = function(append) {\n
+        if (!this.completionKeywords) {\n
+            var rules = this.$tokenizer.rules;\n
+            var completionKeywords = [];\n
+            for (var rule in rules) {\n
+                var ruleItr = rules[rule];\n
+                for (var r = 0, l = ruleItr.length; r < l; r++) {\n
+                    if (typeof ruleItr[r].token === "string") {\n
+                        if (/keyword|support|storage/.test(ruleItr[r].token))\n
+                            completionKeywords.push(ruleItr[r].regex);\n
+                    }\n
+                    else if (typeof ruleItr[r].token === "object") {\n
+                        for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) {    \n
+                            if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n
+                                var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n
+                                completionKeywords.push(rule.substr(1, rule.length - 2));\n
+                            }\n
+                        }\n
+                    }\n
+                }\n
+            }\n
+            this.completionKeywords = completionKeywords;\n
+        }\n
+        if (!append)\n
+            return this.$keywordList;\n
+        return completionKeywords.concat(this.$keywordList || []);\n
+    };\n
+    \n
+    this.$createKeywordList = function() {\n
+        if (!this.$highlightRules)\n
+            this.getTokenizer();\n
+        return this.$keywordList = this.$highlightRules.$keywordList || [];\n
+    }\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var keywords = this.$keywordList || this.$createKeywordList();\n
+        return keywords.map(function(word) {\n
+            return {\n
+                name: word,\n
+                value: word,\n
+                score: 0,\n
+                meta: "keyword"\n
+            };\n
+        });\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -7905,6 +8447,10 @@ var Tokenizer = function(rules) {\n
 };\n
 \n
 (function() {\n
+    this.$setMaxTokenCount = function(m) {\n
+        MAX_TOKEN_COUNT = m | 0;\n
+    };\n
+    \n
     this.$applyToken = function(str) {\n
         var values = this.splitRegex.exec(str).slice(1);\n
         var types = this.token.apply(this, values);\n
@@ -8119,15 +8665,23 @@ var TextHighlightRules = function() {\n
 (function() {\n
 \n
     this.addRules = function(rules, prefix) {\n
+        if (!prefix) {\n
+            for (var key in rules)\n
+                this.$rules[key] = rules[key];\n
+            return;\n
+        }\n
         for (var key in rules) {\n
             var state = rules[key];\n
             for (var i = 0; i < state.length; i++) {\n
                 var rule = state[i];\n
                 if (rule.next) {\n
-                    if (typeof rule.next != "string")\n
-                        rule.nextState = prefix + rule.nextState;\n
-                    else\n
-                        rule.next = prefix + rule.next;\n
+                    if (typeof rule.next != "string") {\n
+                        if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n
+                            rule.nextState = prefix + rule.nextState;\n
+                    } else {\n
+                        if (rule.next.indexOf(prefix) !== 0)\n
+                            rule.next = prefix + rule.next;\n
+                    }\n
 \n
                 }\n
             }\n
@@ -8161,7 +8715,7 @@ var TextHighlightRules = function() {\n
         if (!this.$embeds)\n
             this.$embeds = [];\n
         this.$embeds.push(prefix);\n
-    }\n
+    };\n
 \n
     this.getEmbeds = function() {\n
         return this.$embeds;\n
@@ -8270,6 +8824,10 @@ var TextHighlightRules = function() {\n
             for (var i = list.length; i--; )\n
                 keywords[list[i]] = className;\n
         });\n
+        if (Object.getPrototypeOf(keywords)) {\n
+            keywords.__proto__ = null;\n
+        }\n
+        this.$keywordList = Object.keys(keywords);\n
         map = null;\n
         return ignoreCase\n
             ? function(value) {return keywords[value.toLowerCase()] || defaultToken }\n
@@ -8366,30 +8924,7 @@ addUnicodePackage({\n
     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",\n
     Pd: "002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",\n
     Ps: "0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",\n
-   
-
-]]></string> </value>
-        </item>
-        <item>
-            <key> <string>next</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="6" aka="AAAAAAAAAAY=">
-    <pickle>
-      <global name="Pdata" module="OFS.Image"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value> <string encoding="cdata"><![CDATA[
-
- Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",\n
+    Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",\n
     Pi: "00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",\n
     Pf: "00BB2019201D203A2E032E052E0A2E0D2E1D2E21",\n
     Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F",\n
@@ -8577,14 +9112,37 @@ var Document = function(text) {\n
     };\n
     this.getTextRange = function(range) {\n
         if (range.start.row == range.end.row) {\n
-            return this.$lines[range.start.row]\n
+            return this.getLine(range.start.row)\n
                 .substring(range.start.column, range.end.column);\n
         }\n
         var lines = this.getLines(range.start.row, range.end.row);\n
         lines[0] = (lines[0] || "").substring(range.start.column);\n
         var l = lines.length - 1;\n
         if (range.end.row - range.start.row == l)\n
-            lines[l] = lines[l].substring(0, range.end.column);\n
+            lines[l] 
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="6" aka="AAAAAAAAAAY=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+= lines[l].substring(0, range.end.column);\n
         return lines.join(this.getNewLineCharacter());\n
     };\n
 \n
@@ -8688,6 +9246,8 @@ var Document = function(text) {\n
         return end;\n
     };\n
     this.remove = function(range) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         range.start = this.$clipPosition(range.start);\n
         range.end = this.$clipPosition(range.end);\n
 \n
@@ -8771,6 +9331,8 @@ var Document = function(text) {\n
         this._emit("change", { data: delta });\n
     };\n
     this.replace = function(range, text) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         if (text.length == 0 && range.isEmpty())\n
             return range.start;\n
         if (text == this.getTextRange(range))\n
@@ -8850,29 +9412,25 @@ var oop = require("./lib/oop");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 \n
 var Anchor = exports.Anchor = function(doc, row, column) {\n
-    this.document = doc;\n
-\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.attach(doc);\n
+    \n
     if (typeof column == "undefined")\n
         this.setPosition(row.row, row.column);\n
     else\n
         this.setPosition(row, column);\n
-\n
-    this.$onChange = this.onChange.bind(this);\n
-    doc.on("change", this.$onChange);\n
 };\n
 \n
 (function() {\n
 \n
     oop.implement(this, EventEmitter);\n
-\n
     this.getPosition = function() {\n
         return this.$clipPositionToDocument(this.row, this.column);\n
     };\n
-\n
     this.getDocument = function() {\n
         return this.document;\n
     };\n
-\n
+    this.$insertRight = false;\n
     this.onChange = function(e) {\n
         var delta = e.data;\n
         var range = delta.range;\n
@@ -8893,7 +9451,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         if (delta.action === "insertText") {\n
             if (start.row === row && start.column <= column) {\n
-                if (start.row === end.row) {\n
+                if (start.column === column && this.$insertRight) {\n
+                } else if (start.row === end.row) {\n
                     column += end.column - start.column;\n
                 } else {\n
                     column -= start.column;\n
@@ -8934,7 +9493,6 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         this.setPosition(row, column, true);\n
     };\n
-\n
     this.setPosition = function(row, column, noClip) {\n
         var pos;\n
         if (noClip) {\n
@@ -8961,10 +9519,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
             value: pos\n
         });\n
     };\n
-\n
     this.detach = function() {\n
         this.document.removeEventListener("change", this.$onChange);\n
     };\n
+    this.attach = function(doc) {\n
+        this.document = doc || this.document;\n
+        this.document.on("change", this.$onChange);\n
+    };\n
     this.$clipPositionToDocument = function(row, column) {\n
         var pos = {};\n
 \n
@@ -9010,27 +9571,35 @@ var BackgroundTokenizer = function(tokenizer, editor) {\n
         if (!self.running) { return; }\n
 \n
         var workerStart = new Date();\n
-        var startLine = self.currentLine;\n
+        var currentLine = self.currentLine;\n
+        var endLine = -1;\n
         var doc = self.doc;\n
 \n
-        var processedLines = 0;\n
+        while (self.lines[currentLine])\n
+            currentLine++;\n
+\n
+        var startLine = currentLine;\n
 \n
         var len = doc.getLength();\n
-        while (self.currentLine < len) {\n
-            self.$tokenizeRow(self.currentLine);\n
-            while (self.lines[self.currentLine])\n
-                self.currentLine++;\n
+        var processedLines = 0;\n
+        self.running = false;\n
+        while (currentLine < len) {\n
+            self.$tokenizeRow(currentLine);\n
+            endLine = currentLine;\n
+            do {\n
+                currentLine++;\n
+            } while (self.lines[currentLine]);\n
             processedLines ++;\n
-            if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) {\n
-                self.fireUpdateEvent(startLine, self.currentLine-1);\n
+            if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) {                \n
                 self.running = setTimeout(self.$worker, 20);\n
+                self.currentLine = currentLine;\n
                 return;\n
             }\n
         }\n
-\n
-        self.running = false;\n
-\n
-        self.fireUpdateEvent(startLine, len - 1);\n
+        self.currentLine = currentLine;\n
+        \n
+        if (startLine <= endLine)\n
+            self.fireUpdateEvent(startLine, endLine);\n
     };\n
 };\n
 \n
@@ -9066,6 +9635,11 @@ var BackgroundTokenizer = function(tokenizer, editor) {\n
         this.stop();\n
         this.running = setTimeout(this.$worker, 700);\n
     };\n
+    \n
+    this.scheduleStart = function() {\n
+        if (!this.running)\n
+            this.running = setTimeout(this.$worker, 700);\n
+    }\n
 \n
     this.$updateOnChange = function(delta) {\n
         var range = delta.range;\n
@@ -9087,7 +9661,6 @@ var BackgroundTokenizer = function(tokenizer, editor) {\n
         this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n
 \n
         this.stop();\n
-        this.running = setTimeout(this.$worker, 700);\n
     };\n
     this.stop = function() {\n
         if (this.running)\n
@@ -9372,8 +9945,9 @@ function Folding() {\n
         var startColumn = fold.start.column;\n
         var endRow = fold.end.row;\n
         var endColumn = fold.end.column;\n
-        if (startRow == endRow && endColumn - startColumn < 2)\n
-            throw "The range has to be at least 2 characters width";\n
+        if (!(startRow < endRow || \n
+            startRow == endRow && startColumn <= endColumn - 2))\n
+            throw new Error("The range has to be at least 2 characters width");\n
 \n
         var startFold = this.getFoldAt(startRow, startColumn, 1);\n
         var endFold = this.getFoldAt(endRow, endColumn, -1);\n
@@ -9384,7 +9958,7 @@ function Folding() {\n
             (startFold && !startFold.range.isStart(startRow, startColumn))\n
             || (endFold && !endFold.range.isEnd(endRow, endColumn))\n
         ) {\n
-            throw "A fold can\'t intersect already existing fold" + fold.range + startFold.range;\n
+            throw new Error("A fold can\'t intersect already existing fold" + fold.range + startFold.range);\n
         }\n
         var folds = this.getFoldsInRange(fold.range);\n
         if (folds.length > 0) {\n
@@ -9695,18 +10269,23 @@ function Folding() {\n
             depth = 100000; // JSON.stringify doesn\'t hanle Infinity\n
         var foldWidgets = this.foldWidgets;\n
         endRow = endRow || this.getLength();\n
-        for (var row = startRow || 0; row < endRow; row++) {\n
+        startRow = startRow || 0;\n
+        for (var row = startRow; row < endRow; row++) {\n
             if (foldWidgets[row] == null)\n
                 foldWidgets[row] = this.getFoldWidget(row);\n
             if (foldWidgets[row] != "start")\n
                 continue;\n
 \n
             var range = this.getFoldWidgetRange(row);\n
-            if (range && range.end.row <= endRow) try {\n
+            var rangeEndRow = range.end.row;\n
+            if (range && range.isMultiLine()\n
+                && rangeEndRow <= endRow\n
+                && range.start.row >= startRow\n
+            ) try {\n
                 var fold = this.addFold("...", range);\n
                 fold.collapseChildren = depth;\n
+                row = rangeEndRow;\n
             } catch(e) {}\n
-            row = range.end.row;\n
         }\n
     };\n
     this.$foldStyles = {\n
@@ -9888,7 +10467,7 @@ function FoldLine(foldData, folds) {\n
     this.addFold = function(fold) {\n
         if (fold.sameRow) {\n
             if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n
-                throw "Can\'t add a fold to this FoldLine as it has no connection";\n
+                throw new Error("Can\'t add a fold to this FoldLine as it has no connection");\n
             }\n
             this.folds.push(fold);\n
             this.folds.sort(function(a, b) {\n
@@ -9910,7 +10489,7 @@ function FoldLine(foldData, folds) {\n
             this.start.row = fold.start.row;\n
             this.start.column = fold.start.column;\n
         } else {\n
-            throw "Trying to add fold to FoldRow that doesn\'t have a matching row";\n
+            throw new Error("Trying to add fold to FoldRow that doesn\'t have a matching row");\n
         }\n
         fold.foldLine = this;\n
     }\n
@@ -10117,7 +10696,7 @@ oop.inherits(Fold, RangeList);\n
             return;\n
 \n
         if (!this.range.containsRange(fold))\n
-            throw "A fold can\'t intersect already existing fold" + fold.range + this.range;\n
+            throw new Error("A fold can\'t intersect already existing fold" + fold.range + this.range);\n
         consumeRange(fold, this.start);\n
 \n
         var row = fold.start.row, column = fold.start.column;\n
@@ -10139,7 +10718,7 @@ oop.inherits(Fold, RangeList);\n
         var afterEnd = this.subFolds[j];\n
 \n
         if (cmp == 0)\n
-            throw "A fold can\'t intersect already existing fold" + fold.range + this.range;\n
+            throw new Error("A fold can\'t intersect already existing fold" + fold.range + this.range);\n
 \n
         var consumedFolds = this.subFolds.splice(i, j - i, fold);\n
         fold.setFoldLine(this.foldLine);\n
@@ -10179,30 +10758,7 @@ define(\'ace/range_list\', [\'require\', \'exports\', \'module\' , \'ace/range\'
 var Range = require("./range").Range;\n
 var comparePoints = Range.comparePoints;\n
 \n
-var RangeList = functio
-
-]]></string> </value>
-        </item>
-        <item>
-            <key> <string>next</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="7" aka="AAAAAAAAAAc=">
-    <pickle>
-      <global name="Pdata" module="OFS.Image"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value> <string encoding="cdata"><![CDATA[
-
-n() {\n
+var RangeList = function() {\n
     this.ranges = [];\n
 };\n
 \n
@@ -10371,11 +10927,16 @@ n() {\n
                 break;\n
 \n
             if (r.start.row == startRow && r.start.column >= start.column ) {\n
-                \n
-                r.start.column += colDiff;\n
-                r.start.row += lineDif;\n
+                if (r.start.column == start.column && this.$insertRight) {\n
+                } else {\n
+                    r.start.column += colDiff;\n
+                    r.start.row += lineDif;\n
+                }\n
             }\n
             if (r.end.row == startRow && r.end.column >= start.column) {\n
+                if (r.end.column == start.column && this.$insertRight) {\n
+                    continue;\n
+                }\n
                 if (r.end.column == start.column && colDiff > 0 && i < n - 1) {                \n
                     if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n
                         r.end.column -= colDiff;\n
@@ -10657,7 +11218,30 @@ var Search = function() {\n
                     var match = matches[j];\n
                     ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n
                 }\n
-            }\n
+  
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="7" aka="AAAAAAAAAAc=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+          }\n
         }\n
 \n
         if (range) {\n
@@ -10876,12 +11460,8 @@ var HashHandler = require("../keyboard/hash_handler").HashHandler;\n
 var EventEmitter = require("../lib/event_emitter").EventEmitter;\n
 \n
 var CommandManager = function(platform, commands) {\n
-    this.platform = platform;\n
-    this.commands = this.byName = {};\n
-    this.commmandKeyBinding = {};\n
-\n
-    this.addCommands(commands);\n
-\n
+    HashHandler.call(this, commands, platform);\n
+    this.byName = this.commands;\n
     this.setDefaultHandler("exec", function(e) {\n
         return e.command.exec(e.editor, e.args || {});\n
     });\n
@@ -10981,7 +11561,26 @@ var useragent = require("../lib/useragent");\n
 function HashHandler(config, platform) {\n
     this.platform = platform || (useragent.isMac ? "mac" : "win");\n
     this.commands = {};\n
-    this.commmandKeyBinding = {};\n
+    this.commandKeyBinding = {};\n
+    if (this.__defineGetter__ && this.__defineSetter__ && typeof console != "undefined" && console.error) {\n
+        var warned = false;\n
+        var warn = function() {\n
+            if (!warned) {\n
+                warned = true;\n
+                console.error("commmandKeyBinding has too many m\'s. use commandKeyBinding");\n
+            }\n
+        };\n
+        this.__defineGetter__("commmandKeyBinding", function() {\n
+            warn();\n
+            return this.commandKeyBinding;\n
+        });\n
+        this.__defineSetter__("commmandKeyBinding", function(val) {\n
+            warn();\n
+            return this.commandKeyBinding = val;\n
+        });\n
+    } else {\n
+        this.commmandKeyBinding = this.commandKeyBinding;\n
+    }\n
 \n
     this.addCommands(config);\n
 };\n
@@ -11002,7 +11601,7 @@ function HashHandler(config, platform) {\n
         var name = (typeof command === \'string\' ? command : command.name);\n
         command = this.commands[name];\n
         delete this.commands[name];\n
-        var ckb = this.commmandKeyBinding;\n
+        var ckb = this.commandKeyBinding;\n
         for (var hashId in ckb) {\n
             for (var key in ckb[hashId]) {\n
                 if (ckb[hashId][key] == command)\n
@@ -11019,7 +11618,7 @@ function HashHandler(config, platform) {\n
             return;\n
         }\n
 \n
-        var ckb = this.commmandKeyBinding;\n
+        var ckb = this.commandKeyBinding;\n
         key.split("|").forEach(function(keyPart) {\n
             var binding = this.parseKeys(keyPart, command);\n
             var hashId = binding.hashId;\n
@@ -11030,6 +11629,9 @@ function HashHandler(config, platform) {\n
     this.addCommands = function(commands) {\n
         commands && Object.keys(commands).forEach(function(name) {\n
             var command = commands[name];\n
+            if (!command)\n
+                return;\n
+            \n
             if (typeof command === "string")\n
                 return this.bindKey(command, name);\n
 \n
@@ -11092,7 +11694,7 @@ function HashHandler(config, platform) {\n
     };\n
 \n
     this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n
-        var ckbr = this.commmandKeyBinding;\n
+        var ckbr = this.commandKeyBinding;\n
         return ckbr[hashId] && ckbr[hashId][keyString];\n
     };\n
 \n
@@ -11197,13 +11799,15 @@ exports.commands = [{\n
     bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Up"),\n
     exec: function(editor) { editor.getSelection().selectFileStart(); },\n
     multiSelectAction: "forEach",\n
-    readOnly: true\n
+    readOnly: true,\n
+    group: "fileJump"\n
 }, {\n
     name: "gotostart",\n
     bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"),\n
     exec: function(editor) { editor.navigateFileStart(); },\n
     multiSelectAction: "forEach",\n
-    readOnly: true\n
+    readOnly: true,\n
+    group: "fileJump"\n
 }, {\n
     name: "selectup",\n
     bindKey: bindKey("Shift-Up", "Shift-Up"),\n
@@ -11221,13 +11825,15 @@ exports.commands = [{\n
     bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-Down"),\n
     exec: function(editor) { editor.getSelection().selectFileEnd(); },\n
     multiSelectAction: "forEach",\n
-    readOnly: true\n
+    readOnly: true,\n
+    group: "fileJump"\n
 }, {\n
     name: "gotoend",\n
     bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"),\n
     exec: function(editor) { editor.navigateFileEnd(); },\n
     multiSelectAction: "forEach",\n
-    readOnly: true\n
+    readOnly: true,\n
+    group: "fileJump"\n
 }, {\n
     name: "selectdown",\n
     bindKey: bindKey("Shift-Down", "Shift-Down"),\n
@@ -11466,17 +12072,28 @@ exports.commands = [{\n
     exec: function(editor) { editor.moveLinesDown(); }\n
 }, {\n
     name: "del",\n
-    bindKey: bindKey("Delete", "Delete|Ctrl-D"),\n
+    bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"),\n
     exec: function(editor) { editor.remove("right"); },\n
     multiSelectAction: "forEach"\n
 }, {\n
     name: "backspace",\n
     bindKey: bindKey(\n
-        "Command-Backspace|Option-Backspace|Shift-Backspace|Backspace",\n
-        "Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H"\n
+        "Shift-Backspace|Backspace",\n
+        "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"\n
     ),\n
     exec: function(editor) { editor.remove("left"); },\n
     multiSelectAction: "forEach"\n
+}, {\n
+    name: "cut_or_delete",\n
+    bindKey: bindKey("Shift-Delete", null),\n
+    exec: function(editor) { \n
+        if (editor.selection.isEmpty()) {\n
+            editor.remove("left");\n
+        } else {\n
+            return false;\n
+        }\n
+    },\n
+    multiSelectAction: "forEach"\n
 }, {\n
     name: "removetolinestart",\n
     bindKey: bindKey("Alt-Backspace", "Command-Backspace"),\n
@@ -11560,6 +12177,9 @@ var UndoManager = function() {\n
     this.execute = function(options) {\n
         var deltas = options.args[0];\n
         this.$doc  = options.args[1];\n
+        if (options.merge && this.hasUndo()){\n
+            deltas = this.$undoStack.pop().concat(deltas);\n
+        }\n
         this.$undoStack.push(deltas);\n
         this.$redoStack = [];\n
 \n
@@ -11615,19 +12235,19 @@ var UndoManager = function() {\n
 exports.UndoManager = UndoManager;\n
 });\n
 \n
-define(\'ace/virtual_renderer\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/dom\', \'ace/lib/event\', \'ace/lib/useragent\', \'ace/config\', \'ace/layer/gutter\', \'ace/layer/marker\', \'ace/layer/text\', \'ace/layer/cursor\', \'ace/scrollbar\', \'ace/renderloop\', \'ace/lib/event_emitter\'], function(require, exports, module) {\n
+define(\'ace/virtual_renderer\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/dom\', \'ace/lib/useragent\', \'ace/config\', \'ace/layer/gutter\', \'ace/layer/marker\', \'ace/layer/text\', \'ace/layer/cursor\', \'ace/scrollbar\', \'ace/renderloop\', \'ace/lib/event_emitter\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("./lib/oop");\n
 var dom = require("./lib/dom");\n
-var event = require("./lib/event");\n
 var useragent = require("./lib/useragent");\n
 var config = require("./config");\n
 var GutterLayer = require("./layer/gutter").Gutter;\n
 var MarkerLayer = require("./layer/marker").Marker;\n
 var TextLayer = require("./layer/text").Text;\n
 var CursorLayer = require("./layer/cursor").Cursor;\n
-var ScrollBar = require("./scrollbar").ScrollBar;\n
+var ScrollBarH = require("./scrollbar").ScrollBarH;\n
+var ScrollBarV = require("./scrollbar").ScrollBarV;\n
 var RenderLoop = require("./renderloop").RenderLoop;\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 var editorCss = ".ace_editor {\\\n
@@ -11637,6 +12257,10 @@ font-family: \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code
 font-size: 12px;\\\n
 line-height: normal;\\\n
 color: black;\\\n
+-ms-user-select: none;\\\n
+-moz-user-select: none;\\\n
+-webkit-user-select: none;\\\n
+user-select: none;\\\n
 }\\\n
 .ace_scroller {\\\n
 position: absolute;\\\n
@@ -11652,6 +12276,25 @@ position: absolute;\\\n
 box-sizing: border-box;\\\n
 cursor: text;\\\n
 }\\\n
+.ace_dragging, .ace_dragging * {\\\n
+cursor: move !important;\\\n
+}\\\n
+.ace_dragging .ace_scroller:before{\\\n
+position: absolute;\\\n
+top: 0;\\\n
+left: 0;\\\n
+right: 0;\\\n
+bottom: 0;\\\n
+content: \'\';\\\n
+background: rgba(250, 250, 250, 0.01);\\\n
+z-index: 1000;\\\n
+}\\\n
+.ace_dragging.ace_dark .ace_scroller:before{\\\n
+background: rgba(0, 0, 0, 0.01);\\\n
+}\\\n
+.ace_selecting, .ace_selecting * {\\\n
+cursor: text !important;\\\n
+}\\\n
 .ace_gutter {\\\n
 position: absolute;\\\n
 overflow : hidden;\\\n
@@ -11694,15 +12337,26 @@ background-image: url(\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQC
 .ace_scrollbar {\\\n
 position: absolute;\\\n
 overflow-x: hidden;\\\n
-overflow-y: scroll;\\\n
+overflow-y: auto;\\\n
 right: 0;\\\n
 top: 0;\\\n
 bottom: 0;\\\n
+z-index: 6;\\\n
 }\\\n
 .ace_scrollbar-inner {\\\n
 position: absolute;\\\n
-width: 1px;\\\n
+cursor: text;\\\n
+left: 0;\\\n
+top: 0;\\\n
+}\\\n
+.ace_scrollbar-h {\\\n
+position: absolute;\\\n
+overflow-x: auto;\\\n
+overflow-y: hidden;\\\n
+right: 0;\\\n
 left: 0;\\\n
+bottom: 0;\\\n
+z-index: 6;\\\n
 }\\\n
 .ace_print-margin {\\\n
 position: absolute;\\\n
@@ -11724,12 +12378,14 @@ overflow: hidden;\\\n
 font: inherit;\\\n
 padding: 0 1px;\\\n
 margin: 0 -1px;\\\n
+text-indent: -1em;\\\n
 }\\\n
 .ace_text-input.ace_composition {\\\n
 background: #f8f8f8;\\\n
 color: #111;\\\n
 z-index: 1000;\\\n
 opacity: 1;\\\n
+text-indent: 0;\\\n
 }\\\n
 .ace_layer {\\\n
 z-index: 1;\\\n
@@ -11767,6 +12423,14 @@ position: absolute;\\\n
 -moz-box-sizing: border-box;\\\n
 -webkit-box-sizing: border-box;\\\n
 box-sizing: border-box;\\\n
+border-left: 2px solid\\\n
+}\\\n
+.ace_slim-cursors .ace_cursor {\\\n
+border-left-width: 1px;\\\n
+}\\\n
+.ace_overwrite-cursors .ace_cursor {\\\n
+border-left-width: 0px;\\\n
+border-bottom: 1px solid;\\\n
 }\\\n
 .ace_hidden-cursors .ace_cursor {\\\n
 opacity: 0.2;\\\n
@@ -11787,7 +12451,7 @@ border-left-width: 1px;\\\n
 .ace_line {\\\n
 white-space: nowrap;\\\n
 }\\\n
-.ace_marker-layer .ace_step {\\\n
+.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\n
 position: absolute;\\\n
 z-index: 3;\\\n
 }\\\n
@@ -11840,9 +12504,6 @@ url(\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%0
 background-repeat: no-repeat, repeat-x;\\\n
 background-position: center center, top left;\\\n
 }\\\n
-.ace_editor.ace_dragging .ace_content {\\\n
-cursor: move;\\\n
-}\\\n
 .ace_gutter-tooltip {\\\n
 background-color: #FFF;\\\n
 background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\n
@@ -11855,7 +12516,7 @@ display: inline-block;\\\n
 max-width: 500px;\\\n
 padding: 4px;\\\n
 position: fixed;\\\n
-z-index: 300;\\\n
+z-index: 999999;\\\n
 -moz-box-sizing: border-box;\\\n
 -webkit-box-sizing: border-box;\\\n
 box-sizing: border-box;\\\n
@@ -11885,30 +12546,7 @@ border-radius: 3px;\\\n
 border: 1px solid transparent;\\\n
 cursor: pointer;\\\n
 }\\\n
-.ace_foldin
-
-]]></string> </value>
-        </item>
-        <item>
-            <key> <string>next</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="8" aka="AAAAAAAAAAg=">
-    <pickle>
-      <global name="Pdata" module="OFS.Image"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value> <string encoding="cdata"><![CDATA[
-
-g-enabled .ace_fold-widget {\\\n
+.ace_folding-enabled .ace_fold-widget {\\\n
 display: inline-block;   \\\n
 }\\\n
 .ace_fold-widget.ace_end {\\\n
@@ -11984,6 +12622,16 @@ font-weight: normal;\\\n
 .ace_italic {\\\n
 font-style: italic;\\\n
 }\\\n
+.ace_error-marker {\\\n
+background-color: rgba(255, 0, 0,0.2);\\\n
+position: absolute;\\\n
+z-index: 9;\\\n
+}\\\n
+.ace_highlight-marker {\\\n
+background-color: rgba(255, 255, 0,0.2);\\\n
+position: absolute;\\\n
+z-index: 8;\\\n
+}\\\n
 ";\n
 \n
 dom.importCssString(editorCss, "ace_editor");\n
@@ -11992,7 +12640,7 @@ var VirtualRenderer = function(container, theme) {\n
     var _self = this;\n
 \n
     this.container = container || dom.createElement("div");\n
-    this.$keepTextAreaAtCursor = !useragent.isIE;\n
+    this.$keepTextAreaAtCursor = true;\n
 \n
     dom.addCssClass(this.container, "ace_editor");\n
 \n
@@ -12022,21 +12670,22 @@ var VirtualRenderer = function(container, theme) {\n
 \n
     this.$cursorLayer = new CursorLayer(this.content);\n
     this.$horizScroll = false;\n
+    this.$vScroll = false;\n
 \n
-    this.scrollBar = new ScrollBar(this.container);\n
-    this.scrollBar.addEventListener("scroll", function(e) {\n
+    this.scrollBar = \n
+    this.scrollBarV = new ScrollBarV(this.container, this);\n
+    this.scrollBarH = new ScrollBarH(this.container, this);\n
+    this.scrollBarV.addEventListener("scroll", function(e) {\n
+        if (!_self.$scrollAnimation)\n
+            _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n
+    });\n
+    this.scrollBarH.addEventListener("scroll", function(e) {\n
         if (!_self.$scrollAnimation)\n
-            _self.session.setScrollTop(e.data);\n
+            _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n
     });\n
 \n
     this.scrollTop = 0;\n
     this.scrollLeft = 0;\n
-\n
-    event.addListener(this.scroller, "scroll", function() {\n
-        var scrollLeft = _self.scroller.scrollLeft;\n
-        _self.scrollLeft = scrollLeft;\n
-        _self.session.setScrollLeft(scrollLeft);\n
-    });\n
 \n
     this.cursorPos = {\n
         row : 0,\n
@@ -12046,6 +12695,7 @@ var VirtualRenderer = function(container, theme) {\n
     this.$textLayer.addEventListener("changeCharacterSize", function() {\n
         _self.updateCharacterSize();\n
         _self.onResize(true);\n
+        _self._signal("changeCharacterSize");\n
     });\n
 \n
     this.$size = {\n
@@ -12061,13 +12711,22 @@ var VirtualRenderer = function(container, theme) {\n
         firstRow : 0,\n
         firstRowScreen: 0,\n
         lastRow : 0,\n
-        lineHeight : 1,\n
-        characterWidth : 1,\n
+        lineHeight : 0,\n
+        characterWidth : 0,\n
         minHeight : 1,\n
         maxHeight : 1,\n
         offset : 0,\n
         height : 1\n
     };\n
+    \n
+    this.scrollMargin = {\n
+        left: 0,\n
+        right: 0,\n
+        top: 0,\n
+        bottom: 0,\n
+        v: 0,\n
+        h: 0\n
+    };\n
 \n
     this.$loop = new RenderLoop(\n
         this.$renderChanges.bind(this),\n
@@ -12103,7 +12762,9 @@ var VirtualRenderer = function(container, theme) {\n
             this.setStyle("ace_nobold", !this.$allowBoldFonts);\n
         }\n
 \n
+        this.layerConfig.characterWidth =\n
         this.characterWidth = this.$textLayer.getCharacterWidth();\n
+        this.layerConfig.lineHeight =\n
         this.lineHeight = this.$textLayer.getLineHeight();\n
         this.$updatePrintMargin();\n
     };\n
@@ -12160,78 +12821,123 @@ var VirtualRenderer = function(container, theme) {\n
     this.updateFontSize = function() {\n
         this.$textLayer.checkForSizeChanges();\n
     };\n
-    this.onResize = function(force, gutterWidth, width, height) {\n
-        var changes = 0;\n
-        var size = this.$size;\n
 \n
+    this.$changes = 0;\n
+    this.onResize = function(force, gutterWidth, width, height) {\n
         if (this.resizing > 2)\n
             return;\n
-        else if (this.resizing > 1)\n
+        else if (this.resizing > 0)\n
             this.resizing++;\n
         else\n
-            this.resizing = force ? 1 : 0;\n
-        if (!height)\n
-            height = dom.getInnerHeight(this.container);\n
+            this.resizing = force ? 1 : 0;\n
+        var el = this.container;\n
+        if (!height)\n
+            height = el.clientHeight || el.scrollHeight;\n
+        if (!width)\n
+            width = el.clientWidth || el.scrollWidth;\n
+\n
+        var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n
+        \n
+        if (!this.$size.scrollerHeight || (!width && !height))\n
+            return this.resizing = 0;\n
+\n
+        if (force)\n
+            this.$gutterLayer.$padding = null;\n
+\n
+        if (force)\n
+            this.$renderChanges(changes, true);\n
+        else\n
+            this.$loop.schedule(changes | this.$changes);\n
 \n
+        if (this.resizing)\n
+            this.resizing = 0;\n
+    };\n
+    \n
+    this.$updateCachedSize = function(force, gutterWidth, width, height) {\n
+        var changes = 0;\n
+        var size = this.$size;\n
+        var oldSize = {\n
+            width: size.width,\n
+            height: size.height,\n
+            scrollerHeight: size.scrollerHeight,\n
+            scrollerWidth: size.scrollerWidth\n
+        };\n
         if (height && (force || size.height != height)) {\n
             size.height = height;\n
             changes = this.CHANGE_SIZE;\n
 \n
-            size.scrollerHeight = this.scroller.clientHeight;\n
-            if (force || !size.scrollerHeight) {\n
-                size.scrollerHeight = size.height;\n
-                if (this.$horizScroll)\n
-                    size.scrollerHeight -= this.scrollBar.getWidth();\n
-            }\n
-            this.scrollBar.setHeight(size.scrollerHeight);\n
+            size.scrollerHeight = size.height;\n
+            if (this.$horizScroll)\n
+                size.scrollerHeight -= this.scrollBarH.getHeight();\n
+            this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px";\n
 \n
             if (this.session) {\n
                 this.session.setScrollTop(this.getScrollTop());\n
-                changes = changes | this.CHANGE_FULL;\n
+                changes = changes | this.CHANGE_SCROLL;\n
             }\n
         }\n
 \n
-        if (!width)\n
-            width = dom.getInnerWidth(this.container);\n
-\n
-        if (width && (force || this.resizing > 1 || size.width != width)) {\n
+        if (width && (force || size.width != width)) {\n
             changes = this.CHANGE_SIZE;\n
             size.width = width;\n
-\n
-            var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n
+            \n
+            if (gutterWidth == null)\n
+                gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n
+            \n
+            this.gutterWidth = gutterWidth;\n
+            \n
+            this.scrollBarH.element.style.left = \n
             this.scroller.style.left = gutterWidth + "px";\n
-            size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBar.getWidth());\n
-            this.scroller.style.right = this.scrollBar.getWidth() + "px";\n
+            size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth());           \n
+            \n
+            this.scrollBarH.element.style.right = \n
+            this.scroller.style.right = this.scrollBarV.getWidth() + "px";\n
+            this.scroller.style.bottom = this.scrollBarH.getHeight() + "px";\n
 \n
             if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n
                 changes = changes | this.CHANGE_FULL;\n
         }\n
+        \n
+        if (changes)\n
+            this._signal("resize", oldSize);\n
 \n
-        if (!this.$size.scrollerHeight)\n
-            return;\n
-\n
-        if (force)\n
-            this.$renderChanges(changes, true);\n
-        else\n
-            this.$loop.schedule(changes);\n
-\n
-        if (force)\n
-            this.$gutterLayer.$padding = null;\n
-\n
-        if (force)\n
-            delete this.resizing;\n
+        return changes;\n
     };\n
 \n
     this.onGutterResize = function() {\n
-        var width = this.$size.width;\n
-        var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n
-        this.scroller.style.left = gutterWidth + "px";\n
-        this.$size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBar.getWidth());\n
+        var gutterWidth = this.$showGutter ? this.$gutter.offsetWidt
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="8" aka="AAAAAAAAAAg=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+h : 0;\n
+        if (gutterWidth != this.gutterWidth)\n
+            this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n
 \n
         if (this.session.getUseWrapMode() && this.adjustWrapLimit())\n
             this.$loop.schedule(this.CHANGE_FULL);\n
-        else\n
+        else {\n
+            this.$computeLayerConfig();\n
             this.$loop.schedule(this.CHANGE_MARKER);\n
+        }\n
     };\n
     this.adjustWrapLimit = function() {\n
         var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n
@@ -12388,41 +13094,73 @@ var VirtualRenderer = function(container, theme) {\n
         this.$loop.schedule(this.CHANGE_FULL);\n
         this.$updatePrintMargin();\n
     };\n
+    \n
+    this.setScrollMargin = function(top, bottom, left, right) {\n
+        var sm = this.scrollMargin;\n
+        sm.top = top|0;\n
+        sm.bottom = bottom|0;\n
+        sm.right = right|0;\n
+        sm.left = left|0;\n
+        sm.v = sm.top + sm.bottom;\n
+        sm.h = sm.left + sm.right;\n
+        this.updateFull();\n
+    };\n
     this.getHScrollBarAlwaysVisible = function() {\n
         return this.$hScrollBarAlwaysVisible;\n
     };\n
     this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n
         this.setOption("hScrollBarAlwaysVisible", alwaysVisible);\n
     };\n
+    this.getVScrollBarAlwaysVisible = function() {\n
+        return this.$hScrollBarAlwaysVisible;\n
+    };\n
+    this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n
+        this.setOption("vScrollBarAlwaysVisible", alwaysVisible);\n
+    };\n
 \n
-    this.$updateScrollBar = function() {\n
-        this.scrollBar.setInnerHeight(this.layerConfig.maxHeight);\n
-        this.scrollBar.setScrollTop(this.scrollTop);\n
+    this.$updateScrollBarV = function() {\n
+        this.scrollBarV.setInnerHeight(this.layerConfig.maxHeight + this.scrollMargin.v);\n
+        this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n
+    };\n
+    this.$updateScrollBarH = function() {\n
+        this.scrollBarH.setInnerWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n
+        this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n
     };\n
 \n
     this.$renderChanges = function(changes, force) {\n
-        if (!force && (!changes || !this.session || !this.container.offsetWidth))\n
-            return;\n
-\n
+        if (this.$changes) {\n
+            changes |= this.$changes;\n
+            this.$changes = 0;\n
+        }\n
+        if ((!this.session || !this.container.offsetWidth) || (!changes && !force)) {\n
+            this.$changes |= changes;\n
+            return; \n
+        } \n
+        if (!this.$size.width) {\n
+            this.$changes |= changes;\n
+            return this.onResize(true);\n
+        }\n
+        if (!this.lineHeight) {\n
+            this.$textLayer.checkForSizeChanges();\n
+        }\n
+        \n
         this._signal("beforeRender");\n
         if (changes & this.CHANGE_FULL ||\n
             changes & this.CHANGE_SIZE ||\n
             changes & this.CHANGE_TEXT ||\n
             changes & this.CHANGE_LINES ||\n
-            changes & this.CHANGE_SCROLL\n
+            changes & this.CHANGE_SCROLL ||\n
+            changes & this.CHANGE_H_SCROLL\n
         )\n
-            this.$computeLayerConfig();\n
+            changes |= this.$computeLayerConfig();\n
         if (changes & this.CHANGE_H_SCROLL) {\n
-            this.scroller.scrollLeft = this.scrollLeft;\n
-            var scrollLeft = this.scroller.scrollLeft;\n
-            this.scrollLeft = scrollLeft;\n
-            this.session.setScrollLeft(scrollLeft);\n
-\n
-            this.scroller.className = this.scrollLeft == 0 ? "ace_scroller" : "ace_scroller ace_scroll-left";\n
+            this.$updateScrollBarH();\n
+            this.content.style.marginLeft = -this.scrollLeft + "px";\n
+            this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left";\n
         }\n
         if (changes & this.CHANGE_FULL) {\n
-            this.$textLayer.checkForSizeChanges();\n
-            this.$updateScrollBar();\n
+            this.$updateScrollBarV();\n
+            this.$updateScrollBarH();\n
             this.$textLayer.update(this.layerConfig);\n
             if (this.$showGutter)\n
                 this.$gutterLayer.update(this.layerConfig);\n
@@ -12435,6 +13173,7 @@ var VirtualRenderer = function(container, theme) {\n
             return;\n
         }\n
         if (changes & this.CHANGE_SCROLL) {\n
+            this.$updateScrollBarV();\n
             if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n
                 this.$textLayer.update(this.layerConfig);\n
             else\n
@@ -12447,7 +13186,6 @@ var VirtualRenderer = function(container, theme) {\n
             this.$cursorLayer.update(this.layerConfig);\n
             this.$highlightGutterLine && this.$updateGutterLineHighlight();\n
             this.$moveTextAreaToCursor();\n
-            this.$updateScrollBar();\n
             this._signal("afterRender");\n
             return;\n
         }\n
@@ -12480,33 +13218,83 @@ var VirtualRenderer = function(container, theme) {\n
             this.$markerBack.update(this.layerConfig);\n
         }\n
 \n
-        if (changes & this.CHANGE_SIZE)\n
-            this.$updateScrollBar();\n
+        if (changes & this.CHANGE_SIZE || changes & this.CHANGE_LINES) {\n
+            this.$updateScrollBarV();\n
+            this.$updateScrollBarH();\n
+        }\n
 \n
         this._signal("afterRender");\n
     };\n
 \n
+    \n
+    this.$autosize = function(height, width) {\n
+        var height = this.session.getScreenLength() * this.lineHeight;\n
+        var maxHeight = this.$maxLines * this.lineHeight;\n
+        var desiredHeight = Math.max(\n
+            (this.$minLines||1) * this.lineHeight,\n
+            Math.min(maxHeight, height)\n
+        );\n
+        var vScroll = height > maxHeight;\n
+        \n
+        if (desiredHeight != this.desiredHeight ||\n
+            this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n
+            if (vScroll != this.$vScroll) {\n
+                this.$vScroll = vScroll;\n
+                this.scrollBarV.setVisible(vScroll);\n
+            }\n
+            \n
+            var w = this.container.clientWidth;\n
+            this.container.style.height = desiredHeight + "px";\n
+            this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n
+            this.desiredHeight = desiredHeight;\n
+        }\n
+    };\n
+    \n
     this.$computeLayerConfig = function() {\n
-        if (!this.$size.scrollerHeight)\n
-            return this.onResize(true);\n
+        if (this.$maxLines && this.lineHeight > 1)\n
+            this.$autosize();\n
 \n
         var session = this.session;\n
+        \n
+        var hideScrollbars = this.$size.height <= 2 * this.lineHeight;\n
+        var screenLines = this.session.getScreenLength()\n
+        var maxHeight = screenLines * this.lineHeight;\n
 \n
         var offset = this.scrollTop % this.lineHeight;\n
         var minHeight = this.$size.scrollerHeight + this.lineHeight;\n
 \n
         var longestLine = this.$getLongestLine();\n
+        \n
+        var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n
+            this.$size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n
 \n
-        var horizScroll = this.$hScrollBarAlwaysVisible || this.$size.scrollerWidth - longestLine < 0;\n
-        var horizScrollChanged = this.$horizScroll !== horizScroll;\n
-        this.$horizScroll = horizScroll;\n
-        if (horizScrollChanged) {\n
-            this.scroller.style.overflowX = horizScroll ? "scroll" : "hidden";\n
-            if (!horizScroll)\n
-                this.session.setScrollLeft(0);\n
+        var hScrollChanged = this.$horizScroll !== horizScroll;\n
+        if (hScrollChanged) {\n
+            this.$horizScroll = horizScroll;\n
+            this.scrollBarH.setVisible(horizScroll);\n
+        }\n
+        \n
+        if (!this.$maxLines && this.$scrollPastEnd) {\n
+            if (this.scrollTop > maxHeight - this.$size.scrollerHeight)\n
+                maxHeight += Math.min(\n
+                    (this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd,\n
+                    this.scrollTop - maxHeight + this.$size.scrollerHeight\n
+                );\n
+        }\n
+        \n
+        var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n
+            this.$size.scrollerHeight - maxHeight < 0);\n
+        var vScrollChanged = this.$vScroll !== vScroll;\n
+        if (vScrollChanged) {\n
+            this.$vScroll = vScroll;\n
+            this.scrollBarV.setVisible(vScroll);\n
         }\n
-        var maxHeight = this.session.getScreenLength() * this.lineHeight;\n
-        this.session.setScrollTop(Math.max(0, Math.min(this.scrollTop, maxHeight - this.$size.scrollerHeight)));\n
+        \n
+        this.session.setScrollTop(Math.max(-this.scrollMargin.top,\n
+            Math.min(this.scrollTop, maxHeight - this.$size.scrollerHeight + this.scrollMargin.v)));\n
+\n
+        this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, \n
+            longestLine + 2 * this.$padding - this.$size.scrollerWidth + this.scrollMargin.h)));\n
 \n
         var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n
         var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n
@@ -12528,6 +13316,14 @@ var VirtualRenderer = function(container, theme) {\n
 \n
         offset = this.scrollTop - firstRowScreen * lineHeight;\n
 \n
+        var changes = 0;\n
+        if (hScrollChanged || vScrollChanged) {\n
+            changes = this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height);\n
+            this._signal("scrollbarVisibilityChanged");\n
+            if (vScrollChanged)\n
+                longestLine = this.$getLongestLine();\n
+        }\n
+        \n
         this.layerConfig = {\n
             width : longestLine,\n
             padding : this.$padding,\n
@@ -12546,8 +13342,8 @@ var VirtualRenderer = function(container, theme) {\n
         this.content.style.marginTop = (-offset) + "px";\n
         this.content.style.width = longestLine + 2 * this.$padding + "px";\n
         this.content.style.height = minHeight + "px";\n
-        if (horizScrollChanged)\n
-            this.onResize(true);\n
+\n
+        return changes;\n
     };\n
 \n
     this.$updateLines = function() {\n
@@ -12571,7 +13367,7 @@ var VirtualRenderer = function(container, theme) {\n
 \n
     this.$getLongestLine = function() {\n
         var charCount = this.session.getScreenWidth();\n
-        if (this.$textLayer.showInvisibles)\n
+        if (this.showInvisibles && !this.session.$useWrapMode)\n
             charCount += 1;\n
 \n
         return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n
@@ -12619,12 +13415,18 @@ var VirtualRenderer = function(container, theme) {\n
 \n
         var left = pos.left;\n
         var top = pos.top;\n
+        \n
+        var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n
 \n
-        if (this.scrollTop > top) {\n
+        if (scrollTop > top) {\n
             if (offset)\n
                 top -= offset * this.$size.scrollerHeight;\n
+            if (top == 0)\n
+                top = - this.scrollMargin.top;\n
+            else if (top == 0)\n
+                top = + this.scrollMargin.bottom;\n
             this.session.setScrollTop(top);\n
-        } else if (this.scrollTop + this.$size.scrollerHeight < top + this.lineHeight) {\n
+        } else if (scrollTop + this.$size.scrollerHeight < top + this.lineHeight) {\n
             if (offset)\n
                 top += offset * this.$size.scrollerHeight;\n
             this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n
@@ -12634,10 +13436,12 @@ var VirtualRenderer = function(container, theme) {\n
 \n
         if (scrollLeft > left) {\n
             if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n
-                left = 0;\n
+                left = -this.scrollMargin.left;\n
             this.session.setScrollLeft(left);\n
         } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n
             this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n
+        } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n
+            this.session.setScrollLeft(0);\n
         }\n
     };\n
     this.getScrollTop = function() {\n
@@ -12697,29 +13501,42 @@ var VirtualRenderer = function(container, theme) {\n
 \n
     this.animateScrolling = function(fromValue, callback) {\n
         var toValue = this.scrollTop;\n
-        if (this.$animatedScroll) {\n
-            var _self = this;\n
-            var steps = _self.$calcSteps(fromValue, toValue);\n
-            this.$scrollAnimation = {from: fromValue, to: toValue};\n
-\n
-            clearInterval(this.$timer);\n
-\n
-            _self.session.setScrollTop(steps.shift());\n
-            this.$timer = setInterval(function() {\n
-                if (steps.length) {\n
-                    _self.session.setScrollTop(steps.shift());\n
-                    _self.session.$scrollTop = toValue;\n
-                } else if (toValue != null) {\n
-                    _self.session.$scrollTop = -1;\n
-                    _self.session.setScrollTop(toValue);\n
-                    toValue = null;\n
-                } else {\n
-                    _self.$timer = clearInterval(_self.$timer);\n
-                    _self.$scrollAnimation = null;\n
-                    callback && callback();\n
-                }\n
-            }, 10);\n
+        if (!this.$animatedScroll)\n
+            return;\n
+        var _self = this;\n
+        \n
+        if (fromValue == toValue)\n
+            return;\n
+        \n
+        if (this.$scrollAnimation) {\n
+            var oldSteps = this.$scrollAnimation.steps;\n
+            if (oldSteps.length) {\n
+                fromValue = oldSteps[0];\n
+                if (fromValue == toValue)\n
+                    return;\n
+            }\n
         }\n
+        \n
+        var steps = _self.$calcSteps(fromValue, toValue);\n
+        this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n
+\n
+        clearInterval(this.$timer);\n
+\n
+        _self.session.setScrollTop(steps.shift());\n
+        this.$timer = setInterval(function() {\n
+            if (steps.length) {\n
+                _self.session.setScrollTop(steps.shift());\n
+                _self.session.$scrollTop = toValue;\n
+            } else if (toValue != null) {\n
+                _self.session.$scrollTop = -1;\n
+                _self.session.setScrollTop(toValue);\n
+                toValue = null;\n
+            } else {\n
+                _self.$timer = clearInterval(_self.$timer);\n
+                _self.$scrollAnimation = null;\n
+                callback && callback();\n
+            }\n
+        }, 10);\n
     };\n
     this.scrollToY = function(scrollTop) {\n
         if (this.scrollTop !== scrollTop) {\n
@@ -12728,21 +13545,29 @@ var VirtualRenderer = function(container, theme) {\n
         }\n
     };\n
     this.scrollToX = function(scrollLeft) {\n
-        if (scrollLeft < 0)\n
-            scrollLeft = 0;\n
-\n
         if (this.scrollLeft !== scrollLeft)\n
             this.scrollLeft = scrollLeft;\n
         this.$loop.schedule(this.CHANGE_H_SCROLL);\n
     };\n
+    this.scrollTo = function(x, y) {\n
+        this.session.setScrollTop(y);\n
+        this.session.setScrollLeft(y);\n
+    };\n
     this.scrollBy = function(deltaX, deltaY) {\n
         deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n
         deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n
     };\n
     this.isScrollableBy = function(deltaX, deltaY) {\n
-        if (deltaY < 0 && this.session.getScrollTop() >= 1)\n
+        if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n
+           return true;\n
+        if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n
+            - this.layerConfig.maxHeight - (this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n
+            < -1 + this.scrollMargin.bottom)\n
            return true;\n
-        if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight - this.layerConfig.maxHeight < -1)\n
+        if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n
+            return true;\n
+        if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n
+            - this.layerConfig.width < -1 + this.scrollMargin.right)\n
            return true;\n
     };\n
 \n
@@ -12810,7 +13635,7 @@ var VirtualRenderer = function(container, theme) {\n
         this.textarea.style.cssText = this.$composition.cssText;\n
         this.$composition = null;\n
     };\n
-    this.setTheme = function(theme) {\n
+    this.setTheme = function(theme, cb) {\n
         var _self = this;\n
         this.$themeValue = theme;\n
         _self._dispatchEvent(\'themeChange\',{theme:theme});\n
@@ -12824,7 +13649,7 @@ var VirtualRenderer = function(container, theme) {\n
 \n
         function afterLoad(module) {\n
             if (_self.$themeValue != theme)\n
-                return;\n
+                return cb && cb();\n
             if (!module.cssClass)\n
                 return;\n
             dom.importCssString(\n
@@ -12841,7 +13666,7 @@ var VirtualRenderer = function(container, theme) {\n
             dom.addCssClass(_self.container, module.cssClass);\n
             dom.setCssClass(_self.container, "ace_dark", module.isDark);\n
 \n
-            var padding = module.padding || 4;\n
+            var padding = "padding" in module ? module.padding : 4;\n
             if (_self.$padding && padding != _self.$padding)\n
                 _self.setPadding(padding);\n
             if (_self.$size) {\n
@@ -12849,18 +13674,22 @@ var VirtualRenderer = function(container, theme) {\n
                 _self.onResize();\n
             }\n
 \n
-            _self._dispatchEvent(\'themeLoaded\',{theme:module});\n
+            _self._dispatchEvent(\'themeLoaded\', {theme:module});\n
+            cb && cb();\n
         }\n
     };\n
     this.getTheme = function() {\n
         return this.$themeValue;\n
     };\n
-    this.setStyle = function setStyle(style, include) {\n
+    this.setStyle = function(style, include) {\n
         dom.setCssClass(this.container, style, include != false);\n
     };\n
-    this.unsetStyle = function unsetStyle(style) {\n
+    this.unsetStyle = function(style) {\n
         dom.removeCssClass(this.container, style);\n
     };\n
+    this.setMouseCursor = function(cursorStyle) {\n
+        this.content.style.cursor = cursorStyle;\n
+    };\n
     this.destroy = function() {\n
         this.$textLayer.destroy();\n
         this.$cursorLayer.destroy();\n
@@ -12938,13 +13767,19 @@ config.defineOptions(VirtualRenderer.prototype, "renderer", {\n
         value: true\n
     },\n
     hScrollBarAlwaysVisible: {\n
-        set: function(alwaysVisible) {\n
-            this.$hScrollBarAlwaysVisible = alwaysVisible;\n
+        set: function(val) {\n
             if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n
                 this.$loop.schedule(this.CHANGE_SCROLL);\n
         },\n
         initialValue: false\n
     },\n
+    vScrollBarAlwaysVisible: {\n
+        set: function(val) {\n
+            if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n
+                this.$loop.schedule(this.CHANGE_SCROLL);\n
+        },\n
+        initialValue: false\n
+    },\n
     fontSize:  {\n
         set: function(size) {\n
             if (typeof size == "number")\n
@@ -12959,6 +13794,33 @@ config.defineOptions(VirtualRenderer.prototype, "renderer", {\n
             this.container.style.fontFamily = name;\n
             this.updateFontSize();\n
         }\n
+    },\n
+    maxLines: {\n
+        set: function(val) {\n
+            this.updateFull();\n
+        }\n
+    },\n
+    minLines: {\n
+        set: function(val) {\n
+            this.updateFull();\n
+        }\n
+    },\n
+    scrollPastEnd: {\n
+        set: function(val) {\n
+            val = +val || 0;\n
+            if (this.$scrollPastEnd == val)\n
+                return;\n
+            this.$scrollPastEnd = val;\n
+            this.$loop.schedule(this.CHANGE_SCROLL);\n
+        },\n
+        initialValue: 0,\n
+        handlesSet: true\n
+    },\n
+    fixedWidthGutter: {\n
+        set: function(val) {\n
+            this.$gutterLayer.$fixedWidth = !!val;\n
+            this.$loop.schedule(this.CHANGE_GUTTER);\n
+        }\n
     }\n
 });\n
 \n
@@ -12983,6 +13845,8 @@ var Gutter = function(parentEl) {\n
 \n
     this.$annotations = [];\n
     this.$updateAnnotations = this.$updateAnnotations.bind(this);\n
+\n
+    this.$cells = [];\n
 };\n
 \n
 (function() {\n
@@ -13052,11 +13916,9 @@ var Gutter = function(parentEl) {\n
     };\n
 \n
     this.update = function(config) {\n
-        var emptyAnno = {className: ""};\n
-        var html = [];\n
-        var i = config.firstRow;\n
+        var firstRow = config.firstRow;\n
         var lastRow = config.lastRow;\n
-        var fold = this.session.getNextFoldLine(i);\n
+        var fold = this.session.getNextFoldLine(firstRow);\n
         var foldStart = fold ? fold.start.row : Infinity;\n
         var foldWidgets = this.$showFoldWidgets && this.session.foldWidgets;\n
         var breakpoints = this.session.$breakpoints;\n
@@ -13064,57 +13926,100 @@ var Gutter = function(parentEl) {\n
         var firstLineNumber = this.session.$firstLineNumber;\n
         var lastLineNumber = 0;\n
 \n
+        var cell = null;\n
+        var index = -1;\n
+        var row = firstRow;\n
         while (true) {\n
-            if(i > foldStart) {\n
-                i = fold.end.row + 1;\n
-                fold = this.session.getNextFoldLine(i, fold);\n
-                foldStart = fold ?fold.start.row :Infinity;\n
+            if (row > foldStart) {\n
+                row = fold.end.row + 1;\n
+                fold = this.session.getNextFoldLine(row, fold);\n
+                foldStart = fold ? fold.start.row : Infinity;\n
             }\n
-            if(i > lastRow)\n
+            if (row > lastRow) {\n
+                while (this.$cells.length > index + 1) {\n
+                    cell = this.$cells.pop();\n
+                    this.element.removeChild(cell.element);\n
+                }\n
                 break;\n
+            }\n
 \n
-            var annotation = this.$annotations[i] || emptyAnno;\n
-            html.push(\n
-                "<div class=\'ace_gutter-cell ",\n
-                breakpoints[i] || "", decorations[i] || "", annotation.className,\n
-                "\' style=\'height:", this.session.getRowLength(i) * config.lineHeight, "px;\'>", \n
-                lastLineNumber = i + firstLineNumber\n
-            );\n
+            cell = this.$cells[++index];\n
+            if (!cell) {\n
+                cell = {element: null, textNode: null, foldWidget: null};\n
+                cell.element = dom.createElement("div");\n
+                cell.textNode = document.createTextNode(\'\');\n
+                cell.element.appendChild(cell.textNode);\n
+                this.element.appendChild(cell.element);\n
+                this.$cells[index] = cell;\n
+            }\n
+\n
+            var className = "ace_gutter-cell ";\n
+            if (breakpoints[row])\n
+                className += breakpoints[row];\n
+            if (decorations[row])\n
+                className += decorations[row];\n
+            if (this.$annotations[row])\n
+                className += this.$annotations[row].className;\n
+            if (cell.element.className != className)\n
+                cell.element.className = className;\n
+\n
+            var height = this.session.getRowLength(row) * config.lineHeight + "px";\n
+            if (height != cell.element.style.height)\n
+                cell.element.style.height = height;\n
+\n
+            var text = lastLineNumber = row + firstLineNumber;\n
+            if (text != cell.textNode.data)\n
+                cell.textNode.data  = text;\n
 \n
             if (foldWidgets) {\n
-                var c = foldWidgets[i];\n
+                var c = foldWidgets[row];\n
                 if (c == null)\n
-                    c = foldWidgets[i] = this.session.getFoldWidget(i);\n
-                if (c)\n
-                    html.push(\n
-                        "<span class=\'ace_fold-widget ace_", c,\n
-                        c == "start" && i == foldStart && i < fold.end.row ? " ace_closed" : " ace_open",\n
-                        "\' style=\'height:", config.lineHeight, "px",\n
-                        "\'></span>"\n
-                    );\n
+                    c = foldWidgets[row] = this.session.getFoldWidget(row);\n
             }\n
 \n
-            html.push("</div>");\n
+            if (c) {\n
+                if (!cell.foldWidget) {\n
+                    cell.foldWidget = dom.createElement("span");\n
+                    cell.element.appendChild(cell.foldWidget);\n
+                }\n
+                var className = "ace_fold-widget ace_" + c;\n
+                if (c == "start" && row == foldStart && row < fold.end.row)\n
+                    className += " ace_closed";\n
+                else\n
+                    className += " ace_open";\n
+                if (cell.foldWidget.className != className)\n
+                    cell.foldWidget.className = className;\n
+\n
+                var height = config.lineHeight + "px";\n
+                if (cell.foldWidget.style.height != height)\n
+                    cell.foldWidget.style.height = height;\n
+            } else {\n
+                if (cell.foldWidget != null) {\n
+                    cell.element.removeChild(cell.foldWidget);\n
+                    cell.foldWidget = null;\n
+                }\n
+            }\n
 \n
-            i++;\n
+            row++;\n
         }\n
 \n
-        this.element = dom.setInnerHtml(this.element, html.join(""));\n
         this.element.style.height = config.minHeight + "px";\n
-        \n
-        if (this.session.$useWrapMode)\n
+\n
+        if (this.$fixedWidth || this.session.$useWrapMode)\n
             lastLineNumber = this.session.getLength();\n
-        \n
-        var gutterWidth = ("" + lastLineNumber).length * config.characterWidth;\n
+\n
+        var gutterWidth = lastLineNumber.toString().length * config.characterWidth;\n
         var padding = this.$padding || this.$computePadding();\n
         gutterWidth += padding.left + padding.right;\n
-        if (gutterWidth !== this.gutterWidth) {\n
+        if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n
             this.gutterWidth = gutterWidth;\n
             this.element.style.width = Math.ceil(this.gutterWidth) + "px";\n
             this._emit("changeGutterWidth", gutterWidth);\n
         }\n
     };\n
 \n
+    this.$fixedWidth = false;\n
+    \n
     this.$showFoldWidgets = true;\n
     this.setShowFoldWidgets = function(show) {\n
         if (show)\n
@@ -13134,9 +14039,9 @@ var Gutter = function(parentEl) {\n
         if (!this.element.firstChild)\n
             return {left: 0, right: 0};\n
         var style = dom.computedStyle(this.element.firstChild);\n
-        this.$padding = {}\n
-        this.$padding.left = parseInt(style.paddingLeft) + 1;\n
-        this.$padding.right = parseInt(style.paddingRight);  \n
+        this.$padding = {};\n
+        this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n
+        this.$padding.right = parseInt(style.paddingRight) || 0;\n
         return this.$padding;\n
     };\n
 \n
@@ -13365,11 +14270,11 @@ var Text = function(parentEl) {\n
     };\n
 \n
     this.getLineHeight = function() {\n
-        return this.$characterSize.height || 1;\n
+        return this.$characterSize.height || 0;\n
     };\n
 \n
     this.getCharacterWidth = function() {\n
-        return this.$characterSize.width || 1;\n
+        return this.$characterSize.width || 0;\n
     };\n
 \n
     this.checkForSizeChanges = function() {\n
@@ -13452,8 +14357,7 @@ var Text = function(parentEl) {\n
             style.position = "fixed";\n
             style.overflow = "visible";\n
             style.whiteSpace = "nowrap";\n
-\n
-            measureNode.innerHTML = "X";\n
+            measureNode.innerHTML = lang.stringRepeat("X", 100);\n
 \n
             var container = this.element.parentNode;\n
             while (container && !dom.hasCssClass(container, "ace_editor"))\n
@@ -13469,7 +14373,7 @@ var Text = function(parentEl) {\n
 \n
         var size = {\n
             height: rect.height,\n
-            width: rect.width\n
+            width: rect.width / 100\n
         };\n
         if (size.width == 0 || size.height == 0)\n
             return null;\n
@@ -13739,39 +14643,16 @@ var Text = function(parentEl) {\n
         return screenColumn + value.length;\n
     };\n
 \n
-    this.renderIndentGuide = function(stringBuilder, value) {\n
+    this.renderIndentGuide = function(stringBuilder, value, max) {\n
         var cols = value.search(this.$indentGuideRe);\n
-        if (cols <= 0)\n
+        if (cols <= 0 || cols >= max)\n
             return value;\n
         if (value[0] == " ") {\n
             cols -= cols % this.tabSize;\n
             stringBuilder.push(lang.stringRepeat(this.$tabStrings[" "], cols/this.tabSize));\n
             return value.substr(cols);\n
         } else if (value[0] == "\\t") {\n
-            stringBuilde
-
-]]></string> </value>
-        </item>
-        <item>
-            <key> <string>next</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAk=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="9" aka="AAAAAAAAAAk=">
-    <pickle>
-      <global name="Pdata" module="OFS.Image"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value> <string encoding="cdata"><![CDATA[
-
-r.push(lang.stringRepeat(this.$tabStrings["\\t"], cols));\n
+            stringBuilder.push(lang.stringRepeat(this.$tabStrings["\\t"], cols));\n
             return value.substr(cols);\n
         }\n
         return value;\n
@@ -13788,7 +14669,7 @@ r.push(lang.stringRepeat(this.$tabStrings["\\t"], cols));\n
             var value = token.value;\n
             if (i == 0 && this.displayIndentGuides) {\n
                 chars = value.length;\n
-                value = this.renderIndentGuide(stringBuilder, value);\n
+                value = this.renderIndentGuide(stringBuilder, value, splitChars);\n
                 if (!value)\n
                     continue;\n
                 chars -= value.length;\n
@@ -13846,7 +14727,30 @@ r.push(lang.stringRepeat(this.$tabStrings["\\t"], cols));\n
             foldLine = this.session.getFoldLine(row);\n
 \n
         if (foldLine)\n
-            var tokens = this.$getFoldLineTokens(row, foldLine);\n
+            var tokens = this.$getFoldLineTokens(row, f
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAk=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="9" aka="AAAAAAAAAAk=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+oldLine);\n
         else\n
             var tokens = this.session.getTokens(row);\n
 \n
@@ -14149,7 +15053,7 @@ var oop = require("./lib/oop");\n
 var dom = require("./lib/dom");\n
 var event = require("./lib/event");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
-var ScrollBar = function(parent) {\n
+var ScrollBarV = function(parent, renderer) {\n
     this.element = dom.createElement("div");\n
     this.element.className = "ace_scrollbar";\n
 \n
@@ -14158,40 +15062,111 @@ var ScrollBar = function(parent) {\n
     this.element.appendChild(this.inner);\n
 \n
     parent.appendChild(this.element);\n
+    renderer.$scrollbarWidth = \n
     this.width = dom.scrollbarWidth(parent.ownerDocument);\n
+    renderer.$scrollbarWidth = \n
+    this.width = dom.scrollbarWidth(parent.ownerDocument);\n
+    this.fullWidth = this.width;\n
+    this.inner.style.width =\n
     this.element.style.width = (this.width || 15) + 5 + "px";\n
+    this.setVisible(false);\n
+    this.element.style.overflowY = "scroll";\n
+    \n
+    event.addListener(this.element, "scroll", this.onScrollV.bind(this));\n
+    event.addListener(this.element, "mousedown", event.preventDefault);\n
+};\n
+\n
+var ScrollBarH = function(parent, renderer) {\n
+    this.element = dom.createElement("div");\n
+    this.element.className = "ace_scrollbar-h";\n
+\n
+    this.inner = dom.createElement("div");\n
+    this.inner.className = "ace_scrollbar-inner";\n
+    this.element.appendChild(this.inner);\n
 \n
-    event.addListener(this.element, "scroll", this.onScroll.bind(this));\n
+    parent.appendChild(this.element);\n
+    this.height = renderer.$scrollbarWidth;\n
+    this.fullHeight = this.height;\n
+    this.inner.style.height =\n
+    this.element.style.height = (this.height || 15) + 5 + "px";\n
+    this.setVisible(false);\n
+    this.element.style.overflowX = "scroll";\n
+\n
+    event.addListener(this.element, "scroll", this.onScrollH.bind(this));\n
+    event.addListener(this.element, "mousedown", event.preventDefault);\n
 };\n
 \n
 (function() {\n
     oop.implement(this, EventEmitter);\n
-    this.onScroll = function() {\n
+\n
+    this.setVisible = function(show) {\n
+        if (show) {\n
+            this.element.style.display = "";\n
+            if (this.fullWidth)\n
+                this.width = this.fullWidth;\n
+            if (this.fullHeight)\n
+                this.height = this.fullHeight;\n
+        } else {\n
+            this.element.style.display = "none";\n
+            this.height = this.width = 0;\n
+        }\n
+    };\n
+    this.onScrollV = function() {\n
         if (!this.skipEvent) {\n
             this.scrollTop = this.element.scrollTop;\n
             this._emit("scroll", {data: this.scrollTop});\n
         }\n
         this.skipEvent = false;\n
     };\n
+    this.onScrollH = function() {\n
+        if (!this.skipEvent) {\n
+            this.scrollLeft = this.element.scrollLeft;\n
+            this._emit("scroll", {data: this.scrollLeft});\n
+        }\n
+        this.skipEvent = false;\n
+    };\n
     this.getWidth = function() {\n
         return this.width;\n
     };\n
+\n
+    this.getHeight = function() {\n
+        return this.height;\n
+    };\n
     this.setHeight = function(height) {\n
         this.element.style.height = height + "px";\n
     };\n
+    \n
+    this.setWidth = function(width) {\n
+        this.element.style.width = width + "px";\n
+    };\n
     this.setInnerHeight = function(height) {\n
         this.inner.style.height = height + "px";\n
     };\n
+    \n
+    this.setInnerWidth = function(width) {\n
+        this.inner.style.width = width + "px";\n
+    };\n
     this.setScrollTop = function(scrollTop) {\n
         if (this.scrollTop != scrollTop) {\n
             this.skipEvent = true;\n
             this.scrollTop = this.element.scrollTop = scrollTop;\n
         }\n
     };\n
+    this.setScrollLeft = function(scrollLeft) {\n
+        if (this.scrollLeft != scrollLeft) {\n
+            this.skipEvent = true;\n
+            this.scrollLeft = this.element.scrollLeft = scrollLeft;\n
+        }\n
+    };\n
 \n
-}).call(ScrollBar.prototype);\n
+}).call(ScrollBarV.prototype);\n
+ScrollBarH.prototype = ScrollBarV.prototype;\n
 \n
-exports.ScrollBar = ScrollBar;\n
+\n
+\n
+exports.ScrollBar = ScrollBarV; // backward compatibility\n
+exports.ScrollBarV = ScrollBarV;\n
+exports.ScrollBarH = ScrollBarH;\n
 });\n
 \n
 define(\'ace/renderloop\', [\'require\', \'exports\', \'module\' , \'ace/lib/event\'], function(require, exports, module) {\n
@@ -14231,7 +15206,7 @@ var RenderLoop = function(onRender, win) {\n
 exports.RenderLoop = RenderLoop;\n
 });\n
 \n
-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\'], function(require, exports, module) {\n
+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) {\n
 \n
 var RangeList = require("./range_list").RangeList;\n
 var Range = require("./range").Range;\n
@@ -14360,7 +15335,7 @@ var EditSession = require("./edit_session").EditSession;\n
         this.rangeCount = 0;\n
     };\n
     this.getAllRanges = function() {\n
-        return this.rangeList.ranges.concat();\n
+        return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n
     };\n
 \n
     this.splitIntoLines = function () {\n
@@ -14629,7 +15604,7 @@ var Editor = require("./editor").Editor;\n
         this.multiSelect.toSingleRange();\n
     };\n
 \n
-    this.getCopyText = function() {\n
+    this.getSelectedText = function() {\n
         var text = "";\n
         if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n
             var ranges = this.multiSelect.rangeList.ranges;\n
@@ -14644,7 +15619,6 @@ var Editor = require("./editor").Editor;\n
         } else if (!this.selection.isEmpty()) {\n
             text = this.session.getTextRange(this.getSelectionRange());\n
         }\n
-        this._signal("copy", text);\n
         return text;\n
     };\n
     this.onPaste = function(text) {\n
@@ -14771,8 +15745,9 @@ var Editor = require("./editor").Editor;\n
         var range = sel.toOrientedRange();\n
         if (range.isEmpty()) {\n
             var range = session.getWordRange(range.start.row, range.start.column);\n
-            range.cursor = range.end;\n
+            range.cursor = dir == -1 ? range.start : range.end;\n
             this.multiSelect.addRange(range);\n
+            return;\n
         }\n
         var needle = session.getTextRange(range);\n
 \n
@@ -14928,13 +15903,16 @@ exports.onSessionChange = function(e) {\n
     }\n
 };\n
 function MultiSelect(editor) {\n
+    if (editor.$multiselectOnSessionChange)\n
+        return;\n
     editor.$onAddRange = editor.$onAddRange.bind(editor);\n
     editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n
     editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n
     editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n
+    editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n
 \n
-    exports.onSessionChange.call(editor, editor);\n
-    editor.on("changeSession", exports.onSessionChange.bind(editor));\n
+    editor.$multiselectOnSessionChange(editor);\n
+    editor.on("changeSession", editor.$multiselectOnSessionChange);\n
 \n
     editor.on("mousedown", onMouseDown);\n
     editor.commands.addCommands(commands.defaultCommands);\n
@@ -14945,23 +15923,22 @@ function MultiSelect(editor) {\n
 function addAltCursorListeners(editor){\n
     var el = editor.textInput.getElement();\n
     var altCursor = false;\n
-    var contentEl = editor.renderer.content;\n
     event.addListener(el, "keydown", function(e) {\n
         if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) {\n
             if (!altCursor) {\n
-                contentEl.style.cursor = "crosshair";\n
+                editor.renderer.setMouseCursor("crosshair");\n
                 altCursor = true;\n
             }\n
         } else if (altCursor) {\n
-            contentEl.style.cursor = "";\n
+            reset();\n
         }\n
     });\n
 \n
     event.addListener(el, "keyup", reset);\n
     event.addListener(el, "blur", reset);\n
-    function reset() {\n
+    function reset(e) {\n
         if (altCursor) {\n
-            contentEl.style.cursor = "";\n
+            editor.renderer.setMouseCursor("");\n
             altCursor = false;\n
         }\n
     }\n
@@ -14969,6 +15946,25 @@ function addAltCursorListeners(editor){\n
 \n
 exports.MultiSelect = MultiSelect;\n
 \n
+\n
+require("./config").defineOptions(Editor.prototype, "editor", {\n
+    enableMultiselect: {\n
+        set: function(val) {\n
+            MultiSelect(this);\n
+            if (val) {\n
+                this.on("changeSession", this.$multiselectOnSessionChange);\n
+                this.on("mousedown", onMouseDown);\n
+            } else {\n
+                this.off("changeSession", this.$multiselectOnSessionChange);\n
+                this.off("mousedown", onMouseDown);\n
+            }\n
+        },\n
+        value: true\n
+    }\n
+})\n
+\n
+\n
+\n
 });\n
 \n
 define(\'ace/mouse/multi_select_handler\', [\'require\', \'exports\', \'module\' , \'ace/lib/event\'], function(require, exports, module) {\n
@@ -15248,6 +16244,7 @@ var WorkerClient = function(topLevelNamespaces, mod, classname) {\n
 \n
     this.terminate = function() {\n
         this._emit("terminate", {});\n
+        this.deltaQueue = null;\n
         this.$worker.terminate();\n
         this.$worker = null;\n
         this.$doc.removeEventListener("change", this.changeListener);\n
@@ -15634,11 +16631,7 @@ background-color: #6B72E6;\\\n
 background-color: #FFFFFF;\\\n
 }\\\n
 .ace-tm .ace_cursor {\\\n
-border-left: 2px solid black;\\\n
-}\\\n
-.ace-tm .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid black;\\\n
+color: black;\\\n
 }\\\n
 .ace-tm .ace_invisible {\\\n
 color: rgb(191, 191, 191);\\\n
@@ -15700,10 +16693,10 @@ color: rgb(104, 104, 91);\\\n
 .ace-tm .ace_entity.ace_name.ace_function {\\\n
 color: #0000A2;\\\n
 }\\\n
-.ace-tm .ace_markup.ace_heading {\\\n
+.ace-tm .ace_heading {\\\n
 color: rgb(12, 7, 255);\\\n
 }\\\n
-.ace-tm .ace_markup.ace_list {\\\n
+.ace-tm .ace_list {\\\n
 color:rgb(185, 6, 144);\\\n
 }\\\n
 .ace-tm .ace_meta.ace_tag {\\\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-chromevox.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-chromevox.js.xml
new file mode 100644
index 0000000000..815cafcbe1
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-chromevox.js.xml
@@ -0,0 +1,581 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.42</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>ext-chromevox.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+define(\'ace/ext/chromevox\', [\'require\', \'exports\', \'module\' , \'ace/editor\', \'ace/config\'], function(require, exports, module) {\n
+var cvoxAce = {};\n
+cvoxAce.SpeechProperty;\n
+cvoxAce.Cursor;\n
+cvoxAce.Token;\n
+cvoxAce.Annotation;\n
+var CONSTANT_PROP = {\n
+  \'rate\': 0.8,\n
+  \'pitch\': 0.4,\n
+  \'volume\': 0.9\n
+};\n
+var DEFAULT_PROP = {\n
+  \'rate\': 1,\n
+  \'pitch\': 0.5,\n
+  \'volume\': 0.9\n
+};\n
+var ENTITY_PROP = {\n
+  \'rate\': 0.8,\n
+  \'pitch\': 0.8,\n
+  \'volume\': 0.9\n
+};\n
+var KEYWORD_PROP = {\n
+  \'rate\': 0.8,\n
+  \'pitch\': 0.3,\n
+  \'volume\': 0.9\n
+};\n
+var STORAGE_PROP = {\n
+  \'rate\': 0.8,\n
+  \'pitch\': 0.7,\n
+  \'volume\': 0.9\n
+};\n
+var VARIABLE_PROP = {\n
+  \'rate\': 0.8,\n
+  \'pitch\': 0.8,\n
+  \'volume\': 0.9\n
+};\n
+var DELETED_PROP = {\n
+  \'punctuationEcho\': \'none\',\n
+  \'relativePitch\': -0.6\n
+};\n
+var ERROR_EARCON = \'ALERT_NONMODAL\';\n
+var MODE_SWITCH_EARCON = \'ALERT_MODAL\';\n
+var NO_MATCH_EARCON = \'INVALID_KEYPRESS\';\n
+var INSERT_MODE_STATE = \'insertMode\';\n
+var COMMAND_MODE_STATE = \'start\';\n
+\n
+var REPLACE_LIST = [\n
+  {\n
+    substr: \';\',\n
+    newSubstr: \' semicolon \'\n
+  },\n
+  {\n
+    substr: \':\',\n
+    newSubstr: \' colon \'\n
+  }\n
+];\n
+var Command = {\n
+  SPEAK_ANNOT: \'annots\',\n
+  SPEAK_ALL_ANNOTS: \'all_annots\',\n
+  TOGGLE_LOCATION: \'toggle_location\',\n
+  SPEAK_MODE: \'mode\',\n
+  SPEAK_ROW_COL: \'row_col\',\n
+  TOGGLE_DISPLACEMENT: \'toggle_displacement\',\n
+  FOCUS_TEXT: \'focus_text\'\n
+};\n
+var KEY_PREFIX = \'CONTROL + SHIFT \';\n
+cvoxAce.editor = null;\n
+var lastCursor = null;\n
+var annotTable = {};\n
+var shouldSpeakRowLocation = false;\n
+var shouldSpeakDisplacement = false;\n
+var changed = false;\n
+var vimState = null;\n
+var keyCodeToShortcutMap = {};\n
+var cmdToShortcutMap = {};\n
+var getKeyShortcutString = function(keyCode) {\n
+  return KEY_PREFIX + String.fromCharCode(keyCode);\n
+};\n
+var isVimMode = function() {\n
+  var keyboardHandler = cvoxAce.editor.keyBinding.getKeyboardHandler();\n
+  return keyboardHandler.$id === \'ace/keyboard/vim\';\n
+};\n
+var getCurrentToken = function(cursor) {\n
+  return cvoxAce.editor.getSession().getTokenAt(cursor.row, cursor.column + 1);\n
+};\n
+var getCurrentLine = function(cursor) {\n
+  return cvoxAce.editor.getSession().getLine(cursor.row);\n
+};\n
+var onRowChange = function(currCursor) {\n
+  if (annotTable[currCursor.row]) {\n
+    cvox.Api.playEarcon(ERROR_EARCON);\n
+  }\n
+  if (shouldSpeakRowLocation) {\n
+    cvox.Api.stop();\n
+    speakChar(currCursor);\n
+    speakTokenQueue(getCurrentToken(currCursor));\n
+    speakLine(currCursor.row, 1);\n
+  } else {\n
+    speakLine(currCursor.row, 0);\n
+  }\n
+};\n
+var isWord = function(cursor) {\n
+  var line = getCurrentLine(cursor);\n
+  var lineSuffix = line.substr(cursor.column - 1);\n
+  if (cursor.column === 0) {\n
+    lineSuffix = \' \' + line;\n
+  }\n
+  var firstWordRegExp = /^\\W(\\w+)/;\n
+  var words = firstWordRegExp.exec(lineSuffix);\n
+  return words !== null;\n
+};\n
+var rules = {\n
+  \'constant\': {\n
+    prop: CONSTANT_PROP\n
+  },\n
+  \'entity\': {\n
+    prop: ENTITY_PROP\n
+  },\n
+  \'keyword\': {\n
+    prop: KEYWORD_PROP\n
+  },\n
+  \'storage\': {\n
+    prop: STORAGE_PROP\n
+  },\n
+  \'variable\': {\n
+    prop: VARIABLE_PROP\n
+  },\n
+  \'meta\': {\n
+    prop: DEFAULT_PROP,\n
+    replace: [\n
+      {\n
+        substr: \'</\',\n
+        newSubstr: \' closing tag \'\n
+      },\n
+      {\n
+        substr: \'/>\',\n
+        newSubstr: \' close tag \'\n
+      },\n
+      {\n
+        substr: \'<\',\n
+        newSubstr: \' tag start \'\n
+      },\n
+      {\n
+        substr: \'>\',\n
+        newSubstr: \' tag end \'\n
+      }\n
+    ]\n
+  }\n
+};\n
+var DEFAULT_RULE = {\n
+  prop: DEFAULT_RULE\n
+};\n
+var expand = function(value, replaceRules) {\n
+  var newValue = value;\n
+  for (var i = 0; i < replaceRules.length; i++) {\n
+    var replaceRule = replaceRules[i];\n
+    var regexp = new RegExp(replaceRule.substr, \'g\');\n
+    newValue = newValue.replace(regexp, replaceRule.newSubstr);\n
+  }\n
+  return newValue;\n
+};\n
+var mergeTokens = function(tokens, start, end) {\n
+  var newToken = {};\n
+  newToken.value = \'\';\n
+  newToken.type = tokens[start].type;\n
+  for (var j = start; j < end; j++) {\n
+    newToken.value += tokens[j].value;\n
+  }\n
+  return newToken;\n
+};\n
+var mergeLikeTokens = function(tokens) {\n
+  if (tokens.length <= 1) {\n
+    return tokens;\n
+  }\n
+  var newTokens = [];\n
+  var lastLikeIndex = 0;\n
+  for (var i = 1; i < tokens.length; i++) {\n
+    var lastLikeToken = tokens[lastLikeIndex];\n
+    var currToken = tokens[i];\n
+    if (getTokenRule(lastLikeToken) !== getTokenRule(currToken)) {\n
+      newTokens.push(mergeTokens(tokens, lastLikeIndex, i));\n
+      lastLikeIndex = i;\n
+    }\n
+  }\n
+  newTokens.push(mergeTokens(tokens, lastLikeIndex, tokens.length));\n
+  return newTokens;\n
+};\n
+var isRowWhiteSpace = function(row) {\n
+  var line = cvoxAce.editor.getSession().getLine(row);\n
+  var whiteSpaceRegexp = /^\\s*$/;\n
+  return whiteSpaceRegexp.exec(line) !== null;\n
+};\n
+var speakLine = function(row, queue) {\n
+  var tokens = cvoxAce.editor.getSession().getTokens(row);\n
+  if (tokens.length === 0 || isRowWhiteSpace(row)) {\n
+    cvox.Api.playEarcon(\'EDITABLE_TEXT\');\n
+    return;\n
+  }\n
+  tokens = mergeLikeTokens(tokens);\n
+  var firstToken = tokens[0];\n
+  tokens = tokens.filter(function(token) {\n
+    return token !== firstToken;\n
+  });\n
+  speakToken_(firstToken, queue);\n
+  tokens.forEach(speakTokenQueue);\n
+};\n
+var speakTokenFlush = function(token) {\n
+  speakToken_(token, 0);\n
+};\n
+var speakTokenQueue = function(token) {\n
+  speakToken_(token, 1);\n
+};\n
+var getTokenRule = function(token) {\n
+  if (!token || !token.type) {\n
+    return;\n
+  }\n
+  var split = token.type.split(\'.\');\n
+  if (split.length === 0) {\n
+    return;\n
+  }\n
+  var type = split[0];\n
+  var rule = rules[type];\n
+  if (!rule) {\n
+    return DEFAULT_RULE;\n
+  }\n
+  return rule;\n
+};\n
+var speakToken_ = function(token, queue) {\n
+  var rule = getTokenRule(token);\n
+  var value = expand(token.value, REPLACE_LIST);\n
+  if (rule.replace) {\n
+    value = expand(value, rule.replace);\n
+  }\n
+  cvox.Api.speak(value, queue, rule.prop);\n
+};\n
+var speakChar = function(cursor) {\n
+  var line = getCurrentLine(cursor);\n
+  cvox.Api.speak(line[cursor.column], 1);\n
+};\n
+var speakDisplacement = function(lastCursor, currCursor) {\n
+  var line = getCurrentLine(currCursor);\n
+  var displace = line.substring(lastCursor.column, currCursor.column);\n
+  displace = displace.replace(/ /g, \' space \');\n
+  cvox.Api.speak(displace);\n
+};\n
+var speakCharOrWordOrLine = function(lastCursor, currCursor) {\n
+  if (Math.abs(lastCursor.column - currCursor.column) !== 1) {\n
+    var currLineLength = getCurrentLine(currCursor).length;\n
+    if (currCursor.column === 0 || currCursor.column === currLineLength) {\n
+      speakLine(currCursor.row, 0);\n
+      return;\n
+    }\n
+    if (isWord(currCursor)) {\n
+      cvox.Api.stop();\n
+      speakTokenQueue(getCurrentToken(currCursor));\n
+      return;\n
+    }\n
+  }\n
+  speakChar(currCursor);\n
+};\n
+var onColumnChange = function(lastCursor, currCursor) {\n
+  if (!cvoxAce.editor.selection.isEmpty()) {\n
+    speakDisplacement(lastCursor, currCursor);\n
+    cvox.Api.speak(\'selected\', 1);\n
+  }\n
+  else if (shouldSpeakDisplacement) {\n
+    speakDisplacement(lastCursor, currCursor);\n
+  } else {\n
+    speakCharOrWordOrLine(lastCursor, currCursor);\n
+  }\n
+};\n
+var onCursorChange = function(evt) {\n
+  if (changed) {\n
+    changed = false;\n
+    return;\n
+  }\n
+  var currCursor = cvoxAce.editor.selection.getCursor();\n
+  if (currCursor.row !== lastCursor.row) {\n
+    onRowChange(currCursor);\n
+  } else {\n
+    onColumnChange(lastCursor, currCursor);\n
+  }\n
+  lastCursor = currCursor;\n
+};\n
+var onSelectionChange = function(evt) {\n
+  if (cvoxAce.editor.selection.isEmpty()) {\n
+    cvox.Api.speak(\'unselected\');\n
+  }\n
+};\n
+var onChange = function(evt) {\n
+  var data = evt.data;\n
+  switch (data.action) {\n
+  case \'removeText\':\n
+    cvox.Api.speak(data.text, 0, DELETED_PROP);\n
+    changed = true;\n
+    break;\n
+  case \'insertText\':\n
+    cvox.Api.speak(data.text, 0);\n
+    changed = true;\n
+    break;\n
+  }\n
+};\n
+var isNewAnnotation = function(annot) {\n
+  var row = annot.row;\n
+  var col = annot.column;\n
+  return !annotTable[row] || !annotTable[row][col];\n
+};\n
+var populateAnnotations = function(annotations) {\n
+  annotTable = {};\n
+  for (var i = 0; i < annotations.length; i++) {\n
+    var annotation = annotations[i];\n
+    var row = annotation.row;\n
+    var col = annotation.column;\n
+    if (!annotTable[row]) {\n
+      annotTable[row] = {};\n
+    }\n
+    annotTable[row][col] = annotation;\n
+  }\n
+};\n
+var onAnnotationChange = function(evt) {\n
+  var annotations = cvoxAce.editor.getSession().getAnnotations();\n
+  var newAnnotations = annotations.filter(isNewAnnotation);\n
+  if (newAnnotations.length > 0) {\n
+    cvox.Api.playEarcon(ERROR_EARCON);\n
+  }\n
+  populateAnnotations(annotations);\n
+};\n
+var speakAnnot = function(annot) {\n
+  var annotText = annot.type + \' \' + annot.text + \' on \' +\n
+      rowColToString(annot.row, annot.column);\n
+  annotText = annotText.replace(\';\', \'semicolon\');\n
+  cvox.Api.speak(annotText, 1);\n
+};\n
+var speakAnnotsByRow = function(row) {\n
+  var annots = annotTable[row];\n
+  for (var col in annots) {\n
+    speakAnnot(annots[col]);\n
+  }\n
+};\n
+var rowColToString = function(row, col) {\n
+  return \'row \' + (row + 1) + \' column \' + (col + 1);\n
+};\n
+var speakCurrRowAndCol = function() {\n
+  cvox.Api.speak(rowColToString(lastCursor.row, lastCursor.column));\n
+};\n
+var speakAllAnnots = function() {\n
+  for (var row in annotTable) {\n
+    speakAnnotsByRow(row);\n
+  }\n
+};\n
+var speakMode = function() {\n
+  if (!isVimMode()) {\n
+    return;\n
+  }\n
+  switch (cvoxAce.editor.keyBinding.$data.state) {\n
+  case INSERT_MODE_STATE:\n
+    cvox.Api.speak(\'Insert mode\');\n
+    break;\n
+  case COMMAND_MODE_STATE:\n
+    cvox.Api.speak(\'Command mode\');\n
+    break;\n
+  }\n
+};\n
+var toggleSpeakRowLocation = function() {\n
+  shouldSpeakRowLocation = !shouldSpeakRowLocation;\n
+  if (shouldSpeakRowLocation) {\n
+    cvox.Api.speak(\'Speak location on row change enabled.\');\n
+  } else {\n
+    cvox.Api.speak(\'Speak location on row change disabled.\');\n
+  }\n
+};\n
+var toggleSpeakDisplacement = function() {\n
+  shouldSpeakDisplacement = !shouldSpeakDisplacement;\n
+  if (shouldSpeakDisplacement) {\n
+    cvox.Api.speak(\'Speak displacement on column changes.\');\n
+  } else {\n
+    cvox.Api.speak(\'Speak current character or word on column changes.\');\n
+  }\n
+};\n
+var onKeyDown = function(evt) {\n
+  if (evt.ctrlKey && evt.shiftKey) {\n
+    var shortcut = keyCodeToShortcutMap[evt.keyCode];\n
+    if (shortcut) {\n
+      shortcut.func();\n
+    }\n
+  }\n
+};\n
+var onChangeStatus = function(evt, editor) {\n
+  if (!isVimMode()) {\n
+    return;\n
+  }\n
+  var state = editor.keyBinding.$data.state;\n
+  if (state === vimState) {\n
+    return;\n
+  }\n
+  switch (state) {\n
+  case INSERT_MODE_STATE:\n
+    cvox.Api.playEarcon(MODE_SWITCH_EARCON);\n
+    cvox.Api.setKeyEcho(true);\n
+    break;\n
+  case COMMAND_MODE_STATE:\n
+    cvox.Api.playEarcon(MODE_SWITCH_EARCON);\n
+    cvox.Api.setKeyEcho(false);\n
+    break;\n
+  }\n
+  vimState = state;\n
+};\n
+var contextMenuHandler = function(evt) {\n
+  var cmd = evt.detail[\'customCommand\'];\n
+  var shortcut = cmdToShortcutMap[cmd];\n
+  if (shortcut) {\n
+    shortcut.func();\n
+    cvoxAce.editor.focus();\n
+  }\n
+};\n
+var initContextMenu = function() {\n
+  var ACTIONS = SHORTCUTS.map(function(shortcut) {\n
+    return {\n
+      desc: shortcut.desc + getKeyShortcutString(shortcut.keyCode),\n
+      cmd: shortcut.cmd\n
+    };\n
+  });\n
+  var body = document.querySelector(\'body\');\n
+  body.setAttribute(\'contextMenuActions\', JSON.stringify(ACTIONS));\n
+  body.addEventListener(\'ATCustomEvent\', contextMenuHandler, true);\n
+};\n
+var onFindSearchbox = function(evt) {\n
+  if (evt.match) {\n
+    speakLine(lastCursor.row, 0);\n
+  } else {\n
+    cvox.Api.playEarcon(NO_MATCH_EARCON);\n
+  }\n
+};\n
+var focus = function() {\n
+  cvoxAce.editor.focus();\n
+};\n
+var SHORTCUTS = [\n
+  {\n
+    keyCode: 49,\n
+    func: function() {\n
+      speakAnnotsByRow(lastCursor.row);\n
+    },\n
+    cmd: Command.SPEAK_ANNOT,\n
+    desc: \'Speak annotations on line\'\n
+  },\n
+  {\n
+    keyCode: 50,\n
+    func: speakAllAnnots,\n
+    cmd: Command.SPEAK_ALL_ANNOTS,\n
+    desc: \'Speak all annotations\'\n
+  },\n
+  {\n
+    keyCode: 51,\n
+    func: speakMode,\n
+    cmd: Command.SPEAK_MODE,\n
+    desc: \'Speak Vim mode\'\n
+  },\n
+  {\n
+    keyCode: 52,\n
+    func: toggleSpeakRowLocation,\n
+    cmd: Command.TOGGLE_LOCATION,\n
+    desc: \'Toggle speak row location\'\n
+  },\n
+  {\n
+    keyCode: 53,\n
+    func: speakCurrRowAndCol,\n
+    cmd: Command.SPEAK_ROW_COL,\n
+    desc: \'Speak row and column\'\n
+  },\n
+  {\n
+    keyCode: 54,\n
+    func: toggleSpeakDisplacement,\n
+    cmd: Command.TOGGLE_DISPLACEMENT,\n
+    desc: \'Toggle speak displacement\'\n
+  },\n
+  {\n
+    keyCode: 55,\n
+    func: focus,\n
+    cmd: Command.FOCUS_TEXT,\n
+    desc: \'Focus text\'\n
+  }\n
+];\n
+var onFocus = function() {\n
+  cvoxAce.editor = editor;\n
+  editor.getSession().selection.on(\'changeCursor\', onCursorChange);\n
+  editor.getSession().selection.on(\'changeSelection\', onSelectionChange);\n
+  editor.getSession().on(\'change\', onChange);\n
+  editor.getSession().on(\'changeAnnotation\', onAnnotationChange);\n
+  editor.on(\'changeStatus\', onChangeStatus);\n
+  editor.on(\'findSearchBox\', onFindSearchbox);\n
+  editor.container.addEventListener(\'keydown\', onKeyDown);\n
+\n
+  lastCursor = editor.selection.getCursor();\n
+};\n
+var init = function(editor) {\n
+  onFocus();\n
+  SHORTCUTS.forEach(function(shortcut) {\n
+    keyCodeToShortcutMap[shortcut.keyCode] = shortcut;\n
+    cmdToShortcutMap[shortcut.cmd] = shortcut;\n
+  });\n
+\n
+  editor.on(\'focus\', onFocus);\n
+  if (isVimMode()) {\n
+    cvox.Api.setKeyEcho(false);\n
+  }\n
+  initContextMenu();\n
+};\n
+function cvoxApiExists() {\n
+  return (typeof(cvox) !== \'undefined\') && cvox && cvox.Api;\n
+}\n
+var tries = 0;\n
+var MAX_TRIES = 15;\n
+function watchForCvoxLoad(editor) {\n
+  if (cvoxApiExists()) {\n
+    init(editor);\n
+  } else {\n
+    tries++;\n
+    if (tries >= MAX_TRIES) {\n
+      return;\n
+    }\n
+    window.setTimeout(watchForCvoxLoad, 500, editor);\n
+  }\n
+}\n
+\n
+var Editor = require(\'../editor\').Editor;\n
+require(\'../config\').defineOptions(Editor.prototype, \'editor\', {\n
+  enableChromevoxEnhancements: {\n
+    set: function(val) {\n
+      if (val) {\n
+        watchForCvoxLoad(this);\n
+      }\n
+    },\n
+    value: true // turn it on by default or check for window.cvox\n
+  }\n
+});\n
+\n
+});\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>13509</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-elastic_tabstops_lite.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-elastic_tabstops_lite.js.xml
index 027679c5ac..62516f021d 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-elastic_tabstops_lite.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-elastic_tabstops_lite.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155552.62</string> </value>
+            <value> <string>ts83646622.78</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-emmet.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-emmet.js.xml
index 09980b9f9a..9016ffe4ec 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-emmet.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-emmet.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155552.76</string> </value>
+            <value> <string>ts83646621.47</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -52,10 +52,12 @@
  *\n
  * ***** END LICENSE BLOCK ***** */\n
 \n
-define(\'ace/ext/emmet\', [\'require\', \'exports\', \'module\' , \'ace/keyboard/hash_handler\', \'ace/editor\', \'ace/config\'], function(require, exports, module) {\n
+define(\'ace/ext/emmet\', [\'require\', \'exports\', \'module\' , \'ace/keyboard/hash_handler\', \'ace/editor\', \'ace/snippets\', \'ace/range\', \'ace/config\'], function(require, exports, module) {\n
 \n
 var HashHandler = require("ace/keyboard/hash_handler").HashHandler;\n
 var Editor = require("ace/editor").Editor;\n
+var snippetManager = require("ace/snippets").snippetManager;\n
+var Range = require("ace/range").Range;\n
 var emmet;\n
 \n
 Editor.prototype.indexToPosition = function(index) {\n
@@ -116,39 +118,16 @@ AceEmmetEditor.prototype = {\n
         if (end == null)\n
             end = start == null ? this.getContent().length : start;\n
         if (start == null)\n
-            start = 0;\n
-        var utils = emmet.require("utils");\n
-        if (!noIndent) {\n
-            value = utils.padString(value, utils.getLinePaddingFromPosition(this.getContent(), start));\n
-        }\n
-        var tabstopData = emmet.require("tabStops").extract(value, {\n
-            escape: function(ch) {\n
-                return ch;\n
-            }\n
-        });\n
-\n
-        value = tabstopData.text;\n
-        var firstTabStop = tabstopData.tabstops[0];\n
-\n
-        if (firstTabStop) {\n
-            firstTabStop.start += start;\n
-            firstTabStop.end += start;\n
-        } else {\n
-            firstTabStop = {\n
-                start: value.length + start,\n
-                end: value.length + start\n
-            };\n
-        }\n
-\n
-        var range = this.ace.getSelectionRange();\n
-        range.start = this.ace.indexToPosition(start);\n
-        range.end = this.ace.indexToPosition(end);\n
-\n
-        this.ace.session.replace(range, value);\n
-\n
-        range.start = this.ace.indexToPosition(firstTabStop.start);\n
-        range.end = this.ace.indexToPosition(firstTabStop.end);\n
-        this.ace.selection.setRange(range);\n
+            start = 0;        \n
+        \n
+        var editor = this.ace;\n
+        var range = Range.fromPoints(editor.indexToPosition(start), editor.indexToPosition(end));\n
+        editor.session.remove(range);\n
+        \n
+        range.end = range.start;\n
+        \n
+        value = this.$updateTabstops(value);\n
+        snippetManager.insertSnippet(editor, value)\n
     },\n
     getContent: function(){\n
         return this.ace.getValue();\n
@@ -194,6 +173,52 @@ AceEmmetEditor.prototype = {\n
     },\n
     getFilePath: function() {\n
         return "";\n
+    },\n
+    $updateTabstops: function(value) {\n
+        var base = 1000;\n
+        var zeroBase = 0;\n
+        var lastZero = null;\n
+        var range = emmet.require(\'range\');\n
+        var ts = emmet.require(\'tabStops\');\n
+        var settings = emmet.require(\'resources\').getVocabulary("user");\n
+        var tabstopOptions = {\n
+            tabstop: function(data) {\n
+                var group = parseInt(data.group, 10);\n
+                var isZero = group === 0;\n
+                if (isZero)\n
+                    group = ++zeroBase;\n
+                else\n
+                    group += base;\n
+\n
+                var placeholder = data.placeholder;\n
+                if (placeholder) {\n
+                    placeholder = ts.processText(placeholder, tabstopOptions);\n
+                }\n
+\n
+                var result = \'${\' + group + (placeholder ? \':\' + placeholder : \'\') + \'}\';\n
+\n
+                if (isZero) {\n
+                    lastZero = range.create(data.start, result);\n
+                }\n
+\n
+                return result\n
+            },\n
+            escape: function(ch) {\n
+                if (ch == \'$\') return \'\\\\$\';\n
+                if (ch == \'\\\\\') return \'\\\\\\\\\';\n
+                return ch;\n
+            }\n
+        };\n
+\n
+        value = ts.processText(value, tabstopOptions);\n
+\n
+        if (settings.variables[\'insert_final_tabstop\'] && !/\\$\\{0\\}$/.test(value)) {\n
+            value += \'${0}\';\n
+        } else if (lastZero) {\n
+            value = emmet.require(\'utils\').replaceSubstring(value, \'${0}\', lastZero);\n
+        }\n
+        \n
+        return value;\n
     }\n
 };\n
 \n
@@ -267,7 +292,7 @@ var onChangeMode = function(e, target) {\n
     if (!editor)\n
         return;\n
     var modeId = editor.session.$modeId;\n
-    var enabled = modeId && /css|less|sass|html|php/.test(modeId);\n
+    var enabled = modeId && /css|less|scss|sass|stylus|html|php/.test(modeId);\n
     if (e.enableEmmet === false)\n
         enabled = false;\n
     if (enabled)\n
@@ -292,6 +317,807 @@ require("ace/config").defineOptions(Editor.prototype, "editor", {\n
 exports.setCore = function(e) {emmet = e;};\n
 });\n
 \n
+define(\'ace/snippets\', [\'require\', \'exports\', \'module\' , \'ace/lib/lang\', \'ace/range\', \'ace/keyboard/hash_handler\', \'ace/tokenizer\', \'ace/lib/dom\'], function(require, exports, module) {\n
+\n
+var lang = require("./lib/lang")\n
+var Range = require("./range").Range\n
+var HashHandler = require("./keyboard/hash_handler").HashHandler;\n
+var Tokenizer = require("./tokenizer").Tokenizer;\n
+var comparePoints = Range.comparePoints;\n
+\n
+var SnippetManager = function() {\n
+    this.snippetMap = {};\n
+    this.snippetNameMap = {};\n
+};\n
+\n
+(function() {\n
+    this.getTokenizer = function() {\n
+        function TabstopToken(str, _, stack) {\n
+            str = str.substr(1);\n
+            if (/^\\d+$/.test(str) && !stack.inFormatString)\n
+                return [{tabstopId: parseInt(str, 10)}];\n
+            return [{text: str}]\n
+        }\n
+        function escape(ch) {\n
+            return "(?:[^\\\\\\\\" + ch + "]|\\\\\\\\.)";\n
+        }\n
+        SnippetManager.$tokenizer = new Tokenizer({\n
+            start: [\n
+                {regex: /:/, onMatch: function(val, state, stack) {\n
+                    if (stack.length && stack[0].expectIf) {\n
+                        stack[0].expectIf = false;\n
+                        stack[0].elseBranch = stack[0];\n
+                        return [stack[0]];\n
+                    }\n
+                    return ":";\n
+                }},\n
+                {regex: /\\\\./, onMatch: function(val, state, stack) {\n
+                    var ch = val[1];\n
+                    if (ch == "}" && stack.length) {\n
+                        val = ch;\n
+                    }else if ("`$\\\\".indexOf(ch) != -1) {\n
+                        val = ch;\n
+                    } else if (stack.inFormatString) {\n
+                        if (ch == "n")\n
+                            val = "\\n";\n
+                        else if (ch == "t")\n
+                            val = "\\n";\n
+                        else if ("ulULE".indexOf(ch) != -1) {\n
+                            val = {changeCase: ch, local: ch > "a"};\n
+                        }\n
+                    }\n
+\n
+                    return [val];\n
+                }},\n
+                {regex: /}/, onMatch: function(val, state, stack) {\n
+                    return [stack.length ? stack.shift() : val];\n
+                }},\n
+                {regex: /\\$(?:\\d+|\\w+)/, onMatch: TabstopToken},\n
+                {regex: /\\$\\{[\\dA-Z_a-z]+/, onMatch: function(str, state, stack) {\n
+                    var t = TabstopToken(str.substr(1), state, stack);\n
+                    stack.unshift(t[0]);\n
+                    return t;\n
+                }, next: "snippetVar"},\n
+                {regex: /\\n/, token: "newline", merge: false}\n
+            ],\n
+            snippetVar: [\n
+                {regex: "\\\\|" + escape("\\\\|") + "*\\\\|", onMatch: function(val, state, stack) {\n
+                    stack[0].choices = val.slice(1, -1).split(",");\n
+                }, next: "start"},\n
+                {regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\\\w*):?",\n
+                 onMatch: function(val, state, stack) {\n
+                    var ts = stack[0];\n
+                    ts.fmtString = val;\n
+\n
+                    val = this.splitRegex.exec(val);\n
+                    ts.guard = val[1];\n
+                    ts.fmt = val[2];\n
+                    ts.flag = val[3];\n
+                    return "";\n
+                }, next: "start"},\n
+                {regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) {\n
+                    stack[0].code = val.splice(1, -1);\n
+                    return "";\n
+                }, next: "start"},\n
+                {regex: "\\\\?", onMatch: function(val, state, stack) {\n
+                    if (stack[0])\n
+                        stack[0].expectIf = true;\n
+                }, next: "start"},\n
+                {regex: "([^:}\\\\\\\\]|\\\\\\\\.)*:?", token: "", next: "start"}\n
+            ],\n
+            formatString: [\n
+                {regex: "/(" + escape("/") + "+)/", token: "regex"},\n
+                {regex: "", onMatch: function(val, state, stack) {\n
+                    stack.inFormatString = true;\n
+                }, next: "start"}\n
+            ]\n
+        });\n
+        SnippetManager.prototype.getTokenizer = function() {\n
+            return SnippetManager.$tokenizer;\n
+        }\n
+        return SnippetManager.$tokenizer;\n
+    };\n
+\n
+    this.tokenizeTmSnippet = function(str, startState) {\n
+        return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {\n
+            return x.value || x;\n
+        });\n
+    };\n
+\n
+    this.$getDefaultValue = function(editor, name) {\n
+        if (/^[A-Z]\\d+$/.test(name)) {\n
+            var i = name.substr(1);\n
+            return (this.variables[name[0] + "__"] || {})[i];\n
+        }\n
+        if (/^\\d+$/.test(name)) {\n
+            return (this.variables.__ || {})[name];\n
+        }\n
+        name = name.replace(/^TM_/, "");\n
+\n
+        if (!editor)\n
+            return;\n
+        var s = editor.session;\n
+        switch(name) {\n
+            case "CURRENT_WORD":\n
+                var r = s.getWordRange();\n
+            case "SELECTION":\n
+            case "SELECTED_TEXT":\n
+                return s.getTextRange(r);\n
+            case "CURRENT_LINE":\n
+                return s.getLine(editor.getCursorPosition().row);\n
+            case "PREV_LINE": // not possible in textmate\n
+                return s.getLine(editor.getCursorPosition().row - 1);\n
+            case "LINE_INDEX":\n
+                return editor.getCursorPosition().column;\n
+            case "LINE_NUMBER":\n
+                return editor.getCursorPosition().row + 1;\n
+            case "SOFT_TABS":\n
+                return s.getUseSoftTabs() ? "YES" : "NO";\n
+            case "TAB_SIZE":\n
+                return s.getTabSize();\n
+            case "FILENAME":\n
+            case "FILEPATH":\n
+                return "ace.ajax.org";\n
+            case "FULLNAME":\n
+                return "Ace";\n
+        }\n
+    };\n
+    this.variables = {};\n
+    this.getVariableValue = function(editor, varName) {\n
+        if (this.variables.hasOwnProperty(varName))\n
+            return this.variables[varName](editor, varName) || "";\n
+        return this.$getDefaultValue(editor, varName) || "";\n
+    };\n
+    this.tmStrFormat = function(str, ch, editor) {\n
+        var flag = ch.flag || "";\n
+        var re = ch.guard;\n
+        re = new RegExp(re, flag.replace(/[^gi]/, ""));\n
+        var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString");\n
+        var _self = this;\n
+        var formatted = str.replace(re, function() {\n
+            _self.variables.__ = arguments;\n
+            var fmtParts = _self.resolveVariables(fmtTokens, editor);\n
+            var gChangeCase = "E";\n
+            for (var i  = 0; i < fmtParts.length; i++) {\n
+                var ch = fmtParts[i];\n
+                if (typeof ch == "object") {\n
+                    fmtParts[i] = "";\n
+                    if (ch.changeCase && ch.local) {\n
+                        var next = fmtParts[i + 1];\n
+                        if (next && typeof next == "string") {\n
+                            if (ch.changeCase == "u")\n
+                                fmtParts[i] = next[0].toUpperCase();\n
+                            else\n
+                                fmtParts[i] = next[0].toLowerCase();\n
+                            fmtParts[i + 1] = next.substr(1);\n
+                        }\n
+                    } else if (ch.changeCase) {\n
+                        gChangeCase = ch.changeCase;\n
+                    }\n
+                } else if (gChangeCase == "U") {\n
+                    fmtParts[i] = ch.toUpperCase();\n
+                } else if (gChangeCase == "L") {\n
+                    fmtParts[i] = ch.toLowerCase();\n
+                }\n
+            }\n
+            return fmtParts.join("");\n
+        });\n
+        this.variables.__ = null;\n
+        return formatted;\n
+    };\n
+\n
+    this.resolveVariables = function(snippet, editor) {\n
+        var result = [];\n
+        for (var i = 0; i < snippet.length; i++) {\n
+            var ch = snippet[i];\n
+            if (typeof ch == "string") {\n
+                result.push(ch);\n
+            } else if (typeof ch != "object") {\n
+                continue;\n
+            } else if (ch.skip) {\n
+                gotoNext(ch);\n
+            } else if (ch.processed < i) {\n
+                continue;\n
+            } else if (ch.text) {\n
+                var value = this.getVariableValue(editor, ch.text);\n
+                if (value && ch.fmtString)\n
+                    value = this.tmStrFormat(value, ch);\n
+                ch.processed = i;\n
+                if (ch.expectIf == null) {\n
+                    if (value) {\n
+                        result.push(value);\n
+                        gotoNext(ch);\n
+                    }\n
+                } else {\n
+                    if (value) {\n
+                        ch.skip = ch.elseBranch;\n
+                    } else\n
+                        gotoNext(ch);\n
+                }\n
+            } else if (ch.tabstopId != null) {\n
+                result.push(ch);\n
+            } else if (ch.changeCase != null) {\n
+                result.push(ch);\n
+            }\n
+        }\n
+        function gotoNext(ch) {\n
+            var i1 = snippet.indexOf(ch, i + 1);\n
+            if (i1 != -1)\n
+                i = i1;\n
+        }\n
+        return result;\n
+    };\n
+\n
+    this.insertSnippet = function(editor, snippetText) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = editor.session.getLine(cursor.row);\n
+        var indentString = line.match(/^\\s*/)[0];\n
+        var tabString = editor.session.getTabString();\n
+\n
+        var tokens = this.tokenizeTmSnippet(snippetText);\n
+        tokens = this.resolveVariables(tokens, editor);\n
+        tokens = tokens.map(function(x) {\n
+            if (x == "\\n")\n
+                return x + indentString;\n
+            if (typeof x == "string")\n
+                return x.replace(/\\t/g, tabString);\n
+            return x;\n
+        });\n
+        var tabstops = [];\n
+        tokens.forEach(function(p, i) {\n
+            if (typeof p != "object")\n
+                return;\n
+            var id = p.tabstopId;\n
+            var ts = tabstops[id];\n
+            if (!ts) {\n
+                ts = tabstops[id] = [];\n
+                ts.index = id;\n
+                ts.value = "";\n
+            }\n
+            if (ts.indexOf(p) !== -1)\n
+                return;\n
+            ts.push(p);\n
+            var i1 = tokens.indexOf(p, i + 1);\n
+            if (i1 === -1)\n
+                return;\n
+\n
+            var value = tokens.slice(i + 1, i1);\n
+            var isNested = value.some(function(t) {return typeof t === "object"});          \n
+            if (isNested && !ts.value) {\n
+                ts.value = value;\n
+            } else if (value.length && (!ts.value || typeof ts.value !== "string")) {\n
+                ts.value = value.join("");\n
+            }\n
+        });\n
+        tabstops.forEach(function(ts) {ts.length = 0});\n
+        var expanding = {};\n
+        function copyValue(val) {\n
+            var copy = []\n
+            for (var i = 0; i < val.length; i++) {\n
+                var p = val[i];\n
+                if (typeof p == "object") {\n
+                    if (expanding[p.tabstopId])\n
+                        continue;\n
+                    var j = val.lastIndexOf(p, i - 1);\n
+                    p = copy[j] || {tabstopId: p.tabstopId};\n
+                }\n
+                copy[i] = p;\n
+            }\n
+            return copy;\n
+        }\n
+        for (var i = 0; i < tokens.length; i++) {\n
+            var p = tokens[i];\n
+            if (typeof p != "object")\n
+                continue;\n
+            var id = p.tabstopId;\n
+            var i1 = tokens.indexOf(p, i + 1);\n
+            if (expanding[id] == p) { \n
+                expanding[id] = null;\n
+                continue;\n
+            }\n
+            \n
+            var ts = tabstops[id];\n
+            var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value);\n
+            arg.unshift(i + 1, Math.max(0, i1 - i));\n
+            arg.push(p);\n
+            expanding[id] = p;\n
+            tokens.splice.apply(tokens, arg);\n
+\n
+            if (ts.indexOf(p) === -1)\n
+                ts.push(p);\n
+        };\n
+        var row = 0, column = 0;\n
+        var text = "";\n
+        tokens.forEach(function(t) {\n
+            if (typeof t === "string") {\n
+                if (t[0] === "\\n"){\n
+                    column = t.length - 1;\n
+                    row ++;\n
+                } else\n
+                    column += t.length;\n
+                text += t;\n
+            } else {\n
+                if (!t.start)\n
+                    t.start = {row: row, column: column};\n
+                else\n
+                    t.end = {row: row, column: column};\n
+            }\n
+        });\n
+        var range = editor.getSelectionRange();\n
+        var end = editor.session.replace(range, text);\n
+\n
+        var tabstopManager = new TabstopManager(editor);\n
+        tabstopManager.addTabstops(tabstops, range.start, end);\n
+        tabstopManager.tabNext();\n
+    };\n
+\n
+    this.$getScope = function(editor) {\n
+        var scope = editor.session.$mode.$id || "";\n
+        scope = scope.split("/").pop();\n
+        if (scope === "html" || scope === "php") {\n
+            if (scope === "php") \n
+                scope = "html";\n
+            var c = editor.getCursorPosition()\n
+            var state = editor.session.getState(c.row);\n
+            if (typeof state === "object") {\n
+                state = state[0];\n
+            }\n
+            if (state.substring) {\n
+                if (state.substring(0, 3) == "js-")\n
+                    scope = "javascript";\n
+                else if (state.substring(0, 4) == "css-")\n
+                    scope = "css";\n
+                else if (state.substring(0, 4) == "php-")\n
+                    scope = "php";\n
+            }\n
+        }\n
+        \n
+        return scope;\n
+    };\n
+\n
+    this.expandWithTab = function(editor) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = editor.session.getLine(cursor.row);\n
+        var before = line.substring(0, cursor.column);\n
+        var after = line.substr(cursor.column);\n
+\n
+        var scope = this.$getScope(editor);\n
+        var snippetMap = this.snippetMap;\n
+        var snippet;\n
+        [scope, "_"].some(function(scope) {\n
+            var snippets = snippetMap[scope];\n
+            if (snippets)\n
+                snippet = this.findMatchingSnippet(snippets, before, after);\n
+            return !!snippet;\n
+        }, this);\n
+        if (!snippet)\n
+            return false;\n
+\n
+        editor.session.doc.removeInLine(cursor.row,\n
+            cursor.column - snippet.replaceBefore.length,\n
+            cursor.column + snippet.replaceAfter.length\n
+        );\n
+\n
+        this.variables.M__ = snippet.matchBefore;\n
+        this.variables.T__ = snippet.matchAfter;\n
+        this.insertSnippet(editor, snippet.content);\n
+\n
+        this.variables.M__ = this.variables.T__ = null;\n
+        return true;\n
+    };\n
+\n
+    this.findMatchingSnippet = function(snippetList, before, after) {\n
+        for (var i = snippetList.length; i--;) {\n
+            var s = snippetList[i];\n
+            if (s.startRe && !s.startRe.test(before))\n
+                continue;\n
+            if (s.endRe && !s.endRe.test(after))\n
+                continue;\n
+            if (!s.startRe && !s.endRe)\n
+                continue;\n
+\n
+            s.matchBefore = s.startRe ? s.startRe.exec(before) : [""];\n
+            s.matchAfter = s.endRe ? s.endRe.exec(after) : [""];\n
+            s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : "";\n
+            s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : "";\n
+            return s;\n
+        }\n
+    };\n
+\n
+    this.snippetMap = {};\n
+    this.snippetNameMap = {};\n
+    this.register = function(snippets, scope) {\n
+        var snippetMap = this.snippetMap;\n
+        var snippetNameMap = this.snippetNameMap;\n
+        var self = this;\n
+        function wrapRegexp(src) {\n
+            if (src && !/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(src))\n
+                src = "(?:" + src + ")"\n
+\n
+            return src || "";\n
+        }\n
+        function guardedRegexp(re, guard, opening) {\n
+            re = wrapRegexp(re);\n
+            guard = wrapRegexp(guard);\n
+            if (opening) {\n
+                re = guard + re;\n
+                if (re && re[re.length - 1] != "$")\n
+                    re = re + "$";\n
+            } else {\n
+                re = re + guard;\n
+                if (re && re[0] != "^")\n
+                    re = "^" + re;\n
+            }\n
+            return new RegExp(re);\n
+        }\n
+\n
+        function addSnippet(s) {\n
+            if (!s.scope)\n
+                s.scope = scope || "_";\n
+            scope = s.scope\n
+            if (!snippetMap[scope]) {\n
+                snippetMap[scope] = [];\n
+                snippetNameMap[scope] = {};\n
+            }\n
+\n
+            var map = snippetNameMap[scope];\n
+            if (s.name) {\n
+                var old = map[s.name];\n
+                if (old)\n
+                    self.unregister(old);\n
+                map[s.name] = s;\n
+            }\n
+            snippetMap[scope].push(s);\n
+\n
+            if (s.tabTrigger && !s.trigger) {\n
+                if (!s.guard && /^\\w/.test(s.tabTrigger))\n
+                    s.guard = "\\\\b";\n
+                s.trigger = lang.escapeRegExp(s.tabTrigger);\n
+            }\n
+\n
+            s.startRe = guardedRegexp(s.trigger, s.guard, true);\n
+            s.triggerRe = new RegExp(s.trigger, "", true);\n
+\n
+            s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);\n
+            s.endTriggerRe = new RegExp(s.endTrigger, "", true);\n
+        };\n
+\n
+        if (snippets.content)\n
+            addSnippet(snippets);\n
+        else if (Array.isArray(snippets))\n
+            snippets.forEach(addSnippet);\n
+    };\n
+    this.unregister = function(snippets, scope) {\n
+        var snippetMap = this.snippetMap;\n
+        var snippetNameMap = this.snippetNameMap;\n
+\n
+        function removeSnippet(s) {\n
+            var nameMap = snippetNameMap[s.scope||scope];\n
+            if (nameMap && nameMap[s.name]) {\n
+                delete nameMap[s.name];\n
+                var map = snippetMap[s.scope||scope];\n
+                var i = map && map.indexOf(s);\n
+                if (i >= 0)\n
+                    map.splice(i, 1);\n
+            }\n
+        }\n
+        if (snippets.content)\n
+            removeSnippet(snippets);\n
+        else if (Array.isArray(snippets))\n
+            snippets.forEach(removeSnippet);\n
+    };\n
+    this.parseSnippetFile = function(str) {\n
+        str = str.replace(/\\r/g, "");\n
+        var list = [], snippet = {};\n
+        var re = /^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm;\n
+        var m;\n
+        while (m = re.exec(str)) {\n
+            if (m[1]) {\n
+                try {\n
+                    snippet = JSON.parse(m[1])\n
+                    list.push(snippet);\n
+                } catch (e) {}\n
+            } if (m[4]) {\n
+                snippet.content = m[4].replace(/^\\t/gm, "");\n
+                list.push(snippet);\n
+                snippet = {};\n
+            } else {\n
+                var key = m[2], val = m[3];\n
+                if (key == "regex") {\n
+                    var guardRe = /\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;\n
+                    snippet.guard = guardRe.exec(val)[1];\n
+                    snippet.trigger = guardRe.exec(val)[1];\n
+                    snippet.endTrigger = guardRe.exec(val)[1];\n
+                    snippet.endGuard = guardRe.exec(val)[1];\n
+                } else if (key == "snippet") {\n
+                    snippet.tabTrigger = val.match(/^\\S*/)[0];\n
+                    if (!snippet.name)\n
+                        snippet.name = val;\n
+                } else {\n
+                    snippet[key] = val;\n
+                }\n
+            }\n
+        }\n
+        return list;\n
+    };\n
+    this.getSnippetByName = function(name, editor) {\n
+        var scope = editor && this.$getScope(editor);\n
+        var snippetMap = this.snippetNameMap;\n
+        var snippet;\n
+        [scope, "_"].some(function(scope) {\n
+            var snippets = snippetMap[scope];\n
+            if (snippets)\n
+                snippet = snippets[name];\n
+            return !!snippet;\n
+        }, this);\n
+        return snippet;\n
+    };\n
+\n
+}).call(SnippetManager.prototype);\n
+\n
+\n
+var TabstopManager = function(editor) {\n
+    if (editor.tabstopManager)\n
+        return editor.tabstopManager;\n
+    editor.tabstopManager = this;\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;\n
+    this.$onChangeSession = this.onChangeSession.bind(this);\n
+    this.$onAfterExec = this.onAfterExec.bind(this);\n
+    this.attach(editor);\n
+};\n
+(function() {\n
+    this.attach = function(editor) {\n
+        this.index = -1;\n
+        this.ranges = [];\n
+        this.tabstops = [];\n
+        this.selectedTabstop = null;\n
+\n
+        this.editor = editor;\n
+        this.editor.on("change", this.$onChange);\n
+        this.editor.on("changeSelection", this.$onChangeSelection);\n
+        this.editor.on("changeSession", this.$onChangeSession);\n
+        this.editor.commands.on("afterExec", this.$onAfterExec);\n
+        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n
+    };\n
+    this.detach = function() {\n
+        this.tabstops.forEach(this.removeTabstopMarkers, this);\n
+        this.ranges = null;\n
+        this.tabstops = null;\n
+        this.selectedTabstop = null;\n
+        this.editor.removeListener("change", this.$onChange);\n
+        this.editor.removeListener("changeSelection", this.$onChangeSelection);\n
+        this.editor.removeListener("changeSession", this.$onChangeSession);\n
+        this.editor.commands.removeListener("afterExec", this.$onAfterExec);\n
+        this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n
+        this.editor.tabstopManager = null;\n
+        this.editor = null;\n
+    };\n
+\n
+    this.onChange = function(e) {\n
+        var changeRange = e.data.range;\n
+        var isRemove = e.data.action[0] == "r";\n
+        var start = changeRange.start;\n
+        var end = changeRange.end;\n
+        var startRow = start.row;\n
+        var endRow = end.row;\n
+        var lineDif = endRow - startRow;\n
+        var colDiff = end.column - start.column;\n
+\n
+        if (isRemove) {\n
+            lineDif = -lineDif;\n
+            colDiff = -colDiff;\n
+        }\n
+        if (!this.$inChange && isRemove) {\n
+            var ts = this.selectedTabstop;\n
+            var changedOutside = !ts.some(function(r) {\n
+                return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;\n
+            });\n
+            if (changedOutside)\n
+                return this.detach();\n
+        }\n
+        var ranges = this.ranges;\n
+        for (var i = 0; i < ranges.length; i++) {\n
+            var r = ranges[i];\n
+            if (r.end.row < start.row)\n
+                continue;\n
+\n
+            if (comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {\n
+                this.removeRange(r);\n
+                i--;\n
+                continue;\n
+            }\n
+\n
+            if (r.start.row == startRow && r.start.column > start.column)\n
+                r.start.column += colDiff;\n
+            if (r.end.row == startRow && r.end.column >= start.column)\n
+                r.end.column += colDiff;\n
+            if (r.start.row >= startRow)\n
+                r.start.row += lineDif;\n
+            if (r.end.row >= startRow)\n
+                r.end.row += lineDif;\n
+\n
+            if (comparePoints(r.start, r.end) > 0)\n
+                this.removeRange(r);\n
+        }\n
+        if (!ranges.length)\n
+            this.detach();\n
+    };\n
+    this.updateLinkedFields = function() {\n
+        var ts = this.selectedTabstop;\n
+        if (!ts.hasLinkedRanges)\n
+            return;\n
+        this.$inChange = true;\n
+        var session = this.editor.session;\n
+        var text = session.getTextRange(ts.firstNonLinked);\n
+        for (var i = ts.length; i--;) {\n
+            var range = ts[i];\n
+            if (!range.linked)\n
+                continue;\n
+            var fmt = exports.snippetManager.tmStrFormat(text, range.original)\n
+            session.replace(range, fmt);\n
+        }\n
+        this.$inChange = false;\n
+    };\n
+    this.onAfterExec = function(e) {\n
+        if (e.command && !e.command.readOnly)\n
+            this.updateLinkedFields();\n
+    };\n
+    this.onChangeSelection = function() {\n
+        if (!this.editor)\n
+            return\n
+        var lead = this.editor.selection.lead;\n
+        var anchor = this.editor.selection.anchor;\n
+        var isEmpty = this.editor.selection.isEmpty();\n
+        for (var i = this.ranges.length; i--;) {\n
+            if (this.ranges[i].linked)\n
+                continue;\n
+            var containsLead = this.ranges[i].contains(lead.row, lead.column);\n
+            var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);\n
+            if (containsLead && containsAnchor)\n
+                return;\n
+        }\n
+        this.detach();\n
+    };\n
+    this.onChangeSession = function() {\n
+        this.detach();\n
+    };\n
+    this.tabNext = function(dir) {\n
+        var max = this.tabstops.length - 1;\n
+        var index = this.index + (dir || 1);\n
+        index = Math.min(Math.max(index, 0), max);\n
+        this.selectTabstop(index);\n
+        if (index == max)\n
+            this.detach();\n
+    };\n
+    this.selectTabstop = function(index) {\n
+        var ts = this.tabstops[this.index];\n
+        if (ts)\n
+            this.addTabstopMarkers(ts);\n
+        this.index = index;\n
+        ts = this.tabstops[this.index];\n
+        if (!ts || !ts.length)\n
+            return;\n
+        \n
+        this.selectedTabstop = ts;\n
+        if (!this.editor.inVirtualSelectionMode) {        \n
+            var sel = this.editor.multiSelect;\n
+            sel.toSingleRange(ts.firstNonLinked.clone());\n
+            for (var i = ts.length; i--;) {\n
+                if (ts.hasLinkedRanges && ts[i].linked)\n
+                    continue;\n
+                sel.addRange(ts[i].clone(), true);\n
+            }\n
+        } else {\n
+            this.editor.selection.setRange(ts.firstNonLinked);\n
+        }\n
+        \n
+        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n
+    };\n
+    this.addTabstops = function(tabstops, start, end) {\n
+        if (!tabstops[0]) {\n
+            var p = Range.fromPoints(end, end);\n
+            moveRelative(p.start, start);\n
+            moveRelative(p.end, start);\n
+            tabstops[0] = [p];\n
+            tabstops[0].index = 0;\n
+        }\n
+\n
+        var i = this.index;\n
+        var arg = [i, 0];\n
+        var ranges = this.ranges;\n
+        var editor = this.editor;\n
+        tabstops.forEach(function(ts) {\n
+            for (var i = ts.length; i--;) {\n
+                var p = ts[i];\n
+                var range = Range.fromPoints(p.start, p.end || p.start);\n
+                movePoint(range.start, start);\n
+                movePoint(range.end, start);\n
+                range.original = p;\n
+                range.tabstop = ts;\n
+                ranges.push(range);\n
+                ts[i] = range;\n
+                if (p.fmtString) {\n
+                    range.linked = true;\n
+                    ts.hasLinkedRanges = true;\n
+                } else if (!ts.firstNonLinked)\n
+                    ts.firstNonLinked = range;\n
+            }\n
+            if (!ts.firstNonLinked)\n
+                ts.hasLinkedRanges = false;\n
+            arg.push(ts);\n
+            this.addTabstopMarkers(ts);\n
+        }, this);\n
+        arg.push(arg.splice(2, 1)[0]);\n
+        this.tabstops.splice.apply(this.tabstops, arg);\n
+    };\n
+\n
+    this.addTabstopMarkers = function(ts) {\n
+        var session = this.editor.session;\n
+        ts.forEach(function(range) {\n
+            if  (!range.markerId)\n
+                range.markerId = session.addMarker(range, "ace_snippet-marker", "text");\n
+        });\n
+    };\n
+    this.removeTabstopMarkers = function(ts) {\n
+        var session = this.editor.session;\n
+        ts.forEach(function(range) {\n
+            session.removeMarker(range.markerId);\n
+            range.markerId = null;\n
+        });\n
+    };\n
+    this.removeRange = function(range) {\n
+        var i = range.tabstop.indexOf(range);\n
+        range.tabstop.splice(i, 1);\n
+        i = this.ranges.indexOf(range);\n
+        this.ranges.splice(i, 1);\n
+        this.editor.session.removeMarker(range.markerId);\n
+    };\n
+\n
+    this.keyboardHandler = new HashHandler();\n
+    this.keyboardHandler.bindKeys({\n
+        "Tab": function(ed) {\n
+            ed.tabstopManager.tabNext(1);\n
+        },\n
+        "Shift-Tab": function(ed) {\n
+            ed.tabstopManager.tabNext(-1);\n
+        },\n
+        "Esc": function(ed) {\n
+            ed.tabstopManager.detach();\n
+        },\n
+        "Return": function(ed) {\n
+            return false;\n
+        }\n
+    });\n
+}).call(TabstopManager.prototype);\n
+\n
+\n
+var movePoint = function(point, diff) {\n
+    if (point.row == 0)\n
+        point.column += diff.column;\n
+    point.row += diff.row;\n
+};\n
+\n
+var moveRelative = function(point, start) {\n
+    if (point.row == start.row)\n
+        point.column -= start.column;\n
+    point.row -= start.row;\n
+};\n
+\n
+\n
+require("./lib/dom").importCssString("\\\n
+.ace_snippet-marker {\\\n
+    -moz-box-sizing: border-box;\\\n
+    box-sizing: border-box;\\\n
+    background: rgba(194, 193, 208, 0.09);\\\n
+    border: 1px dotted rgba(211, 208, 235, 0.62);\\\n
+    position: absolute;\\\n
+}");\n
+\n
+exports.snippetManager = new SnippetManager();\n
+\n
+\n
+});\n
 
 
 ]]></string> </value>
@@ -302,7 +1128,7 @@ exports.setCore = function(e) {emmet = e;};\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>9678</int> </value>
+            <value> <int>39213</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-keybinding_menu.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-keybinding_menu.js.xml
index ca22e0f7c5..b0338a51ef 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-keybinding_menu.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-keybinding_menu.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155552.86</string> </value>
+            <value> <string>ts83646622.76</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -198,7 +198,7 @@ module.exports.getEditorKeybordShortcuts = function(editor) {\n
     var keybindings = [];\n
     var commandMap = {};\n
     editor.keyBinding.$handlers.forEach(function(handler) {\n
-        var ckb = handler.commmandKeyBinding;\n
+        var ckb = handler.commandKeyBinding;\n
         for (var i in ckb) {\n
             var modifier = parseInt(i);\n
             if (modifier == -1) {\n
@@ -238,7 +238,7 @@ module.exports.getEditorKeybordShortcuts = function(editor) {\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>7803</int> </value>
+            <value> <int>7802</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-language_tools.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-language_tools.js.xml
new file mode 100644
index 0000000000..83bb88cdbc
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-language_tools.js.xml
@@ -0,0 +1,1664 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_Cacheable__manager_id</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.4</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>ext-language_tools.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2012, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/ext/language_tools\', [\'require\', \'exports\', \'module\' , \'ace/snippets\', \'ace/autocomplete\', \'ace/config\', \'ace/autocomplete/text_completer\', \'ace/editor\'], function(require, exports, module) {\n
+\n
+\n
+var snippetManager = require("../snippets").snippetManager;\n
+var Autocomplete = require("../autocomplete").Autocomplete;\n
+var config = require("../config");\n
+\n
+var textCompleter = require("../autocomplete/text_completer");\n
+var keyWordCompleter = {\n
+    getCompletions: function(editor, session, pos, prefix, callback) {\n
+        var state = editor.session.getState(pos.row);\n
+        var completions = session.$mode.getCompletions(state, session, pos, prefix);\n
+        callback(null, completions);\n
+    }\n
+};\n
+\n
+var snippetCompleter = {\n
+    getCompletions: function(editor, session, pos, prefix, callback) {\n
+        var scope = snippetManager.$getScope(editor);\n
+        var snippetMap = snippetManager.snippetMap;\n
+        var completions = [];\n
+        [scope, "_"].forEach(function(scope) {\n
+            var snippets = snippetMap[scope] || [];\n
+            for (var i = snippets.length; i--;) {\n
+                var s = snippets[i];\n
+                var caption = s.name || s.tabTrigger;\n
+                if (!caption)\n
+                    continue;\n
+                completions.push({\n
+                    caption: caption,\n
+                    snippet: s.content,\n
+                    meta: s.tabTrigger && !s.name ? s.tabTrigger + "\\u21E5 " : "snippet"\n
+                });\n
+            }\n
+        }, this);\n
+        callback(null, completions);\n
+    }\n
+};\n
+\n
+var completers = [snippetCompleter, textCompleter, keyWordCompleter];\n
+exports.addCompleter = function(completer) {\n
+    completers.push(completer);\n
+};\n
+\n
+var expandSnippet = {\n
+    name: "expandSnippet",\n
+    exec: function(editor) {\n
+        var success = snippetManager.expandWithTab(editor);\n
+        if (!success)\n
+            editor.execCommand("indent");\n
+    },\n
+    bindKey: "tab"\n
+}\n
+\n
+var onChangeMode = function(e, editor) {\n
+    var mode = editor.session.$mode;\n
+    var id = mode.$id\n
+    if (!snippetManager.files) snippetManager.files = {};\n
+    if (id && !snippetManager.files[id]) {\n
+        var snippetFilePath = id.replace("mode", "snippets");\n
+        config.loadModule(snippetFilePath, function(m) {\n
+            if (m) {\n
+                snippetManager.files[id] = m;\n
+                m.snippets = snippetManager.parseSnippetFile(m.snippetText);\n
+                snippetManager.register(m.snippets, m.scope);\n
+            }\n
+        });\n
+    }\n
+};\n
+\n
+var Editor = require("../editor").Editor;\n
+require("../config").defineOptions(Editor.prototype, "editor", {\n
+    enableBasicAutocompletion: {\n
+        set: function(val) {\n
+            if (val) {\n
+                this.completers = completers\n
+                this.commands.addCommand(Autocomplete.startCommand);\n
+            } else {\n
+                this.commands.removeCommand(Autocomplete.startCommand);\n
+            }\n
+        },\n
+        value: false\n
+    },\n
+    enableSnippets: {\n
+        set: function(val) {\n
+            if (val) {\n
+                this.commands.addCommand(expandSnippet);\n
+                this.on("changeMode", onChangeMode);\n
+                onChangeMode(null, this)\n
+            } else {\n
+                this.commands.removeCommand(expandSnippet);\n
+                this.off("changeMode", onChangeMode);\n
+            }\n
+        },\n
+        value: false\n
+    }\n
+});\n
+\n
+});\n
+\n
+define(\'ace/snippets\', [\'require\', \'exports\', \'module\' , \'ace/lib/lang\', \'ace/range\', \'ace/keyboard/hash_handler\', \'ace/tokenizer\', \'ace/lib/dom\'], function(require, exports, module) {\n
+\n
+var lang = require("./lib/lang")\n
+var Range = require("./range").Range\n
+var HashHandler = require("./keyboard/hash_handler").HashHandler;\n
+var Tokenizer = require("./tokenizer").Tokenizer;\n
+var comparePoints = Range.comparePoints;\n
+\n
+var SnippetManager = function() {\n
+    this.snippetMap = {};\n
+    this.snippetNameMap = {};\n
+};\n
+\n
+(function() {\n
+    this.getTokenizer = function() {\n
+        function TabstopToken(str, _, stack) {\n
+            str = str.substr(1);\n
+            if (/^\\d+$/.test(str) && !stack.inFormatString)\n
+                return [{tabstopId: parseInt(str, 10)}];\n
+            return [{text: str}]\n
+        }\n
+        function escape(ch) {\n
+            return "(?:[^\\\\\\\\" + ch + "]|\\\\\\\\.)";\n
+        }\n
+        SnippetManager.$tokenizer = new Tokenizer({\n
+            start: [\n
+                {regex: /:/, onMatch: function(val, state, stack) {\n
+                    if (stack.length && stack[0].expectIf) {\n
+                        stack[0].expectIf = false;\n
+                        stack[0].elseBranch = stack[0];\n
+                        return [stack[0]];\n
+                    }\n
+                    return ":";\n
+                }},\n
+                {regex: /\\\\./, onMatch: function(val, state, stack) {\n
+                    var ch = val[1];\n
+                    if (ch == "}" && stack.length) {\n
+                        val = ch;\n
+                    }else if ("`$\\\\".indexOf(ch) != -1) {\n
+                        val = ch;\n
+                    } else if (stack.inFormatString) {\n
+                        if (ch == "n")\n
+                            val = "\\n";\n
+                        else if (ch == "t")\n
+                            val = "\\n";\n
+                        else if ("ulULE".indexOf(ch) != -1) {\n
+                            val = {changeCase: ch, local: ch > "a"};\n
+                        }\n
+                    }\n
+\n
+                    return [val];\n
+                }},\n
+                {regex: /}/, onMatch: function(val, state, stack) {\n
+                    return [stack.length ? stack.shift() : val];\n
+                }},\n
+                {regex: /\\$(?:\\d+|\\w+)/, onMatch: TabstopToken},\n
+                {regex: /\\$\\{[\\dA-Z_a-z]+/, onMatch: function(str, state, stack) {\n
+                    var t = TabstopToken(str.substr(1), state, stack);\n
+                    stack.unshift(t[0]);\n
+                    return t;\n
+                }, next: "snippetVar"},\n
+                {regex: /\\n/, token: "newline", merge: false}\n
+            ],\n
+            snippetVar: [\n
+                {regex: "\\\\|" + escape("\\\\|") + "*\\\\|", onMatch: function(val, state, stack) {\n
+                    stack[0].choices = val.slice(1, -1).split(",");\n
+                }, next: "start"},\n
+                {regex: "/(" + escape("/") + "+)/(?:(" + escape("/") + "*)/)(\\\\w*):?",\n
+                 onMatch: function(val, state, stack) {\n
+                    var ts = stack[0];\n
+                    ts.fmtString = val;\n
+\n
+                    val = this.splitRegex.exec(val);\n
+                    ts.guard = val[1];\n
+                    ts.fmt = val[2];\n
+                    ts.flag = val[3];\n
+                    return "";\n
+                }, next: "start"},\n
+                {regex: "`" + escape("`") + "*`", onMatch: function(val, state, stack) {\n
+                    stack[0].code = val.splice(1, -1);\n
+                    return "";\n
+                }, next: "start"},\n
+                {regex: "\\\\?", onMatch: function(val, state, stack) {\n
+                    if (stack[0])\n
+                        stack[0].expectIf = true;\n
+                }, next: "start"},\n
+                {regex: "([^:}\\\\\\\\]|\\\\\\\\.)*:?", token: "", next: "start"}\n
+            ],\n
+            formatString: [\n
+                {regex: "/(" + escape("/") + "+)/", token: "regex"},\n
+                {regex: "", onMatch: function(val, state, stack) {\n
+                    stack.inFormatString = true;\n
+                }, next: "start"}\n
+            ]\n
+        });\n
+        SnippetManager.prototype.getTokenizer = function() {\n
+            return SnippetManager.$tokenizer;\n
+        }\n
+        return SnippetManager.$tokenizer;\n
+    };\n
+\n
+    this.tokenizeTmSnippet = function(str, startState) {\n
+        return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {\n
+            return x.value || x;\n
+        });\n
+    };\n
+\n
+    this.$getDefaultValue = function(editor, name) {\n
+        if (/^[A-Z]\\d+$/.test(name)) {\n
+            var i = name.substr(1);\n
+            return (this.variables[name[0] + "__"] || {})[i];\n
+        }\n
+        if (/^\\d+$/.test(name)) {\n
+            return (this.variables.__ || {})[name];\n
+        }\n
+        name = name.replace(/^TM_/, "");\n
+\n
+        if (!editor)\n
+            return;\n
+        var s = editor.session;\n
+        switch(name) {\n
+            case "CURRENT_WORD":\n
+                var r = s.getWordRange();\n
+            case "SELECTION":\n
+            case "SELECTED_TEXT":\n
+                return s.getTextRange(r);\n
+            case "CURRENT_LINE":\n
+                return s.getLine(editor.getCursorPosition().row);\n
+            case "PREV_LINE": // not possible in textmate\n
+                return s.getLine(editor.getCursorPosition().row - 1);\n
+            case "LINE_INDEX":\n
+                return editor.getCursorPosition().column;\n
+            case "LINE_NUMBER":\n
+                return editor.getCursorPosition().row + 1;\n
+            case "SOFT_TABS":\n
+                return s.getUseSoftTabs() ? "YES" : "NO";\n
+            case "TAB_SIZE":\n
+                return s.getTabSize();\n
+            case "FILENAME":\n
+            case "FILEPATH":\n
+                return "ace.ajax.org";\n
+            case "FULLNAME":\n
+                return "Ace";\n
+        }\n
+    };\n
+    this.variables = {};\n
+    this.getVariableValue = function(editor, varName) {\n
+        if (this.variables.hasOwnProperty(varName))\n
+            return this.variables[varName](editor, varName) || "";\n
+        return this.$getDefaultValue(editor, varName) || "";\n
+    };\n
+    this.tmStrFormat = function(str, ch, editor) {\n
+        var flag = ch.flag || "";\n
+        var re = ch.guard;\n
+        re = new RegExp(re, flag.replace(/[^gi]/, ""));\n
+        var fmtTokens = this.tokenizeTmSnippet(ch.fmt, "formatString");\n
+        var _self = this;\n
+        var formatted = str.replace(re, function() {\n
+            _self.variables.__ = arguments;\n
+            var fmtParts = _self.resolveVariables(fmtTokens, editor);\n
+            var gChangeCase = "E";\n
+            for (var i  = 0; i < fmtParts.length; i++) {\n
+                var ch = fmtParts[i];\n
+                if (typeof ch == "object") {\n
+                    fmtParts[i] = "";\n
+                    if (ch.changeCase && ch.local) {\n
+                        var next = fmtParts[i + 1];\n
+                        if (next && typeof next == "string") {\n
+                            if (ch.changeCase == "u")\n
+                                fmtParts[i] = next[0].toUpperCase();\n
+                            else\n
+                                fmtParts[i] = next[0].toLowerCase();\n
+                            fmtParts[i + 1] = next.substr(1);\n
+                        }\n
+                    } else if (ch.changeCase) {\n
+                        gChangeCase = ch.changeCase;\n
+                    }\n
+                } else if (gChangeCase == "U") {\n
+                    fmtParts[i] = ch.toUpperCase();\n
+                } else if (gChangeCase == "L") {\n
+                    fmtParts[i] = ch.toLowerCase();\n
+                }\n
+            }\n
+            return fmtParts.join("");\n
+        });\n
+        this.variables.__ = null;\n
+        return formatted;\n
+    };\n
+\n
+    this.resolveVariables = function(snippet, editor) {\n
+        var result = [];\n
+        for (var i = 0; i < snippet.length; i++) {\n
+            var ch = snippet[i];\n
+            if (typeof ch == "string") {\n
+                result.push(ch);\n
+            } else if (typeof ch != "object") {\n
+                continue;\n
+            } else if (ch.skip) {\n
+                gotoNext(ch);\n
+            } else if (ch.processed < i) {\n
+                continue;\n
+            } else if (ch.text) {\n
+                var value = this.getVariableValue(editor, ch.text);\n
+                if (value && ch.fmtString)\n
+                    value = this.tmStrFormat(value, ch);\n
+                ch.processed = i;\n
+                if (ch.expectIf == null) {\n
+                    if (value) {\n
+                        result.push(value);\n
+                        gotoNext(ch);\n
+                    }\n
+                } else {\n
+                    if (value) {\n
+                        ch.skip = ch.elseBranch;\n
+                    } else\n
+                        gotoNext(ch);\n
+                }\n
+            } else if (ch.tabstopId != null) {\n
+                result.push(ch);\n
+            } else if (ch.changeCase != null) {\n
+                result.push(ch);\n
+            }\n
+        }\n
+        function gotoNext(ch) {\n
+            var i1 = snippet.indexOf(ch, i + 1);\n
+            if (i1 != -1)\n
+                i = i1;\n
+        }\n
+        return result;\n
+    };\n
+\n
+    this.insertSnippet = function(editor, snippetText) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = editor.session.getLine(cursor.row);\n
+        var indentString = line.match(/^\\s*/)[0];\n
+        var tabString = editor.session.getTabString();\n
+\n
+        var tokens = this.tokenizeTmSnippet(snippetText);\n
+        tokens = this.resolveVariables(tokens, editor);\n
+        tokens = tokens.map(function(x) {\n
+            if (x == "\\n")\n
+                return x + indentString;\n
+            if (typeof x == "string")\n
+                return x.replace(/\\t/g, tabString);\n
+            return x;\n
+        });\n
+        var tabstops = [];\n
+        tokens.forEach(function(p, i) {\n
+            if (typeof p != "object")\n
+                return;\n
+            var id = p.tabstopId;\n
+            var ts = tabstops[id];\n
+            if (!ts) {\n
+                ts = tabstops[id] = [];\n
+                ts.index = id;\n
+                ts.value = "";\n
+            }\n
+            if (ts.indexOf(p) !== -1)\n
+                return;\n
+            ts.push(p);\n
+            var i1 = tokens.indexOf(p, i + 1);\n
+            if (i1 === -1)\n
+                return;\n
+\n
+            var value = tokens.slice(i + 1, i1);\n
+            var isNested = value.some(function(t) {return typeof t === "object"});          \n
+            if (isNested && !ts.value) {\n
+                ts.value = value;\n
+            } else if (value.length && (!ts.value || typeof ts.value !== "string")) {\n
+                ts.value = value.join("");\n
+            }\n
+        });\n
+        tabstops.forEach(function(ts) {ts.length = 0});\n
+        var expanding = {};\n
+        function copyValue(val) {\n
+            var copy = []\n
+            for (var i = 0; i < val.length; i++) {\n
+                var p = val[i];\n
+                if (typeof p == "object") {\n
+                    if (expanding[p.tabstopId])\n
+                        continue;\n
+                    var j = val.lastIndexOf(p, i - 1);\n
+                    p = copy[j] || {tabstopId: p.tabstopId};\n
+                }\n
+                copy[i] = p;\n
+            }\n
+            return copy;\n
+        }\n
+        for (var i = 0; i < tokens.length; i++) {\n
+            var p = tokens[i];\n
+            if (typeof p != "object")\n
+                continue;\n
+            var id = p.tabstopId;\n
+            var i1 = tokens.indexOf(p, i + 1);\n
+            if (expanding[id] == p) { \n
+                expanding[id] = null;\n
+                continue;\n
+            }\n
+            \n
+            var ts = tabstops[id];\n
+            var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value);\n
+            arg.unshift(i + 1, Math.max(0, i1 - i));\n
+            arg.push(p);\n
+            expanding[id] = p;\n
+            tokens.splice.apply(tokens, arg);\n
+\n
+            if (ts.indexOf(p) === -1)\n
+                ts.push(p);\n
+        };\n
+        var row = 0, column = 0;\n
+        var text = "";\n
+        tokens.forEach(function(t) {\n
+            if (typeof t === "string") {\n
+                if (t[0] === "\\n"){\n
+                    column = t.length - 1;\n
+                    row ++;\n
+                } else\n
+                    column += t.length;\n
+                text += t;\n
+            } else {\n
+                if (!t.start)\n
+                    t.start = {row: row, column: column};\n
+                else\n
+                    t.end = {row: row, column: column};\n
+            }\n
+        });\n
+        var range = editor.getSelectionRange();\n
+        var end = editor.session.replace(range, text);\n
+\n
+        var tabstopManager = new TabstopManager(editor);\n
+        tabstopManager.addTabstops(tabstops, range.start, end);\n
+        tabstopManager.tabNext();\n
+    };\n
+\n
+    this.$getScope = function(editor) {\n
+        var scope = editor.session.$mode.$id || "";\n
+        scope = scope.split("/").pop();\n
+        if (scope === "html" || scope === "php") {\n
+            if (scope === "php") \n
+                scope = "html";\n
+            var c = editor.getCursorPosition()\n
+            var state = editor.session.getState(c.row);\n
+            if (typeof state === "object") {\n
+                state = state[0];\n
+            }\n
+            if (state.substring) {\n
+                if (state.substring(0, 3) == "js-")\n
+                    scope = "javascript";\n
+                else if (state.substring(0, 4) == "css-")\n
+                    scope = "css";\n
+                else if (state.substring(0, 4) == "php-")\n
+                    scope = "php";\n
+            }\n
+        }\n
+        \n
+        return scope;\n
+    };\n
+\n
+    this.expandWithTab = function(editor) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = editor.session.getLine(cursor.row);\n
+        var before = line.substring(0, cursor.column);\n
+        var after = line.substr(cursor.column);\n
+\n
+        var scope = this.$getScope(editor);\n
+        var snippetMap = this.snippetMap;\n
+        var snippet;\n
+        [scope, "_"].some(function(scope) {\n
+            var snippets = snippetMap[scope];\n
+            if (snippets)\n
+                snippet = this.findMatchingSnippet(snippets, before, after);\n
+            return !!snippet;\n
+        }, this);\n
+        if (!snippet)\n
+            return false;\n
+\n
+        editor.session.doc.removeInLine(cursor.row,\n
+            cursor.column - snippet.replaceBefore.length,\n
+            cursor.column + snippet.replaceAfter.length\n
+        );\n
+\n
+        this.variables.M__ = snippet.matchBefore;\n
+        this.variables.T__ = snippet.matchAfter;\n
+        this.insertSnippet(editor, snippet.content);\n
+\n
+        this.variables.M__ = this.variables.T__ = null;\n
+        return true;\n
+    };\n
+\n
+    this.findMatchingSnippet = function(snippetList, before, after) {\n
+        for (var i = snippetList.length; i--;) {\n
+            var s = snippetList[i];\n
+            if (s.startRe && !s.startRe.test(before))\n
+                continue;\n
+            if (s.endRe && !s.endRe.test(after))\n
+                continue;\n
+            if (!s.startRe && !s.endRe)\n
+                continue;\n
+\n
+            s.matchBefore = s.startRe ? s.startRe.exec(before) : [""];\n
+            s.matchAfter = s.endRe ? s.endRe.exec(after) : [""];\n
+            s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : "";\n
+            s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : "";\n
+            return s;\n
+        }\n
+    };\n
+\n
+    this.snippetMap = {};\n
+    this.snippetNameMap = {};\n
+    this.register = function(snippets, scope) {\n
+        var snippetMap = this.snippetMap;\n
+        var snippetNameMap = this.snippetNameMap;\n
+        var self = this;\n
+        function wrapRegexp(src) {\n
+            if (src && !/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(src))\n
+                src = "(?:" + src + ")"\n
+\n
+            return src || "";\n
+        }\n
+        function guardedRegexp(re, guard, opening) {\n
+            re = wrapRegexp(re);\n
+            guard = wrapRegexp(guard);\n
+            if (opening) {\n
+                re = guard + re;\n
+                if (re && re[re.length - 1] != "$")\n
+                    re = re + "$";\n
+            } else {\n
+                re = re + guard;\n
+                if (re && re[0] != "^")\n
+                    re = "^" + re;\n
+            }\n
+            return new RegExp(re);\n
+        }\n
+\n
+        function addSnippet(s) {\n
+            if (!s.scope)\n
+                s.scope = scope || "_";\n
+            scope = s.scope\n
+            if (!snippetMap[scope]) {\n
+                snippetMap[scope] = [];\n
+                snippetNameMap[scope] = {};\n
+            }\n
+\n
+            var map = snippetNameMap[scope];\n
+            if (s.name) {\n
+                var old = map[s.name];\n
+                if (old)\n
+                    self.unregister(old);\n
+                map[s.name] = s;\n
+            }\n
+            snippetMap[scope].push(s);\n
+\n
+            if (s.tabTrigger && !s.trigger) {\n
+                if (!s.guard && /^\\w/.test(s.tabTrigger))\n
+                    s.guard = "\\\\b";\n
+                s.trigger = lang.escapeRegExp(s.tabTrigger);\n
+            }\n
+\n
+            s.startRe = guardedRegexp(s.trigger, s.guard, true);\n
+            s.triggerRe = new RegExp(s.trigger, "", true);\n
+\n
+            s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);\n
+            s.endTriggerRe = new RegExp(s.endTrigger, "", true);\n
+        };\n
+\n
+        if (snippets.content)\n
+            addSnippet(snippets);\n
+        else if (Array.isArray(snippets))\n
+            snippets.forEach(addSnippet);\n
+    };\n
+    this.unregister = function(snippets, scope) {\n
+        var snippetMap = this.snippetMap;\n
+        var snippetNameMap = this.snippetNameMap;\n
+\n
+        function removeSnippet(s) {\n
+            var nameMap = snippetNameMap[s.scope||scope];\n
+            if (nameMap && nameMap[s.name]) {\n
+                delete nameMap[s.name];\n
+                var map = snippetMap[s.scope||scope];\n
+                var i = map && map.indexOf(s);\n
+                if (i >= 0)\n
+                    map.splice(i, 1);\n
+            }\n
+        }\n
+        if (snippets.content)\n
+            removeSnippet(snippets);\n
+        else if (Array.isArray(snippets))\n
+            snippets.forEach(removeSnippet);\n
+    };\n
+    this.parseSnippetFile = function(str) {\n
+        str = str.replace(/\\r/g, "");\n
+        var list = [], snippet = {};\n
+        var re = /^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm;\n
+        var m;\n
+        while (m = re.exec(str)) {\n
+            if (m[1]) {\n
+                try {\n
+                    snippet = JSON.parse(m[1])\n
+                    list.push(snippet);\n
+                } catch (e) {}\n
+            } if (m[4]) {\n
+                snippet.content = m[4].replace(/^\\t/gm, "");\n
+                list.push(snippet);\n
+                snippet = {};\n
+            } else {\n
+                var key = m[2], val = m[3];\n
+                if (key == "regex") {\n
+                    var guardRe = /\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;\n
+                    snippet.guard = guardRe.exec(val)[1];\n
+                    snippet.trigger = guardRe.exec(val)[1];\n
+                    snippet.endTrigger = guardRe.exec(val)[1];\n
+                    snippet.endGuard = guardRe.exec(val)[1];\n
+                } else if (key == "snippet") {\n
+                    snippet.tabTrigger = val.match(/^\\S*/)[0];\n
+                    if (!snippet.name)\n
+                        snippet.name = val;\n
+                } else {\n
+                    snippet[key] = val;\n
+                }\n
+            }\n
+        }\n
+        return list;\n
+    };\n
+    this.getSnippetByName = function(name, editor) {\n
+        var scope = editor && this.$getScope(editor);\n
+        var snippetMap = this.snippetNameMap;\n
+        var snippet;\n
+        [scope, "_"].some(function(scope) {\n
+            var snippets = snippetMap[scope];\n
+            if (snippets)\n
+                snippet = snippets[name];\n
+            return !!snippet;\n
+        }, this);\n
+        return snippet;\n
+    };\n
+\n
+}).call(SnippetManager.prototype);\n
+\n
+\n
+var TabstopManager = function(editor) {\n
+    if (editor.tabstopManager)\n
+        return editor.tabstopManager;\n
+    editor.tabstopManager = this;\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;\n
+    this.$onChangeSession = this.onChangeSession.bind(this);\n
+    this.$onAfterExec = this.onAfterExec.bind(this);\n
+    this.attach(editor);\n
+};\n
+(function() {\n
+    this.attach = function(editor) {\n
+        this.index = -1;\n
+        this.ranges = [];\n
+        this.tabstops = [];\n
+        this.selectedTabstop = null;\n
+\n
+        this.editor = editor;\n
+        this.editor.on("change", this.$onChange);\n
+        this.editor.on("changeSelection", this.$onChangeSelection);\n
+        this.editor.on("changeSession", this.$onChangeSession);\n
+        this.editor.commands.on("afterExec", this.$onAfterExec);\n
+        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n
+    };\n
+    this.detach = function() {\n
+        this.tabstops.forEach(this.removeTabstopMarkers, this);\n
+        this.ranges = null;\n
+        this.tabstops = null;\n
+        this.selectedTabstop = null;\n
+        this.editor.removeListener("change", this.$onChange);\n
+        this.editor.removeListener("changeSelection", this.$onChangeSelection);\n
+        this.editor.removeListener("changeSession", this.$onChangeSession);\n
+        this.editor.commands.removeListener("afterExec", this.$onAfterExec);\n
+        this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n
+        this.editor.tabstopManager = null;\n
+        this.editor = null;\n
+    };\n
+\n
+    this.onChange = function(e) {\n
+        var changeRange = e.data.range;\n
+        var isRemove = e.data.action[0] == "r";\n
+        var start = changeRange.start;\n
+        var end = changeRange.end;\n
+        var startRow = start.row;\n
+        var endRow = end.row;\n
+        var lineDif = endRow - startRow;\n
+        var colDiff = end.column - start.column;\n
+\n
+        if (isRemove) {\n
+            lineDif = -lineDif;\n
+            colDiff = -colDiff;\n
+        }\n
+        if (!this.$inChange && isRemove) {\n
+            var ts = this.selectedTabstop;\n
+            var changedOutside = !ts.some(function(r) {\n
+                return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;\n
+            });\n
+            if (changedOutside)\n
+                return this.detach();\n
+        }\n
+        var ranges = this.ranges;\n
+        for (var i = 0; i < ranges.length; i++) {\n
+            var r = ranges[i];\n
+            if (r.end.row < start.row)\n
+                continue;\n
+\n
+            if (comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {\n
+                this.removeRange(r);\n
+                i--;\n
+                continue;\n
+            }\n
+\n
+            if (r.start.row == startRow && r.start.column > start.column)\n
+                r.start.column += colDiff;\n
+            if (r.end.row == startRow && r.end.column >= start.column)\n
+                r.end.column += colDiff;\n
+            if (r.start.row >= startRow)\n
+                r.start.row += lineDif;\n
+            if (r.end.row >= startRow)\n
+                r.end.row += lineDif;\n
+\n
+            if (comparePoints(r.start, r.end) > 0)\n
+                this.removeRange(r);\n
+        }\n
+        if (!ranges.length)\n
+            this.detach();\n
+    };\n
+    this.updateLinkedFields = function() {\n
+        var ts = this.selectedTabstop;\n
+        if (!ts.hasLinkedRanges)\n
+            return;\n
+        this.$inChange = true;\n
+        var session = this.editor.session;\n
+        var text = session.getTextRange(ts.firstNonLinked);\n
+        for (var i = ts.length; i--;) {\n
+            var range = ts[i];\n
+            if (!range.linked)\n
+                continue;\n
+            var fmt = exports.snippetManager.tmStrFormat(text, range.original)\n
+            session.replace(range, fmt);\n
+        }\n
+        this.$inChange = false;\n
+    };\n
+    this.onAfterExec = function(e) {\n
+        if (e.command && !e.command.readOnly)\n
+            this.updateLinkedFields();\n
+    };\n
+    this.onChangeSelection = function() {\n
+        if (!this.editor)\n
+            return\n
+        var lead = this.editor.selection.lead;\n
+        var anchor = this.editor.selection.anchor;\n
+        var isEmpty = this.editor.selection.isEmpty();\n
+        for (var i = this.ranges.length; i--;) {\n
+            if (this.ranges[i].linked)\n
+                continue;\n
+            var containsLead = this.ranges[i].contains(lead.row, lead.column);\n
+            var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);\n
+            if (containsLead && containsAnchor)\n
+                return;\n
+        }\n
+        this.detach();\n
+    };\n
+    this.onChangeSession = function() {\n
+        this.detach();\n
+    };\n
+    this.tabNext = function(dir) {\n
+        var max = this.tabstops.length - 1;\n
+        var index = this.index + (dir || 1);\n
+        index = Math.min(Math.max(index, 0), max);\n
+        this.selectTabstop(index);\n
+        if (index == max)\n
+            this.detach();\n
+    };\n
+    this.selectTabstop = function(index) {\n
+        var ts = this.tabstops[this.index];\n
+        if (ts)\n
+            this.addTabstopMarkers(ts);\n
+        this.index = index;\n
+        ts = this.tabstops[this.index];\n
+        if (!ts || !ts.length)\n
+            return;\n
+        \n
+        this.selectedTabstop = ts;\n
+        if (!this.editor.inVirtualSelectionMode) {        \n
+            var sel = this.editor.multiSelect;\n
+            sel.toSingleRange(ts.firstNonLinked.clone());\n
+            for (var i = ts.length; i--;) {\n
+                if (ts.hasLinkedRanges && ts[i].linked)\n
+                    continue;\n
+                sel.addRange(ts[i].clone(), true);\n
+            }\n
+        } else {\n
+            this.editor.selection.setRange(ts.firstNonLinked);\n
+        }\n
+        \n
+        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n
+    };\n
+    this.addTabstops = function(tabstops, start, end) {\n
+        if (!tabstops[0]) {\n
+            var p = Range.fromPoints(end, end);\n
+            moveRelative(p.start, start);\n
+            moveRelative(p.end, start);\n
+            tabstops[0] = [p];\n
+            tabstops[0].index = 0;\n
+        }\n
+\n
+        var i = this.index;\n
+        var arg = [i, 0];\n
+        var ranges = this.ranges;\n
+        var editor = this.editor;\n
+        tabstops.forEach(function(ts) {\n
+            for (var i = ts.length; i--;) {\n
+                var p = ts[i];\n
+                var range = Range.fromPoints(p.start, p.end || p.start);\n
+                movePoint(range.start, start);\n
+                movePoint(range.end, start);\n
+                range.original = p;\n
+                range.tabstop = ts;\n
+                ranges.push(range);\n
+                ts[i] = range;\n
+                if (p.fmtString) {\n
+                    range.linked = true;\n
+                    ts.hasLinkedRanges = true;\n
+                } else if (!ts.firstNonLinked)\n
+                    ts.firstNonLinked = range;\n
+            }\n
+            if (!ts.firstNonLinked)\n
+                ts.hasLinkedRanges = false;\n
+            arg.push(ts);\n
+            this.addTabstopMarkers(ts);\n
+        }, this);\n
+        arg.push(arg.splice(2, 1)[0]);\n
+        this.tabstops.splice.apply(this.tabstops, arg);\n
+    };\n
+\n
+    this.addTabstopMarkers = function(ts) {\n
+        var session = this.editor.session;\n
+        ts.forEach(function(range) {\n
+            if  (!range.markerId)\n
+                range.markerId = session.addMarker(range, "ace_snippet-marker", "text");\n
+        });\n
+    };\n
+    this.removeTabstopMarkers = function(ts) {\n
+        var session = this.editor.session;\n
+        ts.forEach(function(range) {\n
+            session.removeMarker(range.markerId);\n
+            range.markerId = null;\n
+        });\n
+    };\n
+    this.removeRange = function(range) {\n
+        var i = range.tabstop.indexOf(range);\n
+        range.tabstop.splice(i, 1);\n
+        i = this.ranges.indexOf(range);\n
+        this.ranges.splice(i, 1);\n
+        this.editor.session.removeMarker(range.markerId);\n
+    };\n
+\n
+    this.keyboardHandler = new HashHandler();\n
+    this.keyboardHandler.bindKeys({\n
+        "Tab": function(ed) {\n
+            ed.tabstopManager.tabNext(1);\n
+        },\n
+        "Shift-Tab": function(ed) {\n
+            ed.tabstopManager.tabNext(-1);\n
+        },\n
+        "Esc": function(ed) {\n
+            ed.tabstopManager.detach();\n
+        },\n
+        "Return": function(ed) {\n
+            return false;\n
+        }\n
+    });\n
+}).call(TabstopManager.prototype);\n
+\n
+\n
+var movePoint = function(point, diff) {\n
+    if (point.row == 0)\n
+        point.column += diff.column;\n
+    point.row += diff.row;\n
+};\n
+\n
+var moveRelative = function(point, start) {\n
+    if (point.row == start.row)\n
+        point.column -= start.column;\n
+    point.row -= start.row;\n
+};\n
+\n
+\n
+require("./lib/dom").importCssString("\\\n
+.ace_snippet-marker {\\\n
+    -moz-box-sizing: border-box;\\\n
+    box-sizing: border-box;\\\n
+    background: rgba(194, 193, 208, 0.09);\\\n
+    border: 1px dotted rgba(211, 208, 235, 0.62);\\\n
+    position: absolute;\\\n
+}");\n
+\n
+exports.snippetManager = new SnippetManager();\n
+\n
+\n
+});\n
+\n
+define(\'ace/autocomplete\', [\'require\', \'exports\', \'module\' , \'ace/keyboard/hash_handler\', \'ace/autocomplete/popup\', \'ace/autocomplete/util\', \'ace/lib/event\', \'ace/lib/lang\', \'ace/snippets\'], function(require, exports, module) {\n
+\n
+\n
+var HashHandler = require("./keyboard/hash_handler").HashHandler;\n
+var AcePopup = require("./autocomplete/popup").AcePopup;\n
+var util = require("./autocomplete/util");\n
+var event = require("./lib/event");\n
+var lang = require("./lib/lang");\n
+var snippetManager = require("./snippets").snippetManager;\n
+\n
+var Autocomplete = function() {\n
+    this.keyboardHandler = new HashHandler();\n
+    this.keyboardHandler.bindKeys(this.commands);\n
+\n
+    this.blurListener = this.blurListener.bind(this);\n
+    this.changeListener = this.changeListener.bind(this);\n
+    this.mousedownListener = this.mousedownListener.bind(this);\n
+    this.mousewheelListener = this.mousewheelListener.bind(this);\n
+    \n
+    this.changeTimer = lang.delayedCall(function() {\n
+        this.updateCompletions(true);\n
+    }.bind(this))\n
+};\n
+\n
+(function() {\n
+    this.$init = function() {\n
+        this.popup = new AcePopup(document.body || document.documentElement);\n
+        this.popup.on("click", function(e) {\n
+            this.insertMatch();\n
+            e.stop();\n
+        }.bind(this));\n
+    };\n
+\n
+    this.openPopup = function(editor, prefix, keepPopupPosition) {\n
+        if (!this.popup)\n
+            this.$init();\n
+\n
+        this.popup.setData(this.completions.filtered);\n
+\n
+        var renderer = editor.renderer;\n
+        if (!keepPopupPosition) {\n
+            this.popup.setFontSize(editor.getFontSize());\n
+\n
+            var lineHeight = renderer.layerConfig.lineHeight;\n
+            \n
+            var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);            \n
+            pos.left -= this.popup.getTextLeftOffset();\n
+            \n
+            var rect = editor.container.getBoundingClientRect();\n
+            pos.top += rect.top - renderer.layerConfig.offset;\n
+            pos.left += rect.left;\n
+            pos.left += renderer.$gutterLayer.gutterWidth;\n
+\n
+            this.popup.show(pos, lineHeight);\n
+        }\n
+    };\n
+\n
+    this.detach = function() {\n
+        this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n
+        this.editor.off("changeSelection", this.changeListener);\n
+        this.editor.off("blur", this.changeListener);\n
+        this.editor.off("mousedown", this.mousedownListener);\n
+        this.editor.off("mousewheel", this.mousewheelListener);\n
+        this.changeTimer.cancel();\n
+        \n
+        if (this.popup)\n
+            this.popup.hide();\n
+\n
+        this.activated = false;\n
+        this.completions = this.base = null;\n
+    };\n
+\n
+    this.changeListener = function(e) {\n
+        var cursor = this.editor.selection.lead;\n
+        if (cursor.row != this.base.row || cursor.column < this.base.column) {\n
+            this.detach();\n
+        }\n
+        if (this.activated)\n
+            this.changeTimer.schedule();\n
+        else\n
+            this.detach();\n
+    };\n
+\n
+    this.blurListener = function() {\n
+        if (document.activeElement != this.editor.textInput.getElement())\n
+            this.detach();\n
+    };\n
+\n
+    this.mousedownListener = function(e) {\n
+        this.detach();\n
+    };\n
+\n
+    this.mousewheelListener = function(e) {\n
+        this.detach();\n
+    };\n
+\n
+    this.goTo = function(where) {\n
+        var row = this.popup.getRow();\n
+        var max = this.popup.session.getLength() - 1;\n
+\n
+        switch(where) {\n
+            case "up": row = row < 0 ? max : row - 1; break;\n
+            case "down": row = row >= max ? -1 : row + 1; break;\n
+            case "start": row = 0; break;\n
+            case "end": row = max; break;\n
+        }\n
+\n
+        this.popup.setRow(row);\n
+    };\n
+\n
+    this.insertMatch = function(data) {\n
+        if (!data)\n
+            data = this.popup.getData(this.popup.getRow());\n
+        if (!data)\n
+            return false;\n
+        if (data.completer && data.completer.insertMatch) {\n
+            data.completer.insertMatch(this.editor);\n
+        } else {\n
+            if (this.completions.filterText) {\n
+                var ranges = this.editor.selection.getAllRanges();\n
+                for (var i = 0, range; range = ranges[i]; i++) {\n
+                    range.start.column -= this.completions.filterText.length;\n
+                    this.editor.session.remove(range);\n
+                }\n
+            }\n
+            if (data.snippet)\n
+                snippetManager.insertSnippet(this.editor, data.snippet);\n
+            else\n
+                this.editor.execCommand("insertstring", data.value || data);\n
+        }\n
+        this.detach();\n
+    };\n
+\n
+    this.commands = {\n
+        "Up": function(editor) { editor.completer.goTo("up"); },\n
+        "Down": function(editor) { editor.completer.goTo("down"); },\n
+        "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); },\n
+        "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); },\n
+\n
+        "Esc": function(editor) { editor.completer.detach(); },\n
+        "Space": function(editor) { editor.completer.detach(); editor.insert(" ");},\n
+        "Return": function(editor) { editor.completer.insertMatch(); },\n
+        "Shift-Return": function(editor) { editor.completer.insertMatch(true); },\n
+        "Tab": function(editor) { editor.completer.insertMatch(); },\n
+\n
+        "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); },\n
+        "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); }\n
+    };\n
+\n
+    this.gatherCompletions = function(editor, callback) {\n
+        var session = editor.getSession();\n
+        var pos = editor.getCursorPosition();\n
+        \n
+        var line = session.getLine(pos.row);\n
+        var prefix = util.retrievePrecedingIdentifier(line, pos.column);\n
+        \n
+        this.base = editor.getCursorPosition();\n
+        this.base.column -= prefix.length;\n
+\n
+        var matches = [];\n
+        util.parForEach(editor.completers, function(completer, next) {\n
+            completer.getCompletions(editor, session, pos, prefix, function(err, results) {\n
+                if (!err)\n
+                    matches = matches.concat(results);\n
+                next();\n
+            });\n
+        }, function() {\n
+            callback(null, {\n
+                prefix: prefix,\n
+                matches: matches\n
+            });\n
+        });\n
+        return true;\n
+    };\n
+\n
+    this.showPopup = function(editor) {\n
+        if (this.editor)\n
+            this.detach();\n
+        \n
+        this.activated = true;\n
+\n
+        this.editor = editor;\n
+        if (editor.completer != this) {\n
+            if (editor.completer)\n
+                editor.completer.detach();\n
+            editor.completer = this;\n
+        }\n
+\n
+        editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n
+        editor.on("changeSelection", this.changeListener);\n
+        editor.on("blur", this.blurListener);\n
+        editor.on("mousedown", this.mousedownListener);\n
+        editor.on("mousewheel", this.mousewheelListener);\n
+        \n
+        this.updateCompletions();\n
+    };\n
+    \n
+    this.updateCompletions = function(keepPopupPosition) {\n
+        if (keepPopupPosition && this.base && this.completions) {\n
+            var pos = this.editor.getCursorPosition();\n
+            var prefix = this.editor.session.getTextRange({start: this.base, end: pos});\n
+            if (prefix == this.completions.filterText)\n
+                return;\n
+            this.completions.setFilter(prefix);\n
+            if (!this.completions.filtered.length)\n
+                return this.detach();\n
+            this.openPopup(this.editor, prefix, keepPopupPosition);\n
+            return;\n
+        }\n
+        this.gatherCompletions(this.editor, function(err, results) {\n
+            var matches = results && results.matches;\n
+            if (!matches || !matches.length)\n
+                return this.detach();\n
+\n
+            this.completions = new FilteredList(matches);\n
+            this.completions.setFilter(results.prefix);\n
+            if (!this.completions.filtered.length)\n
+                return this.detach();\n
+            this.openPopup(this.editor, results.prefix, keepPopupPosition);\n
+        }.bind(this));\n
+    };\n
+\n
+    this.cancelContextMenu = function() {\n
+        var stop = function(e) {\n
+            this.editor.off("nativecontextmenu", stop);\n
+            if (e && e.domEvent)\n
+                event.stopEvent(e.domEvent);\n
+        }.bind(this);\n
+        setTimeout(stop, 10);\n
+        this.editor.on("nativecontextmenu", stop);\n
+    };\n
+\n
+}).call(Autocomplete.prototype);\n
+\n
+Autocomplete.startCommand = {\n
+    name: "startAutocomplete",\n
+    exec: function(editor) {\n
+        if (!editor.completer)\n
+            editor.completer = new Autocomplete();\n
+        editor.completer.showPopup(editor);\n
+        editor.completer.cancelContextMenu();\n
+    },\n
+    bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space"\n
+};\n
+\n
+var FilteredList = function(array, filterText, mutateData) {\n
+    this.all = array;\n
+    this.filtered = array;\n
+    this.filterText = filterText || "";\n
+};\n
+(function(){\n
+    this.setFilter = function(str) {\n
+        if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)\n
+            var matches = this.filtered;\n
+        else\n
+            var matches = this.all;\n
+\n
+        this.filterText = str;\n
+        matches = this.filterCompletions(matches, this.filterText);\n
+        matches = matches.sort(function(a, b) {\n
+            return b.exactMatch - a.exactMatch || b.score - a.score;\n
+        });\n
+        var prev = null;\n
+        matches = matches.filter(function(item){\n
+            var caption = item.value || item.caption || item.snippet; \n
+            if (caption === prev) return false;\n
+            prev = caption;\n
+            return true;\n
+        });\n
+        \n
+        this.filtered = matches;\n
+    };\n
+    this.filterCompletions = function(items, needle) {\n
+        var results = [];\n
+        var upper = needle.toUpperCase();\n
+        var lower = needle.toLowerCase();\n
+        loop: for (var i = 0, item; item = items[i]; i++) {\n
+            var caption = item.value || item.caption || item.snippet;\n
+            if (!caption) continue;\n
+            var lastIndex = -1;\n
+            var matchMask = 0;\n
+            var penalty = 0;\n
+            var index, distance;\n
+            for (var j = 0; j < needle.length; j++) {\n
+                var i1 = caption.indexOf(lower[j], lastIndex + 1);\n
+                var i2 = caption.indexOf(upper[j], lastIndex + 1);\n
+                index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;\n
+                if (index < 0)\n
+                    continue loop;\n
+                distance = index - lastIndex - 1;\n
+                if (distance > 0) {\n
+                    if (lastIndex === -1)\n
+                        penalty += 10;\n
+                    penalty += distance;\n
+                }\n
+                matchMask = matchMask | (1 << index);\n
+                lastIndex = index;\n
+            }\n
+            item.matchMask = matchMask;\n
+            item.exactMatch = penalty ? 0 : 1;\n
+            item.score = (item.score || 0) - penalty;\n
+            results.push(item);\n
+        }\n
+        return results;\n
+    };\n
+}).call(FilteredList.prototype);\n
+\n
+exports.Autocomplete = Autocomplete;\n
+exports.FilteredList = FilteredList;\n
+\n
+});\n
+\n
+define(\'ace/autocomplete/popup\', [\'require\', \'exports\', \'module\' , \'ace/edit_session\', \'ace/virtual_renderer\', \'ace/editor\', \'ace/range\', \'ace/lib/event\', \'ace/lib/lang\', \'ace/lib/dom\'], function(require, exports, module) {\n
+\n
+\n
+var EditSession = require("../edit_session").EditSession;\n
+var Renderer = require("../virtual_renderer").VirtualRenderer;\n
+var Editor = require("../editor").Editor;\n
+var Range = require("../range").Range;\n
+var event = require("../lib/event");\n
+var lang = require("../lib/lang");\n
+var dom = require("../lib/dom");\n
+\n
+var $singleLineEditor = function(el) {\n
+    var renderer = new Renderer(el);\n
+\n
+    renderer.$maxLines = 4;\n
+    \n
+    var editor = new Editor(renderer);\n
+\n
+    editor.setHighlightActiveLine(false);\n
+    editor.setShowPrintMargin(false);\n
+    editor.renderer.setShowGutter(false);\n
+    editor.renderer.setHighlightGutterLine(false);\n
+\n
+    editor.$mouseHandler.$focusWaitTimout = 0;\n
+\n
+    return editor;\n
+};\n
+\n
+var AcePopup = function(parentNode) {\n
+    var el = dom.createElement("div");\n
+    var popup = new $singleLineEditor(el);\n
+    \n
+    if (parentNode)\n
+        parentNode.appendChild(el);\n
+    el.style.display = "none";\n
+    popup.renderer.content.style.cursor = "default";\n
+    popup.renderer.setStyle("ace_autocomplete");\n
+    \n
+    popup.setOption("displayIndentGuides", false);\n
+\n
+    var noop = function(){};\n
+\n
+    popup.focus = noop;\n
+    popup.$isFocused = true;\n
+\n
+    popup.renderer.$cursorLayer.restartTimer = noop;\n
+    popup.renderer.$cursorLayer.element.style.opacity = 0;\n
+\n
+    popup.renderer.$maxLines = 8;\n
+    popup.renderer.$keepTextAreaAtCursor = false;\n
+\n
+    popup.setHighlightActiveLine(false);\n
+    popup.session.highlight("");\n
+    popup.session.$searchHighlight.clazz = "ace_highlight-marker";\n
+\n
+    popup.on("mousedown", function(e) {\n
+        var pos = e.getDocumentPosition();\n
+        popup.moveCursorToPosition(pos);\n
+        popup.selection.clearSelection();\n
+        selectionMarker.start.row = selectionMarker.end.row = pos.row;\n
+        e.stop();\n
+    });\n
+\n
+    var lastMouseEvent;\n
+    var hoverMarker = new Range(-1,0,-1,Infinity);\n
+    var selectionMarker = new Range(-1,0,-1,Infinity);\n
+    selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine");\n
+    popup.setSelectOnHover = function(val) {\n
+        if (!val) {\n
+            hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine");\n
+        } else if (hoverMarker.id) {\n
+            popup.session.removeMarker(hoverMarker.id);\n
+            hoverMarker.id = null;\n
+        }\n
+    }\n
+    popup.setSelectOnHover(false);\n
+    popup.on("mousemove", function(e) {\n
+        if (!lastMouseEvent) {\n
+            lastMouseEvent = e;\n
+            return;\n
+        }\n
+        if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) {\n
+            return;\n
+        }\n
+        lastMouseEvent = e;\n
+        lastMouseEvent.scrollTop = popup.renderer.scrollTop;\n
+        var row = lastMouseEvent.getDocumentPosition().row;\n
+        if (hoverMarker.start.row != row) {\n
+            if (!hoverMarker.id)\n
+                popup.setRow(row);\n
+            setHoverMarker(row);\n
+        }\n
+    });\n
+    popup.renderer.on("beforeRender", function() {\n
+        if (lastMouseEvent && hoverMarker.start.row != -1) {\n
+            lastMouseEvent.$pos = null;\n
+            var row = lastMouseEvent.getDocumentPosition().row;\n
+            if (!hoverMarker.id)\n
+                popup.setRow(row);\n
+            setHoverMarker(row, true);\n
+        }\n
+    });\n
+    popup.renderer.on("afterRender", function() {\n
+        var row = popup.getRow();\n
+        var t = popup.renderer.$textLayer;\n
+        var selected = t.element.childNodes[row - t.config.firstRow];\n
+        if (selected == t.selectedNode)\n
+            return;\n
+        if (t.selectedNode)\n
+            dom.removeCssClass(t.selectedNode, "ace_selected");\n
+        t.selectedNode = selected;\n
+        if (selected)\n
+            dom.addCssClass(selected, "ace_selected");\n
+    });\n
+    var hideHoverMarker = function() { setHoverMarker(-1) };\n
+    var setHoverMarker = function(row, suppressRedraw) {\n
+        if (row !== hoverMarker.start.row) {\n
+            hoverMarker.start.row = hoverMarker.end.row = row;\n
+            if (!suppressRedraw)\n
+                popup.session._emit("changeBackMarker");\n
+            popup._emit("changeHoverMarker");\n
+        }\n
+    };\n
+    popup.getHoveredRow = function() {\n
+        return hoverMarker.start.row;\n
+    };\n
+    \n
+    event.addListener(popup.container, "mouseout", hideHoverMarker);\n
+    popup.on("hide", hideHoverMarker);\n
+    popup.on("changeSelection", hideHoverMarker);\n
+    \n
+    popup.session.doc.getLength = function() {\n
+        return popup.data.length;\n
+    };\n
+    popup.session.doc.getLine = function(i) {\n
+        var data = popup.data[i];\n
+        if (typeof data == "string")\n
+            return data;\n
+        return (data && data.value) || "";\n
+    };\n
+\n
+    var bgTokenizer = popup.session.bgTokenizer;\n
+    bgTokenizer.$tokenizeRow = function(i) {\n
+        var data = popup.data[i];\n
+        var tokens = [];\n
+        if (!data)\n
+            return tokens;\n
+        if (typeof data == "string")\n
+            data = {value: data};\n
+        if (!data.caption)\n
+            data.caption = data.value;\n
+\n
+        var last = -1;\n
+        var flag, c;\n
+        for (var i = 0; i < data.caption.length; i++) {\n
+            c = data.caption[i];\n
+            flag = data.matchMask & (1 << i) ? 1 : 0;\n
+            if (last !== flag) {\n
+                tokens.push({type: data.className || "" + ( flag ? "completion-highlight" : ""), value: c});\n
+                last = flag;\n
+            } else {\n
+                tokens[tokens.length - 1].value += c;\n
+            }\n
+        }\n
+\n
+        if (data.meta) {\n
+            var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth;\n
+            if (data.meta.length + data.caption.length < maxW - 2)\n
+                tokens.push({type: "rightAlignedText", value: data.meta});\n
+        }\n
+        return tokens;\n
+    };\n
+    bgTokenizer.$updateOnChange = noop;\n
+    bgTokenizer.start = noop;\n
+    \n
+    popup.session.$computeWidth = function() {\n
+        return this.screenWidth = 0;\n
+    }\n
+    popup.data = [];\n
+    popup.setData = function(list) {\n
+        popup.data = list || [];\n
+        popup.setValue(lang.stringRepeat("\\n", list.length), -1);\n
+        popup.setRow(0);\n
+    };\n
+    popup.getData = function(row) {\n
+        return popup.data[row];\n
+    };\n
+\n
+    popup.getRow = function() {\n
+        return selectionMarker.start.row;\n
+    };\n
+    popup.setRow = function(line) {\n
+        line = Math.max(-1, Math.min(this.data.length, line));\n
+        if (selectionMarker.start.row != line) {\n
+            popup.selection.clearSelection();\n
+            selectionMarker.start.row = selectionMarker.end.row = line || 0;\n
+            popup.session._emit("changeBackMarker");\n
+            popup.moveCursorTo(line || 0, 0);\n
+            if (popup.isOpen)\n
+                popup._signal("select");\n
+        }\n
+    };\n
+\n
+    popup.hide = function() {\n
+        this.container.style.display = "none";\n
+        this._signal("hide");\n
+        popup.isOpen = false;\n
+    };\n
+    popup.show = function(pos, lineHeight) {\n
+        var el = this.container;\n
+        var screenHeight = window.innerHeight;\n
+        var renderer = this.renderer;\n
+        var maxH = renderer.$maxLines * lineHeight * 1.4;\n
+        var top = pos.top + this.$borderSize;\n
+        if (top + maxH > screenHeight - lineHeight) {\n
+            el.style.top = "";\n
+            el.style.bottom = screenHeight - top + "px";\n
+        } else {\n
+            top += lineHeight;\n
+            el.style.top = top + "px";\n
+            el.style.bottom = "";\n
+        }\n
+\n
+        el.style.left = pos.left + "px";\n
+        el.style.display = "";\n
+        this.renderer.$textLayer.checkForSizeChanges();\n
+\n
+        this._signal("show");\n
+        lastMouseEvent = null;\n
+        popup.isOpen = true;\n
+    };\n
+    \n
+    popup.getTextLeftOffset = function() {\n
+        return this.$borderSize + this.renderer.$padding + this.$imageSize;\n
+    };\n
+    \n
+    popup.$imageSize = 0;\n
+    popup.$borderSize = 1;\n
+\n
+    return popup;\n
+};\n
+\n
+dom.importCssString("\\\n
+.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {\\\n
+    background-color: #CAD6FA;\\\n
+    z-index: 1;\\\n
+}\\\n
+.ace_autocomplete.ace-tm .ace_line-hover {\\\n
+    border: 1px solid #abbffe;\\\n
+    margin-top: -1px;\\\n
+    background: rgba(233,233,253,0.4);\\\n
+}\\\n
+.ace_autocomplete .ace_line-hover {\\\n
+    position: absolute;\\\n
+    z-index: 2;\\\n
+}\\\n
+.ace_rightAlignedText {\\\n
+    color: gray;\\\n
+    display: inline-block;\\\n
+    position: absolute;\\\n
+    right: 4px;\\\n
+    text-align: right;\\\n
+    z-index: -1;\\\n
+}\\\n
+.ace_autocomplete .ace_completion-highlight{\\\n
+    color: #000;\\\n
+    text-shadow: 0 0 0.01em;\\\n
+}\\\n
+.ace_autocomplete {\\\n
+    width: 280px;\\\n
+    z-index: 200000;\\\n
+    background: #fbfbfb;\\\n
+    color: #444;\\\n
+    border: 1px lightgray solid;\\\n
+    position: fixed;\\\n
+    box-shadow: 2px 3px 5px rgba(0,0,0,.2);\\\n
+    line-height: 1.4;\\\n
+}");\n
+\n
+exports.AcePopup = AcePopup;\n
+\n
+});\n
+\n
+define(\'ace/autocomplete/util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+exports.parForEach = function(array, fn, callback) {\n
+    var completed = 0;\n
+    var arLength = array.length;\n
+    if (arLength === 0)\n
+        callback();\n
+    for (var i = 0; i < arLength; i++) {\n
+        fn(array[i], function(result, err) {\n
+            completed++;\n
+            if (completed === arLength)\n
+                callback(result, err);\n
+        });\n
+    }\n
+}\n
+\n
+var ID_REGEX = /[a-zA-Z_0-9\\$-]/;\n
+\n
+exports.retrievePrecedingIdentifier = function(text, pos, regex) {\n
+    regex = regex || ID_REGEX;\n
+    var buf = [];\n
+    for (var i = pos-1; i >= 0; i--) {\n
+        if (regex.test(text[i]))\n
+            buf.push(text[i]);\n
+        else\n
+            break;\n
+    }\n
+    return buf.reverse().join("");\n
+}\n
+\n
+exports.retrieveFollowingIdentifier = function(text, pos, regex) {\n
+    regex = regex || ID_REGEX;\n
+    var buf = [];\n
+    for (var i = pos; i < text.length; i++) {\n
+        if (regex.test(text[i]))\n
+            buf.push(text[i]);\n
+        else\n
+            break;\n
+    }\n
+    return buf;\n
+}\n
+\n
+});\n
+\n
+define(\'ace/autocomplete/text_completer\', [\'require\', \'exports\', \'module\' , \'ace/range\'], function(require, exports, module) {\n
+    var Range = require("ace/range").Range;\n
+    \n
+    var splitRegex = /[^a-zA-Z_0-9\\$\\-]+/;\n
+\n
+    function getWordIndex(doc, pos) {\n
+        var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos));\n
+        return textBefore.split(splitRegex).length - 1;\n
+    }\n
+    function wordDistance(doc, pos) {\n
+        var prefixPos = getWordIndex(doc, pos);\n
+        var words = doc.getValue().split(splitRegex);\n
+        var wordScores = Object.create(null);\n
+        \n
+        var currentWord = words[prefixPos];\n
+\n
+        words.forEach(function(word, idx) {\n
+            if (!word || word === currentWord) return;\n
+\n
+            var distance = Math.abs(prefixPos - idx);\n
+            var score = words.length - distance;\n
+            if (wordScores[word]) {\n
+                wordScores[word] = Math.max(score, wordScores[word]);\n
+            } else {\n
+                wordScores[word] = score;\n
+            }\n
+        });\n
+        return wordScores;\n
+    }\n
+\n
+    exports.getCompletions = function(editor, session, pos, prefix, callback) {\n
+        var wordScore = wordDistance(session, pos, prefix);\n
+        var wordList = Object.keys(wordScore);\n
+        callback(null, wordList.map(function(word) {\n
+            return {\n
+                name: word,\n
+                value: word,\n
+                score: wordScore[word],\n
+                meta: "local"\n
+            };\n
+        }));\n
+    };\n
+});
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>56218</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-modelist.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-modelist.js.xml
index b845cb97f1..a960635e7e 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-modelist.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-modelist.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155553.0</string> </value>
+            <value> <string>ts83646622.7</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -59,17 +59,17 @@ Mode.prototype.supportsFile = function(filename) {\n
 };\n
 var supportedModes = {\n
     ABAP:        ["abap"],\n
-    ADA:         ["ada|adb"],\n
     ActionScript:["as"],\n
+    ADA:         ["ada|adb"],\n
     AsciiDoc:    ["asciidoc"],\n
     Assembly_x86:["asm"],\n
     AutoHotKey:  ["ahk"],\n
     BatchFile:   ["bat|cmd"],\n
     C9Search:    ["c9search_results"],\n
-    C_Cpp:       ["c|cc|cpp|cxx|h|hh|hpp"],\n
+    C_Cpp:       ["cpp|c|cc|cxx|h|hh|hpp"],\n
     Clojure:     ["clj"],\n
-    Cobol:       ["^CBL|COB"],\n
-    coffee:      ["^Cakefile|coffee|cf|cson"],\n
+    Cobol:       ["CBL|COB"],\n
+    coffee:      ["coffee|cf|cson|^Cakefile"],\n
     ColdFusion:  ["cfm"],\n
     CSharp:      ["cs"],\n
     CSS:         ["css"],\n
@@ -81,25 +81,27 @@ var supportedModes = {\n
     Erlang:      ["erl|hrl"],\n
     EJS:         ["ejs"],\n
     Forth:       ["frt|fs|ldr"],\n
-    FreeMarker:  ["ftl"],\n
+    FTL:         ["ftl"],\n
     Glsl:        ["glsl|frag|vert"],\n
     golang:      ["go"],\n
     Groovy:      ["groovy"],\n
     HAML:        ["haml"],\n
+    Handlebars:  ["hbs|handlebars|tpl|mustache"],\n
     Haskell:     ["hs"],\n
     haXe:        ["hx"],\n
-    HTML:        ["htm|html|xhtml"],\n
+    HTML:        ["html|htm|xhtml"],\n
     HTML_Ruby:   ["erb|rhtml|html.erb"],\n
-    Ini:         ["Ini|conf"],\n
+    INI:         ["ini|conf|cfg|prefs"],\n
+    Jack:        ["jack"],\n
     Jade:        ["jade"],\n
     Java:        ["java"],\n
-    JavaScript:  ["js"],\n
+    JavaScript:  ["js|jsm"],\n
     JSON:        ["json"],\n
     JSONiq:      ["jq"],\n
     JSP:         ["jsp"],\n
     JSX:         ["jsx"],\n
     Julia:       ["jl"],\n
-    LaTeX:       ["latex|tex|ltx|bib"],\n
+    LaTeX:       ["tex|latex|ltx|bib"],\n
     LESS:        ["less"],\n
     Liquid:      ["liquid"],\n
     Lisp:        ["lisp"],\n
@@ -109,11 +111,12 @@ var supportedModes = {\n
     Lua:         ["lua"],\n
     LuaPage:     ["lp"],\n
     Lucene:      ["lucene"],\n
-    Makefile:    ["^GNUmakefile|^makefile|^Makefile|^OCamlMakefile|make"],\n
+    Makefile:    ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"],\n
     MATLAB:      ["matlab"],\n
     Markdown:    ["md|markdown"],\n
     MySQL:       ["mysql"],\n
     MUSHCode:    ["mc|mush"],\n
+    Nix:         ["nix"],\n
     ObjectiveC:  ["m|mm"],\n
     OCaml:       ["ml|mli"],\n
     Pascal:      ["pas|p"],\n
@@ -123,19 +126,23 @@ var supportedModes = {\n
     Powershell:  ["ps1"],\n
     Prolog:      ["plg|prolog"],\n
     Properties:  ["properties"],\n
+    Protobuf:    ["proto"],\n
     Python:      ["py"],\n
     R:           ["r"],\n
     RDoc:        ["Rd"],\n
     RHTML:       ["Rhtml"],\n
-    Ruby:        ["ru|gemspec|rake|rb"],\n
+    Ruby:        ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"],\n
     Rust:        ["rs"],\n
     SASS:        ["sass"],\n
     SCAD:        ["scad"],\n
     Scala:       ["scala"],\n
     Scheme:      ["scm|rkt"],\n
     SCSS:        ["scss"],\n
-    SH:          ["sh|bash"],\n
+    SH:          ["sh|bash|^.bashrc"],\n
+    SJS:         ["sjs"],\n
+    Space:       ["space"],\n
     snippets:    ["snippets"],\n
+    Soy_Template:["soy"],\n
     SQL:         ["sql"],\n
     Stylus:      ["styl|stylus"],\n
     SVG:         ["svg"],\n
@@ -145,12 +152,13 @@ var supportedModes = {\n
     Textile:     ["textile"],\n
     Toml:        ["toml"],\n
     Twig:        ["twig"],\n
-    Typescript:  ["typescript|ts|str"],\n
+    Typescript:  ["ts|typescript|str"],\n
     VBScript:    ["vbs"],\n
     Velocity:    ["vm"],\n
+    Verilog:     ["v|vh|sv|svh"],\n
     XML:         ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl"],\n
     XQuery:      ["xq"],\n
-    YAML:        ["yaml"]\n
+    YAML:        ["yaml|yml"]\n
 };\n
 \n
 var nameOverrides = {\n
@@ -159,7 +167,8 @@ var nameOverrides = {\n
     golang: "Go",\n
     C_Cpp: "C/C++",\n
     coffee: "CoffeeScript",\n
-    HTML_Ruby: "HTML (Ruby)"\n
+    HTML_Ruby: "HTML (Ruby)",\n
+    FTL: "FreeMarker"\n
 };\n
 var modesByName = {};\n
 for (var name in supportedModes) {\n
@@ -189,7 +198,7 @@ module.exports = {\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4320</int> </value>
+            <value> <int>4644</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-old_ie.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-old_ie.js.xml
new file mode 100644
index 0000000000..a20582d5a9
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-old_ie.js.xml
@@ -0,0 +1,543 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.38</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>ext-old_ie.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/ext/old_ie\', [\'require\', \'exports\', \'module\' , \'ace/lib/useragent\', \'ace/tokenizer\', \'ace/ext/searchbox\'], function(require, exports, module) {\n
+\n
+var MAX_TOKEN_COUNT = 1000;\n
+var useragent = require("../lib/useragent");\n
+var TokenizerModule = require("../tokenizer");\n
+\n
+function patch(obj, name, regexp, replacement) {\n
+    eval("obj[\'" + name + "\']=" + obj[name].toString().replace(\n
+        regexp, replacement\n
+    ));\n
+}\n
+\n
+if (useragent.isIE && useragent.isIE < 10 && window.top.document.compatMode === "BackCompat")\n
+    useragent.isOldIE = true;\n
+\n
+if (typeof document != "undefined" && !document.documentElement.querySelector) {    \n
+    useragent.isOldIE = true;\n
+    var qs = function(el, selector) {\n
+        if (selector.charAt(0) == ".") {\n
+            var classNeme = selector.slice(1);\n
+        } else {\n
+            var m = selector.match(/(\\w+)=(\\w+)/);\n
+            var attr = m && m[1];\n
+            var attrVal = m && m[2];\n
+        }\n
+        for (var i = 0; i < el.all.length; i++) {\n
+            var ch = el.all[i];\n
+            if (classNeme) {\n
+                if (ch.className.indexOf(classNeme) != -1)\n
+                    return ch;\n
+            } else if (attr) {\n
+                if (ch.getAttribute(attr) == attrVal)\n
+                    return ch;\n
+            }\n
+        }\n
+    };\n
+    var sb = require("./searchbox").SearchBox.prototype;\n
+    patch(\n
+        sb, "$initElements",\n
+        /([^\\s=]*).querySelector\\((".*?")\\)/g, \n
+        "qs($1, $2)"\n
+    );\n
+}\n
+    \n
+var compliantExecNpcg = /()??/.exec("")[1] === undefined;\n
+if (compliantExecNpcg)\n
+    return;\n
+var proto = TokenizerModule.Tokenizer.prototype;\n
+TokenizerModule.Tokenizer_orig = TokenizerModule.Tokenizer;\n
+proto.getLineTokens_orig = proto.getLineTokens;\n
+\n
+patch(\n
+    TokenizerModule, "Tokenizer",\n
+    "ruleRegExps.push(adjustedregex);\\n", \n
+    function(m) {\n
+        return m + \'\\\n
+        if (state[i].next && RegExp(adjustedregex).test(""))\\n\\\n
+            rule._qre = RegExp(adjustedregex, "g");\\n\\\n
+        \';\n
+    }\n
+);\n
+TokenizerModule.Tokenizer.prototype = proto;\n
+patch(\n
+    proto, "getLineTokens",\n
+    /if \\(match\\[i \\+ 1\\] === undefined\\)\\s*continue;/, \n
+    "if (!match[i + 1]) {\\n\\\n
+        if (value)continue;\\n\\\n
+        var qre = state[mapping[i]]._qre;\\n\\\n
+        if (!qre) continue;\\n\\\n
+        qre.lastIndex = lastIndex;\\n\\\n
+        if (!qre.exec(line) || qre.lastIndex != lastIndex)\\n\\\n
+            continue;\\n\\\n
+    }"\n
+);\n
+\n
+useragent.isOldIE = true;\n
+\n
+});\n
+\n
+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) {\n
+\n
+\n
+var dom = require("../lib/dom");\n
+var lang = require("../lib/lang");\n
+var event = require("../lib/event");\n
+var searchboxCss = "\\\n
+/* ------------------------------------------------------------------------------------------\\\n
+* Editor Search Form\\\n
+* --------------------------------------------------------------------------------------- */\\\n
+.ace_search {\\\n
+background-color: #ddd;\\\n
+border: 1px solid #cbcbcb;\\\n
+border-top: 0 none;\\\n
+max-width: 297px;\\\n
+overflow: hidden;\\\n
+margin: 0;\\\n
+padding: 4px;\\\n
+padding-right: 6px;\\\n
+padding-bottom: 0;\\\n
+position: absolute;\\\n
+top: 0px;\\\n
+z-index: 99;\\\n
+}\\\n
+.ace_search.left {\\\n
+border-left: 0 none;\\\n
+border-radius: 0px 0px 5px 0px;\\\n
+left: 0;\\\n
+}\\\n
+.ace_search.right {\\\n
+border-radius: 0px 0px 0px 5px;\\\n
+border-right: 0 none;\\\n
+right: 0;\\\n
+}\\\n
+.ace_search_form, .ace_replace_form {\\\n
+border-radius: 3px;\\\n
+border: 1px solid #cbcbcb;\\\n
+float: left;\\\n
+margin-bottom: 4px;\\\n
+overflow: hidden;\\\n
+}\\\n
+.ace_search_form.ace_nomatch {\\\n
+outline: 1px solid red;\\\n
+}\\\n
+.ace_search_field {\\\n
+background-color: white;\\\n
+border-right: 1px solid #cbcbcb;\\\n
+border: 0 none;\\\n
+-webkit-box-sizing: border-box;\\\n
+-moz-box-sizing: border-box;\\\n
+box-sizing: border-box;\\\n
+display: block;\\\n
+float: left;\\\n
+height: 22px;\\\n
+outline: 0;\\\n
+padding: 0 7px;\\\n
+width: 214px;\\\n
+margin: 0;\\\n
+}\\\n
+.ace_searchbtn,\\\n
+.ace_replacebtn {\\\n
+background: #fff;\\\n
+border: 0 none;\\\n
+border-left: 1px solid #dcdcdc;\\\n
+cursor: pointer;\\\n
+display: block;\\\n
+float: left;\\\n
+height: 22px;\\\n
+margin: 0;\\\n
+padding: 0;\\\n
+position: relative;\\\n
+}\\\n
+.ace_searchbtn:last-child,\\\n
+.ace_replacebtn:last-child {\\\n
+border-top-right-radius: 3px;\\\n
+border-bottom-right-radius: 3px;\\\n
+}\\\n
+.ace_searchbtn:disabled {\\\n
+background: none;\\\n
+cursor: default;\\\n
+}\\\n
+.ace_searchbtn {\\\n
+background-position: 50% 50%;\\\n
+background-repeat: no-repeat;\\\n
+width: 27px;\\\n
+}\\\n
+.ace_searchbtn.prev {\\\n
+background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=);    \\\n
+}\\\n
+.ace_searchbtn.next {\\\n
+background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=);    \\\n
+}\\\n
+.ace_searchbtn_close {\\\n
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\\\n
+border-radius: 50%;\\\n
+border: 0 none;\\\n
+color: #656565;\\\n
+cursor: pointer;\\\n
+display: block;\\\n
+float: right;\\\n
+font-family: Arial;\\\n
+font-size: 16px;\\\n
+height: 14px;\\\n
+line-height: 16px;\\\n
+margin: 5px 1px 9px 5px;\\\n
+padding: 0;\\\n
+text-align: center;\\\n
+width: 14px;\\\n
+}\\\n
+.ace_searchbtn_close:hover {\\\n
+background-color: #656565;\\\n
+background-position: 50% 100%;\\\n
+color: white;\\\n
+}\\\n
+.ace_replacebtn.prev {\\\n
+width: 54px\\\n
+}\\\n
+.ace_replacebtn.next {\\\n
+width: 27px\\\n
+}\\\n
+.ace_button {\\\n
+margin-left: 2px;\\\n
+cursor: pointer;\\\n
+-webkit-user-select: none;\\\n
+-moz-user-select: none;\\\n
+-o-user-select: none;\\\n
+-ms-user-select: none;\\\n
+user-select: none;\\\n
+overflow: hidden;\\\n
+opacity: 0.7;\\\n
+border: 1px solid rgba(100,100,100,0.23);\\\n
+padding: 1px;\\\n
+-moz-box-sizing: border-box;\\\n
+box-sizing:    border-box;\\\n
+color: black;\\\n
+}\\\n
+.ace_button:hover {\\\n
+background-color: #eee;\\\n
+opacity:1;\\\n
+}\\\n
+.ace_button:active {\\\n
+background-color: #ddd;\\\n
+}\\\n
+.ace_button.checked {\\\n
+border-color: #3399ff;\\\n
+opacity:1;\\\n
+}\\\n
+.ace_search_options{\\\n
+margin-bottom: 3px;\\\n
+text-align: right;\\\n
+-webkit-user-select: none;\\\n
+-moz-user-select: none;\\\n
+-o-user-select: none;\\\n
+-ms-user-select: none;\\\n
+user-select: none;\\\n
+}";\n
+var HashHandler = require("../keyboard/hash_handler").HashHandler;\n
+var keyUtil = require("../lib/keys");\n
+\n
+dom.importCssString(searchboxCss, "ace_searchbox");\n
+\n
+var html = \'<div class="ace_search right">\\\n
+    <button type="button" action="hide" class="ace_searchbtn_close"></button>\\\n
+    <div class="ace_search_form">\\\n
+        <input class="ace_search_field" placeholder="Search for" spellcheck="false"></input>\\\n
+        <button type="button" action="findNext" class="ace_searchbtn next"></button>\\\n
+        <button type="button" action="findPrev" class="ace_searchbtn prev"></button>\\\n
+    </div>\\\n
+    <div class="ace_replace_form">\\\n
+        <input class="ace_search_field" placeholder="Replace with" spellcheck="false"></input>\\\n
+        <button type="button" action="replaceAndFindNext" class="ace_replacebtn">Replace</button>\\\n
+        <button type="button" action="replaceAll" class="ace_replacebtn">All</button>\\\n
+    </div>\\\n
+    <div class="ace_search_options">\\\n
+        <span action="toggleRegexpMode" class="ace_button" title="RegExp Search">.*</span>\\\n
+        <span action="toggleCaseSensitive" class="ace_button" title="CaseSensitive Search">Aa</span>\\\n
+        <span action="toggleWholeWords" class="ace_button" title="Whole Word Search">\\\\b</span>\\\n
+    </div>\\\n
+</div>\'.replace(/>\\s+/g, ">");\n
+\n
+var SearchBox = function(editor, range, showReplaceForm) {\n
+    var div = dom.createElement("div");\n
+    div.innerHTML = html;\n
+    this.element = div.firstChild;\n
+\n
+    this.$init();\n
+    this.setEditor(editor);\n
+};\n
+\n
+(function() {\n
+    this.setEditor = function(editor) {\n
+        editor.searchBox = this;\n
+        editor.container.appendChild(this.element);\n
+        this.editor = editor;\n
+    };\n
+\n
+    this.$initElements = function(sb) {\n
+        this.searchBox = sb.querySelector(".ace_search_form");\n
+        this.replaceBox = sb.querySelector(".ace_replace_form");\n
+        this.searchOptions = sb.querySelector(".ace_search_options");\n
+        this.regExpOption = sb.querySelector("[action=toggleRegexpMode]");\n
+        this.caseSensitiveOption = sb.querySelector("[action=toggleCaseSensitive]");\n
+        this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]");\n
+        this.searchInput = this.searchBox.querySelector(".ace_search_field");\n
+        this.replaceInput = this.replaceBox.querySelector(".ace_search_field");\n
+    };\n
+    \n
+    this.$init = function() {\n
+        var sb = this.element;\n
+        \n
+        this.$initElements(sb);\n
+        \n
+        var _this = this;\n
+        event.addListener(sb, "mousedown", function(e) {\n
+            setTimeout(function(){\n
+                _this.activeInput.focus();\n
+            }, 0);\n
+            event.stopPropagation(e);\n
+        });\n
+        event.addListener(sb, "click", function(e) {\n
+            var t = e.target || e.srcElement;\n
+            var action = t.getAttribute("action");\n
+            if (action && _this[action])\n
+                _this[action]();\n
+            else if (_this.$searchBarKb.commands[action])\n
+                _this.$searchBarKb.commands[action].exec(_this);\n
+            event.stopPropagation(e);\n
+        });\n
+\n
+        event.addCommandKeyListener(sb, function(e, hashId, keyCode) {\n
+            var keyString = keyUtil.keyCodeToString(keyCode);\n
+            var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);\n
+            if (command && command.exec) {\n
+                command.exec(_this);\n
+                event.stopEvent(e);\n
+            }\n
+        });\n
+\n
+        this.$onChange = lang.delayedCall(function() {\n
+            _this.find(false, false);\n
+        });\n
+\n
+        event.addListener(this.searchInput, "input", function() {\n
+            _this.$onChange.schedule(20);\n
+        });\n
+        event.addListener(this.searchInput, "focus", function() {\n
+            _this.activeInput = _this.searchInput;\n
+            _this.searchInput.value && _this.highlight();\n
+        });\n
+        event.addListener(this.replaceInput, "focus", function() {\n
+            _this.activeInput = _this.replaceInput;\n
+            _this.searchInput.value && _this.highlight();\n
+        });\n
+    };\n
+    this.$closeSearchBarKb = new HashHandler([{\n
+        bindKey: "Esc",\n
+        name: "closeSearchBar",\n
+        exec: function(editor) {\n
+            editor.searchBox.hide();\n
+        }\n
+    }]);\n
+    this.$searchBarKb = new HashHandler();\n
+    this.$searchBarKb.bindKeys({\n
+        "Ctrl-f|Command-f|Ctrl-H|Command-Option-F": function(sb) {\n
+            var isReplace = sb.isReplace = !sb.isReplace;\n
+            sb.replaceBox.style.display = isReplace ? "" : "none";\n
+            sb[isReplace ? "replaceInput" : "searchInput"].focus();\n
+        },\n
+        "Ctrl-G|Command-G": function(sb) {\n
+            sb.findNext();\n
+        },\n
+        "Ctrl-Shift-G|Command-Shift-G": function(sb) {\n
+            sb.findPrev();\n
+        },\n
+        "esc": function(sb) {\n
+            setTimeout(function() { sb.hide();});\n
+        },\n
+        "Return": function(sb) {\n
+            if (sb.activeInput == sb.replaceInput)\n
+                sb.replace();\n
+            sb.findNext();\n
+        },\n
+        "Shift-Return": function(sb) {\n
+            if (sb.activeInput == sb.replaceInput)\n
+                sb.replace();\n
+            sb.findPrev();\n
+        },\n
+        "Tab": function(sb) {\n
+            (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();\n
+        }\n
+    });\n
+\n
+    this.$searchBarKb.addCommands([{\n
+        name: "toggleRegexpMode",\n
+        bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"},\n
+        exec: function(sb) {\n
+            sb.regExpOption.checked = !sb.regExpOption.checked;\n
+            sb.$syncOptions();\n
+        }\n
+    }, {\n
+        name: "toggleCaseSensitive",\n
+        bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"},\n
+        exec: function(sb) {\n
+            sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;\n
+            sb.$syncOptions();\n
+        }\n
+    }, {\n
+        name: "toggleWholeWords",\n
+        bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"},\n
+        exec: function(sb) {\n
+            sb.wholeWordOption.checked = !sb.wholeWordOption.checked;\n
+            sb.$syncOptions();\n
+        }\n
+    }]);\n
+\n
+    this.$syncOptions = function() {\n
+        dom.setCssClass(this.regExpOption, "checked", this.regExpOption.checked);\n
+        dom.setCssClass(this.wholeWordOption, "checked", this.wholeWordOption.checked);\n
+        dom.setCssClass(this.caseSensitiveOption, "checked", this.caseSensitiveOption.checked);\n
+        this.find(false, false);\n
+    };\n
+\n
+    this.highlight = function(re) {\n
+        this.editor.session.highlight(re || this.editor.$search.$options.re);\n
+        this.editor.renderer.updateBackMarkers()\n
+    };\n
+    this.find = function(skipCurrent, backwards) {\n
+        var range = this.editor.find(this.searchInput.value, {\n
+            skipCurrent: skipCurrent,\n
+            backwards: backwards,\n
+            wrap: true,\n
+            regExp: this.regExpOption.checked,\n
+            caseSensitive: this.caseSensitiveOption.checked,\n
+            wholeWord: this.wholeWordOption.checked\n
+        });\n
+        var noMatch = !range && this.searchInput.value;\n
+        dom.setCssClass(this.searchBox, "ace_nomatch", noMatch);\n
+        this.editor._emit("findSearchBox", { match: !noMatch });\n
+        this.highlight();\n
+    };\n
+    this.findNext = function() {\n
+        this.find(true, false);\n
+    };\n
+    this.findPrev = function() {\n
+        this.find(true, true);\n
+    };\n
+    this.replace = function() {\n
+        if (!this.editor.getReadOnly())\n
+            this.editor.replace(this.replaceInput.value);\n
+    };    \n
+    this.replaceAndFindNext = function() {\n
+        if (!this.editor.getReadOnly()) {\n
+            this.editor.replace(this.replaceInput.value);\n
+            this.findNext()\n
+        }\n
+    };\n
+    this.replaceAll = function() {\n
+        if (!this.editor.getReadOnly())\n
+            this.editor.replaceAll(this.replaceInput.value);\n
+    };\n
+\n
+    this.hide = function() {\n
+        this.element.style.display = "none";\n
+        this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);\n
+        this.editor.focus();\n
+    };\n
+    this.show = function(value, isReplace) {\n
+        this.element.style.display = "";\n
+        this.replaceBox.style.display = isReplace ? "" : "none";\n
+\n
+        this.isReplace = isReplace;\n
+\n
+        if (value)\n
+            this.searchInput.value = value;\n
+        this.searchInput.focus();\n
+        this.searchInput.select();\n
+\n
+        this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);\n
+    };\n
+\n
+}).call(SearchBox.prototype);\n
+\n
+exports.SearchBox = SearchBox;\n
+\n
+exports.Search = function(editor, isReplace) {\n
+    var sb = editor.searchBox || new SearchBox(editor);\n
+    sb.show(editor.session.getTextRange(), isReplace);\n
+};\n
+\n
+});\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>16695</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-options.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-options.js.xml
index 5bbe7b91e7..4ce6f206bc 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-options.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-options.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155553.14</string> </value>
+            <value> <string>ts83646622.68</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-searchbox.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-searchbox.js.xml
index 7503fc04a2..6ffaa495d0 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-searchbox.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-searchbox.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155553.29</string> </value>
+            <value> <string>ts83646622.67</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -222,7 +222,7 @@ var html = \'<div class="ace_search right">\\\n
     </div>\\\n
     <div class="ace_replace_form">\\\n
         <input class="ace_search_field" placeholder="Replace with" spellcheck="false"></input>\\\n
-        <button type="button" action="replace" class="ace_replacebtn">Replace</button>\\\n
+        <button type="button" action="replaceAndFindNext" class="ace_replacebtn">Replace</button>\\\n
         <button type="button" action="replaceAll" class="ace_replacebtn">All</button>\\\n
     </div>\\\n
     <div class="ace_search_options">\\\n
@@ -248,9 +248,7 @@ var SearchBox = function(editor, range, showReplaceForm) {\n
         this.editor = editor;\n
     };\n
 \n
-    this.$init = function() {\n
-        var sb = this.element;\n
-\n
+    this.$initElements = function(sb) {\n
         this.searchBox = sb.querySelector(".ace_search_form");\n
         this.replaceBox = sb.querySelector(".ace_replace_form");\n
         this.searchOptions = sb.querySelector(".ace_search_options");\n
@@ -259,7 +257,13 @@ var SearchBox = function(editor, range, showReplaceForm) {\n
         this.wholeWordOption = sb.querySelector("[action=toggleWholeWords]");\n
         this.searchInput = this.searchBox.querySelector(".ace_search_field");\n
         this.replaceInput = this.replaceBox.querySelector(".ace_search_field");\n
-\n
+    };\n
+    \n
+    this.$init = function() {\n
+        var sb = this.element;\n
+        \n
+        this.$initElements(sb);\n
+        \n
         var _this = this;\n
         event.addListener(sb, "mousedown", function(e) {\n
             setTimeout(function(){\n
@@ -268,7 +272,7 @@ var SearchBox = function(editor, range, showReplaceForm) {\n
             event.stopPropagation(e);\n
         });\n
         event.addListener(sb, "click", function(e) {\n
-            var t = e.target;\n
+            var t = e.target || e.srcElement;\n
             var action = t.getAttribute("action");\n
             if (action && _this[action])\n
                 _this[action]();\n
@@ -383,7 +387,9 @@ var SearchBox = function(editor, range, showReplaceForm) {\n
             caseSensitive: this.caseSensitiveOption.checked,\n
             wholeWord: this.wholeWordOption.checked\n
         });\n
-        dom.setCssClass(this.searchBox, "ace_nomatch", !range && this.searchInput.value);\n
+        var noMatch = !range && this.searchInput.value;\n
+        dom.setCssClass(this.searchBox, "ace_nomatch", noMatch);\n
+        this.editor._emit("findSearchBox", { match: !noMatch });\n
         this.highlight();\n
     };\n
     this.findNext = function() {\n
@@ -393,10 +399,18 @@ var SearchBox = function(editor, range, showReplaceForm) {\n
         this.find(true, true);\n
     };\n
     this.replace = function() {\n
-        this.editor.replace(this.replaceInput.value);\n
+        if (!this.editor.getReadOnly())\n
+            this.editor.replace(this.replaceInput.value);\n
+    };    \n
+    this.replaceAndFindNext = function() {\n
+        if (!this.editor.getReadOnly()) {\n
+            this.editor.replace(this.replaceInput.value);\n
+            this.findNext()\n
+        }\n
     };\n
     this.replaceAll = function() {\n
-        this.editor.replaceAll(this.replaceInput.value);\n
+        if (!this.editor.getReadOnly())\n
+            this.editor.replaceAll(this.replaceInput.value);\n
     };\n
 \n
     this.hide = function() {\n
@@ -427,47 +441,6 @@ exports.Search = function(editor, isReplace) {\n
     sb.show(editor.session.getTextRange(), isReplace);\n
 };\n
 \n
-\n
-exports.ISearch = function(session, options) {\n
-    this.$changeListener = this.$changeListener.bind(this);\n
-    this.startRange = session.selection.toOrientedRange();\n
-    this.options = options || {};\n
-};\n
-\n
-(function(){\n
-    this.setSession = function(session) {\n
-        if (this.session) {\n
-            this.session.removeListener(this.$changeListener);\n
-        }\n
-        this.session = session;\n
-        this.session.addListener(this.$changeListener);\n
-    };\n
-    this.setSearchString = function() {\n
-\n
-    };\n
-    this.getValue = function() {\n
-        if (this.value == null)\n
-            this.value = this.session.getValue();\n
-        return this.value;\n
-    };\n
-    this.$changeListener = function() {\n
-        this.value = null;\n
-    };\n
-    this.find = function() {\n
-\n
-    };\n
-    this.$edgeBefore = function() {\n
-        this.cursor = this.startRange[this.options.backwards ? "start" : "end"];\n
-    };\n
-    this.$edgeAfter = function() {\n
-\n
-    };\n
-    this.next = function(dir) {\n
-\n
-    };\n
-}).call(exports.ISearch.prototype);\n
-\n
-\n
 });\n
 
 
@@ -479,7 +452,7 @@ exports.ISearch = function(session, options) {\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>14773</int> </value>
+            <value> <int>14267</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-settings_menu.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-settings_menu.js.xml
index 002eb10c6c..4a352bb524 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-settings_menu.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-settings_menu.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155553.44</string> </value>
+            <value> <string>ts83646622.66</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -327,17 +327,17 @@ Mode.prototype.supportsFile = function(filename) {\n
 };\n
 var supportedModes = {\n
     ABAP:        ["abap"],\n
-    ADA:         ["ada|adb"],\n
     ActionScript:["as"],\n
+    ADA:         ["ada|adb"],\n
     AsciiDoc:    ["asciidoc"],\n
     Assembly_x86:["asm"],\n
     AutoHotKey:  ["ahk"],\n
     BatchFile:   ["bat|cmd"],\n
     C9Search:    ["c9search_results"],\n
-    C_Cpp:       ["c|cc|cpp|cxx|h|hh|hpp"],\n
+    C_Cpp:       ["cpp|c|cc|cxx|h|hh|hpp"],\n
     Clojure:     ["clj"],\n
-    Cobol:       ["^CBL|COB"],\n
-    coffee:      ["^Cakefile|coffee|cf|cson"],\n
+    Cobol:       ["CBL|COB"],\n
+    coffee:      ["coffee|cf|cson|^Cakefile"],\n
     ColdFusion:  ["cfm"],\n
     CSharp:      ["cs"],\n
     CSS:         ["css"],\n
@@ -349,25 +349,27 @@ var supportedModes = {\n
     Erlang:      ["erl|hrl"],\n
     EJS:         ["ejs"],\n
     Forth:       ["frt|fs|ldr"],\n
-    FreeMarker:  ["ftl"],\n
+    FTL:         ["ftl"],\n
     Glsl:        ["glsl|frag|vert"],\n
     golang:      ["go"],\n
     Groovy:      ["groovy"],\n
     HAML:        ["haml"],\n
+    Handlebars:  ["hbs|handlebars|tpl|mustache"],\n
     Haskell:     ["hs"],\n
     haXe:        ["hx"],\n
-    HTML:        ["htm|html|xhtml"],\n
+    HTML:        ["html|htm|xhtml"],\n
     HTML_Ruby:   ["erb|rhtml|html.erb"],\n
-    Ini:         ["Ini|conf"],\n
+    INI:         ["ini|conf|cfg|prefs"],\n
+    Jack:        ["jack"],\n
     Jade:        ["jade"],\n
     Java:        ["java"],\n
-    JavaScript:  ["js"],\n
+    JavaScript:  ["js|jsm"],\n
     JSON:        ["json"],\n
     JSONiq:      ["jq"],\n
     JSP:         ["jsp"],\n
     JSX:         ["jsx"],\n
     Julia:       ["jl"],\n
-    LaTeX:       ["latex|tex|ltx|bib"],\n
+    LaTeX:       ["tex|latex|ltx|bib"],\n
     LESS:        ["less"],\n
     Liquid:      ["liquid"],\n
     Lisp:        ["lisp"],\n
@@ -377,11 +379,12 @@ var supportedModes = {\n
     Lua:         ["lua"],\n
     LuaPage:     ["lp"],\n
     Lucene:      ["lucene"],\n
-    Makefile:    ["^GNUmakefile|^makefile|^Makefile|^OCamlMakefile|make"],\n
+    Makefile:    ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"],\n
     MATLAB:      ["matlab"],\n
     Markdown:    ["md|markdown"],\n
     MySQL:       ["mysql"],\n
     MUSHCode:    ["mc|mush"],\n
+    Nix:         ["nix"],\n
     ObjectiveC:  ["m|mm"],\n
     OCaml:       ["ml|mli"],\n
     Pascal:      ["pas|p"],\n
@@ -391,19 +394,23 @@ var supportedModes = {\n
     Powershell:  ["ps1"],\n
     Prolog:      ["plg|prolog"],\n
     Properties:  ["properties"],\n
+    Protobuf:    ["proto"],\n
     Python:      ["py"],\n
     R:           ["r"],\n
     RDoc:        ["Rd"],\n
     RHTML:       ["Rhtml"],\n
-    Ruby:        ["ru|gemspec|rake|rb"],\n
+    Ruby:        ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"],\n
     Rust:        ["rs"],\n
     SASS:        ["sass"],\n
     SCAD:        ["scad"],\n
     Scala:       ["scala"],\n
     Scheme:      ["scm|rkt"],\n
     SCSS:        ["scss"],\n
-    SH:          ["sh|bash"],\n
+    SH:          ["sh|bash|^.bashrc"],\n
+    SJS:         ["sjs"],\n
+    Space:       ["space"],\n
     snippets:    ["snippets"],\n
+    Soy_Template:["soy"],\n
     SQL:         ["sql"],\n
     Stylus:      ["styl|stylus"],\n
     SVG:         ["svg"],\n
@@ -413,12 +420,13 @@ var supportedModes = {\n
     Textile:     ["textile"],\n
     Toml:        ["toml"],\n
     Twig:        ["twig"],\n
-    Typescript:  ["typescript|ts|str"],\n
+    Typescript:  ["ts|typescript|str"],\n
     VBScript:    ["vbs"],\n
     Velocity:    ["vm"],\n
+    Verilog:     ["v|vh|sv|svh"],\n
     XML:         ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl"],\n
     XQuery:      ["xq"],\n
-    YAML:        ["yaml"]\n
+    YAML:        ["yaml|yml"]\n
 };\n
 \n
 var nameOverrides = {\n
@@ -427,7 +435,8 @@ var nameOverrides = {\n
     golang: "Go",\n
     C_Cpp: "C/C++",\n
     coffee: "CoffeeScript",\n
-    HTML_Ruby: "HTML (Ruby)"\n
+    HTML_Ruby: "HTML (Ruby)",\n
+    FTL: "FreeMarker"\n
 };\n
 var modesByName = {};\n
 for (var name in supportedModes) {\n
@@ -487,8 +496,8 @@ module.exports.themes = [\n
     "kr_theme",\n
     "merbivore",\n
     "merbivore_soft",\n
-    "monokai",\n
     "mono_industrial",\n
+    "monokai",\n
     "pastel_on_dark",\n
     "solarized_dark",\n
     "solarized_light",\n
@@ -656,7 +665,7 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, top, r
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>19778</int> </value>
+            <value> <int>20102</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-spellcheck.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-spellcheck.js.xml
index ec767d2760..4816993e08 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-spellcheck.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-spellcheck.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155553.56</string> </value>
+            <value> <string>ts83646622.64</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -39,8 +39,9 @@ exports.contextMenuHandler = function(e){\n
     var PLACEHOLDER = "\\x01\\x01";\n
     var value = w + " " + PLACEHOLDER;\n
     text.value = value;\n
-    text.setSelectionRange(w.length + 1, w.length + 1);\n
+    text.setSelectionRange(w.length, w.length + 1);\n
     text.setSelectionRange(0, 0);\n
+    text.setSelectionRange(0, w.length);\n
 \n
     var afterKeydown = false;\n
     event.addListener(text, "keydown", function onKeydown() {\n
@@ -95,7 +96,7 @@ require("../config").defineOptions(Editor.prototype, "editor", {\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>2227</int> </value>
+            <value> <int>2264</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-split.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-split.js.xml
new file mode 100644
index 0000000000..9a3e99a62f
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-split.js.xml
@@ -0,0 +1,315 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.37</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>ext-split.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/ext/split\', [\'require\', \'exports\', \'module\' , \'ace/split\'], function(require, exports, module) {\n
+module.exports = require("../split");\n
+\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("./lib/oop");\n
+var lang = require("./lib/lang");\n
+var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
+\n
+var Editor = require("./editor").Editor;\n
+var Renderer = require("./virtual_renderer").VirtualRenderer;\n
+var EditSession = require("./edit_session").EditSession;\n
+\n
+\n
+var Split = function(container, theme, splits) {\n
+    this.BELOW = 1;\n
+    this.BESIDE = 0;\n
+\n
+    this.$container = container;\n
+    this.$theme = theme;\n
+    this.$splits = 0;\n
+    this.$editorCSS = "";\n
+    this.$editors = [];\n
+    this.$orientation = this.BESIDE;\n
+\n
+    this.setSplits(splits || 1);\n
+    this.$cEditor = this.$editors[0];\n
+\n
+\n
+    this.on("focus", function(editor) {\n
+        this.$cEditor = editor;\n
+    }.bind(this));\n
+};\n
+\n
+(function(){\n
+\n
+    oop.implement(this, EventEmitter);\n
+\n
+    this.$createEditor = function() {\n
+        var el = document.createElement("div");\n
+        el.className = this.$editorCSS;\n
+        el.style.cssText = "position: absolute; top:0px; bottom:0px";\n
+        this.$container.appendChild(el);\n
+        var editor = new Editor(new Renderer(el, this.$theme));\n
+\n
+        editor.on("focus", function() {\n
+            this._emit("focus", editor);\n
+        }.bind(this));\n
+\n
+        this.$editors.push(editor);\n
+        editor.setFontSize(this.$fontSize);\n
+        return editor;\n
+    };\n
+\n
+    this.setSplits = function(splits) {\n
+        var editor;\n
+        if (splits < 1) {\n
+            throw "The number of splits have to be > 0!";\n
+        }\n
+\n
+        if (splits == this.$splits) {\n
+            return;\n
+        } else if (splits > this.$splits) {\n
+            while (this.$splits < this.$editors.length && this.$splits < splits) {\n
+                editor = this.$editors[this.$splits];\n
+                this.$container.appendChild(editor.container);\n
+                editor.setFontSize(this.$fontSize);\n
+                this.$splits ++;\n
+            }\n
+            while (this.$splits < splits) {\n
+                this.$createEditor();\n
+                this.$splits ++;\n
+            }\n
+        } else {\n
+            while (this.$splits > splits) {\n
+                editor = this.$editors[this.$splits - 1];\n
+                this.$container.removeChild(editor.container);\n
+                this.$splits --;\n
+            }\n
+        }\n
+        this.resize();\n
+    };\n
+    this.getSplits = function() {\n
+        return this.$splits;\n
+    };\n
+    this.getEditor = function(idx) {\n
+        return this.$editors[idx];\n
+    };\n
+    this.getCurrentEditor = function() {\n
+        return this.$cEditor;\n
+    };\n
+    this.focus = function() {\n
+        this.$cEditor.focus();\n
+    };\n
+    this.blur = function() {\n
+        this.$cEditor.blur();\n
+    };\n
+    this.setTheme = function(theme) {\n
+        this.$editors.forEach(function(editor) {\n
+            editor.setTheme(theme);\n
+        });\n
+    };\n
+    this.setKeyboardHandler = function(keybinding) {\n
+        this.$editors.forEach(function(editor) {\n
+            editor.setKeyboardHandler(keybinding);\n
+        });\n
+    };\n
+    this.forEach = function(callback, scope) {\n
+        this.$editors.forEach(callback, scope);\n
+    };\n
+\n
+\n
+    this.$fontSize = "";\n
+    this.setFontSize = function(size) {\n
+        this.$fontSize = size;\n
+        this.forEach(function(editor) {\n
+           editor.setFontSize(size);\n
+        });\n
+    };\n
+\n
+    this.$cloneSession = function(session) {\n
+        var s = new EditSession(session.getDocument(), session.getMode());\n
+\n
+        var undoManager = session.getUndoManager();\n
+        if (undoManager) {\n
+            var undoManagerProxy = new UndoManagerProxy(undoManager, s);\n
+            s.setUndoManager(undoManagerProxy);\n
+        }\n
+        s.$informUndoManager = lang.delayedCall(function() { s.$deltas = []; });\n
+        s.setTabSize(session.getTabSize());\n
+        s.setUseSoftTabs(session.getUseSoftTabs());\n
+        s.setOverwrite(session.getOverwrite());\n
+        s.setBreakpoints(session.getBreakpoints());\n
+        s.setUseWrapMode(session.getUseWrapMode());\n
+        s.setUseWorker(session.getUseWorker());\n
+        s.setWrapLimitRange(session.$wrapLimitRange.min,\n
+                            session.$wrapLimitRange.max);\n
+        s.$foldData = session.$cloneFoldData();\n
+\n
+        return s;\n
+    };\n
+    this.setSession = function(session, idx) {\n
+        var editor;\n
+        if (idx == null) {\n
+            editor = this.$cEditor;\n
+        } else {\n
+            editor = this.$editors[idx];\n
+        }\n
+        var isUsed = this.$editors.some(function(editor) {\n
+           return editor.session === session;\n
+        });\n
+\n
+        if (isUsed) {\n
+            session = this.$cloneSession(session);\n
+        }\n
+        editor.setSession(session);\n
+        return session;\n
+    };\n
+    this.getOrientation = function() {\n
+        return this.$orientation;\n
+    };\n
+    this.setOrientation = function(orientation) {\n
+        if (this.$orientation == orientation) {\n
+            return;\n
+        }\n
+        this.$orientation = orientation;\n
+        this.resize();\n
+    };\n
+    this.resize = function() {\n
+        var width = this.$container.clientWidth;\n
+        var height = this.$container.clientHeight;\n
+        var editor;\n
+\n
+        if (this.$orientation == this.BESIDE) {\n
+            var editorWidth = width / this.$splits;\n
+            for (var i = 0; i < this.$splits; i++) {\n
+                editor = this.$editors[i];\n
+                editor.container.style.width = editorWidth + "px";\n
+                editor.container.style.top = "0px";\n
+                editor.container.style.left = i * editorWidth + "px";\n
+                editor.container.style.height = height + "px";\n
+                editor.resize();\n
+            }\n
+        } else {\n
+            var editorHeight = height / this.$splits;\n
+            for (var i = 0; i < this.$splits; i++) {\n
+                editor = this.$editors[i];\n
+                editor.container.style.width = width + "px";\n
+                editor.container.style.top = i * editorHeight + "px";\n
+                editor.container.style.left = "0px";\n
+                editor.container.style.height = editorHeight + "px";\n
+                editor.resize();\n
+            }\n
+        }\n
+    };\n
+\n
+}).call(Split.prototype);\n
+\n
+ \n
+function UndoManagerProxy(undoManager, session) {\n
+    this.$u = undoManager;\n
+    this.$doc = session;\n
+}\n
+\n
+(function() {\n
+    this.execute = function(options) {\n
+        this.$u.execute(options);\n
+    };\n
+\n
+    this.undo = function() {\n
+        var selectionRange = this.$u.undo(true);\n
+        if (selectionRange) {\n
+            this.$doc.selection.setSelectionRange(selectionRange);\n
+        }\n
+    };\n
+\n
+    this.redo = function() {\n
+        var selectionRange = this.$u.redo(true);\n
+        if (selectionRange) {\n
+            this.$doc.selection.setSelectionRange(selectionRange);\n
+        }\n
+    };\n
+\n
+    this.reset = function() {\n
+        this.$u.reset();\n
+    };\n
+\n
+    this.hasUndo = function() {\n
+        return this.$u.hasUndo();\n
+    };\n
+\n
+    this.hasRedo = function() {\n
+        return this.$u.hasRedo();\n
+    };\n
+}).call(UndoManagerProxy.prototype);\n
+\n
+exports.Split = Split;\n
+});\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>8919</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-static_highlight.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-static_highlight.js.xml
index 4a1f6925df..380fed223a 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-static_highlight.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-static_highlight.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155553.66</string> </value>
+            <value> <string>ts83646622.63</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -52,34 +52,37 @@
  *\n
  * ***** END LICENSE BLOCK ***** */\n
 \n
-define(\'ace/ext/static_highlight\', [\'require\', \'exports\', \'module\' , \'ace/edit_session\', \'ace/layer/text\', \'ace/config\'], function(require, exports, module) {\n
+define(\'ace/ext/static_highlight\', [\'require\', \'exports\', \'module\' , \'ace/edit_session\', \'ace/layer/text\', \'ace/config\', \'ace/lib/dom\'], function(require, exports, module) {\n
 \n
 \n
 var EditSession = require("../edit_session").EditSession;\n
 var TextLayer = require("../layer/text").Text;\n
-var baseStyles = ".ace_editor {\\\n
-font-family: \'Monaco\', \'Menlo\', \'Droid Sans Mono\', \'Courier New\', monospace;\\\n
+var baseStyles = ".ace_static_highlight {\\\n
+font-family: \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', \'Droid Sans Mono\', monospace;\\\n
 font-size: 12px;\\\n
 }\\\n
-.ace_editor .ace_gutter {\\\n
+.ace_static_highlight .ace_gutter {\\\n
 width: 25px !important;\\\n
 display: block;\\\n
 float: left;\\\n
 text-align: right;\\\n
 padding: 0 3px 0 0;\\\n
 margin-right: 3px;\\\n
+position: static !important;\\\n
 }\\\n
-.ace_line { clear: both; }\\\n
-*.ace_gutter-cell {\\\n
+.ace_static_highlight .ace_line { clear: both; }\\\n
+.ace_static_highlight .ace_gutter-cell {\\\n
 -moz-user-select: -moz-none;\\\n
 -khtml-user-select: none;\\\n
 -webkit-user-select: none;\\\n
 user-select: none;\\\n
 }";\n
 var config = require("../config");\n
+var dom = require("../lib/dom");\n
 \n
 exports.render = function(input, mode, theme, lineStart, disableGutter, callback) {\n
-    var waiting = 0\n
+    var waiting = 0;\n
+    var modeCache = EditSession.prototype.$modes;\n
     if (typeof theme == "string") {\n
         waiting++;\n
         config.loadModule([\'theme\', theme], function(m) {\n
@@ -91,7 +94,8 @@ exports.render = function(input, mode, theme, lineStart, disableGutter, callback
     if (typeof mode == "string") {\n
         waiting++;\n
         config.loadModule([\'mode\', mode], function(m) {\n
-            mode = new m.Mode()\n
+            if (!modeCache[mode]) modeCache[mode] = new m.Mode();\n
+            mode = modeCache[mode];\n
             --waiting || done();\n
         });\n
     }\n
@@ -128,11 +132,11 @@ exports.renderSync = function(input, mode, theme, lineStart, disableGutter) {\n
         textLayer.$renderLine(stringBuilder, ix, true, false);\n
         stringBuilder.push("</div>");\n
     }\n
-    var html = "<div class=\':cssClass\'>\\\n
-        <div class=\'ace_editor ace_scroller ace_text-layer\'>\\\n
-            :code\\\n
-        </div>\\\n
-    </div>".replace(/:cssClass/, theme.cssClass).replace(/:code/, stringBuilder.join(""));\n
+    var html = "<div class=\'" + theme.cssClass + "\'>" +\n
+        "<div class=\'ace_static_highlight\'>" +\n
+            stringBuilder.join("") +\n
+        "</div>" +\n
+    "</div>";\n
 \n
     textLayer.destroy();\n
 \n
@@ -142,6 +146,46 @@ exports.renderSync = function(input, mode, theme, lineStart, disableGutter) {\n
     };\n
 };\n
 \n
+\n
+\n
+exports.highlight = function(el, opts, callback) {\n
+    var m = el.className.match(/lang-(\\w+)/);\n
+    var mode = opts.mode || m && ("ace/mode/" + m[1]);\n
+    if (!mode)\n
+        return false;\n
+    var theme = opts.theme || "ace/theme/textmate";\n
+    \n
+    var data = "";\n
+    var nodes = [];\n
+\n
+    if (el.firstElementChild) {\n
+        var textLen = 0;\n
+        for (var i = 0; i < el.childNodes.length; i++) {\n
+            var ch = el.childNodes[i];\n
+            if (ch.nodeType == 3) {\n
+                textLen += ch.data.length;\n
+                data += ch.data;\n
+            } else {\n
+                nodes.push(textLen, ch);\n
+            }\n
+        }\n
+    } else {\n
+        data = dom.getInnerText(el);\n
+    }\n
+    \n
+    exports.render(data, mode, theme, 1, true, function (highlighted) {\n
+        dom.importCssString(highlighted.css, "ace_highlight");\n
+        el.innerHTML = highlighted.html;\n
+        var container = el.firstChild.firstChild\n
+        for (var i = 0; i < nodes.length; i += 2) {\n
+            var pos = highlighted.session.doc.indexToPosition(nodes[i])\n
+            var node = nodes[i + 1];\n
+            var lineEl = container.children[pos.row];\n
+            lineEl && lineEl.appendChild(nodes[i+1]);\n
+        }\n
+        callback && callback();\n
+    });\n
+};\n
 });\n
 
 
@@ -153,7 +197,7 @@ exports.renderSync = function(input, mode, theme, lineStart, disableGutter) {\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4310</int> </value>
+            <value> <int>5794</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-statusbar.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-statusbar.js.xml
index 850b937ac4..6610950e67 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-statusbar.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-statusbar.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155553.77</string> </value>
+            <value> <string>ts83646622.6</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-textarea.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-textarea.js.xml
index 75bfc3d099..46d555bc2e 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-textarea.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-textarea.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155553.93</string> </value>
+            <value> <string>ts83646622.59</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -88,7 +88,7 @@ function applyStyles(elm, styles) {\n
 \n
 function setupContainer(element, getValue) {\n
     if (element.type != \'textarea\') {\n
-        throw "Textarea required!";\n
+        throw new Error("Textarea required!");\n
     }\n
 \n
     var parentNode = element.parentNode;\n
@@ -247,21 +247,18 @@ function setupApi(editor, editorDiv, settingDiv, ace, options, loader) {\n
             settingDiv.hideButton.focus();\n
             editor.on("focus", function onFocus() {\n
                 editor.removeListener("focus", onFocus);\n
-                settingDiv.style.display = "none"\n
+                settingDiv.style.display = "none";\n
             });\n
         } else {\n
             editor.focus();\n
-        };\n
+        }\n
     };\n
 \n
+    editor.$setOption = editor.setOption;\n
     editor.setOption = function(key, value) {\n
         if (options[key] == value) return;\n
 \n
         switch (key) {\n
-            case "gutter":\n
-                renderer.setShowGutter(toBool(value));\n
-            break;\n
-\n
             case "mode":\n
                 if (value != "text") {\n
                     loader("mode-" + value + ".js", "ace/mode/" + value, function() {\n
@@ -323,18 +320,9 @@ function setupApi(editor, editorDiv, settingDiv, ace, options, loader) {\n
                     break;\n
                 }\n
             break;\n
-\n
-            case "useSoftTabs":\n
-                session.setUseSoftTabs(toBool(value));\n
-            break;\n
-\n
-            case "showPrintMargin":\n
-                renderer.setShowPrintMargin(toBool(value));\n
-            break;\n
-\n
-            case "showInvisibles":\n
-                editor.setShowInvisibles(toBool(value));\n
-            break;\n
+            \n
+            default:\n
+                editor.$setOption(key, toBool(value));\n
         }\n
 \n
         options[key] = value;\n
@@ -348,9 +336,7 @@ function setupApi(editor, editorDiv, settingDiv, ace, options, loader) {\n
         return options;\n
     };\n
 \n
-    for (var option in exports.options) {\n
-        editor.setOption(option, exports.options[option]);\n
-    }\n
+    editor.setOptions(exports.options);\n
 \n
     return editor;\n
 }\n
@@ -450,7 +436,7 @@ function setupSettingPanel(settingDiv, settingOpener, editor, options) {\n
                     cValue == "true" ? "checked=\'true\'" : "",\n
                "\'></input>"\n
             );\n
-            return\n
+            return;\n
         }\n
         builder.push("<select title=\'" + option + "\'>");\n
         for (var value in obj) {\n
@@ -524,7 +510,7 @@ exports.options = {\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>16096</int> </value>
+            <value> <int>15735</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-themelist.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-themelist.js.xml
index 36247d27ac..2f75f4e570 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-themelist.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-themelist.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.04</string> </value>
+            <value> <string>ts83646622.57</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -92,8 +92,8 @@ module.exports.themes = [\n
     "kr_theme",\n
     "merbivore",\n
     "merbivore_soft",\n
-    "monokai",\n
     "mono_industrial",\n
+    "monokai",\n
     "pastel_on_dark",\n
     "solarized_dark",\n
     "solarized_light",\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-whitespace.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-whitespace.js.xml
index 3c0e133282..9131b93a74 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-whitespace.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/ext-whitespace.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.14</string> </value>
+            <value> <string>ts83646622.56</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -82,7 +82,7 @@ exports.$detectIndentation = function(lines, fallback) {\n
         prevSpaces = spaces;\n
         while (line[line.length - 1] == "\\\\")\n
             line = lines[i++];\n
-    };\n
+    }\n
 \n
     function getScore(indent) {\n
         var score = 0;\n
@@ -132,15 +132,17 @@ exports.detectIndentation = function(session) {\n
     return indent;\n
 };\n
 \n
-exports.trimTrailingSpace = function(session) {\n
+exports.trimTrailingSpace = function(session, trimEmpty) {\n
     var doc = session.getDocument();\n
     var lines = doc.getAllLines();\n
+    \n
+    var min = trimEmpty ? -1 : 0;\n
 \n
     for (var i = 0, l=lines.length; i < l; i++) {\n
         var line = lines[i];\n
         var index = line.search(/\\s+$/);\n
 \n
-        if (index !== -1)\n
+        if (index > min)\n
             doc.removeInLine(i, index, line.length);\n
     }\n
 };\n
@@ -179,14 +181,14 @@ exports.convertIndentation = function(session, ch, len) {\n
 };\n
 \n
 exports.$parseStringArg = function(text) {\n
-    var indent = {}\n
+    var indent = {};\n
     if (/t/.test(text))\n
         indent.ch = "\\t";\n
     else if (/s/.test(text))\n
         indent.ch = " ";\n
     var m = text.match(/\\d+/);\n
     if (m)\n
-        indent.length = parseInt(m[0]);\n
+        indent.length = parseInt(m[0], 10);\n
     return indent;\n
 };\n
 \n
@@ -198,7 +200,7 @@ exports.$parseArg = function(arg) {\n
     if (typeof arg.text == "string")\n
         return exports.$parseStringArg(arg.text);\n
     return arg;\n
-}\n
+};\n
 \n
 exports.commands = [{\n
     name: "detectIndentation",\n
@@ -214,7 +216,7 @@ exports.commands = [{\n
     name: "convertIndentation",\n
     exec: function(editor, arg) {\n
         var indent = exports.$parseArg(arg);\n
-        exports.convertIndentation(editor.session, arg.ch, arg.length);\n
+        exports.convertIndentation(editor.session, indent.ch, indent.length);\n
     }\n
 }, {\n
     name: "setIndentation",\n
@@ -223,7 +225,7 @@ exports.commands = [{\n
         indent.length && editor.session.setTabSize(indent.length);\n
         indent.ch && editor.session.setUseSoftTabs(indent.ch == " ");\n
     }\n
-}]\n
+}];\n
 \n
 });\n
 
@@ -236,7 +238,7 @@ exports.commands = [{\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6632</int> </value>
+            <value> <int>6693</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/keybinding-emacs.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/keybinding-emacs.js.xml
index 082f34ffe8..388f8d02c5 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/keybinding-emacs.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/keybinding-emacs.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.27</string> </value>
+            <value> <string>ts83646622.54</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -95,7 +95,7 @@ exports.handler.attach = function(editor) {\n
                 background-color: rgba(0,250,0,0.9);\\\n
                 opacity: 0.5;\\\n
             }\\\n
-            .emacs-mode .ace_cursor.ace_hidden{\\\n
+            .emacs-mode .ace_hidden-cursors .ace_cursor{\\\n
                 opacity: 1;\\\n
                 background-color: transparent;\\\n
             }\\\n
@@ -219,7 +219,7 @@ exports.handler.bindKey = function(key, command) {\n
     if (!key)\n
         return;\n
 \n
-    var ckb = this.commmandKeyBinding;\n
+    var ckb = this.commandKeyBinding;\n
     key.split("|").forEach(function(keyPart) {\n
         keyPart = keyPart.toLowerCase();\n
         ckb[keyPart] = command;\n
@@ -260,7 +260,7 @@ exports.handler.handleKeyboard = function(data, hashId, key, keyCode) {\n
     data.universalArgument = false;\n
     if (modifier) key = modifier + key;\n
     if (data.keyChain) key = data.keyChain += " " + key;\n
-    var command = this.commmandKeyBinding[key];\n
+    var command = this.commandKeyBinding[key];\n
     data.keyChain = command == "null" ? key : "";\n
     if (!command) return undefined;\n
     if (command === "null") return {command: "null"};\n
@@ -1090,7 +1090,7 @@ exports.Occur = Occur;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>36738</int> </value>
+            <value> <int>36745</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/keybinding-vim.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/keybinding-vim.js.xml
index 251274ff40..0a050b4427 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/keybinding-vim.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/keybinding-vim.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.39</string> </value>
+            <value> <string>ts83646622.53</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -99,6 +99,38 @@ exports.handler = {\n
             data.lastEvent = "keypress";\n
         }\n
     },\n
+    updateMacCompositionHandlers: function(editor, enable) {\n
+        var onCompositionUpdateOverride = function(text) {\n
+            if (util.currentMode !== "insert") {\n
+                var el = this.textInput.getElement();\n
+                el.blur();\n
+                el.focus();\n
+                el.value = text;\n
+            } else {\n
+                this.onCompositionUpdateOrig(text);\n
+            }\n
+        };\n
+        var onCompositionStartOverride = function(text) {\n
+            if (util.currentMode === "insert") {            \n
+                this.onCompositionStartOrig(text);\n
+            }\n
+        }\n
+        if (enable) {\n
+            if (!editor.onCompositionUpdateOrig) {\n
+                editor.onCompositionUpdateOrig = editor.onCompositionUpdate;\n
+                editor.onCompositionUpdate = onCompositionUpdateOverride;\n
+                editor.onCompositionStartOrig = editor.onCompositionStart;\n
+                editor.onCompositionStart = onCompositionStartOverride;\n
+            }\n
+        } else {\n
+            if (editor.onCompositionUpdateOrig) {\n
+                editor.onCompositionUpdate = editor.onCompositionUpdateOrig;\n
+                editor.onCompositionUpdateOrig = null;\n
+                editor.onCompositionStart = editor.onCompositionStartOrig;\n
+                editor.onCompositionStartOrig = null;\n
+            }\n
+        }\n
+    },\n
 \n
     handleKeyboard: function(data, hashId, key, keyCode, e) {\n
         if (hashId != 0 && (key == "" || key == "\\x00"))\n
@@ -150,12 +182,15 @@ exports.handler = {\n
         if (util.currentMode !== "insert")\n
             cmds.coreCommands.stop.exec(editor);\n
         editor.$vimModeHandler = this;\n
+        \n
+        this.updateMacCompositionHandlers(editor, true);\n
     },\n
 \n
     detach: function(editor) {\n
         editor.removeListener("click", exports.onCursorMove);\n
         util.noMode(editor);\n
         util.currentMode = "normal";\n
+        this.updateMacCompositionHandlers(editor, false);\n
     },\n
 \n
     actions: cmds.actions,\n
@@ -231,6 +266,18 @@ var actions = exports.actions = {\n
                 case "b":\n
                     editor.renderer.alignCursor(null, 1);\n
                     break;\n
+                case "c":\n
+                    editor.session.onFoldWidgetClick(range.start.row, {domEvent:{target :{}}});\n
+                    break;\n
+                case "o":\n
+                    editor.session.onFoldWidgetClick(range.start.row, {domEvent:{target :{}}});\n
+                    break;\n
+                case "C":\n
+                    editor.session.foldAll();\n
+                    break;\n
+                case "O":\n
+                    editor.session.unfold();\n
+                    break;\n
             }\n
         }\n
     },\n
@@ -1744,7 +1791,7 @@ module.exports = {\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>55892</int> </value>
+            <value> <int>57858</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-abap.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-abap.js.xml
index a5126861be..e33a514ba2 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-abap.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-abap.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.49</string> </value>
+            <value> <string>ts83646622.79</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,7 +63,7 @@ var TextMode = require("./text").Mode;\n
 var oop = require("../lib/oop");\n
 \n
 function Mode() {\n
-    this.$tokenizer = new Tokenizer(new Rules().getRules());\n
+    this.HighlightRules = Rules;\n
     this.foldingRules = new FoldMode();\n
 }\n
 \n
@@ -292,7 +292,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>11346</int> </value>
+            <value> <int>11318</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-actionscript.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-actionscript.js.xml
index a1d7d5d472..ff1c281cf5 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-actionscript.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-actionscript.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.59</string> </value>
+            <value> <string>ts83646622.51</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,9 +67,8 @@ var ActionScriptHighlightRules = require("./actionscript_highlight_rules").Actio
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new ActionScriptHighlightRules();\n
+    this.HighlightRules = ActionScriptHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -248,7 +247,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>23422</int> </value>
+            <value> <int>23359</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ada.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ada.js.xml
index fcd70f3c64..73e07371fe 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ada.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ada.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.74</string> </value>
+            <value> <string>ts83646622.5</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var AdaHighlightRules = require("./ada_highlight_rules").AdaHighlightRules;\n
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new AdaHighlightRules().getRules());\n
+    this.HighlightRules = AdaHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -148,7 +148,7 @@ exports.AdaHighlightRules = AdaHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4503</int> </value>
+            <value> <int>4475</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-asciidoc.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-asciidoc.js.xml
index ad27b1ce0e..e670d5f4d5 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-asciidoc.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-asciidoc.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.84</string> </value>
+            <value> <string>ts83646622.48</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,14 +62,14 @@ var AsciidocHighlightRules = require("./asciidoc_highlight_rules").AsciidocHighl
 var AsciidocFoldMode = require("./folding/asciidoc").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new AsciidocHighlightRules();\n
+    this.HighlightRules = AsciidocHighlightRules;\n
     \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
     this.foldingRules = new AsciidocFoldMode();    \n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
 (function() {\n
+    this.type = "text";\n
     this.getNextLineIndent = function(state, line, tab) {\n
         if (state == "listblock") {\n
             var match = /^((?:.+)?)([-+*][ ]+)/.exec(line);\n
@@ -404,7 +404,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>15515</int> </value>
+            <value> <int>15476</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-assembly_x86.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-assembly_x86.js.xml
index 475f4445d4..6295faf9a1 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-assembly_x86.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-assembly_x86.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155554.98</string> </value>
+            <value> <string>ts83646622.47</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,9 +63,8 @@ var AssemblyX86HighlightRules = require("./assembly_x86_highlight_rules").Assemb
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new AssemblyX86HighlightRules();\n
+    this.HighlightRules = AssemblyX86HighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -249,7 +248,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>13406</int> </value>
+            <value> <int>13343</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-autohotkey.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-autohotkey.js.xml
index c751258dd7..9a4fa61431 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-autohotkey.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-autohotkey.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155555.13</string> </value>
+            <value> <string>ts83646622.45</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>66034</int> </value>
+            <value> <int>65971</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -94,9 +94,8 @@ var AutoHotKeyHighlightRules = require("./autohotkey_highlight_rules").AutoHotKe
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new AutoHotKeyHighlightRules();\n
+    this.HighlightRules = AutoHotKeyHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-batchfile.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-batchfile.js.xml
index 669921e40a..06edf335d9 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-batchfile.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-batchfile.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155555.23</string> </value>
+            <value> <string>ts83646622.44</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,9 +67,8 @@ var BatchFileHighlightRules = require("./batchfile_highlight_rules").BatchFileHi
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new BatchFileHighlightRules();\n
+    this.HighlightRules = BatchFileHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -123,7 +122,8 @@ var BatchFileHighlightRules = function() {\n
          { token: \'keyword.operator.redirect.shell\',\n
            regex: \'&>|\\\\d*>&\\\\d*|\\\\d*(?:>>|>|<)|\\\\d*<&|\\\\d*<>\' } ],\n
         variable: [\n
-         { token: \'constant.numeric\', regex: \'%%\\\\w+\'},\n
+         { token: \'constant.numeric\', regex: \'%%\\\\w+|%[*\\\\d]|%\\\\w+%\'},\n
+         { token: \'constant.numeric\', regex: \'%~\\\\d+\'},\n
          { token: [\'markup.list\', \'constant.other\', \'markup.list\'],\n
             regex: \'(%)(\\\\w+)(%?)\' }]}\n
     \n
@@ -203,7 +203,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6952</int> </value>
+            <value> <int>6960</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-c9search.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-c9search.js.xml
index dc92af1614..a1485c3cc0 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-c9search.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-c9search.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155555.33</string> </value>
+            <value> <string>ts83646622.43</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,7 +63,7 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
 var C9StyleFoldMode = require("./folding/c9search").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new C9SearchHighlightRules().getRules());\n
+    this.HighlightRules = C9SearchHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new C9StyleFoldMode();\n
 };\n
@@ -214,7 +214,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6223</int> </value>
+            <value> <int>6195</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-c_cpp.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-c_cpp.js.xml
index f015028143..2bd3562e77 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-c_cpp.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-c_cpp.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155555.47</string> </value>
+            <value> <string>ts83646622.42</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -65,9 +65,11 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules());\n
+    this.HighlightRules = c_cppHighlightRules;\n
+\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
+\n
     this.foldingRules = new CStyleFoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -80,7 +82,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -769,7 +771,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>30249</int> </value>
+            <value> <int>30227</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-clojure.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-clojure.js.xml
index dab963dbc8..ef9bdd1028 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-clojure.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-clojure.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155555.61</string> </value>
+            <value> <string>ts83646622.4</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,7 +63,7 @@ var MatchingParensOutdent = require("./matching_parens_outdent").MatchingParensO
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new ClojureHighlightRules().getRules());\n
+    this.HighlightRules = ClojureHighlightRules;\n
     this.$outdent = new MatchingParensOutdent();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -75,7 +75,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -331,7 +331,7 @@ exports.MatchingParensOutdent = MatchingParensOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>13063</int> </value>
+            <value> <int>13039</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-cobol.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-cobol.js.xml
index 2506de02d2..e363183b7c 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-cobol.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-cobol.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155555.75</string> </value>
+            <value> <string>ts83646622.39</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var CobolHighlightRules = require("./cobol_highlight_rules").CobolHighlightRules
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CobolHighlightRules().getRules());\n
+    this.HighlightRules = CobolHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -155,7 +155,7 @@ exports.CobolHighlightRules = CobolHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5097</int> </value>
+            <value> <int>5069</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-coffee.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-coffee.js.xml
index 621f39959c..6c9f7e8539 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-coffee.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-coffee.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155555.89</string> </value>
+            <value> <string>ts83646622.37</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -65,7 +65,7 @@ var WorkerClient = require("../worker/worker_client").WorkerClient;\n
 var oop = require("../lib/oop");\n
 \n
 function Mode() {\n
-    this.$tokenizer = new Tokenizer(new Rules().getRules());\n
+    this.HighlightRules = Rules;\n
     this.$outdent = new Outdent();\n
     this.foldingRules = new FoldMode();\n
 }\n
@@ -81,7 +81,7 @@ oop.inherits(Mode, TextMode);\n
     \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
     \n
         if (!(tokens.length && tokens[tokens.length - 1].type === \'comment\') &&\n
             state === \'start\' && indenter.test(line))\n
@@ -475,7 +475,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>16709</int> </value>
+            <value> <int>16685</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-coldfusion.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-coldfusion.js.xml
index 7ff7c02c79..483fa2083b 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-coldfusion.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-coldfusion.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155555.99</string> </value>
+            <value> <string>ts83646622.35</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>72831</int> </value>
+            <value> <int>77566</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -92,10 +92,8 @@ var ColdfusionHighlightRules = require("./coldfusion_highlight_rules").Coldfusio
 var Mode = function() {\n
     XmlMode.call(this);\n
     \n
-    var highlighter = new ColdfusionHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = ColdfusionHighlightRules;\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
       "js-": JavaScriptMode,\n
       "css-": CssMode\n
@@ -125,7 +123,7 @@ var XmlBehaviour = require("./behaviour/xml").XmlBehaviour;\n
 var XmlFoldMode = require("./folding/xml").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules());\n
+    this.HighlightRules = XmlHighlightRules;\n
     this.$behaviour = new XmlBehaviour();\n
     this.foldingRules = new XmlFoldMode();\n
 };\n
@@ -148,36 +146,181 @@ var oop = require("../lib/oop");\n
 var xmlUtil = require("./xml_util");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 \n
-var XmlHighlightRules = function() {\n
+var XmlHighlightRules = function(normalize) {\n
     this.$rules = {\n
         start : [\n
-            {token : "text", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
-            {token : "xml-pe", regex : "<\\\\?.*?\\\\?>"},\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
             {token : "comment", regex : "<\\\\!--", next : "comment"},\n
-            {token : "xml-pe", regex : "<\\\\!.*?>"},\n
-            {token : "meta.tag", regex : "<\\\\/?", next : "tag"},\n
-            {token : "text", regex : "\\\\s+"},\n
             {\n
-                token : "constant.character.entity", \n
-                regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
-            }\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
         ],\n
-        \n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
         cdata : [\n
-            {token : "text", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
             {token : "text", regex : "\\\\s+"},\n
             {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
         ],\n
 \n
         comment : [\n
-            {token : "comment", regex : ".*?-->", next : "start"},\n
-            {token : "comment", regex : ".+"}\n
-        ]\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start");\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
 oop.inherits(XmlHighlightRules, TextHighlightRules);\n
 \n
 exports.XmlHighlightRules = XmlHighlightRules;\n
@@ -262,14 +405,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -283,6 +421,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -291,8 +432,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -309,11 +450,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -692,7 +833,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -725,7 +866,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -758,7 +899,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -887,7 +1028,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -902,7 +1044,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -1008,7 +1150,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -1083,7 +1226,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -1128,8 +1271,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -1216,6 +1359,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1410,7 +1561,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1424,7 +1575,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1491,152 +1642,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1724,95 +1840,118 @@ oop.inherits(CssBehaviour, CstyleBehaviour);\n
 exports.CssBehaviour = CssBehaviour;\n
 });\n
 \n
-define(\'ace/mode/coldfusion_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/css_highlight_rules\', \'ace/mode/javascript_highlight_rules\', \'ace/mode/text_highlight_rules\', \'ace/mode/xml_util\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
-var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
-var xml_util = require("./xml_util");\n
+var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 \n
 var ColdfusionHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
 \n
-    this.$rules = {\n
-        start : [ {\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
+    this.embedTagRules(JavaScriptHighlightRules, "cfjs-", "cfscript");\n
+\n
+    this.normalizeRules();\n
+};\n
+\n
+oop.inherits(ColdfusionHighlightRules, HtmlHighlightRules);\n
+\n
+exports.ColdfusionHighlightRules = ColdfusionHighlightRules;\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
+var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
+\n
+var tagMap = lang.createMap({\n
+    a           : \'anchor\',\n
+    button \t    : \'form\',\n
+    form        : \'form\',\n
+    img         : \'image\',\n
+    input       : \'form\',\n
+    label       : \'form\',\n
+    option      : \'form\',\n
+    script      : \'script\',\n
+    select      : \'form\',\n
+    textarea    : \'form\',\n
+    style       : \'style\',\n
+    table       : \'table\',\n
+    tbody       : \'table\',\n
+    td          : \'table\',\n
+    tfoot       : \'table\',\n
+    th          : \'table\',\n
+    tr          : \'table\'\n
+});\n
+\n
+var HtmlHighlightRules = function() {\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script)",\n
-            next : "script"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=cfscript)",\n
-            next : "cfscript"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style)",\n
-            next : "style"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?",\n
-            next : "tag"\n
-        } ],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ]\n
-    };\n
-    \n
-    xml_util.tag(this.$rules, "tag", "start");\n
-    xml_util.tag(this.$rules, "style", "css-start");\n
-    xml_util.tag(this.$rules, "script", "js-start");\n
-    xml_util.tag(this.$rules, "cfscript", "js-start");\n
-\n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }, {\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/cfscript>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=cfscript)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(ColdfusionHighlightRules, TextHighlightRules);\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
 \n
-exports.ColdfusionHighlightRules = ColdfusionHighlightRules;\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
 
 
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-csharp.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-csharp.js.xml
index c7c71cda89..0551494e97 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-csharp.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-csharp.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155556.06</string> </value>
+            <value> <string>ts83646622.33</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -22,7 +22,7 @@
             <key> <string>data</string> </key>
             <value> <string encoding="cdata"><![CDATA[
 
-define(\'ace/mode/csharp\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/csharp_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/mode/behaviour/cstyle\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+define(\'ace/mode/csharp\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/csharp_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/mode/behaviour/cstyle\', \'ace/mode/folding/csharp\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -31,10 +31,10 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var CSharpHighlightRules = require("./csharp_highlight_rules").CSharpHighlightRules;\n
 var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
 var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
-var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+var CStyleFoldMode = require("./folding/csharp").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CSharpHighlightRules().getRules());\n
+    this.HighlightRules = CSharpHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -49,7 +49,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
   \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
   \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -138,6 +138,9 @@ var CSharpHighlightRules = function() {\n
             }, {\n
                 token : "keyword.operator",\n
                 regex : "!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)"\n
+            }, {\n
+                token : "keyword",\n
+                regex : "^\\\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)"\n
             }, {\n
                 token : "punctuation.operator",\n
                 regex : "\\\\?|\\\\:|\\\\,|\\\\;|\\\\."\n
@@ -581,6 +584,115 @@ oop.inherits(CstyleBehaviour, Behaviour);\n
 exports.CstyleBehaviour = CstyleBehaviour;\n
 });\n
 \n
+define(\'ace/mode/folding/csharp\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Range = require("../../range").Range;\n
+var CFoldMode = require("./cstyle").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(commentRegex) {\n
+    if (commentRegex) {\n
+        this.foldingStartMarker = new RegExp(\n
+            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
+        );\n
+        this.foldingStopMarker = new RegExp(\n
+            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
+        );\n
+    }\n
+};\n
+oop.inherits(FoldMode, CFoldMode);\n
+\n
+(function() {\n
+    this.usingRe = /^\\s*using \\S/;\n
+\n
+    this.getFoldWidgetRangeBase = this.getFoldWidgetRange;\n
+    this.getFoldWidgetBase = this.getFoldWidget;\n
+    \n
+    this.getFoldWidget = function(session, foldStyle, row) {\n
+        var fw = this.getFoldWidgetBase(session, foldStyle, row);\n
+        if (!fw) {\n
+            var line = session.getLine(row);\n
+            if (/^\\s*#region\\b/.test(line)) \n
+                return "start";\n
+            var usingRe = this.usingRe;\n
+            if (usingRe.test(line)) {\n
+                var prev = session.getLine(row - 1);\n
+                var next = session.getLine(row + 1);\n
+                if (!usingRe.test(prev) && usingRe.test(next))\n
+                    return "start"\n
+            }\n
+        }\n
+        return fw;\n
+    };\n
+    \n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var range = this.getFoldWidgetRangeBase(session, foldStyle, row);\n
+        if (range)\n
+            return range;\n
+\n
+        var line = session.getLine(row);\n
+        if (this.usingRe.test(line))\n
+            return this.getUsingStatementBlock(session, line, row);\n
+            \n
+        if (/^\\s*#region\\b/.test(line))\n
+            return this.getRegionBlock(session, line, row);\n
+    };\n
+    \n
+    this.getUsingStatementBlock = function(session, line, row) {\n
+        var startColumn = line.match(this.usingRe)[0].length - 1;\n
+        var maxRow = session.getLength();\n
+        var startRow = row;\n
+        var endRow = row;\n
+\n
+        while (++row < maxRow) {\n
+            line = session.getLine(row);\n
+            if (/^\\s*$/.test(line))\n
+                continue;\n
+            if (!this.usingRe.test(line))\n
+                break;\n
+\n
+            endRow = row;\n
+        }\n
+\n
+        if (endRow > startRow) {\n
+            var endColumn = session.getLine(endRow).length;\n
+            return new Range(startRow, startColumn, endRow, endColumn);\n
+        }\n
+    };\n
+    \n
+    this.getRegionBlock = function(session, line, row) {\n
+        var startColumn = line.search(/\\s*$/);\n
+        var maxRow = session.getLength();\n
+        var startRow = row;\n
+        \n
+        var re = /^\\s*#(end)?region\\b/\n
+        var depth = 1\n
+        while (++row < maxRow) {\n
+            line = session.getLine(row);\n
+            var m = re.exec(line);\n
+            if (!m)\n
+                continue;\n
+            if (m[1])\n
+                depth--;\n
+            else\n
+                depth++;\n
+\n
+            if (!depth)\n
+                break;\n
+        }\n
+\n
+        var endRow = row;\n
+        if (endRow > startRow) {\n
+            var endColumn = line.search(/\\S/);\n
+            return new Range(startRow, startColumn, endRow, endColumn);\n
+        }\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+\n
 define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
 \n
 \n
@@ -644,7 +756,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>23371</int> </value>
+            <value> <int>26871</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-css.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-css.js.xml
index 73c844df94..88646275ee 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-css.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-css.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155556.19</string> </value>
+            <value> <string>ts83646622.32</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -65,7 +65,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -79,7 +79,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -146,152 +146,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -805,7 +770,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>35018</int> </value>
+            <value> <int>34059</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-curly.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-curly.js.xml
index 313581ea38..65e7427f75 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-curly.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-curly.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155556.32</string> </value>
+            <value> <string>ts83646622.3</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>78626</int> </value>
+            <value> <int>91793</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -97,11 +97,10 @@ var HtmlFoldMode = require("./folding/html").FoldMode;\n
 var CurlyHighlightRules = require("./curly_highlight_rules").CurlyHighlightRules;\n
 \n
 var Mode = function() {\n
-    var highlighter = new CurlyHighlightRules();\n
+    HtmlMode.call(this);\n
+    this.HighlightRules = CurlyHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new HtmlFoldMode();\n
-\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, HtmlMode);\n
 \n
@@ -111,7 +110,7 @@ oop.inherits(Mode, HtmlMode);\n
 exports.Mode = Mode;\n
 });\n
 \n
-define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -122,13 +121,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HtmlHighlightRules;\n
     this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -149,6 +148,10 @@ oop.inherits(Mode, TextMode);\n
     this.checkOutdent = function(state, line, input) {\n
         return false;\n
     };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -169,7 +172,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -184,7 +188,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -290,7 +294,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -365,7 +370,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -410,8 +415,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -498,6 +503,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1015,7 +1028,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1029,7 +1042,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1096,152 +1109,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1329,15 +1307,14 @@ oop.inherits(CssBehaviour, CstyleBehaviour);\n
 exports.CssBehaviour = CssBehaviour;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -1346,6 +1323,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -1359,80 +1337,255 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
             token : "text",\n
             regex : "\\\\s+"\n
         }, {\n
-            token : "constant.character.entity",\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
             regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
         }, {\n
-            defaultToken : "comment"\n
-        } ]\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
 \n
-exports.HtmlHighlightRules = HtmlHighlightRules;\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
 });\n
 \n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
@@ -1515,14 +1668,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1537,7 +1685,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1547,8 +1695,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1578,14 +1726,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1599,6 +1742,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1607,8 +1753,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1625,11 +1771,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1708,6 +1854,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -1784,7 +1932,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -1817,7 +1965,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1850,7 +1998,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1964,6 +2112,286 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 }).call(FoldMode.prototype);\n
 \n
 });\n
+\n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
 define(\'ace/mode/curly_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/html_highlight_rules\'], function(require, exports, module) {\n
 \n
 \n
@@ -1972,28 +2400,21 @@ var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 \n
 \n
 var CurlyHighlightRules = function() {\n
-   var CurlyRules = {\n
-        "start" : [\n
-            {\n
-                token: "variable",\n
-                regex: "{{",\n
-                next: "curly_mode"\n
-            }\n
-        ],\n
+    HtmlHighlightRules.call(this);\n
 \n
-        "curly_mode" : [\n
-            {\n
-                token: "variable",\n
-                regex: "}}",\n
-                next: "start"\n
-            }\n
-        ]\n
-    };\n
+    this.$rules["start"].unshift({\n
+        token: "variable",\n
+        regex: "{{",\n
+        push: "curly-start"\n
+    });\n
+\n
+    this.$rules["curly-start"] = [{\n
+        token: "variable",\n
+        regex: "}}",\n
+        next: "pop"\n
+    }];\n
 \n
-    var htmlRules = new HtmlHighlightRules().getRules();\n
-    htmlRules.start = CurlyRules.start.concat(htmlRules.start);\n
-    htmlRules.curly_mode = CurlyRules.curly_mode;\n
-    this.$rules = htmlRules;\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CurlyHighlightRules, HtmlHighlightRules);\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-d.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-d.js.xml
index 6049ce0f71..86609636de 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-d.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-d.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155556.82</string> </value>
+            <value> <string>ts83646622.29</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,9 +62,8 @@ var DHighlightRules = require("./d_highlight_rules").DHighlightRules;\n
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new DHighlightRules();\n
+    this.HighlightRules = DHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -420,7 +419,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>31495</int> </value>
+            <value> <int>31432</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-dart.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-dart.js.xml
index 297707ed3d..b08d04fc9d 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-dart.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-dart.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155556.47</string> </value>
+            <value> <string>ts83646622.27</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -68,14 +68,12 @@ var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
     CMode.call(this);\n
-    var highlighter = new DartHighlightRules();\n
+    this.HighlightRules = DartHighlightRules;\n
     this.foldingRules = new CStyleFoldMode();\n
-\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, CMode);\n
 \n
-(function() {\n
+(function() { \n
     this.lineCommentStart = "//";\n
     this.blockComment = {start: "/*", end: "*/"};\n
 }).call(Mode.prototype);\n
@@ -96,9 +94,11 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules());\n
+    this.HighlightRules = c_cppHighlightRules;\n
+\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
+\n
     this.foldingRules = new CStyleFoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -111,7 +111,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -805,7 +805,7 @@ var DartHighlightRules = function() {\n
     var keywordControl = "try|catch|finally|throw|break|case|continue|default|do|else|for|if|in|return|switch|while|new";\n
     var keywordDeclaration = "abstract|class|extends|external|factory|implements|get|native|operator|set|typedef";\n
     var storageModifier = "static|final|const";\n
-    var storageType = "void|bool|num|int|double|Dynamic|var|String";\n
+    var storageType = "void|bool|num|int|double|dynamic|var|String";\n
 \n
     var keywordMapper = this.createKeywordMapper({\n
         "constant.language.dart": constantLanguage,\n
@@ -839,7 +839,7 @@ var DartHighlightRules = function() {\n
         },\n
         {\n
             token: "keyword.other.import.dart",\n
-            regex: "(?:\\\\b)(?:library|import|source|part|of)(?:\\\\b)"\n
+            regex: "(?:\\\\b)(?:library|import|part|of)(?:\\\\b)"\n
         },\n
         {\n
             token : ["keyword.other.import.dart", "text"],\n
@@ -977,7 +977,7 @@ exports.DartHighlightRules = DartHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>35993</int> </value>
+            <value> <int>35901</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-diff.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-diff.js.xml
index b4a662755e..469f4c7596 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-diff.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-diff.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155556.61</string> </value>
+            <value> <string>ts83646622.26</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var HighlightRules = require("./diff_highlight_rules").DiffHighlightRules;\r\n
 var FoldMode = require("./folding/diff").FoldMode;\r\n
 \r\n
 var Mode = function() {\r\n
-    this.$tokenizer = new Tokenizer(new HighlightRules().getRules());\r\n
+    this.HighlightRules = HighlightRules;\r\n
     this.foldingRules = new FoldMode(["diff", "index", "\\\\+{3}", "@@|\\\\*{5}"], "i");\n
 };\r\n
 oop.inherits(Mode, TextMode);\r\n
@@ -133,6 +133,9 @@ var DiffHighlightRules = function() {\r\r\r\n
             }, {\r\n
                 regex: "^Index.+$",\r\n
                 token: "variable"\r\n
+            }, {\r\n
+                regex: "^\\\\s+$",\n
+                token: "text"\n
             }, {\r\n
                 regex: "\\\\s*$",\n
                 token: "invalid"\n
@@ -198,7 +201,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6189</int> </value>
+            <value> <int>6242</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-django.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-django.js.xml
index a5934016f7..0c601c7688 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-django.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-django.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155556.71</string> </value>
+            <value> <string>ts83646622.24</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>79168</int> </value>
+            <value> <int>92542</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -158,16 +158,15 @@ var DjangoHtmlHighlightRules = function() {\n
 oop.inherits(DjangoHtmlHighlightRules, HtmlHighlightRules);\n
 \n
 var Mode = function() {\n
-    var highlighter = new DjangoHtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
-    this.$embeds = highlighter.getEmbeds();\n
+    HtmlMode.call(this);\n
+    this.HighlightRules = DjangoHtmlHighlightRules;\n
 };\n
 oop.inherits(Mode, HtmlMode);\n
 \n
 exports.Mode = Mode;\n
 });\n
 \n
-define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -178,13 +177,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HtmlHighlightRules;\n
     this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -205,6 +204,10 @@ oop.inherits(Mode, TextMode);\n
     this.checkOutdent = function(state, line, input) {\n
         return false;\n
     };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -225,7 +228,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -240,7 +244,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -346,7 +350,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -421,7 +426,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -466,8 +471,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -554,6 +559,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1071,7 +1084,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1085,7 +1098,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1152,152 +1165,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1385,15 +1363,14 @@ oop.inherits(CssBehaviour, CstyleBehaviour);\n
 exports.CssBehaviour = CssBehaviour;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -1402,6 +1379,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -1415,80 +1393,255 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
             token : "text",\n
             regex : "\\\\s+"\n
         }, {\n
-            token : "constant.character.entity",\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
             regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
         }, {\n
-            defaultToken : "comment"\n
-        } ]\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
 \n
-exports.HtmlHighlightRules = HtmlHighlightRules;\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
 });\n
 \n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
@@ -1571,14 +1724,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1593,7 +1741,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1603,8 +1751,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1634,14 +1782,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1655,6 +1798,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1663,8 +1809,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1681,11 +1827,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1764,6 +1910,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -1840,7 +1988,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -1873,7 +2021,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1906,7 +2054,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -2020,6 +2168,286 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 }).call(FoldMode.prototype);\n
 \n
 });\n
+\n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
 
 
 ]]></string> </value>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-dot.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-dot.js.xml
index f40c7741b0..ec1e206b59 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-dot.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-dot.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155556.93</string> </value>
+            <value> <string>ts83646622.22</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -33,10 +33,9 @@ var DotHighlightRules = require("./dot_highlight_rules").DotHighlightRules;\n
 var DotFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new DotHighlightRules();\n
+    this.HighlightRules = DotHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new DotFoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -48,7 +47,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -352,7 +351,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10836</int> </value>
+            <value> <int>10777</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ejs.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ejs.js.xml
index 6d51fa1781..8739b90a35 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ejs.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ejs.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155557.03</string> </value>
+            <value> <string>ts83646622.21</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>93061</int> </value>
+            <value> <int>106386</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -143,9 +143,7 @@ var RubyMode = require("./ruby").Mode;\n
 \n
 var Mode = function() {\n
     HtmlMode.call(this);\n
-    var highlighter = new EjsHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());    \n
-    this.$embeds = highlighter.getEmbeds();\n
+    this.HighlightRules = EjsHighlightRules;    \n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode,\n
@@ -161,15 +159,14 @@ oop.inherits(Mode, HtmlMode);\n
 exports.Mode = Mode;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -178,6 +175,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -191,78 +189,66 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "text",\n
-            regex : "\\\\s+"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
-            token : "constant.character.entity",\n
-            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ]\n
-    };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
 \n
 exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
@@ -292,152 +278,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -495,7 +446,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -570,7 +522,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -615,8 +567,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -703,6 +655,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -790,6 +750,193 @@ exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
 \n
 });\n
 \n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 \n
@@ -860,7 +1007,7 @@ exports.tag = function(states, name, nextState, tagMap) {\n
 \n
 });\n
 \n
-define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -871,13 +1018,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HtmlHighlightRules;\n
     this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -898,6 +1045,10 @@ oop.inherits(Mode, TextMode);\n
     this.checkOutdent = function(state, line, input) {\n
         return false;\n
     };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -918,7 +1069,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -933,7 +1085,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -1420,7 +1572,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1434,7 +1586,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1565,14 +1717,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1587,7 +1734,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1597,8 +1744,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1628,14 +1775,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1649,6 +1791,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1657,8 +1802,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1675,11 +1820,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1758,6 +1903,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -1834,7 +1981,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -1867,7 +2014,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1900,7 +2047,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -2015,6 +2162,286 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 });\n
 \n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
+\n
 define(\'ace/mode/ruby\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/ruby_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/range\', \'ace/mode/folding/coffee\'], function(require, exports, module) {\n
 \n
 \n
@@ -2027,7 +2454,7 @@ var Range = require("../range").Range;\n
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules());\n
+    this.HighlightRules = RubyHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new FoldMode();\n
 };\n
@@ -2041,7 +2468,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-erlang.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-erlang.js.xml
index a46a853073..3d83505a58 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-erlang.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-erlang.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155557.15</string> </value>
+            <value> <string>ts83646622.19</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -50,11 +50,6 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
  *\n
- *\n
- * Contributor(s):\n
- *\n
- *\n
- *\n
  * ***** END LICENSE BLOCK ***** */\n
 \n
 define(\'ace/mode/erlang\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/erlang_highlight_rules\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
@@ -67,9 +62,8 @@ var ErlangHighlightRules = require("./erlang_highlight_rules").ErlangHighlightRu
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new ErlangHighlightRules();\n
+    this.HighlightRules = ErlangHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -983,7 +977,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>45205</int> </value>
+            <value> <int>45111</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-forth.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-forth.js.xml
index 9bcba8208b..459b4c6d04 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-forth.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-forth.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155557.21</string> </value>
+            <value> <string>ts83646622.18</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,9 +67,8 @@ var ForthHighlightRules = require("./forth_highlight_rules").ForthHighlightRules
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new ForthHighlightRules();\n
+    this.HighlightRules = ForthHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -271,7 +270,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10079</int> </value>
+            <value> <int>10016</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ftl.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ftl.js.xml
index b3e06082da..cfed67e2f6 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ftl.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ftl.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155557.36</string> </value>
+            <value> <string>ts83646622.16</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -61,8 +61,7 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var FtlHighlightRules = require("./ftl_highlight_rules").FtlHighlightRules;\n
 \n
 var Mode = function() {\n
-    var highlighter = new FtlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = FtlHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -174,14 +173,18 @@ var FtlLangHighlightRules = function () {\n
 oop.inherits(FtlLangHighlightRules, TextHighlightRules);\n
 \n
 var FtlHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
+\n
     var directives = "assign|attempt|break|case|compress|default|elseif|else|escape|fallback|function|flush|"\n
         + "ftl|global|if|import|include|list|local|lt|macro|nested|noescape|noparse|nt|recover|recurse|return|rt|"\n
         + "setting|stop|switch|t|visit";\n
 \n
-    HtmlHighlightRules.call(this);\n
-\n
-    for (var i in this.$rules) {\n
-        this.$rules[i].unshift({\n
+    var startRules = [\n
+        {\n
+            token : "comment",\n
+            regex : "<#--",\n
+            next : "ftl-dcomment"\n
+        }, {\n
             token : "string.interpolated",\n
             regex : "\\\\${",\n
             push  : "ftl-start"\n
@@ -193,34 +196,35 @@ var FtlHighlightRules = function() {\n
             token : "keyword.other",\n
             regex : "</?@[a-zA-Z\\\\.]+",\n
             push : "ftl-start"\n
-        });\n
-    }\n
+        }\n
+    ];\n
 \n
-    this.embedRules(FtlLangHighlightRules, "ftl-");\n
+    var endRules = [\n
+        {\n
+           token : "keyword",\n
+            regex : "/?>",\n
+            next  : "pop"\n
+        }, {\n
+            token : "string.interpolated",\n
+            regex : "}",\n
+            next  : "pop"\n
+        }\n
+    ];\n
 \n
-    this.$rules["ftl-start"].unshift({\n
-       token : "keyword",\n
-        regex : "/?>",\n
-        next  : "pop"\n
-    }, {\n
-        token : "string.interpolated",\n
-        regex : "}",\n
-        next  : "pop"\n
-    });\n
+    for (var key in this.$rules)\n
+        this.$rules[key].unshift.apply(this.$rules[key], startRules);\n
 \n
-    this.$rules.start.unshift({\n
-        token : "comment",\n
-        regex : "<#--",\n
-        next : "comment"\n
-    });\n
+    this.embedRules(FtlLangHighlightRules, "ftl-", endRules, ["start"]);\n
 \n
-    this.$rules.comment.unshift({\n
-        token : "comment",\n
-        regex : ".*?-->",\n
-        next : "start"\n
-    }, {\n
-        token : "comment",\n
-        regex : ".+"\n
+    this.addRules({\n
+        "ftl-dcomment" : [{\n
+            token : "comment",\n
+            regex : ".*?-->",\n
+            next : "pop"\n
+        }, {\n
+            token : "comment",\n
+            regex : ".+"\n
+        }]\n
     });\n
 \n
     this.normalizeRules();\n
@@ -231,15 +235,14 @@ oop.inherits(FtlHighlightRules, HtmlHighlightRules);\n
 exports.FtlHighlightRules = FtlHighlightRules;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -248,6 +251,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -261,78 +265,66 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "text",\n
-            regex : "\\\\s+"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
-            token : "constant.character.entity",\n
-            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ]\n
-    };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
 \n
 exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
@@ -362,152 +354,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -565,7 +522,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -640,7 +598,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -685,8 +643,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -773,6 +731,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -860,6 +826,193 @@ exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
 \n
 });\n
 \n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 \n
@@ -939,7 +1092,7 @@ exports.tag = function(states, name, nextState, tagMap) {\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>41378</int> </value>
+            <value> <int>46691</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-glsl.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-glsl.js.xml
index bf8a5dcb3b..db198b9137 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-glsl.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-glsl.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155557.47</string> </value>
+            <value> <string>ts83646622.15</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -65,7 +65,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new glslHighlightRules().getRules());\n
+    this.HighlightRules = glslHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -88,9 +89,11 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new c_cppHighlightRules().getRules());\n
+    this.HighlightRules = c_cppHighlightRules;\n
+\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
+\n
     this.foldingRules = new CStyleFoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -103,7 +106,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -842,7 +845,7 @@ exports.glslHighlightRules = glslHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>33378</int> </value>
+            <value> <int>33333</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-golang.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-golang.js.xml
index 8cb44ac7ce..accbd6a2a3 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-golang.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-golang.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155557.61</string> </value>
+            <value> <string>ts83646622.13</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -33,7 +33,7 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new GolangHighlightRules().getRules());\n
+    this.HighlightRules = GolangHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new CStyleFoldMode();\n
 };\n
@@ -47,7 +47,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -84,17 +84,25 @@ define(\'ace/mode/golang_highlight_rules\', [\'require\', \'exports\', \'module\
 \n
     var GolangHighlightRules = function() {\n
         var keywords = (\n
-            "true|else|false|break|case|return|goto|if|const|" +\n
-            "continue|struct|default|switch|for|" +\n
-            "func|import|package|chan|defer|fallthrough|go|interface|map|range" +\n
+            "else|break|case|return|goto|if|const|select|" +\n
+            "continue|struct|default|switch|for|range|" +\n
+            "func|import|package|chan|defer|fallthrough|go|interface|map|range|" +\n
             "select|type|var"\n
         );\n
-        var buildinConstants = ("nil|true|false|iota");\n
+        var builtinTypes = (\n
+            "string|uint8|uint16|uint32|uint64|int8|int16|int32|int64|float32|" +\n
+            "float64|complex64|complex128|byte|rune|uint|int|uintptr|bool|error"\n
+        );\n
+        var builtinFunctions = (\n
+            "make|close|new|panic|recover"\n
+        );\n
+        var builtinConstants = ("nil|true|false|iota");\n
 \n
         var keywordMapper = this.createKeywordMapper({\n
-            "variable.language": "this",\n
             "keyword": keywords,\n
-            "constant.language": buildinConstants\n
+            "constant.language": builtinConstants,\n
+            "support.function": builtinFunctions,\n
+            "support.type": builtinTypes\n
         }, "identifier");\n
 \n
         this.$rules = {\n
@@ -111,35 +119,29 @@ define(\'ace/mode/golang_highlight_rules\', [\'require\', \'exports\', \'module\
                 }, {\n
                     token : "string", // single line\n
                     regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-                }, {\n
-                    token : "string", // multi line string start\n
-                    regex : \'["].*\\\\\\\\$\',\n
-                    next : "qqstring"\n
                 }, {\n
                     token : "string", // single line\n
-                    regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+                    regex : \'[`](?:[^`]*)[`]\'\n
                 }, {\n
                     token : "string", // multi line string start\n
-                    regex : "[\'].*\\\\\\\\$",\n
-                    next : "qstring"\n
+                    merge : true,\n
+                    regex : \'[`](?:[^`]*)$\',\n
+                    next : "bqstring"\n
+                }, {\n
+                    token : "constant.numeric", // rune\n
+                    regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))[\']"\n
                 }, {\n
                     token : "constant.numeric", // hex\n
                     regex : "0[xX][0-9a-fA-F]+\\\\b"\n
                 }, {\n
                     token : "constant.numeric", // float\n
                     regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
-                }, {\n
-                    token : "constant", // <CONSTANT>\n
-                    regex : "<[a-zA-Z0-9.]+>"\n
-                }, {\n
-                    token : "keyword", // pre-compiler directivs\n
-                    regex : "(?:#include|#pragma|#line|#define|#undef|#ifdef|#else|#elif|#endif|#ifndef)"\n
                 }, {\n
                     token : keywordMapper,\n
                     regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
                 }, {\n
                     token : "keyword.operator",\n
-                    regex : "!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)"\n
+                    regex : "!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^="\n
                 }, {\n
                     token : "punctuation.operator",\n
                     regex : "\\\\?|\\\\:|\\\\,|\\\\;|\\\\."\n
@@ -149,6 +151,9 @@ define(\'ace/mode/golang_highlight_rules\', [\'require\', \'exports\', \'module\
                 }, {\n
                     token : "paren.rparen",\n
                     regex : "[\\\\])}]"\n
+                }, {\n
+                    token: "invalid",\n
+                    regex: "\\\\s+$"\n
                 }, {\n
                     token : "text",\n
                     regex : "\\\\s+"\n
@@ -164,20 +169,10 @@ define(\'ace/mode/golang_highlight_rules\', [\'require\', \'exports\', \'module\
                     regex : ".+"\n
                 }\n
             ],\n
-            "qqstring" : [\n
-                {\n
-                    token : "string",\n
-                    regex : \'(?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?"\',\n
-                    next : "start"\n
-                }, {\n
-                    token : "string",\n
-                    regex : \'.+\'\n
-                }\n
-            ],\n
-            "qstring" : [\n
+            "bqstring" : [\n
                 {\n
                     token : "string",\n
-                    regex : "(?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?\'",\n
+                    regex : \'(?:[^`]*)`\',\n
                     next : "start"\n
                 }, {\n
                     token : "string",\n
@@ -188,7 +183,7 @@ define(\'ace/mode/golang_highlight_rules\', [\'require\', \'exports\', \'module\
 \n
         this.embedRules(DocCommentHighlightRules, "doc-",\n
             [ DocCommentHighlightRules.getEndRule("start") ]);\n
-    }\n
+    };\n
     oop.inherits(GolangHighlightRules, TextHighlightRules);\n
 \n
     exports.GolangHighlightRules = GolangHighlightRules;\n
@@ -664,7 +659,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>24003</int> </value>
+            <value> <int>23743</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-groovy.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-groovy.js.xml
index bac89a3e7b..ca6c6bedc5 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-groovy.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-groovy.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155557.75</string> </value>
+            <value> <string>ts83646622.12</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -32,7 +32,7 @@ var GroovyHighlightRules = require("./groovy_highlight_rules").GroovyHighlightRu
 \n
 var Mode = function() {\n
     JavaScriptMode.call(this);\n
-    this.$tokenizer = new Tokenizer(new GroovyHighlightRules().getRules());\n
+    this.HighlightRules = GroovyHighlightRules;\n
 };\n
 oop.inherits(Mode, JavaScriptMode);\n
 \n
@@ -61,7 +61,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -76,7 +77,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -182,7 +183,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -257,7 +259,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -302,8 +304,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -390,6 +392,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1069,7 +1079,7 @@ exports.GroovyHighlightRules = GroovyHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>43563</int> </value>
+            <value> <int>43867</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haml.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haml.js.xml
index b0b4aa545f..a6bc23066f 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haml.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haml.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155557.85</string> </value>
+            <value> <string>ts83646622.1</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,10 +67,8 @@ var HamlHighlightRules = require("./haml_highlight_rules").HamlHighlightRules;\n
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HamlHighlightRules();\n
-    this.foldingRules = new FoldMode();    \n
-    \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HamlHighlightRules;\n
+    this.foldingRules = new FoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -519,7 +517,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>17975</int> </value>
+            <value> <int>17903</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-handlebars.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-handlebars.js.xml
new file mode 100644
index 0000000000..431db3f48b
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-handlebars.js.xml
@@ -0,0 +1,2442 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.35</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-handlebars.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>91193</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* global define */\n
+\n
+define(\'ace/mode/handlebars\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/html\', \'ace/tokenizer\', \'ace/mode/handlebars_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+  \n
+\n
+var oop = require("../lib/oop");\n
+var HtmlMode = require("./html").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var HandlebarsHighlightRules = require("./handlebars_highlight_rules").HandlebarsHighlightRules;\n
+var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
+var HtmlFoldMode = require("./folding/html").FoldMode;\n
+\n
+var Mode = function() {\n
+    HtmlMode.call(this);\n
+    this.HighlightRules = HandlebarsHighlightRules;\n
+    this.$behaviour = new HtmlBehaviour();\n
+\n
+    \n
+    this.foldingRules = new HtmlFoldMode();\n
+};\n
+\n
+oop.inherits(Mode, HtmlMode);\n
+\n
+(function() {\n
+    \n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var JavaScriptMode = require("./javascript").Mode;\n
+var CssMode = require("./css").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
+var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
+var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = HtmlHighlightRules;\n
+    this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
+    \n
+    this.createModeDelegates({\n
+        "js-": JavaScriptMode,\n
+        "css-": CssMode\n
+    });\n
+    \n
+    this.foldingRules = new HtmlFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.blockComment = {start: "<!--", end: "-->"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        return this.$getIndent(line);\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return false;\n
+    };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/javascript\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/javascript_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/range\', \'ace/worker/worker_client\', \'ace/mode/behaviour/cstyle\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var Range = require("../range").Range;\n
+var WorkerClient = require("../worker/worker_client").WorkerClient;\n
+var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CstyleBehaviour();\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.lineCommentStart = "//";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        var indent = this.$getIndent(line);\n
+\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
+        var tokens = tokenizedLine.tokens;\n
+        var endState = tokenizedLine.state;\n
+\n
+        if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
+            return indent;\n
+        }\n
+\n
+        if (state == "start" || state == "no_regex") {\n
+            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n
+            if (match) {\n
+                indent += tab;\n
+            }\n
+        } else if (state == "doc-start") {\n
+            if (endState == "start" || endState == "no_regex") {\n
+                return "";\n
+            }\n
+            var match = line.match(/^\\s*(\\/?)\\*/);\n
+            if (match) {\n
+                if (match[1]) {\n
+                    indent += " ";\n
+                }\n
+                indent += "* ";\n
+            }\n
+        }\n
+\n
+        return indent;\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return this.$outdent.checkOutdent(line, input);\n
+    };\n
+\n
+    this.autoOutdent = function(state, doc, row) {\n
+        this.$outdent.autoOutdent(doc, row);\n
+    };\n
+\n
+    this.createWorker = function(session) {\n
+        var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker");\n
+        worker.attachToDocument(session.getDocument());\n
+\n
+        worker.on("jslint", function(results) {\n
+            session.setAnnotations(results.data);\n
+        });\n
+\n
+        worker.on("terminate", function() {\n
+            session.clearAnnotations();\n
+        });\n
+\n
+        return worker;\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var JavaScriptHighlightRules = function() {\n
+    var keywordMapper = this.createKeywordMapper({\n
+        "variable.language":\n
+            "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|"  + // Constructors\n
+            "Namespace|QName|XML|XMLList|"                                             + // E4X\n
+            "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|"   +\n
+            "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|"                    +\n
+            "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|"   + // Errors\n
+            "SyntaxError|TypeError|URIError|"                                          +\n
+            "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions\n
+            "isNaN|parseFloat|parseInt|"                                               +\n
+            "JSON|Math|"                                                               + // Other\n
+            "this|arguments|prototype|window|document"                                 , // Pseudo\n
+        "keyword":\n
+            "const|yield|import|get|set|" +\n
+            "break|case|catch|continue|default|delete|do|else|finally|for|function|" +\n
+            "if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +\n
+            "__parent__|__count__|escape|unescape|with|__proto__|" +\n
+            "class|enum|extends|super|export|implements|private|public|interface|package|protected|static",\n
+        "storage.type":\n
+            "const|let|var|function",\n
+        "constant.language":\n
+            "null|Infinity|NaN|undefined",\n
+        "support.function":\n
+            "alert",\n
+        "constant.language.boolean": "true|false"\n
+    }, "identifier");\n
+    var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";\n
+    var identifierRe = "[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b";\n
+\n
+    var escapedRe = "\\\\\\\\(?:x[0-9a-fA-F]{2}|" + // hex\n
+        "u[0-9a-fA-F]{4}|" + // unicode\n
+        "[0-2][0-7]{0,2}|" + // oct\n
+        "3[0-6][0-7]?|" + // oct\n
+        "37[0-7]?|" + // oct\n
+        "[4-7][0-7]?|" + //oct\n
+        ".)";\n
+\n
+    this.$rules = {\n
+        "no_regex" : [\n
+            {\n
+                token : "comment",\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
+            },\n
+            DocCommentHighlightRules.getStartRule("doc-start"),\n
+            {\n
+                token : "comment", // multi line comment\n
+                regex : /\\/\\*/,\n
+                next : "comment"\n
+            }, {\n
+                token : "string",\n
+                regex : "\'(?=.)",\n
+                next  : "qstring"\n
+            }, {\n
+                token : "string",\n
+                regex : \'"(?=.)\',\n
+                next  : "qqstring"\n
+            }, {\n
+                token : "constant.numeric", // hex\n
+                regex : /0[xX][0-9a-fA-F]+\\b/\n
+            }, {\n
+                token : "constant.numeric", // float\n
+                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "support.function",\n
+                    "punctuation.operator", "entity.name.function", "text","keyword.operator"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(prototype)(\\\\.)(" + identifierRe +")(\\\\s*)(=)",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "entity.name.function", "text",\n
+                    "keyword.operator", "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "entity.name.function", "text", "keyword.operator", "text", "storage.type",\n
+                    "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "entity.name.function", "text",\n
+                    "keyword.operator", "text",\n
+                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"\n
+                ],\n
+                regex : "(function)(\\\\s+)(" + identifierRe + ")(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "entity.name.function", "text", "punctuation.operator",\n
+                    "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "text", "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(:)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : "keyword",\n
+                regex : "(?:" + kwBeforeRe + ")\\\\b",\n
+                next : "start"\n
+            }, {\n
+                token : ["punctuation.operator", "support.function"],\n
+                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(?=\\()/\n
+            }, {\n
+                token : ["punctuation.operator", "support.function.dom"],\n
+                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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
+            }, {\n
+                token : ["punctuation.operator", "support.constant"],\n
+                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/\n
+            }, {\n
+                token : ["storage.type", "punctuation.operator", "support.function.firebug"],\n
+                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n
+            }, {\n
+                token : keywordMapper,\n
+                regex : identifierRe\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : /--|\\+\\+|[!$%&*+\\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=/,\n
+                next  : "start"\n
+            }, {\n
+                token : "punctuation.operator",\n
+                regex : /\\?|\\:|\\,|\\;|\\./,\n
+                next  : "start"\n
+            }, {\n
+                token : "paren.lparen",\n
+                regex : /[\\[({]/,\n
+                next  : "start"\n
+            }, {\n
+                token : "paren.rparen",\n
+                regex : /[\\])}]/\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : /\\/=?/,\n
+                next  : "start"\n
+            }, {\n
+                token: "comment",\n
+                regex: /^#!.*$/\n
+            }\n
+        ],\n
+        "start": [\n
+            DocCommentHighlightRules.getStartRule("doc-start"),\n
+            {\n
+                token : "comment", // multi line comment\n
+                regex : "\\\\/\\\\*",\n
+                next : "comment_regex_allowed"\n
+            }, {\n
+                token : "comment",\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
+            }, {\n
+                token: "string.regexp",\n
+                regex: "\\\\/",\n
+                next: "regex"\n
+            }, {\n
+                token : "text",\n
+                regex : "\\\\s+|^$",\n
+                next : "start"\n
+            }, {\n
+                token: "empty",\n
+                regex: "",\n
+                next: "no_regex"\n
+            }\n
+        ],\n
+        "regex": [\n
+            {\n
+                token: "regexp.keyword.operator",\n
+                regex: "\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)"\n
+            }, {\n
+                token: "string.regexp",\n
+                regex: "/\\\\w*",\n
+                next: "no_regex"\n
+            }, {\n
+                token : "invalid",\n
+                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n
+            }, {\n
+                token : "constant.language.escape",\n
+                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?]/\n
+            }, {\n
+                token : "constant.language.delimiter",\n
+                regex: /\\|/\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: /\\[\\^?/,\n
+                next: "regex_character_class"\n
+            }, {\n
+                token: "empty",\n
+                regex: "$",\n
+                next: "no_regex"\n
+            }, {\n
+                defaultToken: "string.regexp"\n
+            }\n
+        ],\n
+        "regex_character_class": [\n
+            {\n
+                token: "regexp.keyword.operator",\n
+                regex: "\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)"\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: "]",\n
+                next: "regex"\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: "-"\n
+            }, {\n
+                token: "empty",\n
+                regex: "$",\n
+                next: "no_regex"\n
+            }, {\n
+                defaultToken: "string.regexp.charachterclass"\n
+            }\n
+        ],\n
+        "function_arguments": [\n
+            {\n
+                token: "variable.parameter",\n
+                regex: identifierRe\n
+            }, {\n
+                token: "punctuation.operator",\n
+                regex: "[, ]+"\n
+            }, {\n
+                token: "punctuation.operator",\n
+                regex: "$"\n
+            }, {\n
+                token: "empty",\n
+                regex: "",\n
+                next: "no_regex"\n
+            }\n
+        ],\n
+        "comment_regex_allowed" : [\n
+            {token : "comment", regex : "\\\\*\\\\/", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "comment" : [\n
+            {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "qqstring" : [\n
+            {\n
+                token : "constant.language.escape",\n
+                regex : escapedRe\n
+            }, {\n
+                token : "string",\n
+                regex : "\\\\\\\\$",\n
+                next  : "qqstring"\n
+            }, {\n
+                token : "string",\n
+                regex : \'"|$\',\n
+                next  : "no_regex"\n
+            }, {\n
+                defaultToken: "string"\n
+            }\n
+        ],\n
+        "qstring" : [\n
+            {\n
+                token : "constant.language.escape",\n
+                regex : escapedRe\n
+            }, {\n
+                token : "string",\n
+                regex : "\\\\\\\\$",\n
+                next  : "qstring"\n
+            }, {\n
+                token : "string",\n
+                regex : "\'|$",\n
+                next  : "no_regex"\n
+            }, {\n
+                defaultToken: "string"\n
+            }\n
+        ]\n
+    };\n
+\n
+    this.embedRules(DocCommentHighlightRules, "doc-",\n
+        [ DocCommentHighlightRules.getEndRule("no_regex") ]);\n
+};\n
+\n
+oop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n
+\n
+exports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/doc_comment_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var DocCommentHighlightRules = function() {\n
+\n
+    this.$rules = {\n
+        "start" : [ {\n
+            token : "comment.doc.tag",\n
+            regex : "@[\\\\w\\\\d_]+" // TODO: fix email addresses\n
+        }, {\n
+            token : "comment.doc.tag",\n
+            regex : "\\\\bTODO\\\\b"\n
+        }, {\n
+            defaultToken : "comment.doc"\n
+        }]\n
+    };\n
+};\n
+\n
+oop.inherits(DocCommentHighlightRules, TextHighlightRules);\n
+\n
+DocCommentHighlightRules.getStartRule = function(start) {\n
+    return {\n
+        token : "comment.doc", // doc comment\n
+        regex : "\\\\/\\\\*(?=\\\\*)",\n
+        next  : start\n
+    };\n
+};\n
+\n
+DocCommentHighlightRules.getEndRule = function (start) {\n
+    return {\n
+        token : "comment.doc", // closing comment\n
+        regex : "\\\\*\\\\/",\n
+        next  : start\n
+    };\n
+};\n
+\n
+\n
+exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
+\n
+});\n
+\n
+define(\'ace/mode/matching_brace_outdent\', [\'require\', \'exports\', \'module\' , \'ace/range\'], function(require, exports, module) {\n
+\n
+\n
+var Range = require("../range").Range;\n
+\n
+var MatchingBraceOutdent = function() {};\n
+\n
+(function() {\n
+\n
+    this.checkOutdent = function(line, input) {\n
+        if (! /^\\s+$/.test(line))\n
+            return false;\n
+\n
+        return /^\\s*\\}/.test(input);\n
+    };\n
+\n
+    this.autoOutdent = function(doc, row) {\n
+        var line = doc.getLine(row);\n
+        var match = line.match(/^(\\s*\\})/);\n
+\n
+        if (!match) return 0;\n
+\n
+        var column = match[1].length;\n
+        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n
+\n
+        if (!openBracePos || openBracePos.row == row) return 0;\n
+\n
+        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n
+        doc.replace(new Range(row, 0, row, column-1), indent);\n
+    };\n
+\n
+    this.$getIndent = function(line) {\n
+        return line.match(/^\\s*/)[0];\n
+    };\n
+\n
+}).call(MatchingBraceOutdent.prototype);\n
+\n
+exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
+});\n
+\n
+define(\'ace/mode/behaviour/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour\', \'ace/token_iterator\', \'ace/lib/lang\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+var lang = require("../../lib/lang");\n
+\n
+var SAFE_INSERT_IN_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator"];\n
+var SAFE_INSERT_BEFORE_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator", "comment"];\n
+\n
+\n
+var autoInsertedBrackets = 0;\n
+var autoInsertedRow = -1;\n
+var autoInsertedLineEnd = "";\n
+var maybeInsertedBrackets = 0;\n
+var maybeInsertedRow = -1;\n
+var maybeInsertedLineStart = "";\n
+var maybeInsertedLineEnd = "";\n
+\n
+var CstyleBehaviour = function () {\n
+    \n
+    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n
+        var cursor = editor.getCursorPosition();\n
+        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+        if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {\n
+            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n
+            if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))\n
+                return false;\n
+        }\n
+        iterator.stepForward();\n
+        return iterator.getCurrentTokenRow() !== cursor.row ||\n
+            this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);\n
+    };\n
+    \n
+    CstyleBehaviour.$matchTokenType = function(token, types) {\n
+        return types.indexOf(token.type || token) > -1;\n
+    };\n
+    \n
+    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n
+            autoInsertedBrackets = 0;\n
+        autoInsertedRow = cursor.row;\n
+        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n
+        autoInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isMaybeInsertedClosing(cursor, line))\n
+            maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = cursor.row;\n
+        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n
+        maybeInsertedLineEnd = line.substr(cursor.column);\n
+        maybeInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n
+        return autoInsertedBrackets > 0 &&\n
+            cursor.row === autoInsertedRow &&\n
+            bracket === autoInsertedLineEnd[0] &&\n
+            line.substr(cursor.column) === autoInsertedLineEnd;\n
+    };\n
+    \n
+    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n
+        return maybeInsertedBrackets > 0 &&\n
+            cursor.row === maybeInsertedRow &&\n
+            line.substr(cursor.column) === maybeInsertedLineEnd &&\n
+            line.substr(0, cursor.column) == maybeInsertedLineStart;\n
+    };\n
+    \n
+    CstyleBehaviour.popAutoInsertedClosing = function() {\n
+        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n
+        autoInsertedBrackets--;\n
+    };\n
+    \n
+    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n
+        maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = -1;\n
+    };\n
+\n
+    this.add("braces", "insertion", function (state, action, editor, session, text) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (text == \'{\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'{\' + selected + \'}\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n
+                    CstyleBehaviour.recordAutoInsert(editor, session, "}");\n
+                    return {\n
+                        text: \'{}\',\n
+                        selection: [1, 1]\n
+                    };\n
+                } else {\n
+                    CstyleBehaviour.recordMaybeInsert(editor, session, "{");\n
+                    return {\n
+                        text: \'{\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == \'}\') {\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\') {\n
+                var matching = session.$findOpeningBracket(\'}\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == "\\n" || text == "\\r\\n") {\n
+            var closing = "";\n
+            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n
+                closing = lang.stringRepeat("}", maybeInsertedBrackets);\n
+                CstyleBehaviour.clearMaybeInsertedClosing();\n
+            }\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\' || closing !== "") {\n
+                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, \'}\');\n
+                if (!openBracePos)\n
+                     return null;\n
+\n
+                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n
+                var next_indent = this.$getIndent(line);\n
+\n
+                return {\n
+                    text: \'\\n\' + indent + \'\\n\' + next_indent + closing,\n
+                    selection: [1, indent.length, 1, indent.length]\n
+                };\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("braces", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'{\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.end.column, range.end.column + 1);\n
+            if (rightChar == \'}\') {\n
+                range.end.column++;\n
+                return range;\n
+            } else {\n
+                maybeInsertedBrackets--;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'(\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'(\' + selected + \')\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, ")");\n
+                return {\n
+                    text: \'()\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \')\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \')\') {\n
+                var matching = session.$findOpeningBracket(\')\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'(\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \')\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'[\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'[\' + selected + \']\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, "]");\n
+                return {\n
+                    text: \'[]\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \']\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \']\') {\n
+                var matching = session.$findOpeningBracket(\']\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'[\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \']\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'"\' || text == "\'") {\n
+            var quote = text;\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "\'" && selected != \'"\' && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: quote + selected + quote,\n
+                    selection: false\n
+                };\n
+            } else {\n
+                var cursor = editor.getCursorPosition();\n
+                var line = session.doc.getLine(cursor.row);\n
+                var leftChar = line.substring(cursor.column-1, cursor.column);\n
+                if (leftChar == \'\\\\\') {\n
+                    return null;\n
+                }\n
+                var tokens = session.getTokens(selection.start.row);\n
+                var col = 0, token;\n
+                var quotepos = -1; // Track whether we\'re inside an open quote.\n
+\n
+                for (var x = 0; x < tokens.length; x++) {\n
+                    token = tokens[x];\n
+                    if (token.type == "string") {\n
+                      quotepos = -1;\n
+                    } else if (quotepos < 0) {\n
+                      quotepos = token.value.indexOf(quote);\n
+                    }\n
+                    if ((token.value.length + col) > selection.start.column) {\n
+                        break;\n
+                    }\n
+                    col += tokens[x].value.length;\n
+                }\n
+                if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n
+                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n
+                        return;\n
+                    return {\n
+                        text: quote + quote,\n
+                        selection: [1,1]\n
+                    };\n
+                } else if (token && token.type === "string") {\n
+                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+                    if (rightChar == quote) {\n
+                        return {\n
+                            text: \'\',\n
+                            selection: [1, 1]\n
+                        };\n
+                    }\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && (selected == \'"\' || selected == "\'")) {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == selected) {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+};\n
+\n
+oop.inherits(CstyleBehaviour, Behaviour);\n
+\n
+exports.CstyleBehaviour = CstyleBehaviour;\n
+});\n
+\n
+define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Range = require("../../range").Range;\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(commentRegex) {\n
+    if (commentRegex) {\n
+        this.foldingStartMarker = new RegExp(\n
+            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
+        );\n
+        this.foldingStopMarker = new RegExp(\n
+            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
+        );\n
+    }\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n
+    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var line = session.getLine(row);\n
+        var match = line.match(this.foldingStartMarker);\n
+        if (match) {\n
+            var i = match.index;\n
+\n
+            if (match[1])\n
+                return this.openingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i + match[0].length, 1);\n
+        }\n
+\n
+        if (foldStyle !== "markbeginend")\n
+            return;\n
+\n
+        var match = line.match(this.foldingStopMarker);\n
+        if (match) {\n
+            var i = match.index + match[0].length;\n
+\n
+            if (match[1])\n
+                return this.closingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i, -1);\n
+        }\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+\n
+define(\'ace/mode/css\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/css_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/worker/worker_client\', \'ace/mode/behaviour/css\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var WorkerClient = require("../worker/worker_client").WorkerClient;\n
+var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = CssHighlightRules;\n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CssBehaviour();\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.foldingRules = "cStyle";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        var indent = this.$getIndent(line);\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
+        if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
+            return indent;\n
+        }\n
+\n
+        var match = line.match(/^.*\\{\\s*$/);\n
+        if (match) {\n
+            indent += tab;\n
+        }\n
+\n
+        return indent;\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return this.$outdent.checkOutdent(line, input);\n
+    };\n
+\n
+    this.autoOutdent = function(state, doc, row) {\n
+        this.$outdent.autoOutdent(doc, row);\n
+    };\n
+\n
+    this.createWorker = function(session) {\n
+        var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker");\n
+        worker.attachToDocument(session.getDocument());\n
+\n
+        worker.on("csslint", function(e) {\n
+            session.setAnnotations(e.data);\n
+        });\n
+\n
+        worker.on("terminate", function() {\n
+            session.clearAnnotations();\n
+        });\n
+\n
+        return worker;\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+\n
+});\n
+\n
+define(\'ace/mode/css_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/lang\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+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|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";\n
+var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters";\n
+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";\n
+var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow";\n
+var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace";\n
+\n
+var numRe = exports.numRe = "\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))";\n
+var pseudoElements = exports.pseudoElements = "(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b";\n
+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";\n
+\n
+var CssHighlightRules = function() {\n
+\n
+    var keywordMapper = this.createKeywordMapper({\n
+        "support.function": supportFunction,\n
+        "support.constant": supportConstant,\n
+        "support.type": supportType,\n
+        "support.constant.color": supportConstantColor,\n
+        "support.constant.fonts": supportConstantFonts\n
+    }, "text", true);\n
+\n
+    this.$rules = {\n
+        "start" : [{\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token: "paren.lparen",\n
+            regex: "\\\\{",\n
+            push:  "ruleset"\n
+        }, {\n
+            token: "string",\n
+            regex: "@.*?{",\n
+            push:  "media"\n
+        }, {\n
+            token: "keyword",\n
+            regex: "#[a-z0-9-_]+"\n
+        }, {\n
+            token: "variable",\n
+            regex: "\\\\.[a-z0-9-_]+"\n
+        }, {\n
+            token: "string",\n
+            regex: ":[a-z0-9-_]+"\n
+        }, {\n
+            token: "constant",\n
+            regex: "[a-z0-9-_]+"\n
+        }, {\n
+            caseInsensitive: true\n
+        }],\n
+\n
+        "media" : [{\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token: "paren.lparen",\n
+            regex: "\\\\{",\n
+            push:  "ruleset"\n
+        }, {\n
+            token: "string",\n
+            regex: "\\\\}",\n
+            next:  "pop"\n
+        }, {\n
+            token: "keyword",\n
+            regex: "#[a-z0-9-_]+"\n
+        }, {\n
+            token: "variable",\n
+            regex: "\\\\.[a-z0-9-_]+"\n
+        }, {\n
+            token: "string",\n
+            regex: ":[a-z0-9-_]+"\n
+        }, {\n
+            token: "constant",\n
+            regex: "[a-z0-9-_]+"\n
+        }, {\n
+            caseInsensitive: true\n
+        }],\n
+\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
+\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
+    };\n
+\n
+    this.normalizeRules();\n
+};\n
+\n
+oop.inherits(CssHighlightRules, TextHighlightRules);\n
+\n
+exports.CssHighlightRules = CssHighlightRules;\n
+\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+\n
+var CssBehaviour = function () {\n
+\n
+    this.inherit(CstyleBehaviour);\n
+\n
+    this.add("colon", "insertion", function (state, action, editor, session, text) {\n
+        if (text === \':\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+            var token = iterator.getCurrentToken();\n
+            if (token && token.value.match(/\\s+/)) {\n
+                token = iterator.stepBackward();\n
+            }\n
+            if (token && token.type === \'support.type\') {\n
+                var line = session.doc.getLine(cursor.row);\n
+                var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+                if (rightChar === \':\') {\n
+                    return {\n
+                       text: \'\',\n
+                       selection: [1, 1]\n
+                    }\n
+                }\n
+                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n
+                    return {\n
+                       text: \':;\',\n
+                       selection: [1, 1]\n
+                    }\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("colon", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected === \':\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+            var token = iterator.getCurrentToken();\n
+            if (token && token.value.match(/\\s+/)) {\n
+                token = iterator.stepBackward();\n
+            }\n
+            if (token && token.type === \'support.type\') {\n
+                var line = session.doc.getLine(range.start.row);\n
+                var rightChar = line.substring(range.end.column, range.end.column + 1);\n
+                if (rightChar === \';\') {\n
+                    range.end.column ++;\n
+                    return range;\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("semicolon", "insertion", function (state, action, editor, session, text) {\n
+        if (text === \';\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar === \';\') {\n
+                return {\n
+                   text: \'\',\n
+                   selection: [1, 1]\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+}\n
+oop.inherits(CssBehaviour, CstyleBehaviour);\n
+\n
+exports.CssBehaviour = CssBehaviour;\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
+var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
+\n
+var tagMap = lang.createMap({\n
+    a           : \'anchor\',\n
+    button \t    : \'form\',\n
+    form        : \'form\',\n
+    img         : \'image\',\n
+    input       : \'form\',\n
+    label       : \'form\',\n
+    option      : \'form\',\n
+    script      : \'script\',\n
+    select      : \'form\',\n
+    textarea    : \'form\',\n
+    style       : \'style\',\n
+    table       : \'table\',\n
+    tbody       : \'table\',\n
+    td          : \'table\',\n
+    tfoot       : \'table\',\n
+    th          : \'table\',\n
+    tr          : \'table\'\n
+});\n
+\n
+var HtmlHighlightRules = function() {\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
+        }, {\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
+        }, {\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
+        }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+function string(state) {\n
+    return [{\n
+        token : "string",\n
+        regex : \'"\',\n
+        next : state + "_qqstring"\n
+    }, {\n
+        token : "string",\n
+        regex : "\'",\n
+        next : state + "_qstring"\n
+    }];\n
+}\n
+\n
+function multiLineString(quote, state) {\n
+    return [\n
+        {token : "string", regex : quote, next : state},\n
+        {\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
+        },\n
+        {defaultToken : "string"}\n
+    ];\n
+}\n
+\n
+exports.tag = function(states, name, nextState, tagMap) {\n
+    states[name] = [{\n
+        token : "text",\n
+        regex : "\\\\s+"\n
+    }, {\n
+        \n
+    token : !tagMap ? "meta.tag.tag-name" : function(value) {\n
+            if (tagMap[value])\n
+                return "meta.tag.tag-name." + tagMap[value];\n
+            else\n
+                return "meta.tag.tag-name";\n
+        },\n
+        regex : "[-_a-zA-Z0-9:]+",\n
+        next : name + "_embed_attribute_list" \n
+    }, {\n
+        token: "empty",\n
+        regex: "",\n
+        next : name + "_embed_attribute_list"\n
+    }];\n
+\n
+    states[name + "_qstring"] = multiLineString("\'", name + "_embed_attribute_list");\n
+    states[name + "_qqstring"] = multiLineString("\\"", name + "_embed_attribute_list");\n
+    \n
+    states[name + "_embed_attribute_list"] = [{\n
+        token : "meta.tag.r",\n
+        regex : "/?>",\n
+        next : nextState\n
+    }, {\n
+        token : "keyword.operator",\n
+        regex : "="\n
+    }, {\n
+        token : "entity.other.attribute-name",\n
+        regex : "[-_a-zA-Z0-9:]+"\n
+    }, {\n
+        token : "constant.numeric", // float\n
+        regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
+    }, {\n
+        token : "text",\n
+        regex : "\\\\s+"\n
+    }].concat(string(name));\n
+};\n
+\n
+});\n
+\n
+define(\'ace/mode/behaviour/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour/xml\', \'ace/mode/behaviour/cstyle\', \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var XmlBehaviour = require("../behaviour/xml").XmlBehaviour;\n
+var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+    return hasType;\n
+}\n
+\n
+var HtmlBehaviour = function () {\n
+\n
+    this.inherit(XmlBehaviour); // Get xml behaviour\n
+    \n
+    this.add("autoclosing", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'>\') {\n
+            var position = editor.getCursorPosition();\n
+            var iterator = new TokenIterator(session, position.row, position.column);\n
+            var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
+            var atCursor = false;\n
+            if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+                do {\n
+                    token = iterator.stepBackward();\n
+                } while (token && (hasType(token, \'string\') || hasType(token, \'keyword.operator\') || hasType(token, \'entity.attribute-name\') || hasType(token, \'text\')));\n
+            } else {\n
+                atCursor = true;\n
+            }\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
+            }\n
+            var element = token.value;\n
+            if (atCursor){\n
+                var element = element.substring(0, position.column - token.start);\n
+            }\n
+            if (voidElements.indexOf(element) !== -1){\n
+                return;\n
+            }\n
+            return {\n
+               text: \'>\' + \'</\' + element + \'>\',\n
+               selection: [1, 1]\n
+            }\n
+        }\n
+    });\n
+}\n
+oop.inherits(HtmlBehaviour, XmlBehaviour);\n
+\n
+exports.HtmlBehaviour = HtmlBehaviour;\n
+});\n
+\n
+define(\'ace/mode/behaviour/xml\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour\', \'ace/mode/behaviour/cstyle\', \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+    return hasType;\n
+}\n
+\n
+var XmlBehaviour = function () {\n
+    \n
+    this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour\n
+    \n
+    this.add("autoclosing", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'>\') {\n
+            var position = editor.getCursorPosition();\n
+            var iterator = new TokenIterator(session, position.row, position.column);\n
+            var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
+            var atCursor = false;\n
+            if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+                do {\n
+                    token = iterator.stepBackward();\n
+                } while (token && (hasType(token, \'string\') || hasType(token, \'keyword.operator\') || hasType(token, \'entity.attribute-name\') || hasType(token, \'text\')));\n
+            } else {\n
+                atCursor = true;\n
+            }\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
+            }\n
+            var tag = token.value;\n
+            if (atCursor){\n
+                var tag = tag.substring(0, position.column - token.start);\n
+            }\n
+\n
+            return {\n
+               text: \'>\' + \'</\' + tag + \'>\',\n
+               selection: [1, 1]\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
+        if (text == "\\n") {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.getLine(cursor.row);\n
+            var rightChars = line.substring(cursor.column, cursor.column + 2);\n
+            if (rightChars == \'</\') {\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
+\n
+                return {\n
+                    text: \'\\n\' + indent + \'\\n\' + next_indent,\n
+                    selection: [1, indent.length, 1, indent.length]\n
+                }\n
+            }\n
+        }\n
+    });\n
+    \n
+}\n
+oop.inherits(XmlBehaviour, Behaviour);\n
+\n
+exports.XmlBehaviour = XmlBehaviour;\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var MixedFoldMode = require("./mixed").FoldMode;\n
+var XmlFoldMode = require("./xml").FoldMode;\n
+var CStyleFoldMode = require("./cstyle").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function() {\n
+    MixedFoldMode.call(this, new XmlFoldMode({\n
+        "area": 1,\n
+        "base": 1,\n
+        "br": 1,\n
+        "col": 1,\n
+        "command": 1,\n
+        "embed": 1,\n
+        "hr": 1,\n
+        "img": 1,\n
+        "input": 1,\n
+        "keygen": 1,\n
+        "link": 1,\n
+        "meta": 1,\n
+        "param": 1,\n
+        "source": 1,\n
+        "track": 1,\n
+        "wbr": 1,\n
+        "li": 1,\n
+        "dt": 1,\n
+        "dd": 1,\n
+        "p": 1,\n
+        "rt": 1,\n
+        "rp": 1,\n
+        "optgroup": 1,\n
+        "option": 1,\n
+        "colgroup": 1,\n
+        "td": 1,\n
+        "th": 1\n
+    }), {\n
+        "js-": new CStyleFoldMode(),\n
+        "css-": new CStyleFoldMode()\n
+    });\n
+};\n
+\n
+oop.inherits(FoldMode, MixedFoldMode);\n
+\n
+});\n
+\n
+define(\'ace/mode/folding/mixed\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n
+    this.defaultMode = defaultMode;\n
+    this.subModes = subModes;\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+\n
+    this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
+        for (var key in this.subModes) {\n
+            if (state.indexOf(key) === 0)\n
+                return this.subModes[key];\n
+        }\n
+        return null;\n
+    };\n
+    \n
+    this.$tryMode = function(state, session, foldStyle, row) {\n
+        var mode = this.$getMode(state);\n
+        return (mode ? mode.getFoldWidget(session, foldStyle, row) : "");\n
+    };\n
+\n
+    this.getFoldWidget = function(session, foldStyle, row) {\n
+        return (\n
+            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n
+            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n
+            this.defaultMode.getFoldWidget(session, foldStyle, row)\n
+        );\n
+    };\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var mode = this.$getMode(session.getState(row-1));\n
+        \n
+        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n
+            mode = this.$getMode(session.getState(row));\n
+        \n
+        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n
+            mode = this.defaultMode;\n
+        \n
+        return mode.getFoldWidgetRange(session, foldStyle, row);\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+\n
+define(\'ace/mode/folding/xml\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/lang\', \'ace/range\', \'ace/mode/folding/fold_mode\', \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var lang = require("../../lib/lang");\n
+var Range = require("../../range").Range;\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+\n
+var FoldMode = exports.FoldMode = function(voidElements) {\n
+    BaseFoldMode.call(this);\n
+    this.voidElements = voidElements || {};\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.getFoldWidget = function(session, foldStyle, row) {\n
+        var tag = this._getFirstTagInLine(session, row);\n
+\n
+        if (tag.closing)\n
+            return foldStyle == "markbeginend" ? "end" : "";\n
+\n
+        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n
+            return "";\n
+\n
+        if (tag.selfClosing)\n
+            return "";\n
+\n
+        if (tag.value.indexOf("/" + tag.tagName) !== -1)\n
+            return "";\n
+\n
+        return "start";\n
+    };\n
+    \n
+    this._getFirstTagInLine = function(session, row) {\n
+        var tokens = session.getTokens(row);\n
+        var value = "";\n
+        for (var i = 0; i < tokens.length; i++) {\n
+            var token = tokens[i];\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
+                value += token.value;\n
+            else\n
+                value += lang.stringRepeat(" ", token.value.length);\n
+        }\n
+        \n
+        return this._parseTag(value);\n
+    };\n
+\n
+    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n
+    this._parseTag = function(tag) {\n
+        \n
+        var match = tag.match(this.tagRe);\n
+        var column = 0;\n
+\n
+        return {\n
+            value: tag,\n
+            match: match ? match[2] : "",\n
+            closing: match ? !!match[3] : false,\n
+            selfClosing: match ? !!match[5] || match[2] == "/>" : false,\n
+            tagName: match ? match[4] : "",\n
+            column: match[1] ? column + match[1].length : column\n
+        };\n
+    };\n
+    this._readTagForward = function(iterator) {\n
+        var token = iterator.getCurrentToken();\n
+        if (!token)\n
+            return null;\n
+            \n
+        var value = "";\n
+        var start;\n
+        \n
+        do {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
+                if (!start) {\n
+                    var start = {\n
+                        row: iterator.getCurrentTokenRow(),\n
+                        column: iterator.getCurrentTokenColumn()\n
+                    };\n
+                }\n
+                value += token.value;\n
+                if (value.indexOf(">") !== -1) {\n
+                    var tag = this._parseTag(value);\n
+                    tag.start = start;\n
+                    tag.end = {\n
+                        row: iterator.getCurrentTokenRow(),\n
+                        column: iterator.getCurrentTokenColumn() + token.value.length\n
+                    };\n
+                    iterator.stepForward();\n
+                    return tag;\n
+                }\n
+            }\n
+        } while(token = iterator.stepForward());\n
+        \n
+        return null;\n
+    };\n
+    \n
+    this._readTagBackward = function(iterator) {\n
+        var token = iterator.getCurrentToken();\n
+        if (!token)\n
+            return null;\n
+            \n
+        var value = "";\n
+        var end;\n
+\n
+        do {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
+                if (!end) {\n
+                    end = {\n
+                        row: iterator.getCurrentTokenRow(),\n
+                        column: iterator.getCurrentTokenColumn() + token.value.length\n
+                    };\n
+                }\n
+                value = token.value + value;\n
+                if (value.indexOf("<") !== -1) {\n
+                    var tag = this._parseTag(value);\n
+                    tag.end = end;\n
+                    tag.start = {\n
+                        row: iterator.getCurrentTokenRow(),\n
+                        column: iterator.getCurrentTokenColumn()\n
+                    };\n
+                    iterator.stepBackward();\n
+                    return tag;\n
+                }\n
+            }\n
+        } while(token = iterator.stepBackward());\n
+        \n
+        return null;\n
+    };\n
+    \n
+    this._pop = function(stack, tag) {\n
+        while (stack.length) {\n
+            \n
+            var top = stack[stack.length-1];\n
+            if (!tag || top.tagName == tag.tagName) {\n
+                return stack.pop();\n
+            }\n
+            else if (this.voidElements[tag.tagName]) {\n
+                return;\n
+            }\n
+            else if (this.voidElements[top.tagName]) {\n
+                stack.pop();\n
+                continue;\n
+            } else {\n
+                return null;\n
+            }\n
+        }\n
+    };\n
+    \n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var firstTag = this._getFirstTagInLine(session, row);\n
+        \n
+        if (!firstTag.match)\n
+            return null;\n
+        \n
+        var isBackward = firstTag.closing || firstTag.selfClosing;\n
+        var stack = [];\n
+        var tag;\n
+        \n
+        if (!isBackward) {\n
+            var iterator = new TokenIterator(session, row, firstTag.column);\n
+            var start = {\n
+                row: row,\n
+                column: firstTag.column + firstTag.tagName.length + 2\n
+            };\n
+            while (tag = this._readTagForward(iterator)) {\n
+                if (tag.selfClosing) {\n
+                    if (!stack.length) {\n
+                        tag.start.column += tag.tagName.length + 2;\n
+                        tag.end.column -= 2;\n
+                        return Range.fromPoints(tag.start, tag.end);\n
+                    } else\n
+                        continue;\n
+                }\n
+                \n
+                if (tag.closing) {\n
+                    this._pop(stack, tag);\n
+                    if (stack.length == 0)\n
+                        return Range.fromPoints(start, tag.start);\n
+                }\n
+                else {\n
+                    stack.push(tag)\n
+                }\n
+            }\n
+        }\n
+        else {\n
+            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n
+            var end = {\n
+                row: row,\n
+                column: firstTag.column\n
+            };\n
+            \n
+            while (tag = this._readTagBackward(iterator)) {\n
+                if (tag.selfClosing) {\n
+                    if (!stack.length) {\n
+                        tag.start.column += tag.tagName.length + 2;\n
+                        tag.end.column -= 2;\n
+                        return Range.fromPoints(tag.start, tag.end);\n
+                    } else\n
+                        continue;\n
+                }\n
+                \n
+                if (!tag.closing) {\n
+                    this._pop(stack, tag);\n
+                    if (stack.length == 0) {\n
+                        tag.start.column += tag.tagName.length + 2;\n
+                        return Range.fromPoints(tag.start, end);\n
+                    }\n
+                }\n
+                else {\n
+                    stack.push(tag)\n
+                }\n
+            }\n
+        }\n
+        \n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+\n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
+\n
+define(\'ace/mode/handlebars_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/html_highlight_rules\', \'ace/mode/xml_util\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
+var xmlUtil = require("./xml_util");\n
+function pop2(currentState, stack) {\n
+    stack.splice(0, 3);\n
+    return stack.shift() || "start";\n
+}\n
+var HandlebarsHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
+    var hbs = {        \n
+        regex : "(?={{)",\n
+        push : "handlebars"\n
+    }\n
+    for (var key in this.$rules) {\n
+        this.$rules[key].unshift(hbs);\n
+    }\n
+    this.$rules.handlebars = [{\n
+        token : "comment.start",\n
+        regex : "{{!--",\n
+        push : [{\n
+            token : "comment.end",\n
+            regex : "--}}",\n
+            next : pop2\n
+        }, {\n
+            defaultToken : "comment"\n
+        }]\n
+    }, {\n
+        token : "comment.start",\n
+        regex : "{{!",\n
+        push : [{\n
+            token : "comment.end",\n
+            regex : "}}",\n
+            next : pop2\n
+        }, {\n
+            defaultToken : "comment"\n
+        }]\n
+    }, {\n
+        token : "storage.type.start", // begin section\n
+        regex : "{{[#\\\\^/&]?",\n
+        push : [{\n
+            token : "storage.type.end",\n
+            regex : "}}",\n
+            next : pop2\n
+        }, {\n
+            token : "variable.parameter",\n
+            regex : "[a-zA-Z_$][a-zA-Z0-9_$]*"\n
+        }]\n
+    }, {\n
+        token : "support.function", // unescaped variable\n
+        regex : "{{{",\n
+        push : [{\n
+            token : "support.function",\n
+            regex : "}}}",\n
+            next : pop2\n
+        }, {\n
+            token : "variable.parameter",\n
+            regex : "[a-zA-Z_$][a-zA-Z0-9_$]*"\n
+        }]\n
+    }];\n
+\n
+    this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HandlebarsHighlightRules, HtmlHighlightRules);\n
+\n
+exports.HandlebarsHighlightRules = HandlebarsHighlightRules;\n
+});\n
+
+
+]]></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haskell.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haskell.js.xml
index d86e22cb87..23e73e5ab0 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haskell.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haskell.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155558.0</string> </value>
+            <value> <string>ts83646622.08</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,9 +67,8 @@ var HaskellHighlightRules = require("./haskell_highlight_rules").HaskellHighligh
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HaskellHighlightRules();\n
+    this.HighlightRules = HaskellHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -353,7 +352,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>15935</int> </value>
+            <value> <int>15872</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haxe.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haxe.js.xml
index 078e91cb7a..579fb9dd0b 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haxe.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-haxe.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155558.13</string> </value>
+            <value> <string>ts83646622.07</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -34,7 +34,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new HaxeHighlightRules().getRules());\n
+    this.HighlightRules = HaxeHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -48,7 +49,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -641,7 +642,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>22824</int> </value>
+            <value> <int>22805</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html.js.xml
index 270b293413..792940b066 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155558.27</string> </value>
+            <value> <string>ts83646622.06</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>76548</int> </value>
+            <value> <int>90004</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -79,7 +79,7 @@
  *\n
  * ***** END LICENSE BLOCK ***** */\n
 \n
-define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -90,13 +90,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HtmlHighlightRules;\n
     this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -117,6 +117,10 @@ oop.inherits(Mode, TextMode);\n
     this.checkOutdent = function(state, line, input) {\n
         return false;\n
     };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -137,7 +141,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -152,7 +157,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -258,7 +263,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -333,7 +339,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -378,8 +384,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -466,6 +472,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -983,7 +997,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -997,7 +1011,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1064,152 +1078,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1297,15 +1276,14 @@ oop.inherits(CssBehaviour, CstyleBehaviour);\n
 exports.CssBehaviour = CssBehaviour;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -1314,6 +1292,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -1327,80 +1306,255 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
             token : "text",\n
             regex : "\\\\s+"\n
         }, {\n
-            token : "constant.character.entity",\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
             regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
         }, {\n
-            defaultToken : "comment"\n
-        } ]\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
 \n
-exports.HtmlHighlightRules = HtmlHighlightRules;\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
 });\n
 \n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
@@ -1483,14 +1637,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1505,7 +1654,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1515,8 +1664,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1546,14 +1695,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1567,6 +1711,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1575,8 +1722,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1593,11 +1740,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1676,6 +1823,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -1752,7 +1901,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -1785,7 +1934,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1818,7 +1967,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1932,6 +2081,286 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 }).call(FoldMode.prototype);\n
 \n
 });\n
+\n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
 
 
 ]]></string> </value>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html_completions.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html_completions.js.xml
new file mode 100644
index 0000000000..b66639ad7e
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html_completions.js.xml
@@ -0,0 +1,353 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.33</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-html_completions.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ * \n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ * \n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>9812</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html_ruby.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html_ruby.js.xml
index c6e19867a5..107b17e422 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html_ruby.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-html_ruby.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155558.37</string> </value>
+            <value> <string>ts83646622.04</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>93319</int> </value>
+            <value> <int>106899</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -93,9 +93,7 @@ var RubyMode = require("./ruby").Mode;\n
 \n
 var Mode = function() {\n
     HtmlMode.call(this);   \n
-    var highlighter = new HtmlRubyHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());    \n
-    this.$embeds = highlighter.getEmbeds();\n
+    this.HighlightRules = HtmlRubyHighlightRules;    \n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode,\n
@@ -120,32 +118,42 @@ define(\'ace/mode/html_ruby_highlight_rules\', [\'require\', \'exports\', \'modu
 \n
     var HtmlRubyHighlightRules = function() {\n
         HtmlHighlightRules.call(this);\n
-        \n
-        for (var i in this.$rules) {\n
-            this.$rules[i].unshift({\n
+\n
+        var startRules = [\n
+            {\n
                 regex: "<%%|%%>",\n
                 token: "constant.language.escape"\n
             }, {\n
-                token : "comment.start.erb", \n
+                token : "comment.start.erb",\n
                 regex : "<%#",\n
-                push  : [{regex: "%>", next: "pop"}]\n
+                push  : [{\n
+                    token : "comment.end.erb",\n
+                    regex: "%>",\n
+                    next: "pop",\n
+                    defaultToken:"comment"\n
+                }]\n
             }, {\n
                 token : "support.ruby_tag",\n
                 regex : "<%+(?!>)[-=]?",\n
                 push  : "ruby-start"\n
-            });\n
-        }\n
-        \n
-        this.embedRules(RubyHighlightRules, "ruby-");\n
-        \n
-        this.$rules["ruby-start"].unshift({\n
-            token : "support.ruby_tag",\n
-            regex : "%>",\n
-            next  : "pop"\n
-        }, {\n
-            token: "comment",\n
-            regex: /#(?:[^%]|%[^>])*/\n
-        });\n
+            }\n
+        ];\n
+\n
+        var endRules = [\n
+            {\n
+                token : "support.ruby_tag",\n
+                regex : "%>",\n
+                next  : "pop"\n
+            }, {\n
+                token: "comment",\n
+                regex: "#(?:[^%]|%[^>])*"\n
+            }\n
+        ];\n
+\n
+        for (var key in this.$rules)\n
+            this.$rules[key].unshift.apply(this.$rules[key], startRules);\n
+\n
+        this.embedRules(RubyHighlightRules, "ruby-", endRules, ["start"]);\n
 \n
         this.normalizeRules();\n
     };\n
@@ -156,15 +164,14 @@ define(\'ace/mode/html_ruby_highlight_rules\', [\'require\', \'exports\', \'modu
     exports.HtmlRubyHighlightRules = HtmlRubyHighlightRules;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -173,6 +180,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -186,78 +194,66 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "text",\n
-            regex : "\\\\s+"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
-            token : "constant.character.entity",\n
-            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ]\n
-    };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
 \n
 exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
@@ -287,152 +283,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -490,7 +451,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -565,7 +527,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -610,8 +572,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -698,6 +660,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -785,6 +755,193 @@ exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
 \n
 });\n
 \n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 \n
@@ -1068,7 +1225,7 @@ oop.inherits(RubyHighlightRules, TextHighlightRules);\n
 exports.RubyHighlightRules = RubyHighlightRules;\n
 });\n
 \n
-define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -1079,13 +1236,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HtmlHighlightRules;\n
     this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -1106,6 +1263,10 @@ oop.inherits(Mode, TextMode);\n
     this.checkOutdent = function(state, line, input) {\n
         return false;\n
     };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -1126,7 +1287,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1141,7 +1303,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -1628,7 +1790,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1642,7 +1804,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1773,14 +1935,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1795,7 +1952,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1805,8 +1962,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1836,14 +1993,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1857,6 +2009,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1865,8 +2020,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1883,11 +2038,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1966,6 +2121,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -2042,7 +2199,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -2075,7 +2232,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -2108,7 +2265,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -2223,6 +2380,286 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 });\n
 \n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
+\n
 define(\'ace/mode/ruby\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/ruby_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/range\', \'ace/mode/folding/coffee\'], function(require, exports, module) {\n
 \n
 \n
@@ -2235,7 +2672,7 @@ var Range = require("../range").Range;\n
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules());\n
+    this.HighlightRules = RubyHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new FoldMode();\n
 };\n
@@ -2249,7 +2686,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ini.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ini.js.xml
index 9477f75109..8e48c8f6fe 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ini.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ini.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155558.48</string> </value>
+            <value> <string>ts83646622.02</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -20,7 +20,9 @@
         </item>
         <item>
             <key> <string>data</string> </key>
-            <value> <string>/* ***** BEGIN LICENSE BLOCK *****\n
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
  * Distributed under the BSD license:\n
  *\n
  * Copyright (c) 2012, Ajax.org B.V.\n
@@ -48,26 +50,20 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
  *\n
- *\n
- * Contributor(s):\n
- *\n
- *\n
- *\n
  * ***** END LICENSE BLOCK ***** */\n
 \n
-define(\'ace/mode/ini\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/ini_highlight_rules\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+define(\'ace/mode/ini\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/ini_highlight_rules\', \'ace/mode/folding/ini\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var TextMode = require("./text").Mode;\n
 var Tokenizer = require("../tokenizer").Tokenizer;\n
 var IniHighlightRules = require("./ini_highlight_rules").IniHighlightRules;\n
-var FoldMode = require("./folding/cstyle").FoldMode;\n
+var FoldMode = require("./folding/ini").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new IniHighlightRules();\n
+    this.HighlightRules = IniHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -85,54 +81,74 @@ define(\'ace/mode/ini_highlight_rules\', [\'require\', \'exports\', \'module\' ,
 var oop = require("../lib/oop");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 \n
-var IniHighlightRules = function() {\n
+var escapeRe = "\\\\\\\\(?:[\\\\\\\\0abtrn;#=:]|x[a-fA-F\\\\d]{4})";\n
 \n
-    this.$rules = { start: \n
-       [ { token: \'punctuation.definition.comment.ini\',\n
-           regex: \'#.*\',\n
-           push_: \n
-            [ { token: \'comment.line.number-sign.ini\',\n
-                regex: \'$\',\n
-                next: \'pop\' },\n
-              { defaultToken: \'comment.line.number-sign.ini\' } ] },\n
-         { token: \'punctuation.definition.comment.ini\',\n
-           regex: \';.*\',\n
-           push_: \n
-            [ { token: \'comment.line.semicolon.ini\', regex: \'$\', next: \'pop\' },\n
-              { defaultToken: \'comment.line.semicolon.ini\' } ] },\n
-         { token: \n
-            [ \'keyword.other.definition.ini\',\n
-              \'text\',\n
-              \'punctuation.separator.key-value.ini\' ],\n
-           regex: \'\\\\b([a-zA-Z0-9_.-]+)\\\\b(\\\\s*)(=)\' },\n
-         { token: \n
-            [ \'punctuation.definition.entity.ini\',\n
-              \'constant.section.group-title.ini\',\n
-              \'punctuation.definition.entity.ini\' ],\n
-           regex: \'^(\\\\[)(.*?)(\\\\])\' },\n
-         { token: \'punctuation.definition.string.begin.ini\',\n
-           regex: \'\\\'\',\n
-           push: \n
-            [ { token: \'punctuation.definition.string.end.ini\',\n
-                regex: \'\\\'\',\n
-                next: \'pop\' },\n
-              { token: \'constant.character.escape.ini\', regex: \'\\\\\\\\.\' },\n
-              { defaultToken: \'string.quoted.single.ini\' } ] },\n
-         { token: \'punctuation.definition.string.begin.ini\',\n
-           regex: \'"\',\n
-           push: \n
-            [ { token: \'punctuation.definition.string.end.ini\',\n
+var IniHighlightRules = function() {\n
+    this.$rules = {\n
+        start: [{\n
+            token: \'punctuation.definition.comment.ini\',\n
+            regex: \'#.*\',\n
+            push_: [{\n
+                token: \'comment.line.number-sign.ini\',\n
+                regex: \'$|^\',\n
+                next: \'pop\'\n
+            }, {\n
+                defaultToken: \'comment.line.number-sign.ini\'\n
+            }]\n
+        }, {\n
+            token: \'punctuation.definition.comment.ini\',\n
+            regex: \';.*\',\n
+            push_: [{\n
+                token: \'comment.line.semicolon.ini\',\n
+                regex: \'$|^\',\n
+                next: \'pop\'\n
+            }, {\n
+                defaultToken: \'comment.line.semicolon.ini\'\n
+            }]\n
+        }, {\n
+            token: [\'keyword.other.definition.ini\', \'text\', \'punctuation.separator.key-value.ini\'],\n
+            regex: \'\\\\b([a-zA-Z0-9_.-]+)\\\\b(\\\\s*)(=)\'\n
+        }, {\n
+            token: [\'punctuation.definition.entity.ini\', \'constant.section.group-title.ini\', \'punctuation.definition.entity.ini\'],\n
+            regex: \'^(\\\\[)(.*?)(\\\\])\'\n
+        }, {\n
+            token: \'punctuation.definition.string.begin.ini\',\n
+            regex: "\'",\n
+            push: [{\n
+                token: \'punctuation.definition.string.end.ini\',\n
+                regex: "\'",\n
+                next: \'pop\'\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: escapeRe\n
+            }, {\n
+                defaultToken: \'string.quoted.single.ini\'\n
+            }]\n
+        }, {\n
+            token: \'punctuation.definition.string.begin.ini\',\n
+            regex: \'"\',\n
+            push: [{\n
+                token: "constant.language.escape",\n
+                regex: escapeRe\n
+            }, {\n
+                token: \'punctuation.definition.string.end.ini\',\n
                 regex: \'"\',\n
-                next: \'pop\' },\n
-              { defaultToken: \'string.quoted.double.ini\' } ] } ] }\n
-    \n
+                next: \'pop\'\n
+            }, {\n
+                defaultToken: \'string.quoted.double.ini\'\n
+            }]\n
+        }]\n
+    };\n
+\n
     this.normalizeRules();\n
 };\n
 \n
-IniHighlightRules.metaData = { fileTypes: [ \'ini\', \'conf\' ],\n
-      keyEquivalent: \'^~I\',\n
-      name: \'Ini\',\n
-      scopeName: \'source.ini\' }\n
+IniHighlightRules.metaData = {\n
+    fileTypes: [\'ini\', \'conf\'],\n
+    keyEquivalent: \'^~I\',\n
+    name: \'Ini\',\n
+    scopeName: \'source.ini\'\n
+};\n
 \n
 \n
 oop.inherits(IniHighlightRules, TextHighlightRules);\n
@@ -140,60 +156,59 @@ oop.inherits(IniHighlightRules, TextHighlightRules);\n
 exports.IniHighlightRules = IniHighlightRules;\n
 });\n
 \n
-define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+define(\'ace/mode/folding/ini\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../../lib/oop");\n
 var Range = require("../../range").Range;\n
 var BaseFoldMode = require("./fold_mode").FoldMode;\n
 \n
-var FoldMode = exports.FoldMode = function(commentRegex) {\n
-    if (commentRegex) {\n
-        this.foldingStartMarker = new RegExp(\n
-            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
-        );\n
-        this.foldingStopMarker = new RegExp(\n
-            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
-        );\n
-    }\n
+var FoldMode = exports.FoldMode = function() {\n
 };\n
 oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 (function() {\n
 \n
-    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n
-    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n
+    this.foldingStartMarker = /^\\s*\\[([^\\])]*)]\\s*(?:$|[;#])/;\n
 \n
     this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var re = this.foldingStartMarker;\n
         var line = session.getLine(row);\n
-        var match = line.match(this.foldingStartMarker);\n
-        if (match) {\n
-            var i = match.index;\n
-\n
-            if (match[1])\n
-                return this.openingBracketBlock(session, match[1], row, i);\n
-\n
-            return session.getCommentFoldRange(row, i + match[0].length, 1);\n
+        \n
+        var m = line.match(re);\n
+        \n
+        if (!m) return;\n
+        \n
+        var startName = m[1] + ".";\n
+        \n
+        var startColumn = line.length;\n
+        var maxRow = session.getLength();\n
+        var startRow = row;\n
+        var endRow = row;\n
+\n
+        while (++row < maxRow) {\n
+            line = session.getLine(row);\n
+            if (/^\\s*$/.test(line))\n
+                continue;\n
+            m = line.match(re);\n
+            if (m && m[1].lastIndexOf(startName, 0) !== 0)\n
+                break;\n
+\n
+            endRow = row;\n
         }\n
 \n
-        if (foldStyle !== "markbeginend")\n
-            return;\n
-\n
-        var match = line.match(this.foldingStopMarker);\n
-        if (match) {\n
-            var i = match.index + match[0].length;\n
-\n
-            if (match[1])\n
-                return this.closingBracketBlock(session, match[1], row, i);\n
-\n
-            return session.getCommentFoldRange(row, i, -1);\n
+        if (endRow > startRow) {\n
+            var endColumn = session.getLine(endRow).length;\n
+            return new Range(startRow, startColumn, endRow, endColumn);\n
         }\n
     };\n
 \n
 }).call(FoldMode.prototype);\n
 \n
 });\n
-</string> </value>
+
+
+]]></string> </value>
         </item>
         <item>
             <key> <string>precondition</string> </key>
@@ -201,7 +216,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6416</int> </value>
+            <value> <int>6342</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jack.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jack.js.xml
new file mode 100644
index 0000000000..868a01cad8
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jack.js.xml
@@ -0,0 +1,650 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.31</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-jack.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ * \n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ * \n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/mode/jack\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/jack_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/mode/behaviour/cstyle\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var HighlightRules = require("./jack_highlight_rules").JackHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = HighlightRules;\n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CstyleBehaviour();\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.lineCommentStart = "--";\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        var indent = this.$getIndent(line);\n
+\n
+        if (state == "start") {\n
+            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n
+            if (match) {\n
+                indent += tab;\n
+            }\n
+        }\n
+\n
+        return indent;\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return this.$outdent.checkOutdent(line, input);\n
+    };\n
+\n
+    this.autoOutdent = function(state, doc, row) {\n
+        this.$outdent.autoOutdent(doc, row);\n
+    };\n
+\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/jack_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var JackHighlightRules = function() {\n
+    this.$rules = {\n
+        "start" : [\n
+            {\n
+                token : "string",\n
+                regex : \'"\',\n
+                next  : "string2"\n
+            }, {\n
+                token : "string",\n
+                regex : "\'",\n
+                next  : "string1"\n
+            }, {\n
+                token : "constant.numeric", // hex\n
+                regex: "-?0[xX][0-9a-fA-F]+\\\\b"\n
+            }, {\n
+                token : "constant.numeric", // float\n
+                regex : "(?:0|[-+]?[1-9][0-9]*)\\\\b"\n
+            }, {\n
+                token : "constant.binary",\n
+                regex : "<[0-9A-Fa-f][0-9A-Fa-f](\\\\s+[0-9A-Fa-f][0-9A-Fa-f])*>"\n
+            }, {\n
+                token : "constant.language.boolean",\n
+                regex : "(?:true|false)\\\\b"\n
+            }, {\n
+                token : "constant.language.null",\n
+                regex : "null\\\\b"\n
+            }, {\n
+                token : "storage.type",\n
+                regex: "(?:Integer|Boolean|Null|String|Buffer|Tuple|List|Object|Function|Coroutine|Form)\\\\b"\n
+            }, {\n
+                token : "keyword",\n
+                regex : "(?:return|abort|vars|for|delete|in|is|escape|exec|split|and|if|elif|else|while)\\\\b"\n
+            }, {\n
+                token : "language.builtin",\n
+                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"\n
+            }, {\n
+                token : "comment",\n
+                regex : "--.*$"\n
+            }, {\n
+                token : "paren.lparen",\n
+                regex : "[[({]"\n
+            }, {\n
+                token : "paren.rparen",\n
+                regex : "[\\\\])}]"\n
+            }, {\n
+                token : "storage.form",\n
+                regex : "@[a-z]+"\n
+            }, {\n
+                token : "constant.other.symbol",\n
+                regex : \':+[a-zA-Z_]([-]?[a-zA-Z0-9_])*[?!]?\'\n
+            }, {\n
+                token : "variable",\n
+                regex : \'[a-zA-Z_]([-]?[a-zA-Z0-9_])*[?!]?\'\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : "\\\\|\\\\||\\\\^\\\\^|&&|!=|==|<=|<|>=|>|\\\\+|-|\\\\*|\\\\/|\\\\^|\\\\%|\\\\#|\\\\!"\n
+            }, {\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            }\n
+        ],\n
+        "string1" : [\n
+            {\n
+                token : "constant.language.escape",\n
+                regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\'"\\\\\\/bfnrt])/\n
+            }, {\n
+                token : "string",\n
+                regex : "[^\'\\\\\\\\]+"\n
+            }, {\n
+                token : "string",\n
+                regex : "\'",\n
+                next  : "start"\n
+            }, {\n
+                token : "string",\n
+                regex : "",\n
+                next  : "start"\n
+            }\n
+        ],\n
+        "string2" : [\n
+            {\n
+                token : "constant.language.escape",\n
+                regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\'"\\\\\\/bfnrt])/\n
+            }, {\n
+                token : "string",\n
+                regex : \'[^"\\\\\\\\]+\'\n
+            }, {\n
+                token : "string",\n
+                regex : \'"\',\n
+                next  : "start"\n
+            }, {\n
+                token : "string",\n
+                regex : "",\n
+                next  : "start"\n
+            }\n
+        ]\n
+    };\n
+    \n
+};\n
+\n
+oop.inherits(JackHighlightRules, TextHighlightRules);\n
+\n
+exports.JackHighlightRules = JackHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/matching_brace_outdent\', [\'require\', \'exports\', \'module\' , \'ace/range\'], function(require, exports, module) {\n
+\n
+\n
+var Range = require("../range").Range;\n
+\n
+var MatchingBraceOutdent = function() {};\n
+\n
+(function() {\n
+\n
+    this.checkOutdent = function(line, input) {\n
+        if (! /^\\s+$/.test(line))\n
+            return false;\n
+\n
+        return /^\\s*\\}/.test(input);\n
+    };\n
+\n
+    this.autoOutdent = function(doc, row) {\n
+        var line = doc.getLine(row);\n
+        var match = line.match(/^(\\s*\\})/);\n
+\n
+        if (!match) return 0;\n
+\n
+        var column = match[1].length;\n
+        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n
+\n
+        if (!openBracePos || openBracePos.row == row) return 0;\n
+\n
+        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n
+        doc.replace(new Range(row, 0, row, column-1), indent);\n
+    };\n
+\n
+    this.$getIndent = function(line) {\n
+        return line.match(/^\\s*/)[0];\n
+    };\n
+\n
+}).call(MatchingBraceOutdent.prototype);\n
+\n
+exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
+});\n
+\n
+define(\'ace/mode/behaviour/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour\', \'ace/token_iterator\', \'ace/lib/lang\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+var lang = require("../../lib/lang");\n
+\n
+var SAFE_INSERT_IN_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator"];\n
+var SAFE_INSERT_BEFORE_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator", "comment"];\n
+\n
+\n
+var autoInsertedBrackets = 0;\n
+var autoInsertedRow = -1;\n
+var autoInsertedLineEnd = "";\n
+var maybeInsertedBrackets = 0;\n
+var maybeInsertedRow = -1;\n
+var maybeInsertedLineStart = "";\n
+var maybeInsertedLineEnd = "";\n
+\n
+var CstyleBehaviour = function () {\n
+    \n
+    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n
+        var cursor = editor.getCursorPosition();\n
+        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+        if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {\n
+            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n
+            if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))\n
+                return false;\n
+        }\n
+        iterator.stepForward();\n
+        return iterator.getCurrentTokenRow() !== cursor.row ||\n
+            this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);\n
+    };\n
+    \n
+    CstyleBehaviour.$matchTokenType = function(token, types) {\n
+        return types.indexOf(token.type || token) > -1;\n
+    };\n
+    \n
+    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n
+            autoInsertedBrackets = 0;\n
+        autoInsertedRow = cursor.row;\n
+        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n
+        autoInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isMaybeInsertedClosing(cursor, line))\n
+            maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = cursor.row;\n
+        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n
+        maybeInsertedLineEnd = line.substr(cursor.column);\n
+        maybeInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n
+        return autoInsertedBrackets > 0 &&\n
+            cursor.row === autoInsertedRow &&\n
+            bracket === autoInsertedLineEnd[0] &&\n
+            line.substr(cursor.column) === autoInsertedLineEnd;\n
+    };\n
+    \n
+    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n
+        return maybeInsertedBrackets > 0 &&\n
+            cursor.row === maybeInsertedRow &&\n
+            line.substr(cursor.column) === maybeInsertedLineEnd &&\n
+            line.substr(0, cursor.column) == maybeInsertedLineStart;\n
+    };\n
+    \n
+    CstyleBehaviour.popAutoInsertedClosing = function() {\n
+        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n
+        autoInsertedBrackets--;\n
+    };\n
+    \n
+    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n
+        maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = -1;\n
+    };\n
+\n
+    this.add("braces", "insertion", function (state, action, editor, session, text) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (text == \'{\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'{\' + selected + \'}\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n
+                    CstyleBehaviour.recordAutoInsert(editor, session, "}");\n
+                    return {\n
+                        text: \'{}\',\n
+                        selection: [1, 1]\n
+                    };\n
+                } else {\n
+                    CstyleBehaviour.recordMaybeInsert(editor, session, "{");\n
+                    return {\n
+                        text: \'{\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == \'}\') {\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\') {\n
+                var matching = session.$findOpeningBracket(\'}\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == "\\n" || text == "\\r\\n") {\n
+            var closing = "";\n
+            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n
+                closing = lang.stringRepeat("}", maybeInsertedBrackets);\n
+                CstyleBehaviour.clearMaybeInsertedClosing();\n
+            }\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\' || closing !== "") {\n
+                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, \'}\');\n
+                if (!openBracePos)\n
+                     return null;\n
+\n
+                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n
+                var next_indent = this.$getIndent(line);\n
+\n
+                return {\n
+                    text: \'\\n\' + indent + \'\\n\' + next_indent + closing,\n
+                    selection: [1, indent.length, 1, indent.length]\n
+                };\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("braces", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'{\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.end.column, range.end.column + 1);\n
+            if (rightChar == \'}\') {\n
+                range.end.column++;\n
+                return range;\n
+            } else {\n
+                maybeInsertedBrackets--;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'(\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'(\' + selected + \')\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, ")");\n
+                return {\n
+                    text: \'()\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \')\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \')\') {\n
+                var matching = session.$findOpeningBracket(\')\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'(\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \')\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'[\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'[\' + selected + \']\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, "]");\n
+                return {\n
+                    text: \'[]\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \']\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \']\') {\n
+                var matching = session.$findOpeningBracket(\']\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'[\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \']\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'"\' || text == "\'") {\n
+            var quote = text;\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "\'" && selected != \'"\' && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: quote + selected + quote,\n
+                    selection: false\n
+                };\n
+            } else {\n
+                var cursor = editor.getCursorPosition();\n
+                var line = session.doc.getLine(cursor.row);\n
+                var leftChar = line.substring(cursor.column-1, cursor.column);\n
+                if (leftChar == \'\\\\\') {\n
+                    return null;\n
+                }\n
+                var tokens = session.getTokens(selection.start.row);\n
+                var col = 0, token;\n
+                var quotepos = -1; // Track whether we\'re inside an open quote.\n
+\n
+                for (var x = 0; x < tokens.length; x++) {\n
+                    token = tokens[x];\n
+                    if (token.type == "string") {\n
+                      quotepos = -1;\n
+                    } else if (quotepos < 0) {\n
+                      quotepos = token.value.indexOf(quote);\n
+                    }\n
+                    if ((token.value.length + col) > selection.start.column) {\n
+                        break;\n
+                    }\n
+                    col += tokens[x].value.length;\n
+                }\n
+                if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n
+                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n
+                        return;\n
+                    return {\n
+                        text: quote + quote,\n
+                        selection: [1,1]\n
+                    };\n
+                } else if (token && token.type === "string") {\n
+                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+                    if (rightChar == quote) {\n
+                        return {\n
+                            text: \'\',\n
+                            selection: [1, 1]\n
+                        };\n
+                    }\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && (selected == \'"\' || selected == "\'")) {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == selected) {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+};\n
+\n
+oop.inherits(CstyleBehaviour, Behaviour);\n
+\n
+exports.CstyleBehaviour = CstyleBehaviour;\n
+});\n
+\n
+define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Range = require("../../range").Range;\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(commentRegex) {\n
+    if (commentRegex) {\n
+        this.foldingStartMarker = new RegExp(\n
+            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
+        );\n
+        this.foldingStopMarker = new RegExp(\n
+            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
+        );\n
+    }\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n
+    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var line = session.getLine(row);\n
+        var match = line.match(this.foldingStartMarker);\n
+        if (match) {\n
+            var i = match.index;\n
+\n
+            if (match[1])\n
+                return this.openingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i + match[0].length, 1);\n
+        }\n
+\n
+        if (foldStyle !== "markbeginend")\n
+            return;\n
+\n
+        var match = line.match(this.foldingStopMarker);\n
+        if (match) {\n
+            var i = match.index + match[0].length;\n
+\n
+            if (match[1])\n
+                return this.closingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i, -1);\n
+        }\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>23337</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jade.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jade.js.xml
index f793ddb66d..4514346659 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jade.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jade.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155558.63</string> </value>
+            <value> <string>ts83646622.01</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>84557</int> </value>
+            <value> <int>88250</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -94,14 +94,13 @@ var JadeHighlightRules = require("./jade_highlight_rules").JadeHighlightRules;\n
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new JadeHighlightRules();\n
+    this.HighlightRules = JadeHighlightRules;\n
     \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
     this.foldingRules = new FoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
-(function() {\n
+(function() { \n
 \tthis.lineCommentStart = "//";\n
 }).call(Mode.prototype);\n
 \n
@@ -320,27 +319,74 @@ oop.inherits(JadeHighlightRules, TextHighlightRules);\n
 exports.JadeHighlightRules = JadeHighlightRules;\n
 });\n
 \n
-define(\'ace/mode/markdown_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'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) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
 var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 \n
+var escaped = function(ch) {\n
+    return "(?:[^" + lang.escapeRegExp(ch) + "\\\\\\\\]|\\\\\\\\.)*";\n
+}\n
+\n
 function github_embed(tag, prefix) {\n
     return { // Github style block\n
         token : "support.function",\n
         regex : "^```" + tag + "\\\\s*$",\n
-        next  : prefix + "start"\n
+        push  : prefix + "start"\n
     };\n
 }\n
 \n
 var MarkdownHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
+\n
+    this.$rules["start"].unshift({\n
+        token : "empty_line",\n
+        regex : \'^$\',\n
+        next: "allowBlock"\n
+    }, { // h1\n
+        token: "markup.heading.1",\n
+        regex: "^=+(?=\\\\s*$)"\n
+    }, { // h2\n
+        token: "markup.heading.2",\n
+        regex: "^\\\\-+(?=\\\\s*$)"\n
+    }, {\n
+        token : function(value) {\n
+            return "markup.heading." + value.length;\n
+        },\n
+        regex : /^#{1,6}(?=\\s*[^ #]|\\s+#.)/,\n
+        next : "header"\n
+    },\n
+       github_embed("(?:javascript|js)", "jscode-"),\n
+       github_embed("xml", "xmlcode-"),\n
+       github_embed("html", "htmlcode-"),\n
+       github_embed("css", "csscode-"),\n
+    { // Github style block\n
+        token : "support.function",\n
+        regex : "^```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$",\n
+        next  : "githubblock"\n
+    }, { // block quote\n
+        token : "string",\n
+        regex : "^>[ ].+$",\n
+        next  : "blockquote"\n
+    }, { // HR * - _\n
+        token : "constant",\n
+        regex : "^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$",\n
+        next: "allowBlock"\n
+    }, { // list\n
+        token : "markup.list",\n
+        regex : "^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+",\n
+        next  : "listblock-start"\n
+    }, {\n
+        include : "basic"\n
+    });\n
 \n
-    this.$rules = {\n
+    this.addRules({\n
         "basic" : [{\n
             token : "constant.language.escape",\n
             regex : /\\\\[\\\\`*_{}\\[\\]()#+\\-.!]/\n
@@ -352,15 +398,15 @@ var MarkdownHighlightRules = function() {\n
             regex : "^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\\"][^\\"]+[\\"])?(\\\\s*))$"\n
         }, { // link by reference\n
             token : ["text", "string", "text", "constant", "text"],\n
-            regex : "(\\\\[)((?:[[^\\\\]]*\\\\]|[^\\\\[\\\\]])*)(\\\\][ ]?(?:\\\\n[ ]*)?\\\\[)(.*?)(\\\\])"\n
+            regex : "(\\\\[)(" + escaped("]") + ")(\\\\]\\s*\\\\[)("+ escaped("]") + ")(\\\\])"\n
         }, { // link by url\n
             token : ["text", "string", "text", "markup.underline", "string", "text"],\n
-            regex : "(\\\\[)"+\n
-                    "(\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]*)"+\n
-                    "(\\\\]\\\\([ \\\\t]*)"+\n
-                    "(<?(?:(?:[^\\\\(]*?\\\\([^\\\\)]*?\\\\)\\\\S*?)|(?:.*?))>?)"+\n
-                    "((?:[ \\t]*\\"(?:.*?)\\"[ \\\\t]*)?)"+\n
-                    "(\\\\))"\n
+            regex : "(\\\\[)(" +                                        // [\n
+                    escaped("]") +                                    // link text\n
+                    ")(\\\\]\\\\()"+                                      // ](\n
+                    \'((?:[^\\\\)\\\\s\\\\\\\\]|\\\\\\\\.|\\\\s(?=[^"]))*)\' +        // href\n
+                    \'(\\\\s*"\' +  escaped(\'"\') + \'"\\\\s*)?\' +            // "title"\n
+                    "(\\\\))"                                           // )\n
         }, { // strong ** __\n
             token : "string",\n
             regex : "([*]{2}|[_]{2}(?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)"\n
@@ -380,54 +426,13 @@ var MarkdownHighlightRules = function() {\n
             {token : "empty", regex : "", next : "start"}\n
         ],\n
 \n
-        "start" : [{\n
-            token : "empty_line",\n
-            regex : \'^$\',\n
-            next: "allowBlock"\n
-        }, { // h1\n
-            token: "markup.heading.1",\n
-            regex: "^=+(?=\\\\s*$)"\n
-        }, { // h2\n
-            token: "markup.heading.2",\n
-            regex: "^\\\\-+(?=\\\\s*$)"\n
-        }, {\n
-            token : function(value) {\n
-                return "markup.heading." + value.length;\n
-            },\n
-            regex : /^#{1,6}(?=\\s*[^ #]|\\s+#.)/,\n
-            next : "header"\n
-        },\n
-           github_embed("(?:javascript|js)", "js-"),\n
-           github_embed("xml", "xml-"),\n
-           github_embed("html", "html-"),\n
-           github_embed("css", "css-"),\n
-        { // Github style block\n
-            token : "support.function",\n
-            regex : "^```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$",\n
-            next  : "githubblock"\n
-        }, { // block quote\n
-            token : "string",\n
-            regex : "^>[ ].+$",\n
-            next  : "blockquote"\n
-        }, { // HR * - _\n
-            token : "constant",\n
-            regex : "^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$",\n
-            next: "allowBlock"\n
-        }, { // list\n
-            token : "markup.list",\n
-            regex : "^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+",\n
-            next  : "listblock-start"\n
-        }, {\n
-            include : "basic"\n
-        }],\n
-        \n
         "header" : [{\n
             regex: "$",\n
             next : "start"\n
         }, {\n
             include: "basic"\n
         }, {\n
-            defaultToken : "markup.heading"\n
+            defaultToken : "heading"\n
         } ],\n
 \n
         "listblock-start" : [{\n
@@ -447,7 +452,7 @@ var MarkdownHighlightRules = function() {\n
         }, {\n
             include : "basic", noEscape: true\n
         }, {\n
-            defaultToken : "markup.list"\n
+            defaultToken : "list"\n
         } ],\n
 \n
         "blockquote" : [ { // BLockquotes only escape on blank lines.\n
@@ -467,39 +472,31 @@ var MarkdownHighlightRules = function() {\n
             token : "support.function",\n
             regex : ".+"\n
         } ]\n
-    };\n
+    });\n
 \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
+    this.embedRules(JavaScriptHighlightRules, "jscode-", [{\n
        token : "support.function",\n
        regex : "^```",\n
-       next  : "start"\n
+       next  : "pop"\n
     }]);\n
 \n
-    this.embedRules(HtmlHighlightRules, "html-", [{\n
+    this.embedRules(HtmlHighlightRules, "htmlcode-", [{\n
        token : "support.function",\n
        regex : "^```",\n
-       next  : "start"\n
+       next  : "pop"\n
     }]);\n
 \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
+    this.embedRules(CssHighlightRules, "csscode-", [{\n
        token : "support.function",\n
        regex : "^```",\n
-       next  : "start"\n
+       next  : "pop"\n
     }]);\n
 \n
-    this.embedRules(XmlHighlightRules, "xml-", [{\n
+    this.embedRules(XmlHighlightRules, "xmlcode-", [{\n
        token : "support.function",\n
        regex : "^```",\n
-       next  : "start"\n
+       next  : "pop"\n
     }]);\n
-\n
-    var html = new HtmlHighlightRules().getRules();\n
-    for (var i in html) {\n
-        if (this.$rules[i])\n
-            this.$rules[i] = this.$rules[i].concat(html[i]);\n
-        else\n
-            this.$rules[i] = html[i];\n
-    }\n
 \n
     this.normalizeRules();\n
 };\n
@@ -557,7 +554,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -632,7 +630,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -677,8 +675,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -765,6 +763,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -859,36 +865,181 @@ var oop = require("../lib/oop");\n
 var xmlUtil = require("./xml_util");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 \n
-var XmlHighlightRules = function() {\n
+var XmlHighlightRules = function(normalize) {\n
     this.$rules = {\n
         start : [\n
-            {token : "text", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
-            {token : "xml-pe", regex : "<\\\\?.*?\\\\?>"},\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
             {token : "comment", regex : "<\\\\!--", next : "comment"},\n
-            {token : "xml-pe", regex : "<\\\\!.*?>"},\n
-            {token : "meta.tag", regex : "<\\\\/?", next : "tag"},\n
-            {token : "text", regex : "\\\\s+"},\n
             {\n
-                token : "constant.character.entity", \n
-                regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
-            }\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
         ],\n
-        \n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
         cdata : [\n
-            {token : "text", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
             {token : "text", regex : "\\\\s+"},\n
             {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
         ],\n
 \n
         comment : [\n
-            {token : "comment", regex : ".*?-->", next : "start"},\n
-            {token : "comment", regex : ".+"}\n
-        ]\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start");\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
 oop.inherits(XmlHighlightRules, TextHighlightRules);\n
 \n
 exports.XmlHighlightRules = XmlHighlightRules;\n
@@ -964,15 +1115,14 @@ exports.tag = function(states, name, nextState, tagMap) {\n
 \n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -981,6 +1131,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -994,78 +1145,66 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "text",\n
-            regex : "\\\\s+"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
-            token : "constant.character.entity",\n
-            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ]\n
-    };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
 \n
 exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
@@ -1095,152 +1234,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-java.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-java.js.xml
index da3b30b11a..a26e284b67 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-java.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-java.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155558.74</string> </value>
+            <value> <string>ts83646621.99</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -32,8 +32,7 @@ var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules;\n
 \n
 var Mode = function() {\n
     JavaScriptMode.call(this);\n
-    \n
-    this.$tokenizer = new Tokenizer(new JavaHighlightRules().getRules());\n
+    this.HighlightRules = JavaHighlightRules;\n
 };\n
 oop.inherits(Mode, JavaScriptMode);\n
 \n
@@ -62,7 +61,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -77,7 +77,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -183,7 +183,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -258,7 +259,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -303,8 +304,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -391,6 +392,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1028,7 +1037,7 @@ exports.JavaHighlightRules = JavaHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>42256</int> </value>
+            <value> <int>42555</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-javascript.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-javascript.js.xml
index 7b94c6b620..681fdfb4ff 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-javascript.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-javascript.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155558.88</string> </value>
+            <value> <string>ts83646621.97</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -66,7 +66,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -81,7 +82,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -187,7 +188,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -262,7 +264,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -307,8 +309,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -395,6 +397,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -908,7 +918,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>37963</int> </value>
+            <value> <int>38295</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-json.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-json.js.xml
index daa4c2b9b0..1b61bcf4ae 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-json.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-json.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155559.13</string> </value>
+            <value> <string>ts83646621.96</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -65,7 +65,7 @@ var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 var WorkerClient = require("../worker/worker_client").WorkerClient;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new HighlightRules().getRules());\n
+    this.HighlightRules = HighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -610,7 +610,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>22267</int> </value>
+            <value> <int>22239</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsoniq.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsoniq.js.xml
index 6822b70732..fb2561d08b 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsoniq.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsoniq.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155559.02</string> </value>
+            <value> <string>ts83646621.94</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>329346</int> </value>
+            <value> <int>329317</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -1948,7 +1948,26 @@ JSONiqTokenizer.MAP0 =\n
 ];\n
 \n
 JSONiqTokenizer.MAP1 =\n
-[ 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\n
+[ 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, 21</string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>4, 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\n
 ];\n
 \n
 JSONiqTokenizer.MAP2 =\n
@@ -1960,7 +1979,64 @@ JSONiqTokenizer.INITIAL =\n
 ];\n
 \n
 JSONiqTokenizer.TRANSITION =\n
-[ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22874, 18847, 17152, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17365, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 17470, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18199, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 17890, 17922, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18065, 36544, 18632, 18081, 18098, 18114, 18159, 18185, 18215, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17756, 18816, 18429, 18445, 18143, 17393, 18500, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18590, 21686, 17152, 19027, 19252, 17687, 19027, 28677, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17365, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 17470, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18199, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 17890, 17922, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18065, 36544, 18632, 18081, 18098, 18114, 18159, 18185, 18215, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17756, 18816, 18429, 18445, 18143, 17393, 18500, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20083, 18847, 18648, 19027, 19252, 21242, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18774, 18789, 18805, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18832, 22889, 18925, 19027, 19252, 17569, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18956, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 19073, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 18972, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21818, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21671, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22395, 20098, 18731, 19027, 19252, 17687, 19027, 17173, 23525, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 18129, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 20746, 19130, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19043, 18847, 18620, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19100, 22410, 19006, 19027, 19252, 17687, 19027, 19084, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21967, 21982, 19006, 19027, 19252, 17687, 19027, 18701, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22380, 18847, 19006, 19027, 19252, 30659, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 19157, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 19299, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 19191, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21758, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 19237, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21626, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19268, 19284, 19326, 18482, 27869, 30509, 24384, 31417, 23323, 18482, 19370, 18482, 18484, 27202, 19389, 27202, 27202, 19411, 24384, 34295, 24384, 24384, 25485, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 19459, 24384, 24384, 24384, 24384, 24017, 18036, 24041, 18482, 18482, 18482, 18484, 19487, 27202, 27202, 27202, 27202, 19503, 35523, 19539, 24384, 24384, 24384, 19647, 18482, 35623, 18482, 18482, 23052, 27202, 19557, 27202, 27202, 30764, 23993, 24384, 19579, 24384, 24384, 26758, 18482, 18482, 19346, 27867, 27202, 27202, 19599, 17590, 23998, 24384, 24384, 19619, 25683, 18482, 18482, 28511, 27202, 27203, 23997, 19639, 19887, 28419, 18902, 18483, 19663, 27202, 24325, 35844, 19887, 30991, 19713, 19395, 19736, 22259, 19754, 22073, 19770, 35154, 19795, 19816, 19836, 19859, 25794, 34248, 24116, 19720, 19875, 30988, 23482, 30981, 28304, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21743, 18847, 19006, 19027, 19252, 17431, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22365, 18847, 19907, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21641, 18847, 19326, 18482, 27869, 30544, 24384, 29176, 21442, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 19935, 24384, 24384, 24384, 24384, 32316, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 19965, 24384, 24384, 24384, 24384, 31473, 18475, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19988, 24384, 24384, 24384, 24384, 24384, 33654, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 29523, 29939, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 20017, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20068, 19058, 20158, 20367, 20884, 17944, 20276, 20853, 25651, 20604, 20460, 20185, 20209, 17189, 17208, 17281, 17675, 20232, 20273, 20295, 20338, 22456, 20777, 20600, 21329, 20635, 20365, 20937, 21207, 17292, 17421, 21157, 17192, 21217, 22425, 20279, 25549, 22436, 20276, 20383, 18983, 20421, 20446, 21317, 21051, 20476, 20322, 20663, 20490, 17543, 17559, 17585, 22463, 20540, 19523, 20246, 20556, 20257, 20430, 20585, 20620, 20193, 20651, 17661, 18368, 17703, 17730, 17772, 19513, 20679, 20692, 22446, 21027, 21097, 18990, 21111, 20708, 20736, 17744, 17795, 17874, 17590, 25536, 20349, 20762, 20812, 20169, 20828, 21376, 17714, 17976, 18021, 18560, 20844, 20569, 25560, 20869, 20900, 18114, 18159, 20916, 20953, 21013, 21043, 21067, 18281, 21083, 18574, 21127, 21143, 21181, 20515, 20930, 20883, 20504, 21197, 21233, 21258, 20524, 20216, 17405, 21270, 21286, 21302, 20720, 20310, 21345, 21361, 21392, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21952, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 21427, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 21479, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 36500, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 28667, 21921, 17617, 36472, 18265, 17237, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 21550, 21509, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 21535, 30636, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21773, 18847, 21587, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21611, 18847, 19006, 19027, 19252, 18169, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21728, 19115, 21878, 19027, 19252, 17687, 19027, 19310, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17379, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 21906, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18322, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21937, 18605, 19006, 19027, 19252, 22018, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21656, 21833, 19006, 19027, 19252, 17687, 19027, 21519, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 32253, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 22228, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 31644, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 33557, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 34068, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22245, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22290, 18847, 22034, 18482, 27869, 34957, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 34436, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22320, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 27077, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 19919, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22275, 22479, 19006, 19027, 19252, 17687, 19027, 19141, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 22510, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22574, 18847, 22954, 22970, 27597, 22986, 23002, 23033, 22062, 18482, 18482, 18482, 23049, 27202, 27202, 27202, 23068, 22096, 24384, 24384, 24384, 23088, 31359, 31082, 19693, 18482, 28112, 28225, 19443, 35045, 27202, 27202, 23108, 23139, 23155, 23178, 24384, 24384, 23212, 35330, 31659, 23228, 18482, 23256, 23274, 27795, 26712, 23293, 35214, 34879, 33340, 23312, 18235, 23359, 32708, 23949, 24384, 23380, 35255, 23429, 18482, 33884, 23408, 23448, 27202, 27202, 23498, 23518, 21406, 23541, 24384, 24384, 23570, 26114, 23601, 23623, 18482, 33444, 23651, 32875, 27202, 22171, 18862, 23702, 36589, 24384, 18481, 23731, 32601, 27202, 23750, 23768, 20047, 32969, 24367, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 23784, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 28217, 31795, 23804, 26925, 34916, 23831, 26501, 25793, 23859, 23895, 23482, 30981, 22080, 19438, 27956, 19678, 29812, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22589, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 28902, 25794, 27202, 27202, 27202, 34019, 23914, 22148, 24384, 24384, 24384, 28393, 23930, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 26591, 18482, 18482, 18482, 31585, 23965, 27202, 27202, 27202, 23986, 22185, 24014, 24384, 24384, 24384, 24033, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 26504, 24057, 24107, 24132, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22604, 18847, 22034, 19697, 27869, 24166, 24384, 24182, 24198, 26600, 18482, 18482, 18484, 24233, 24249, 27202, 27202, 22096, 24268, 24284, 24384, 24384, 30621, 19800, 35427, 35999, 32609, 18482, 25794, 24303, 28959, 23752, 27202, 35010, 22148, 24341, 32040, 26837, 24383, 31473, 31659, 18482, 18482, 18482, 24784, 18484, 27202, 27202, 27202, 27202, 24401, 19503, 24384, 24384, 24384, 24384, 20134, 31154, 18482, 18482, 18482, 27845, 23052, 27202, 27202, 33502, 27202, 30764, 21406, 24384, 24384, 22938, 24384, 26114, 18482, 36246, 18482, 27867, 27202, 24423, 27202, 22171, 22934, 24384, 24442, 24384, 36762, 28438, 18482, 34466, 34508, 35771, 24461, 24385, 24477, 25677, 18482, 36220, 27202, 27202, 24498, 30954, 23715, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 24521, 30990, 27868, 34251, 30090, 23343, 24546, 19856, 25793, 19779, 30988, 23482, 26152, 22080, 19438, 29824, 24562, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22619, 18847, 22034, 25767, 22132, 25325, 23162, 29176, 24597, 24091, 23607, 24656, 26122, 24680, 24426, 24696, 28551, 22096, 24731, 24445, 24747, 23364, 30621, 18482, 18482, 18482, 18482, 24781, 25794, 27202, 27202, 27202, 34210, 35010, 22148, 24384, 24384, 24384, 33259, 31473, 22525, 24087, 24213, 18482, 18482, 34908, 24800, 30419, 27202, 27202, 32418, 19503, 29781, 35065, 24384, 24384, 19891, 31154, 24835, 18482, 18482, 24854, 29214, 27202, 27202, 32006, 27202, 30764, 35344, 24384, 24384, 31544, 24384, 26114, 33098, 27814, 27002, 27867, 34668, 25625, 24871, 22171, 22934, 19214, 34531, 24889, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 33615, 27202, 27202, 24907, 24930, 23554, 30991, 18484, 27202, 31802, 22199, 19466, 23052, 23296, 19847, 30877, 31015, 24955, 19859, 24983, 34248, 30871, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 24999, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22634, 18847, 25024, 25040, 31293, 25056, 25072, 25088, 22062, 34734, 24217, 36253, 34808, 32637, 25104, 23072, 32848, 22245, 36623, 25120, 30679, 27356, 30621, 25136, 26455, 25174, 25208, 22540, 23240, 25224, 25240, 25256, 25306, 25341, 25357, 25418, 25446, 25470, 26739, 25522, 31659, 23635, 25576, 27398, 25593, 28592, 25945, 25617, 27202, 32546, 27295, 25641, 25850, 25667, 24384, 34758, 25699, 25716, 22552, 27787, 30221, 25756, 25789, 25810, 25828, 28333, 28988, 30764, 21493, 33405, 25848, 25866, 25904, 26114, 31227, 26677, 30167, 27867, 25941, 25961, 27202, 22171, 22934, 25977, 25997, 24384, 23394, 27775, 25740, 25270, 26013, 26048, 26064, 26104, 26138, 26178, 26211, 26230, 26247, 30500, 26380, 26282, 28388, 30991, 33711, 27202, 33645, 26324, 36716, 26353, 26374, 35300, 30990, 26396, 26415, 30927, 26358, 33832, 26442, 26471, 26487, 26520, 23482, 33146, 26539, 26555, 27956, 31266, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22649, 18847, 26576, 26189, 26616, 25325, 26643, 29176, 22062, 26669, 18482, 18482, 18484, 26693, 27202, 27202, 27202, 22096, 26728, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 26782, 25794, 27202, 27202, 27202, 26258, 35010, 22148, 24384, 24384, 24384, 21571, 31473, 31659, 18482, 18482, 33949, 18482, 18484, 27202, 27202, 25812, 27202, 27202, 19503, 24384, 24384, 24384, 26800, 24384, 31154, 18482, 18482, 18482, 35570, 23052, 27202, 27202, 27202, 26817, 30764, 21406, 24384, 24384, 24384, 26836, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 31882, 18483, 35699, 27202, 19738, 26853, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 26913, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 24967, 31061, 19438, 26953, 27663, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22664, 18847, 26990, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 23017, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 27024, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 27047, 18482, 18484, 27202, 27202, 27331, 27202, 27202, 27066, 24384, 24384, 29025, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 33957, 27867, 27202, 27202, 27093, 17590, 23998, 24384, 24384, 27114, 27135, 36322, 27153, 27201, 27219, 28359, 18229, 34780, 34405, 27235, 35972, 27268, 27293, 27311, 36040, 33984, 20980, 31851, 21453, 30535, 27347, 32520, 27372, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 26337, 30118, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 27397, 27414, 27436, 27452, 27473, 22062, 18482, 18482, 30171, 18484, 27202, 27202, 27982, 27202, 22096, 24384, 24384, 25700, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 34013, 27202, 27202, 27202, 27202, 29731, 22148, 24384, 24384, 24384, 24384, 27119, 31659, 27489, 18482, 18482, 18482, 18484, 27185, 27202, 27202, 27202, 27202, 19503, 27457, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 27050, 23052, 27202, 27202, 27202, 32469, 30764, 23993, 24384, 24384, 24384, 34982, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 20796, 27202, 29362, 22110, 33940, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22679, 18847, 22034, 27508, 27528, 27553, 35182, 27569, 22062, 29693, 26300, 23258, 27585, 24715, 27613, 27202, 27648, 22096, 36597, 27698, 24384, 27733, 18877, 18482, 27811, 18482, 27830, 22046, 27865, 32194, 27202, 25158, 27885, 27913, 22148, 29458, 24384, 29977, 34392, 26750, 27763, 26889, 18482, 18482, 27252, 29886, 27929, 27202, 27202, 27202, 27981, 27998, 28024, 28045, 24384, 24384, 28062, 28081, 28128, 25506, 28145, 26088, 28160, 27202, 28173, 24640, 28189, 30764, 31496, 24384, 28205, 34154, 36166, 24939, 28241, 28259, 28283, 21463, 33034, 28320, 28349, 17590, 20967, 23092, 28375, 28409, 28095, 28435, 28454, 28474, 28509, 28527, 20001, 33682, 25879, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30272, 28267, 28546, 28567, 19425, 28583, 23052, 23296, 19847, 19471, 28608, 28653, 31075, 25794, 34248, 19856, 25793, 19779, 29644, 35950, 30318, 22080, 19438, 27956, 23123, 28693, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 22494, 18482, 18482, 18482, 18482, 18484, 25283, 27202, 27202, 27202, 27202, 19503, 29397, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22694, 18847, 28740, 28775, 28810, 28834, 28850, 28873, 28889, 24142, 28936, 31945, 36329, 25290, 28954, 27632, 28975, 29004, 24505, 29020, 25454, 29041, 23017, 27512, 29083, 29103, 30721, 18482, 23478, 29123, 24819, 27202, 29148, 28920, 27024, 29166, 23196, 24384, 29192, 35529, 31659, 18482, 18482, 25601, 32589, 29211, 27202, 27202, 31434, 30700, 29230, 27066, 24384, 24384, 24384, 29255, 29306, 19647, 18482, 33383, 18482, 18482, 23052, 27202, 29333, 27202, 27202, 30764, 23993, 35925, 24384, 24384, 24384, 27717, 36123, 18482, 18482, 29350, 29413, 27202, 35642, 17590, 21411, 29432, 24384, 25981, 18481, 33866, 18482, 27202, 26967, 27203, 23997, 32729, 19887, 25677, 18482, 26897, 27202, 27202, 29451, 23870, 24354, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 31737, 19859, 25794, 34248, 19856, 29474, 29539, 29283, 29581, 29637, 22080, 32533, 29501, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22709, 18847, 22034, 29660, 29512, 25325, 33242, 29176, 29682, 27245, 18482, 29709, 33286, 26974, 27202, 29725, 29747, 22096, 19221, 24384, 32702, 29772, 18877, 26784, 33892, 28458, 18482, 18482, 25794, 29797, 27202, 29840, 27202, 35010, 22148, 35817, 24384, 29859, 24384, 24017, 36756, 25192, 18482, 18482, 29879, 18484, 27202, 29902, 27202, 26032, 27202, 29925, 24384, 29960, 24384, 33594, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 29239, 29993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 31665, 18482, 18482, 19603, 27202, 27203, 23997, 30013, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19949, 19466, 36661, 19563, 19847, 30029, 30128, 30062, 19859, 25794, 30078, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 30106, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22724, 18847, 30152, 30187, 30237, 30288, 30304, 30344, 22062, 35616, 32797, 25773, 18484, 29909, 34096, 26820, 27202, 22096, 24914, 23189, 29195, 24384, 18877, 34444, 30360, 18482, 18482, 18482, 23413, 24707, 27202, 27202, 27202, 35010, 30378, 34990, 24384, 24384, 24384, 24017, 29554, 18482, 18482, 27137, 18482, 31281, 30394, 27202, 27202, 30413, 30566, 19503, 30435, 24384, 24384, 29969, 35678, 19647, 28759, 30455, 35459, 35606, 23052, 28724, 30490, 30525, 30560, 30764, 23993, 20123, 30582, 30606, 30675, 26291, 33426, 28938, 27682, 30695, 23675, 33466, 28493, 17590, 23944, 20405, 34338, 20997, 32331, 26308, 30716, 30737, 24315, 30756, 21563, 36372, 30787, 26653, 24611, 33177, 32448, 30814, 31804, 25430, 25917, 26523, 18484, 28818, 31802, 29269, 19466, 28297, 34240, 23815, 26076, 30842, 30858, 32115, 30893, 30915, 32757, 25793, 30943, 30988, 23482, 30981, 30970, 31007, 27956, 19678, 29489, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22739, 18847, 31031, 31047, 32397, 31098, 31114, 31170, 22062, 18482, 29565, 35577, 36725, 27202, 33216, 31186, 24407, 22096, 24384, 20142, 31202, 34301, 27748, 31218, 33388, 27166, 18482, 29087, 27277, 27202, 31251, 31309, 27202, 31328, 31344, 24384, 31375, 31391, 24384, 31410, 31659, 18482, 36130, 32801, 18482, 18484, 27202, 27202, 31433, 31450, 27202, 19503, 24384, 24384, 31470, 33588, 24384, 32977, 18482, 18482, 18482, 18482, 30038, 27202, 27202, 27202, 27202, 31489, 32244, 24384, 24384, 24384, 24384, 31512, 18482, 28755, 18482, 24634, 35732, 27202, 27202, 28637, 31538, 35788, 24384, 24384, 19337, 31986, 18482, 33208, 25316, 27203, 29997, 29863, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 31560, 19887, 31601, 32369, 33316, 30136, 31629, 19972, 31681, 31726, 31753, 31781, 30046, 31820, 31847, 25794, 34282, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 31867, 30252, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22754, 18847, 22034, 18909, 30474, 31902, 24287, 31918, 31934, 32767, 35262, 27008, 29621, 34103, 19820, 29416, 33323, 22096, 27031, 30439, 29435, 28857, 29596, 18482, 18482, 18482, 31961, 18482, 25794, 27202, 27202, 35038, 27202, 35010, 22148, 24384, 24384, 29389, 24384, 24017, 31979, 18482, 26937, 18482, 18482, 18484, 27202, 31454, 32002, 27202, 27202, 32022, 24384, 33015, 32056, 24384, 24384, 33690, 18482, 18482, 33119, 18482, 23052, 27202, 27202, 27624, 27202, 29756, 32078, 24384, 24384, 34332, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 36691, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 31710, 22155, 33181, 24252, 32103, 30990, 27868, 34251, 19859, 25794, 34248, 30265, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 32138, 32166, 32186, 30826, 33252, 29067, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 23585, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 32210, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 32233, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 33857, 18483, 36057, 27202, 19738, 35289, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22769, 18847, 32269, 31613, 34604, 32285, 32301, 32351, 22062, 18482, 32367, 19354, 32385, 27202, 32413, 27098, 32434, 22096, 24384, 32485, 20052, 32506, 18877, 25396, 23734, 18482, 18482, 32562, 32625, 27202, 32653, 27202, 23664, 32673, 32689, 24384, 32724, 24384, 25888, 32745, 34706, 18482, 27381, 32783, 24577, 24838, 32817, 24873, 32838, 32864, 27202, 32899, 32934, 24384, 32957, 29317, 24384, 30798, 26214, 27678, 33875, 18482, 23052, 36352, 27202, 32993, 27202, 30764, 23993, 32087, 24384, 33013, 24384, 35853, 18482, 18482, 30362, 27965, 27202, 27202, 33754, 17590, 20112, 24384, 24384, 34576, 20792, 18482, 18482, 33031, 27202, 27203, 36159, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 34554, 24150, 33050, 33080, 33114, 27868, 34251, 23843, 26560, 31696, 19856, 25793, 19779, 30988, 23482, 30981, 33135, 22123, 27956, 23463, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22784, 18847, 33162, 28106, 33197, 25325, 33232, 29176, 22062, 33275, 35433, 18482, 18484, 33302, 26399, 33339, 27202, 22096, 33356, 28065, 33404, 24384, 18877, 22229, 18482, 33421, 18482, 18482, 33442, 33460, 24811, 27202, 27202, 26627, 22148, 24758, 35190, 24384, 24384, 25925, 29611, 18482, 18482, 29290, 25186, 33482, 33501, 27202, 27202, 33518, 36276, 19503, 33554, 24384, 24384, 33573, 32490, 19647, 18482, 18482, 31235, 33610, 23052, 27202, 27202, 33631, 27202, 30764, 23993, 24384, 24384, 33670, 24384, 26862, 27492, 18482, 33706, 27867, 32883, 34639, 27202, 17590, 32036, 24765, 23788, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 33727, 36097, 19887, 25677, 18482, 23334, 27202, 29150, 19738, 23870, 35357, 30328, 18484, 33748, 34675, 33770, 19466, 34050, 33824, 31831, 30990, 27868, 34251, 33848, 28913, 33908, 19856, 30469, 33973, 25385, 36033, 34000, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22799, 18847, 34035, 32576, 34084, 34119, 34135, 34170, 34186, 32150, 36005, 31522, 31886, 34202, 34226, 34267, 29334, 34317, 34354, 34378, 34421, 26801, 18877, 26195, 29666, 25402, 18482, 35091, 25794, 34460, 34482, 34504, 25832, 35010, 22148, 34524, 34547, 34570, 19623, 24017, 36654, 35111, 24664, 18482, 32335, 34592, 31312, 34620, 34636, 27202, 34655, 34691, 28046, 34750, 34774, 24384, 33785, 19647, 34796, 32170, 34844, 24581, 33485, 26704, 34828, 34860, 35493, 29132, 36704, 33800, 35368, 32941, 34146, 26758, 34895, 18482, 18482, 34932, 34948, 27202, 32997, 17590, 29944, 34973, 24384, 36296, 25500, 30202, 35875, 35006, 35026, 26266, 20396, 31146, 35061, 35081, 35127, 24623, 28484, 27897, 19738, 35143, 35170, 26162, 28794, 35206, 35230, 33064, 35245, 23052, 23296, 29054, 30990, 27868, 34251, 19859, 25794, 34248, 24530, 25147, 35278, 31765, 35316, 33370, 22080, 19438, 27956, 24072, 28623, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22814, 18847, 22034, 34720, 34059, 35384, 20989, 35400, 35416, 35449, 18482, 18482, 23432, 35475, 27202, 27202, 27202, 35509, 31127, 24384, 24384, 24384, 35545, 18482, 26871, 35101, 35593, 24855, 25794, 30397, 23502, 26024, 35639, 35658, 22148, 19541, 19583, 30590, 35674, 27709, 35560, 29107, 18482, 18482, 18482, 18484, 27202, 35694, 27202, 27202, 27202, 35715, 24384, 36580, 24384, 24384, 24384, 19647, 30215, 18482, 18482, 18482, 23052, 35731, 27202, 27202, 27202, 27537, 22904, 24384, 24384, 24384, 24384, 23879, 35748, 18482, 18482, 25008, 35770, 27202, 27202, 17590, 20031, 35787, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 23898, 18484, 34488, 31802, 25371, 19466, 23052, 23296, 26426, 30990, 27868, 34251, 19859, 25794, 35804, 19856, 27178, 35833, 33092, 23482, 30981, 22080, 22212, 28705, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22829, 18847, 22034, 35869, 28716, 25325, 31137, 29176, 22062, 26766, 18482, 22558, 18484, 23970, 27202, 29843, 27202, 22096, 33732, 24384, 31394, 24384, 18877, 18482, 18482, 26880, 18482, 18482, 25794, 27202, 30740, 27202, 27202, 35010, 22148, 24384, 24891, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22844, 18847, 22034, 27849, 27869, 35891, 24384, 35907, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31575, 18482, 18482, 18482, 18482, 26231, 27202, 27202, 27202, 27202, 27202, 19503, 35923, 24384, 24384, 24384, 24384, 19647, 18482, 28129, 18482, 18482, 35941, 27202, 32822, 27202, 32657, 30764, 23993, 24384, 32217, 24384, 32062, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22859, 18847, 22034, 35966, 34820, 25325, 33931, 29176, 35988, 18482, 23277, 18482, 36021, 27202, 27202, 36056, 36073, 22096, 24384, 24384, 36096, 33921, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 36113, 18482, 25577, 18482, 18482, 18484, 27202, 27202, 27324, 27202, 27202, 36146, 24384, 24384, 34362, 24384, 24384, 19647, 28243, 18482, 18482, 18482, 23052, 30899, 27202, 27202, 27202, 23686, 23993, 33808, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 19373, 27869, 36182, 24384, 36198, 22062, 18482, 18482, 18482, 18049, 27202, 27202, 27202, 35485, 22096, 24384, 24384, 24384, 29371, 18877, 18482, 36214, 18482, 28788, 18482, 25794, 34872, 27202, 27420, 27202, 35010, 22148, 29380, 24384, 24482, 24384, 24017, 31659, 18482, 36236, 18482, 18482, 18484, 27202, 36080, 27202, 27202, 27202, 19503, 24384, 28029, 24384, 24384, 24384, 19647, 18482, 18482, 32122, 18482, 35754, 27202, 27202, 36269, 27202, 33531, 23993, 24384, 24384, 36292, 24384, 36312, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 25730, 18482, 18482, 36345, 27202, 27203, 19203, 24385, 19887, 25677, 31963, 18483, 27202, 32462, 19738, 23870, 36368, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22350, 18847, 36388, 19027, 19252, 17687, 36433, 17173, 17595, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 36452, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 17682, 21701, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22335, 18847, 19006, 19027, 19252, 17687, 19027, 21712, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21788, 18847, 36488, 19027, 19252, 17687, 19027, 17173, 17779, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17810, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21165, 21997, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 36516, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19326, 18482, 27869, 30764, 24384, 29176, 28008, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 36566, 24384, 24384, 24384, 24384, 22919, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 36613, 24384, 24384, 24384, 24384, 24017, 18892, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 36639, 36677, 18731, 19027, 19252, 17687, 19027, 17454, 17595, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17223, 17308, 17327, 17346, 18937, 36741, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 17682, 21701, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 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, 2207744, 2207744, 2207744, 2207744, 2564096, 2207744, 2207744, 2207744, 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, 0, 0, 0, 2162968, 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, 167936, 0, 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, 2207744, 3096576, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 2715648, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2867200, 2207744, 2904064, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2473984, 2207744, 2207744, 2494464, 2207744, 2207744, 2207744, 2523136, 2207744, 2207744, 2207744, 2207744, 3014656, 2207744, 2207744, 3051520, 2207744, 2207744, 3100672, 2207744, 2207744, 3121152, 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, 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, 0, 0, 0, 172310, 279, 0, 2162688, 0, 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, 20480, 0, 0, 0, 0, 0, 2162688, 20480, 0, 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, 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, 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, 45, 45, 45, 67, 67, 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, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 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, 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, 0, 97, 97, 1789, 97, 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, 2207744, 2441216, 2445312, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2502656, 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, 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, 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, 2207744, 2580480, 2207744, 2207744, 2207744, 2207744, 2621440, 2207744, 2207744, 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, 0, 823, 0, 825, 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, 2781184, 2793472, 2207744, 2818048, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 541, 0, 543, 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, 542, 0, 544, 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, 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, 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, 97, 97, 1787, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2029, 45, 67, 67, 67, 67, 2033, 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, 97, 1786, 97, 0, 0, 97, 97, 0, 1790, 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, 799, 67, 67, 67, 804, 67, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 1446, 67, 67, 67, 67, 67, 67, 67, 1298, 0, 0, 0, 1304, 0, 0, 0, 1310, 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, 1587, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 97, 1706, 97, 97, 97, 1709, 97, 97, 97, 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, 753, 67, 67, 67, 67, 67, 67, 67, 67, 467, 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, 768, 67, 67, 67, 67, 67, 67, 67, 67, 769, 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, 783, 67, 67, 67, 788, 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, 1574, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 468, 475, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 798, 67, 67, 67, 802, 67, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 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, 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, 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, 1559, 1561, 45, 45, 45, 1564, 45, 1566, 1567, 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, 784, 67, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 1060, 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, 97, 2002, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1740, 45, 45, 45, 1744, 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, 800, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 67, 67, 67, 67, 67, 0, 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, 817, 67, 67, 67, 67, 25398, 542, 13112, 544, 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, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 1013, 67, 67, 1016, 67, 67, 67, 67, 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, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 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, 1041, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1044, 67, 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, 297, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 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, 1302, 0, 0, 0, 1308, 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, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 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, 1695, 67, 67, 67, 67, 67, 1700, 67, 1702, 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, 1259, 67, 67, 67, 67, 67, 67, 1264, 67, 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, 1271, 67, 67, 67, 1274, 67, 67, 67, 1279, 67, 1460, 67, 1462, 67, 67, 67, 67, 67, 67, 1466, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 67, 1605, 67, 67, 67, 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, 1685, 67, 67, 67, 67, 67, 67, 67, 67, 1465, 67, 67, 1468, 67, 67, 1471, 67, 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, 1286, 67, 67, 67, 67, 67, 67, 67, 1291, 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, 1301, 0, 0, 0, 1307, 0, 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, 1299, 0, 0, 0, 1305, 0, 0, 0, 97, 1141, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1152, 97, 97, 0, 0, 97, 97, 1784, 97, 97, 97, 0, 0, 97, 97, 0, 97, 1978, 97, 97, 97, 1982, 45, 45, 45, 45, 45, 45, 45, 45, 45, 972, 973, 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, 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, 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, 1297, 0, 0, 0, 1303, 0, 0, 0, 1309, 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, 1300, 0, 0, 0, 1306, 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, 1000, 45, 45, 45, 45, 67, 67, 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, 97, 2001, 0, 97, 2003, 97, 97, 97, 45, 45, 45, 1739, 45, 45, 45, 1742, 45, 45, 45, 45, 45, 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, 1696, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 67, 67, 1267, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 280, 94, 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, 273, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 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, 1894, 1895, 97, 1897, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 656, 45, 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, 1234, 45, 45, 45, 45, 67, 67, 67, 67, 1240, 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, 45, 45, 45, 1539, 45, 45, 1803, 45, 45, 45, 45, 45, 1809, 45, 45, 45, 67, 67, 67, 1814, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1932, 97, 97, 0, 1781, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 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, 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, 1548, 45, 45, 45, 45, 45, 45, 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, 1210, 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, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1288, 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, 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, 1053, 1054, 67, 67, 67, 67, 67, 67, 1061, 67, 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, 464, 67, 67, 67, 67, 67, 67, 479, 67, 67, 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, 527, 67, 67, 67, 67, 67, 67, 537, 67, 67, 67, 67, 67, 1051, 67, 67, 67, 67, 67, 1057, 67, 67, 67, 67, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1445, 67, 67, 67, 67, 67, 67, 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, 0, 1782, 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, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 493, 67, 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, 1761, 67, 67, 67, 67, 67, 67, 67, 67, 67, 530, 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, 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, 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, 1296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 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, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 1154, 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, 1772, 67, 67, 97, 97, 97, 97, 97, 97, 97, 0, 921, 922, 1175, 0, 0, 0, 0, 45, 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, 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, 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, 281, 28809, 53531, 45, 45, 67, 211, 67, 67, 67, 67, 230, 234, 240, 244, 67, 67, 67, 67, 67, 67, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 481, 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, 1821, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 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, 1931, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 552, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 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, 895, 97, 97, 97, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 1638, 97, 97, 97, 97, 97, 97, 97, 97, 1646, 97, 599, 97, 97, 97, 97, 97, 97, 97, 605, 97, 97, 97, 612, 614, 97, 97, 97, 97, 97, 1377, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 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, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1775, 97, 97, 97, 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, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 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, 24851, 12565, 0, 0, 0, 0, 28809, 53532, 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, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 756, 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, 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, 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, 97, 1794, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 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, 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, 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, 1207, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 67, 67, 67, 67, 67, 463, 67, 67, 67, 472, 67, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 540, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 97, 97, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 917, 97, 97, 0, 0, 0, 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, 1223, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 433, 45, 45, 45, 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, 1198, 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, 1392, 45, 45, 45, 45, 45, 45, 45, 45, 45, 960, 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, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 425, 45, 45, 45, 45, 45, 45, 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, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 67, 456, 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, 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, 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, 1811, 45, 67, 67, 67, 67, 67, 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, 45, 1537, 45, 45, 45, 45\n
+[ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22874, 18847, 17152, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17365, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 17470, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18199, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 17890, 17922, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18065, 36544, 18632, 18081, 18098, 18114, 18159, 18185, 18215, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17756, 18816, 18429, 18445, 18143, 17393, 18500, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18590, 21686, 17152, 19027, 19252, 17687, 19027, 28677, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17365, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 17470, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18199, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 17890, 17922, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18065, 36544, 18632, 18081, 18098, 18114, 18159, 18185, 18215, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17756, 18816, 18429, 18445, 18143, 17393, 18500, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20083, 18847, 18648, 19027, 19252, 21242, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18774, 18789, 18805, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18832, 22889, 18925, 19027, 19252, 17569, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18956, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 19073, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 18972, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21818, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21671, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22395, 20098, 18731, 19027, 19252, 17687, 19027, 17173, 23525, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 18129, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 20746, 19130, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19043, 18847, 18620, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19100, 22410, 19006, 19027, 19252, 17687, 19027, 19084, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21967, 21982, 19006, 19027, 19252, 17687, 19027, 18701, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22380, 18847, 19006, 19027, 19252, 30659, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 19157, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 19299, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 19191, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21758, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 19237, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21626, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19268, 19284, 19326, 18482, 27869, 30509, 24384, 31417, 23323, 18482, 19370, 18482, 18484, 27202, 19389, 27202, 27202, 19411, 24384, 34295, 24384, 24384, 25485, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 19459, 24384, 24384, 24384, 24384, 24017, 18036, 24041, 18482, 18482, 18482, 18484, 19487, 27202, 27202, 27202, 27202, 19503, 35523, 19539, 24384, 24384, 24384, 19647, 18482, 35623, 18482, 18482, 23052, 27202, 19557, 27202, 27202, 30764, 23993, 24384, 19579, 24384, 24384, 26758, 18482, 18482, 19346, 27867, 27202, 27202, 19599, 17590, 23998, 24384, 24384, 19619, 25683, 18482, 18482, 28511, 27202, 27203, 23997, 19639, 19887, 28419, 18902, 18483, 19663, 27202, 24325, 35844, 19887, 30991, 19713, 19395, 19736, 22259, 19754, 22073, 19770, 35154, 19795, 19816, 19836, 19859, 25794, 34248, 24116, 19720, 19875, 30988, 23482, 30981, 28304, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21743, 18847, 19006, 19027, 19252, 17431, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22365, 18847, 19907, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21641, 18847, 19326, 18482, 27869, 30544, 24384, 29176, 21442, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 19935, 24384, 24384, 24384, 24384, 32316, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 19965, 24384, 24384, 24384, 24384, 31473, 18475, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19988, 24384, 24384, 24384, 24384, 24384, 33654, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 29523, 29939, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 20017, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20068, 19058, 20158, 20367, 20884, 17944, 20276, 20853, 25651, 20604, 20460, 20185, 20209, 17189, 17208, 17281, 17675, 20232, 20273, 20295, 20338, 22456, 20777, 20600, 21329, 20635, 20365, 20937, 21207, 17292, 17421, 21157, 17192, 21217, 22425, 20279, 25549, 22436, 20276, 20383, 18983, 20421, 20446, 21317, 21051, 20476, 20322, 20663, 20490, 17543, 17559, 17585, 22463, 20540, 19523, 20246, 20556, 20257, 20430, 20585, 20620, 20193, 20651, 17661, 18368, 17703, 17730, 17772, 19513, 20679, 20692, 22446, 21027, 21097, 18990, 21111, 20708, 20736, 17744, 17795, 17874, 17590, 25536, 20349, 20762, 20812, 20169, 20828, 21376, 17714, 17976, 18021, 18560, 20844, 20569, 25560, 20869, 20900, 18114, 18159, 20916, 20953, 21013, 21043, 21067, 18281, 21083, 18574, 21127, 21143, 21181, 20515, 20930, 20883, 20504, 21197, 21233, 21258, 20524, 20216, 17405, 21270, 21286, 21302, 20720, 20310, 21345, 21361, 21392, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21952, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 21427, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 21479, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 36500, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 28667, 21921, 17617, 36472, 18265, 17237, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 21550, 21509, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 21535, 30636, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21773, 18847, 21587, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21611, 18847, 19006, 19027, 19252, 18169, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21728, 19115, 21878, 19027, 19252, 17687, 19027, 19310, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 17379, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 21906, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 18322, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21937, 18605, 19006, 19027, 19252, 22018, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21656, 21833, 19006, 19027, 19252, 17687, 19027, 21519, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 32253, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 22228, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 31644, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 33557, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 34068, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22245, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 31473, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 21406, 24384, 24384, 24384, 24384, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22290, 18847, 22034, 18482, 27869, 34957, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 34436, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22320, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 27077, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 19919, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, </string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22275, 22479, 19006, 19027, 19252, 17687, 19027, 19141, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 22510, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22574, 18847, 22954, 22970, 27597, 22986, 23002, 23033, 22062, 18482, 18482, 18482, 23049, 27202, 27202, 27202, 23068, 22096, 24384, 24384, 24384, 23088, 31359, 31082, 19693, 18482, 28112, 28225, 19443, 35045, 27202, 27202, 23108, 23139, 23155, 23178, 24384, 24384, 23212, 35330, 31659, 23228, 18482, 23256, 23274, 27795, 26712, 23293, 35214, 34879, 33340, 23312, 18235, 23359, 32708, 23949, 24384, 23380, 35255, 23429, 18482, 33884, 23408, 23448, 27202, 27202, 23498, 23518, 21406, 23541, 24384, 24384, 23570, 26114, 23601, 23623, 18482, 33444, 23651, 32875, 27202, 22171, 18862, 23702, 36589, 24384, 18481, 23731, 32601, 27202, 23750, 23768, 20047, 32969, 24367, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 23784, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 28217, 31795, 23804, 26925, 34916, 23831, 26501, 25793, 23859, 23895, 23482, 30981, 22080, 19438, 27956, 19678, 29812, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22589, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 28902, 25794, 27202, 27202, 27202, 34019, 23914, 22148, 24384, 24384, 24384, 28393, 23930, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 31154, 26591, 18482, 18482, 18482, 31585, 23965, 27202, 27202, 27202, 23986, 22185, 24014, 24384, 24384, 24384, 24033, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 26504, 24057, 24107, 24132, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22604, 18847, 22034, 19697, 27869, 24166, 24384, 24182, 24198, 26600, 18482, 18482, 18484, 24233, 24249, 27202, 27202, 22096, 24268, 24284, 24384, 24384, 30621, 19800, 35427, 35999, 32609, 18482, 25794, 24303, 28959, 23752, 27202, 35010, 22148, 24341, 32040, 26837, 24383, 31473, 31659, 18482, 18482, 18482, 24784, 18484, 27202, 27202, 27202, 27202, 24401, 19503, 24384, 24384, 24384, 24384, 20134, 31154, 18482, 18482, 18482, 27845, 23052, 27202, 27202, 33502, 27202, 30764, 21406, 24384, 24384, 22938, 24384, 26114, 18482, 36246, 18482, 27867, 27202, 24423, 27202, 22171, 22934, 24384, 24442, 24384, 36762, 28438, 18482, 34466, 34508, 35771, 24461, 24385, 24477, 25677, 18482, 36220, 27202, 27202, 24498, 30954, 23715, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 24521, 30990, 27868, 34251, 30090, 23343, 24546, 19856, 25793, 19779, 30988, 23482, 26152, 22080, 19438, 29824, 24562, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22619, 18847, 22034, 25767, 22132, 25325, 23162, 29176, 24597, 24091, 23607, 24656, 26122, 24680, 24426, 24696, 28551, 22096, 24731, 24445, 24747, 23364, 30621, 18482, 18482, 18482, 18482, 24781, 25794, 27202, 27202, 27202, 34210, 35010, 22148, 24384, 24384, 24384, 33259, 31473, 22525, 24087, 24213, 18482, 18482, 34908, 24800, 30419, 27202, 27202, 32418, 19503, 29781, 35065, 24384, 24384, 19891, 31154, 24835, 18482, 18482, 24854, 29214, 27202, 27202, 32006, 27202, 30764, 35344, 24384, 24384, 31544, 24384, 26114, 33098, 27814, 27002, 27867, 34668, 25625, 24871, 22171, 22934, 19214, 34531, 24889, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 18482, 33615, 27202, 27202, 24907, 24930, 23554, 30991, 18484, 27202, 31802, 22199, 19466, 23052, 23296, 19847, 30877, 31015, 24955, 19859, 24983, 34248, 30871, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 24999, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22634, 18847, 25024, 25040, 31293, 25056, 25072, 25088, 22062, 34734, 24217, 36253, 34808, 32637, 25104, 23072, 32848, 22245, 36623, 25120, 30679, 27356, 30621, 25136, 26455, 25174, 25208, 22540, 23240, 25224, 25240, 25256, 25306, 25341, 25357, 25418, 25446, 25470, 26739, 25522, 31659, 23635, 25576, 27398, 25593, 28592, 25945, 25617, 27202, 32546, 27295, 25641, 25850, 25667, 24384, 34758, 25699, 25716, 22552, 27787, 30221, 25756, 25789, 25810, 25828, 28333, 28988, 30764, 21493, 33405, 25848, 25866, 25904, 26114, 31227, 26677, 30167, 27867, 25941, 25961, 27202, 22171, 22934, 25977, 25997, 24384, 23394, 27775, 25740, 25270, 26013, 26048, 26064, 26104, 26138, 26178, 26211, 26230, 26247, 30500, 26380, 26282, 28388, 30991, 33711, 27202, 33645, 26324, 36716, 26353, 26374, 35300, 30990, 26396, 26415, 30927, 26358, 33832, 26442, 26471, 26487, 26520, 23482, 33146, 26539, 26555, 27956, 31266, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22649, 18847, 26576, 26189, 26616, 25325, 26643, 29176, 22062, 26669, 18482, 18482, 18484, 26693, 27202, 27202, 27202, 22096, 26728, 24384, 24384, 24384, 30621, 18482, 18482, 18482, 18482, 26782, 25794, 27202, 27202, 27202, 26258, 35010, 22148, 24384, 24384, 24384, 21571, 31473, 31659, 18482, 18482, 33949, 18482, 18484, 27202, 27202, 25812, 27202, 27202, 19503, 24384, 24384, 24384, 26800, 24384, 31154, 18482, 18482, 18482, 35570, 23052, 27202, 27202, 27202, 26817, 30764, 21406, 24384, 24384, 24384, 26836, 26114, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 22171, 22934, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 35771, 20047, 24385, 19887, 25677, 31882, 18483, 35699, 27202, 19738, 26853, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 26913, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 24967, 31061, 19438, 26953, 27663, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22664, 18847, 26990, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 23017, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 27024, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 27047, 18482, 18484, 27202, 27202, 27331, 27202, 27202, 27066, 24384, 24384, 29025, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 33957, 27867, 27202, 27202, 27093, 17590, 23998, 24384, 24384, 27114, 27135, 36322, 27153, 27201, 27219, 28359, 18229, 34780, 34405, 27235, 35972, 27268, 27293, 27311, 36040, 33984, 20980, 31851, 21453, 30535, 27347, 32520, 27372, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 26337, 30118, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 27397, 27414, 27436, 27452, 27473, 22062, 18482, 18482, 30171, 18484, 27202, 27202, 27982, 27202, 22096, 24384, 24384, 25700, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 34013, 27202, 27202, 27202, 27202, 29731, 22148, 24384, 24384, 24384, 24384, 27119, 31659, 27489, 18482, 18482, 18482, 18484, 27185, 27202, 27202, 27202, 27202, 19503, 27457, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 27050, 23052, 27202, 27202, 27202, 32469, 30764, 23993, 24384, 24384, 24384, 34982, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 20796, 27202, 29362, 22110, 33940, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22679, 18847, 22034, 27508, 27528, 27553, 35182, 27569, 22062, 29693, 26300, 23258, 27585, 24715, 27613, 27202, 27648, 22096, 36597, 27698, 24384, 27733, 18877, 18482, 27811, 18482, 27830, 22046, 27865, 32194, 27202, 25158, 27885, 27913, 22148, 29458, 24384, 29977, 34392, 26750, 27763, 26889, 18482, 18482, 27252, 29886, 27929, 27202, 27202, 27202, 27981, 27998, 28024, 28045, 24384, 24384, 28062, 28081, 28128, 25506, 28145, 26088, 28160, 27202, 28173, 24640, 28189, 30764, 31496, 24384, 28205, 34154, 36166, 24939, 28241, 28259, 28283, 21463, 33034, 28320, 28349, 17590, 20967, 23092, 28375, 28409, 28095, 28435, 28454, 28474, 28509, 28527, 20001, 33682, 25879, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30272, 28267, 28546, 28567, 19425, 28583, 23052, 23296, 19847, 19471, 28608, 28653, 31075, 25794, 34248, 19856, 25793, 19779, 29644, 35950, 30318, 22080, 19438, 27956, 23123, 28693, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 18482, 27869, 25325, 24384, 29176, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 22494, 18482, 18482, 18482, 18482, 18484, 25283, 27202, 27202, 27202, 27202, 19503, 29397, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22694, 18847, 28740, 28775, 28810, 28834, 28850, 28873, 28889, 24142, 28936, 31945, 36329, 25290, 28954, 27632, 28975, 29004, 24505, 29020, 25454, 29041, 23017, 27512, 29083, 29103, 30721, 18482, 23478, 29123, 24819, 27202, 29148, 28920, 27024, 29166, 23196, 24384, 29192, 35529, 31659, 18482, 18482, 25601, 32589, 29211, 27202, 27202, 31434, 30700, 29230, 27066, 24384, 24384, 24384, 29255, 29306, 19647, 18482, 33383, 18482, 18482, 23052, 27202, 29333, 27202, 27202, 30764, 23993, 35925, 24384, 24384, 24384, 27717, 36123, 18482, 18482, 29350, 29413, 27202, 35642, 17590, 21411, 29432, 24384, 25981, 18481, 33866, 18482, 27202, 26967, 27203, 23997, 32729, 19887, 25677, 18482, 26897, 27202, 27202, 29451, 23870, 24354, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 31737, 19859, 25794, 34248, 19856, 29474, 29539, 29283, 29581, 29637, 22080, 32533, 29501, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22709, 18847, 22034, 29660, 29512, 25325, 33242, 29176, 29682, 27245, 18482, 29709, 33286, 26974, 27202, 29725, 29747, 22096, 19221, 24384, 32702, 29772, 18877, 26784, 33892, 28458, 18482, 18482, 25794, 29797, 27202, 29840, 27202, 35010, 22148, 35817, 24384, 29859, 24384, 24017, 36756, 25192, 18482, 18482, 29879, 18484, 27202, 29902, 27202, 26032, 27202, 29925, 24384, 29960, 24384, 33594, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 29239, 29993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 31665, 18482, 18482, 19603, 27202, 27203, 23997, 30013, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19949, 19466, 36661, 19563, 19847, 30029, 30128, 30062, 19859, 25794, 30078, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 30106, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22724, 18847, 30152, 30187, 30237, 30288, 30304, 30344, 22062, 35616, 32797, 25773, 18484, 29909, 34096, 26820, 27202, 22096, 24914, 23189, 29195, 24384, 18877, 34444, 30360, 18482, 18482, 18482, 23413, 24707, 27202, 27202, 27202, 35010, 30378, 34990, 24384, 24384, 24384, 24017, 29554, 18482, 18482, 27137, 18482, 31281, 30394, 27202, 27202, 30413, 30566, 19503, 30435, 24384, 24384, 29969, 35678, 19647, 28759, 30455, 35459, 35606, 23052, 28724, 30490, 30525, 30560, 30764, 23993, 20123, 30582, 30606, 30675, 26291, 33426, 28938, 27682, 30695, 23675, 33466, 28493, 17590, 23944, 20405, 34338, 20997, 32331, 26308, 30716, 30737, 24315, 30756, 21563, 36372, 30787, 26653, 24611, 33177, 32448, 30814, 31804, 25430, 25917, 26523, 18484, 28818, 31802, 29269, 19466, 28297, 34240, 23815, 26076, 30842, 30858, 32115, 30893, 30915, 32757, 25793, 30943, 30988, 23482, 30981, 30970, 31007, 27956, 19678, 29489, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22739, 18847, 31031, 31047, 32397, 31098, 31114, 31170, 22062, 18482, 29565, 35577, 36725, 27202, 33216, 31186, 24407, 22096, 24384, 20142, 31202, 34301, 27748, 31218, 33388, 27166, 18482, 29087, 27277, 27202, 31251, 31309, 27202, 31328, 31344, 24384, 31375, 31391, 24384, 31410, 31659, 18482, 36130, 32801, 18482, 18484, 27202, 27202, 31433, 31450, 27202, 19503, 24384, 24384, 31470, 33588, 24384, 32977, 18482, 18482, 18482, 18482, 30038, 27202, 27202, 27202, 27202, 31489, 32244, 24384, 24384, 24384, 24384, 31512, 18482, 28755, 18482, 24634, 35732, 27202, 27202, 28637, 31538, 35788, 24384, 24384, 19337, 31986, 18482, 33208, 25316, 27203, 29997, 29863, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 31560, 19887, 31601, 32369, 33316, 30136, 31629, 19972, 31681, 31726, 31753, 31781, 30046, 31820, 31847, 25794, 34282, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 31867, 30252, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22754, 18847, 22034, 18909, 30474, 31902, 24287, 31918, 31934, 32767, 35262, 27008, 29621, 34103, 19820, 29416, 33323, 22096, 27031, 30439, 29435, 28857, 29596, 18482, 18482, 18482, 31961, 18482, 25794, 27202, 27202, 35038, 27202, 35010, 22148, 24384, 24384, 29389, 24384, 24017, 31979, 18482, 26937, 18482, 18482, 18484, 27202, 31454, 32002, 27202, 27202, 32022, 24384, 33015, 32056, 24384, 24384, 33690, 18482, 18482, 33119, 18482, 23052, 27202, 27202, 27624, 27202, 29756, 32078, 24384, 24384, 34332, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 36691, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 31710, 22155, 33181, 24252, 32103, 30990, 27868, 34251, 19859, 25794, 34248, 30265, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 32138, 32166, 32186, 30826, 33252, 29067, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 23585, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 32210, 24384, 24384, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 32233, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 33857, 18483, 36057, 27202, 19738, 35289, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22769, 18847, 32269, 31613, 34604, 32285, 32301, 32351, 22062, 18482, 32367, 19354, 32385, 27202, 32413, 27098, 32434, 22096, 24384, 32485, 20052, 32506, 18877, 25396, 23734, 18482, 18482, 32562, 32625, 27202, 32653, 27202, 23664, 32673, 32689, 24384, 32724, 24384, 25888, 32745, 34706, 18482, 27381, 32783, 24577, 24838, 32817, 24873, 32838, 32864, 27202, 32899, 32934, 24384, 32957, 29317, 24384, 30798, 26214, 27678, 33875, 18482, 23052, 36352, 27202, 32993, 27202, 30764, 23993, 32087, 24384, 33013, 24384, 35853, 18482, 18482, 30362, 27965, 27202, 27202, 33754, 17590, 20112, 24384, 24384, 34576, 20792, 18482, 18482, 33031, 27202, 27203, 36159, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 34554, 24150, 33050, 33080, 33114, 27868, 34251, 23843, 26560, 31696, 19856, 25793, 19779, 30988, 23482, 30981, 33135, 22123, 27956, 23463, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22784, 18847, 33162, 28106, 33197, 25325, 33232, 29176, 22062, 33275, 35433, 18482, 18484, 33302, 26399, 33339, 27202, 22096, 33356, 28065, 33404, 24384, 18877, 22229, 18482, 33421, 18482, 18482, 33442, 33460, 24811, 27202, 27202, 26627, 22148, 24758, 35190, 24384, 24384, 25925, 29611, 18482, 18482, 29290, 25186, 33482, 33501, 27202, 27202, 33518, 36276, 19503, 33554, 24384, 24384, 33573, 32490, 19647, 18482, 18482, 31235, 33610, 23052, 27202, 27202, 33631, 27202, 30764, 23993, 24384, 24384, 33670, 24384, 26862, 27492, 18482, 33706, 27867, 32883, 34639, 27202, 17590, 32036, 24765, 23788, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 33727, 36097, 19887, 25677, 18482, 23334, 27202, 29150, 19738, 23870, 35357, 30328, 18484, 33748, 34675, 33770, 19466, 34050, 33824, 31831, 30990, 27868, 34251, 33848, 28913, 33908, 19856, 30469, 33973, 25385, 36033, 34000, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22799, 18847, 34035, 32576, 34084, 34119, 34135, 34170, 34186, 32150, 36005, 31522, 31886, 34202, 34226, 34267, 29334, 34317, 34354, 34378, 34421, 26801, 18877, 26195, 29666, 25402, 18482, 35091, 25794, 34460, 34482, 34504, 25832, 35010, 22148, 34524, 34547, 34570, 19623, 24017, 36654, 35111, 24664, 18482, 32335, 34592, 31312, 34620, 34636, 27202, 34655, 34691, 28046, 34750, 34774, 24384, 33785, 19647, 34796, 32170, 34844, 24581, 33485, 26704, 34828, 34860, 35493, 29132, 36704, 33800, 35368, 32941, 34146, 26758, 34895, 18482, 18482, 34932, 34948, 27202, 32997, 17590, 29944, 34973, 24384, 36296, 25500, 30202, 35875, 35006, 35026, 26266, 20396, 31146, 35061, 35081, 35127, 24623, 28484, 27897, 19738, 35143, 35170, 26162, 28794, 35206, 35230, 33064, 35245, 23052, 23296, 29054, 30990, 27868, 34251, 19859, 25794, 34248, 24530, 25147, 35278, 31765, 35316, 33370, 22080, 19438, 27956, 24072, 28623, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22814, 18847, 22034, 34720, 34059, 35384, 20989, 35400, 35416, 35449, 18482, 18482, 23432, 35475, 27202, 27202, 27202, 35509, 31127, 24384, 24384, 24384, 35545, 18482, 26871, 35101, 35593, 24855, 25794, 30397, 23502, 26024, 35639, 35658, 22148, 19541, 19583, 30590, 35674, 27709, 35560, 29107, 18482, 18482, 18482, 18484, 27202, 35694, 27202, 27202, 27202, 35715, 24384, 36580, 24384, 24384, 24384, 19647, 30215, 18482, 18482, 18482, 23052, 35731, 27202, 27202, 27202, 27537, 22904, 24384, 24384, 24384, 24384, 23879, 35748, 18482, 18482, 25008, 35770, 27202, 27202, 17590, 20031, 35787, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 23898, 18484, 34488, 31802, 25371, 19466, 23052, 23296, 26426, 30990, 27868, 34251, 19859, 25794, 35804, 19856, 27178, 35833, 33092, 23482, 30981, 22080, 22212, 28705, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22829, 18847, 22034, 35869, 28716, 25325, 31137, 29176, 22062, 26766, 18482, 22558, 18484, 23970, 27202, 29843, 27202, 22096, 33732, 24384, 31394, 24384, 18877, 18482, 18482, 26880, 18482, 18482, 25794, 27202, 30740, 27202, 27202, 35010, 22148, 24384, 24891, 24384, 24384, 24017, 31659, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22844, 18847, 22034, 27849, 27869, 35891, 24384, 35907, 22062, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 22096, 24384, 24384, 24384, 24384, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 31575, 18482, 18482, 18482, 18482, 26231, 27202, 27202, 27202, 27202, 27202, 19503, 35923, 24384, 24384, 24384, 24384, 19647, 18482, 28129, 18482, 18482, 35941, 27202, 32822, 27202, 32657, 30764, 23993, 24384, 32217, 24384, 32062, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22859, 18847, 22034, 35966, 34820, 25325, 33931, 29176, 35988, 18482, 23277, 18482, 36021, 27202, 27202, 36056, 36073, 22096, 24384, 24384, 36096, 33921, 18877, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 35010, 22148, 24384, 24384, 24384, 24384, 24017, 36113, 18482, 25577, 18482, 18482, 18484, 27202, 27202, 27324, 27202, 27202, 36146, 24384, 24384, 34362, 24384, 24384, 19647, 28243, 18482, 18482, 18482, 23052, 30899, 27202, 27202, 27202, 23686, 23993, 33808, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22305, 18847, 22034, 19373, 27869, 36182, 24384, 36198, 22062, 18482, 18482, 18482, 18049, 27202, 27202, 27202, 35485, 22096, 24384, 24384, 24384, 29371, 18877, 18482, 36214, 18482, 28788, 18482, 25794, 34872, 27202, 27420, 27202, 35010, 22148, 29380, 24384, 24482, 24384, 24017, 31659, 18482, 36236, 18482, 18482, 18484, 27202, 36080, 27202, 27202, 27202, 19503, 24384, 28029, 24384, 24384, 24384, 19647, 18482, 18482, 32122, 18482, 35754, 27202, 27202, 36269, 27202, 33531, 23993, 24384, 24384, 36292, 24384, 36312, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 25730, 18482, 18482, 36345, 27202, 27203, 19203, 24385, 19887, 25677, 31963, 18483, 27202, 32462, 19738, 23870, 36368, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22350, 18847, 36388, 19027, 19252, 17687, 36433, 17173, 17595, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 36452, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 17682, 21701, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22335, 18847, 19006, 19027, 19252, 17687, 19027, 21712, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17991, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21788, 18847, 36488, 19027, 19252, 17687, 19027, 17173, 17779, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17810, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21165, 21997, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19006, 19027, 19252, 17687, 19027, 17173, 30771, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 36516, 17308, 17327, 17346, 18937, 18460, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 21217, 21848, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21803, 18847, 19326, 18482, 27869, 30764, 24384, 29176, 28008, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 36566, 24384, 24384, 24384, 24384, 22919, 18482, 18482, 18482, 18482, 18482, 25794, 27202, 27202, 27202, 27202, 28530, 36613, 24384, 24384, 24384, 24384, 24017, 18892, 18482, 18482, 18482, 18482, 18484, 27202, 27202, 27202, 27202, 27202, 19503, 24384, 24384, 24384, 24384, 24384, 19647, 18482, 18482, 18482, 18482, 23052, 27202, 27202, 27202, 27202, 30764, 23993, 24384, 24384, 24384, 24384, 26758, 18482, 18482, 18482, 27867, 27202, 27202, 27202, 17590, 23998, 24384, 24384, 24384, 18481, 18482, 18482, 27202, 27202, 27203, 23997, 24385, 19887, 25677, 18482, 18483, 27202, 27202, 19738, 23870, 19887, 30991, 18484, 27202, 31802, 19425, 19466, 23052, 23296, 19847, 30990, 27868, 34251, 19859, 25794, 34248, 19856, 25793, 19779, 30988, 23482, 30981, 22080, 19438, 27956, 19678, 27944, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 36639, 36677, 18731, 19027, 19252, 17687, 19027, 17454, 17595, 36436, 17330, 17349, 18940, 17189, 17208, 17281, 17675, 17223, 17308, 17327, 17346, 18937, 36741, 21855, 18660, 18676, 19025, 17265, 22008, 17292, 17421, 21157, 17192, 17682, 21701, 17311, 18669, 19018, 19027, 17447, 32909, 17497, 17520, 17251, 36410, 17824, 20322, 20663, 20490, 17543, 17559, 17585, 21862, 17504, 17527, 17258, 36417, 21890, 21915, 17611, 36466, 18259, 17633, 17661, 18368, 17703, 17730, 17772, 33538, 21921, 17617, 36472, 18265, 36530, 17477, 19171, 17902, 17934, 17744, 17795, 17874, 17590, 21595, 17481, 19175, 17906, 18742, 17960, 36550, 17714, 17976, 18021, 18738, 18692, 18413, 18632, 18081, 18098, 18114, 18159, 18185, 18717, 18094, 18251, 18292, 18281, 18308, 18005, 18338, 18354, 18384, 17849, 36402, 19251, 17838, 17163, 30650, 18400, 17858, 32918, 17645, 18816, 18429, 18445, 18530, 17393, 18758, 18516, 18546, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 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, 2207744, 2207744, 2207744, 2207744, 2564096, 2207744, 2207744, 2207744, 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, 0, 0, 0, 2162968, 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, 167936, 0, 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, 2207744, 3096576, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 2715648, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2867200, 2207744, 2904064, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2473984, 2207744, 2207744, 2494464, 2207744, 2207744, 2207744, 2523136, 2207744, 2207744, 2207744, 2207744, 3014656, 2207744, 2207744, 3051520, 2207744, 2207744, 3100672, 2207744, 2207744, 3121152, 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, 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, 0, 0, 0, 172310, 279, 0, 2162688, 0, 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, 20480, 0, 0, 0, 0, 0, 2162688, 20480, 0, 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, </string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>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, 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, 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, 45, 45, 45, 67, 67, 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, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 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, 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, 0, 97, 97, 1789, 97, 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, 2207744, 2441216, 2445312, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2502656, 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, 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, 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, 2207744, 2580480, 2207744, 2207744, 2207744, 2207744, 2621440, 2207744, 2207744, 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, 0, 823, 0, 825, 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, 2781184, 2793472, 2207744, 2818048, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 541, 0, 543, 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, 542, 0, 544, 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, 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, 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, 97, 97, 1787, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2029, 45, 67, 67, 67, 67, 2033, 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, 97, 1786, 97, 0, 0, 97, 97, 0, 1790, 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, 799, 67, 67, 67, 804, 67, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 1446, 67, 67, 67, 67, 67, 67, 67, 1298, 0, 0, 0, 1304, 0, 0, 0, 1310, 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, 1587, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 97, 1706, 97, 97, 97, 1709, 97, 97, 97, 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, 753, 67, 67, 67, 67, 67, 67, 67, 67, 467, 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, 768, 67, 67, 67, 67, 67, 67, 67, 67, 769, 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, 783, 67, 67, 67, 788, 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, 1574, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 468, 475, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 798, 67, 67, 67, 802, 67, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 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, 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, 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, 1559, 1561, 45, 45, 45, 1564, 45, 1566, 1567, 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, 784, 67, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 1060, 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, 97, 2002, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1740, 45, 45, 45, 1744, 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, 800, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 67, 67, 67, 67, 67, 0, 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, 817, 67, 67, 67, 67, 25398, 542, 13112, 544, 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, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 1013, 67, 67, 1016, 67, 67, 67, 67, 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, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 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, 1041, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1044, 67, 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, 297, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 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, 1302, 0, 0, 0, 1308, 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, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 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, 1695, 67, 67, 67, 67, 67, 1700, 67, 1702, 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, 1259, 67, 67, 67, 67, 67, 67, 1264, 67, 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, 1271, 67, 67, 67, 1274, 67, 67, 67, 1279, 67, 1460, 67, 1462, 67, 67, 67, 67, 67, 67, 1466, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 67, 1605, 67, 67, 67, 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, 1685, 67, 67, 67, 67, 67, 67, 67, 67, 1465, 67, 67, 1468, 67, 67, 1471, 67, 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, 1286, 67, 67, 67, 67, 67, 67, 67, 1291, 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, 1301, 0, 0, 0, 1307, 0, 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, 1299, 0, 0, 0, 1305, 0, 0, 0, 97, 1141, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1152, 97, 97, 0, 0, 97, 97, 1784, 97, 97, 97, 0, 0, 97, 97, 0, 97, 1978, 97, 97, 97, 1982, 45, 45, 45, 45, 45, 45, 45, 45, 45, 972, 973, 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, 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, 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, 1297, 0, 0, 0, 1303, 0, 0, 0, 1309, 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, 1300, 0, 0, 0, 1306, 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, 1000, 45, 45, 45, 45, 67, 67, 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, 97, 2001, 0, 97, 2003, 97, 97, 97, 45, 45, 45, 1739, 45, 45, 45, 1742, 45, 45, 45, 45, 45, 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, 1696, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 67, 67, 1267, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 280, 94, 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, 273, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 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, 1894, 1895, 97, 1897, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 656, 45, 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,</string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="6" aka="AAAAAAAAAAY=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string> 0, 921, 29315, 0, 0, 0, 0, 45, 929, 45, 45, 45, 45, 45, 45, 45, 1234, 45, 45, 45, 45, 67, 67, 67, 67, 1240, 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, 45, 45, 45, 1539, 45, 45, 1803, 45, 45, 45, 45, 45, 1809, 45, 45, 45, 67, 67, 67, 1814, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1932, 97, 97, 0, 1781, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 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, 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, 1548, 45, 45, 45, 45, 45, 45, 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, 1210, 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, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1288, 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, 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, 1053, 1054, 67, 67, 67, 67, 67, 67, 1061, 67, 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, 464, 67, 67, 67, 67, 67, 67, 479, 67, 67, 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, 527, 67, 67, 67, 67, 67, 67, 537, 67, 67, 67, 67, 67, 1051, 67, 67, 67, 67, 67, 1057, 67, 67, 67, 67, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1445, 67, 67, 67, 67, 67, 67, 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, 0, 1782, 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, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 493, 67, 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, 1761, 67, 67, 67, 67, 67, 67, 67, 67, 67, 530, 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, 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, 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, 1296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 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, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 1154, 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, 1772, 67, 67, 97, 97, 97, 97, 97, 97, 97, 0, 921, 922, 1175, 0, 0, 0, 0, 45, 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, 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, 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, 281, 28809, 53531, 45, 45, 67, 211, 67, 67, 67, 67, 230, 234, 240, 244, 67, 67, 67, 67, 67, 67, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 481, 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, 1821, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 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, 1931, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 552, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 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, 895, 97, 97, 97, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 1638, 97, 97, 97, 97, 97, 97, 97, 97, 1646, 97, 599, 97, 97, 97, 97, 97, 97, 97, 605, 97, 97, 97, 612, 614, 97, 97, 97, 97, 97, 1377, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 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, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1775, 97, 97, 97, 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, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 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, 24851, 12565, 0, 0, 0, 0, 28809, 53532, 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, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 756, 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, 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, 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, 97, 1794, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 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, 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, 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, 1207, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 67, 67, 67, 67, 67, 463, 67, 67, 67, 472, 67, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 540, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 97, 97, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 917, 97, 97, 0, 0, 0, 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, 1223, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 433, 45, 45, 45, 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, 1198, 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, 1392, 45, 45, 45, 45, 45, 45, 45, 45, 45, 960, 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, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 425, 45, 45, 45, 45, 45, 45, 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, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 67, 456, 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, 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, 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, 1811, 45, 67, 67, 67, 67, 67, 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, 45, 1537, 45, 45, 45, 45\n
 ];\n
 \n
 JSONiqTokenizer.EXPECTED =\n
@@ -2643,14 +2719,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -2664,6 +2735,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token \046\046 hasType(token, \'string\') \046\046 iterator.getCurrentTokenColumn() + token.value.length \076 position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') \046\046 !(hasType(token, \'text\') \046\046 token.value.match(\'/\'))){\n
                 do {\n
@@ -2672,8 +2746,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -2690,11 +2764,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'\074/\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -2765,6 +2839,12 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 });\n
 </string> </value>
         </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
       </dictionary>
     </pickle>
   </record>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsp.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsp.js.xml
index 9f87e69d76..741a20b5b2 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsp.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsp.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155559.23</string> </value>
+            <value> <string>ts83646621.91</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,8 +64,7 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new JspHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = JspHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -88,45 +87,52 @@ var JavaHighlightRules = require("./java_highlight_rules").JavaHighlightRules;\n
 \n
 var JspHighlightRules = function() {\n
     HtmlHighlightRules.call(this);\n
-    for (var i in this.$rules) {\n
-        this.$rules[i].unshift({\n
-            token : "meta.tag", // jsp open tag\n
-            regex : "<%@?|<%=?|<jsp:[^>]+>",\n
-            next  : "jsp-start"\n
-        });\n
-    }\n
 \n
     var builtinVariables = \'request|response|out|session|\' +\n
             \'application|config|pageContext|page|Exception\';\n
 \n
     var keywords = \'page|include|taglib\';\n
 \n
-    this.embedRules(JavaHighlightRules, "jsp-");\n
+    var startRules = [\n
+        {\n
+            token : "comment",\n
+            regex : "<%--",\n
+            push : "jsp-dcomment"\n
+        }, {\n
+            token : "meta.tag", // jsp open tag\n
+            regex : "<%@?|<%=?|<jsp:[^>]+>",\n
+            push  : "jsp-start"\n
+        }\n
+    ];\n
 \n
-    this.$rules["start"].unshift({\n
-        token : "comment",\n
-        regex : "<%--",\n
-        next : "comment"\n
-    });\n
+    var endRules = [\n
+        {\n
+            token : "meta.tag", // jsp close tag\n
+            regex : "%>|<\\\\/jsp:[^>]+>",\n
+            next  : "pop"\n
+        }, {\n
+            token: "variable.language",\n
+            regex : builtinVariables\n
+        }, {\n
+            token: "keyword",\n
+            regex : keywords\n
+        }\n
+    ];\n
 \n
-    this.$rules["jsp-start"].unshift({\n
-        token : "meta.tag", // jsp close tag\n
-        regex : "%>|<\\\\/jsp:[^>]+>",\n
-        next  : "start"\n
-    },\n
-    {\n
-        token: "variable.language",\n
-        regex : builtinVariables\n
-    }, {\n
-        token: "keyword",\n
-        regex : keywords\n
-    });\n
+    for (var key in this.$rules)\n
+        this.$rules[key].unshift.apply(this.$rules[key], startRules);\n
 \n
-    this.$rules.comment.unshift({\n
-        token : "comment",\n
-        regex : ".*?--%>",\n
-        next : "start"\n
+    this.embedRules(JavaHighlightRules, "jsp-", endRules, ["start"]);\n
+\n
+    this.addRules({\n
+        "jsp-dcomment" : [{\n
+            token : "comment",\n
+            regex : ".*?--%>",\n
+            next : "pop"\n
+        }]\n
     });\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(JspHighlightRules, HtmlHighlightRules);\n
@@ -134,15 +140,14 @@ oop.inherits(JspHighlightRules, HtmlHighlightRules);\n
 exports.JspHighlightRules = JspHighlightRules;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -151,6 +156,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -164,78 +170,66 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "text",\n
-            regex : "\\\\s+"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
-            token : "constant.character.entity",\n
-            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ]\n
-    };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
 \n
 exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
@@ -265,152 +259,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -468,7 +427,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -543,7 +503,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -588,8 +548,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -676,6 +636,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -763,6 +731,193 @@ exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
 \n
 });\n
 \n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 \n
@@ -1383,7 +1538,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>59568</int> </value>
+            <value> <int>64897</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsx.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsx.js.xml
index e7a0f03b19..9955103cb0 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsx.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-jsx.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155559.38</string> </value>
+            <value> <string>ts83646621.9</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -34,7 +34,7 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 function Mode() {\n
-    this.$tokenizer = new Tokenizer(new JsxHighlightRules().getRules());\n
+    this.HighlightRules = JsxHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -49,7 +49,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -667,7 +667,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>23960</int> </value>
+            <value> <int>23936</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-julia.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-julia.js.xml
index a1a3756684..372d1525a4 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-julia.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-julia.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155559.48</string> </value>
+            <value> <string>ts83646621.89</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,9 +67,8 @@ var JuliaHighlightRules = require("./julia_highlight_rules").JuliaHighlightRules
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new JuliaHighlightRules();\n
+    this.HighlightRules = JuliaHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -277,7 +276,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10504</int> </value>
+            <value> <int>10441</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-latex.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-latex.js.xml
index a580e39a93..8a7fa2fa14 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-latex.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-latex.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155559.58</string> </value>
+            <value> <string>ts83646621.88</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -33,7 +33,7 @@ var LatexFoldMode = require("./folding/latex").FoldMode;\n
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new LatexHighlightRules().getRules());\n
+    this.HighlightRules = LatexHighlightRules;\n
     this.foldingRules = new LatexFoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -221,7 +221,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6040</int> </value>
+            <value> <int>6012</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-less.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-less.js.xml
index cf8021652f..24916b43eb 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-less.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-less.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155559.73</string> </value>
+            <value> <string>ts83646621.87</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,7 +64,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new LessHighlightRules().getRules());\n
+    this.HighlightRules = LessHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -78,7 +78,7 @@ oop.inherits(Mode, TextMode);\n
     \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -839,7 +839,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>33949</int> </value>
+            <value> <int>33925</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-liquid.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-liquid.js.xml
index 062a0bb542..5b72c739dd 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-liquid.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-liquid.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155559.89</string> </value>
+            <value> <string>ts83646621.85</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new LiquidHighlightRules().getRules());\n
+    this.HighlightRules = LiquidHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -74,7 +74,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -105,16 +105,15 @@ oop.inherits(Mode, TextMode);\n
 exports.Mode = Mode;\n
 });\n
 \n
-define(\'ace/mode/liquid_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/css_highlight_rules\', \'ace/mode/javascript_highlight_rules\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
-var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
-var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 \n
 var LiquidHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
     var functions = (\n
         "date|capitalize|downcase|upcase|first|last|join|sort|map|size|escape|" +\n
          "escape_once|strip_html|strip_newlines|newline_to_br|replace|replace_first|" +\n
@@ -137,63 +136,27 @@ var LiquidHighlightRules = function() {\n
         "support.function": functions,\n
         "keyword.definition": definitions\n
     }, "identifier");\n
-\n
-    this.$rules = {\n
-        start : [{\n
+    for (var rule in this.$rules) {\n
+        this.$rules[rule].unshift({\n
             token : "variable",\n
             regex : "{%",\n
-            next : "liquid_start"\n
+            push : "liquid-start"\n
         }, {\n
             token : "variable",\n
             regex : "{{",\n
-            next : "liquid_start"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=\\\\s*script\\\\b)",\n
-            next : "script"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=\\\\s*style\\\\b)",\n
-            next : "style"\n
-        }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?",\n
-            next : "tag"\n
-        } ],\n
-\n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
-\n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ] ,\n
+            push : "liquid-start"\n
+        });\n
+    }\n
 \n
-        liquid_start : [{\n
+    this.addRules({\n
+        "liquid-start" : [{\n
             token: "variable",\n
             regex: "}}",\n
-            next: "start"\n
+            next: "pop"\n
         }, {\n
             token: "variable",\n
             regex: "%}",\n
-            next: "start"\n
+            next: "pop"\n
         }, {\n
             token : "string", // single line\n
             regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
@@ -225,33 +188,109 @@ var LiquidHighlightRules = function() {\n
             token : "text",\n
             regex : "\\\\s+"\n
         }]\n
-    };\n
-\n
-    xmlUtil.tag(this.$rules, "tag", "start");\n
-    xmlUtil.tag(this.$rules, "style", "css-start");\n
-    xmlUtil.tag(this.$rules, "script", "js-start");\n
+    });\n
 \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-\n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.normalizeRules();\n
 };\n
 oop.inherits(LiquidHighlightRules, TextHighlightRules);\n
 \n
 exports.LiquidHighlightRules = LiquidHighlightRules;\n
 });\n
 \n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
+var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
+\n
+var tagMap = lang.createMap({\n
+    a           : \'anchor\',\n
+    button \t    : \'form\',\n
+    form        : \'form\',\n
+    img         : \'image\',\n
+    input       : \'form\',\n
+    label       : \'form\',\n
+    option      : \'form\',\n
+    script      : \'script\',\n
+    select      : \'form\',\n
+    textarea    : \'form\',\n
+    style       : \'style\',\n
+    table       : \'table\',\n
+    tbody       : \'table\',\n
+    td          : \'table\',\n
+    tfoot       : \'table\',\n
+    th          : \'table\',\n
+    tr          : \'table\'\n
+});\n
+\n
+var HtmlHighlightRules = function() {\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
+        }, {\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
+        }, {\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
+        }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
 define(\'ace/mode/css_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/lang\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
 \n
 \n
@@ -277,152 +316,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -480,7 +484,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -555,7 +560,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -600,8 +605,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -688,6 +693,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -775,6 +788,193 @@ exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
 \n
 });\n
 \n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 \n
@@ -894,7 +1094,7 @@ exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>39557</int> </value>
+            <value> <int>46287</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lisp.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lisp.js.xml
index 6e315eccd3..61d214a6f3 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lisp.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lisp.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.02</string> </value>
+            <value> <string>ts83646621.83</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,9 +62,7 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var LispHighlightRules = require("./lisp_highlight_rules").LispHighlightRules;\n
 \n
 var Mode = function() {\n
-    var highlighter = new LispHighlightRules();\n
-    \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = LispHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -170,7 +168,7 @@ exports.LispHighlightRules = LispHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4952</int> </value>
+            <value> <int>4884</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-livescript.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-livescript.js.xml
index 5080dbda63..232e09dd47 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-livescript.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-livescript.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.17</string> </value>
+            <value> <string>ts83646621.8</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-logiql.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-logiql.js.xml
index 222b2f5fe6..51b6ff3df1 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-logiql.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-logiql.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.28</string> </value>
+            <value> <string>ts83646621.78</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -66,9 +66,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
 \n
 var Mode = function() {\n
-    var highlighter = new LogiQLHighlightRules();\n
+    this.HighlightRules = LogiQLHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
 };\n
@@ -81,7 +80,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
         if (/comment|string/.test(endState))  \n
@@ -182,7 +181,7 @@ var LogiQLHighlightRules = function() {\n
            regex: \'//.*\',\n
             },\n
          { token: \'constant.numeric\',\n
-           regex: \'\\\\d+(?:\\\\.\\\\d+)?(?:[eE][+-]?\\\\d+)?\',\n
+           regex: \'\\\\d+(?:\\\\.\\\\d+)?(?:[eE][+-]?\\\\d+)?[fd]?\',\n
             },\n
          { token: \'string\',\n
            regex: \'"\',\n
@@ -696,7 +695,7 @@ exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>25957</int> </value>
+            <value> <int>25903</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lsl.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lsl.js.xml
index 05ece651b4..3447ce8804 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lsl.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lsl.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.34</string> </value>
+            <value> <string>ts83646622.75</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -65,7 +65,7 @@ var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 var oop = require("../lib/oop");\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new Rules().getRules());\n
+    this.HighlightRules = Rules;\n
     this.$outdent = new Outdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -84,7 +84,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -126,61 +126,62 @@ oop.inherits(LSLHighlightRules, TextHighlightRules);\n
 function LSLHighlightRules() {\n
     var keywordMapper = this.createKeywordMapper({\n
         "constant.language.float.lsl" : "DEG_TO_RAD|PI|PI_BY_TWO|RAD_TO_DEG|SQRT2|TWO_PI",\n
-        "constant.language.integer.lsl": "ACTIVE|ALWAYS_RUN|AGENT_ATTACHMENTS|AGENT_AUTOPILOT|" +\n
-            "AGENT_AWAY|AGENT_BUSY|AGENT_BY_LEGACY_NAME|AGENT_BY_USERNAME|AGENT_CROUCHING|" +\n
-            "AGENT_FLYING|AGENT_IN_AIR|AGENT_LIST_PARCEL|AGENT_LIST_PARCEL_OWNER|" +\n
+        "constant.language.integer.lsl": "ACTIVE|AGENT|AGENT_ALWAYS_RUN|AGENT_ATTACHMENTS|" +\n
+            "AGENT_AUTOPILOT|AGENT_AWAY|AGENT_BUSY|AGENT_BY_LEGACY_NAME|AGENT_BY_USERNAME|" +\n
+            "AGENT_CROUCHING|AGENT_FLYING|AGENT_IN_AIR|AGENT_LIST_PARCEL|AGENT_LIST_PARCEL_OWNER|" +\n
             "AGENT_LIST_REGION|AGENT_MOUSELOOK|AGENT_ON_OBJECT|AGENT_SCRIPTED|AGENT_SITTING|" +\n
-            "AGENT_TYPING|AGENT_WALKING|ALL_SIDES|ANIM_ON|ATTACH_AVATAR_CENTER|ATTACH_BACK|ATTACH_BELLY|" +\n
-            "ATTACH_CHEST|ATTACH_CHIN|ATTACH_HEAD|ATTACH_HUD_BOTTOM|ATTACH_HUD_BOTTOM_LEFT|" +\n
-            "ATTACH_HUD_BOTTOM_RIGHT|ATTACH_HUD_CENTER_1|ATTACH_HUD_CENTER_2|ATTACH_HUD_TOP_CENTER|" +\n
-            "ATTACH_HUD_TOP_LEFT|ATTACH_HUD_TOP_RIGHT|ATTACH_LEAR|ATTACH_LEFT_PEC|" +\n
-            "ATTACH_LEYE|ATTACH_LFOOT|ATTACH_LHAND|ATTACH_LHIP|ATTACH_LLARM|ATTACH_LLLEG|" +\n
-            "ATTACH_LSHOULDER|ATTACH_LUARM|ATTACH_LULEG|ATTACH_MOUTH|ATTACH_NECK|ATTACH_NOSE|" +\n
-            "ATTACH_PELVIS|ATTACH_REAR|ATTACH_REYE|ATTACH_RFOOT|ATTACH_RHAND|ATTACH_RHIP|" +\n
-            "ATTACH_RIGHT_PEC|ATTACH_RLARM|ATTACH_RLLEG|ATTACH_RSHOULDER|ATTACH_RUARM|" +\n
-            "ATTACH_RULEG|AVOID_CHARACTERS|AVOID_DYNAMIC_OBSTACLES|AVOID_NONE|CAMERA_ACTIVE|" +\n
-            "CAMERA_BEHINDNESS_ANGLE|CAMERA_BEHINDNESS_LAG|CAMERA_DISTANCE|CAMERA_FOCUS|" +\n
-            "CAMERA_FOCUS_LAG|CAMERA_FOCUS_LOCKED|CAMERA_FOCUS_OFFSET|CAMERA_FOCUS_THRESHOLD|" +\n
-            "CAMERA_PITCH|CAMERA_POSITION|CAMERA_POSITION_LAG|CAMERA_POSITION_LOCKED|" +\n
-            "CAMERA_POSITION_THRESHOLD|CHANGED_ALLOWED_DROP|CHANGED_COLOR|CHANGED_INVENTORY|" +\n
-            "CHANGED_LINK|CHANGED_MEDIA|CHANGED_OWNER|CHANGED_REGION|CHANGED_REGION_START|" +\n
-            "CHANGED_SCALE|CHANGED_SHAPE|CHANGED_TELEPORT|CHANGED_TEXTURE|CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES|" +\n
-            "CHARACTER_AVOIDANCE_MODE|CHARACTER_CMD_JUMP|CHARACTER_CMD_SMOOTH_STOP|" +\n
-            "CHARACTER_CMD_STOP|CHARACTER_DESIRED_SPEED|CHARACTER_DESIRED_TURN_SPEED|" +\n
-            "CHARACTER_LENGTH|CHARACTER_MAX_ACCEL|" +\n
-            "CHARACTER_MAX_DECEL|CHARACTER_MAX_SPEED|CHARACTER_MAX_TURN_RADIUS|CHARACTER_ORIENTATION|" +\n
-            "CHARACTER_RADIUS|CHARACTER_TYPE|CHARACTER_TYPE_A|CHARACTER_TYPE_B|CHARACTER_TYPE_C|" +\n
-            "CHARACTER_TYPE_D|CHARACTER_TYPE_NONE|CLICK_ACTION_BUY|CLICK_ACTION_NONE|" +\n
-            "CLICK_ACTION_OPEN|CLICK_ACTION_OPEN_MEDIA|CLICK_ACTION_PAY|CLICK_ACTION_PLAY|" +\n
-            "CLICK_ACTION_SIT|CLICK_ACTION_TOUCH|CONTENT_TYPE_ATOM|CONTENT_TYPE_FORM|" +\n
-            "CONTENT_TYPE_HTML|CONTENT_TYPE_JSON|CONTENT_TYPE_LLSD|CONTENT_TYPE_RSS|" +\n
-            "CONTENT_TYPE_TEXT|CONTENT_TYPE_XHTML|CONTENT_TYPE_XML|" +\n
-            "CONTROL_BACK|CONTROL_DOWN|CONTROL_FWD|CONTROL_LBUTTON|CONTROL_LEFT|CONTROL_ML_LBUTTON|" +\n
-            "CONTROL_RIGHT|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT|CONTROL_UP|DATA_BORN|" +\n
-            "DATA_NAME|DATA_ONLINE|DATA_PAYINFO|DATA_SIM_POS|DATA_SIM_RATING|DATA_SIM_STATUS|" +\n
-            "DENSITY|DEBUG_CHANNEL|ESTATE_ACCESS_ALLOWED_AGENT_ADD|ESTATE_ACCESS_ALLOWED_AGENT_REMOVE|" +\n
-            "ESTATE_ACCESS_ALLOWED_GROUP_ADD|ESTATE_ACCESS_ALLOWED_GROUP_REMOVE|" +\n
-            "ESTATE_ACCESS_BANNED_AGENT_ADD|ESTATE_ACCESS_BANNED_AGENT_REMOVE|" +\n
-            "FORCE_DIRECT_PATH|FRICTION|GCNP_RADIUS|GCNP_STATIC|GRAVITY_MULTIPLIER|" +\n
-            "HORIZONTAL|HTTP_BODY_MAXLENGTH|HTTP_BODY_TRUNCATED|HTTP_CUSTOM_HEADER|" +\n
-            "HTTP_METHOD|HTTP_MIMETYPE|HTTP_PRAGMA_NO_CACHE|HTTP_VERBOSE_THROTTLE|" +\n
-            "HTTP_VERIFY_CERT|INVENTORY_ALL|INVENTORY_ANIMATION|INVENTORY_BODYPART|" +\n
-            "INVENTORY_CLOTHING|INVENTORY_GESTURE|INVENTORY_LANDMARK|INVENTORY_NONE|" +\n
-            "INVENTORY_NOTECARD|INVENTORY_OBJECT|INVENTORY_SCRIPT|INVENTORY_SOUND|" +\n
-            "INVENTORY_TEXTURE|JSON_APPEND|KFM_CMD_PAUSE|KFM_CMD_PLAY|" +\n
-            "KFM_CMD_SET_MODE|KFM_CMD_STOP|KFM_COMMAND|KFM_DATA|" +\n
-            "KFM_FORWARD|KFM_LOOP|KFM_MODE|KFM_PING_PONG|KFM_REVERSE|KFM_ROTATION|" +\n
-            "KFM_TRANSLATION|LAND_LEVEL|LAND_LOWER|LAND_NOISE|LAND_RAISE|LAND_REVERT|" +\n
-            "LAND_SMOOTH|LINK_ALL_CHILDREN|LINK_ALL_OTHERS|LINK_ROOT|LINK_SET|LINK_THIS|" +\n
-            "LIST_STAT_GEOMETRIC_MEAN|LIST_STAT_MAX|LIST_STAT_MEAN|LIST_STAT_MEDIAN|" +\n
-            "LIST_STAT_MIN|LIST_STAT_NUM_COUNT|LIST_STAT_RANGE|LIST_STAT_STD_DEV|LIST_STAT_SUM|" +\n
-            "LIST_STAT_SUM_SQUARES|LOOP|MASK_BASE|MASK_EVERYONE|MASK_GROUP|MASK_NEXT|" +\n
-            "MASK_OWNER|OBJECT_ATTACHED_POINT|OBJECT_CREATOR|OBJECT_DESC|" +\n
-            "OBJECT_GROUP|OBJECT_NAME|OBJECT_OWNER|OBJECT_PATHFINDING_TYPE|OBJECT_PHYSICS_COST|" +\n
-            "OBJECT_POS|OBJECT_PRIM_EQUIVALENCE|OBJECT_ROOT|OBJECT_ROT|OBJECT_RUNNING_SCRIPT_COUNT|" +\n
+            "AGENT_TYPING|AGENT_WALKING|ALL_SIDES|ANIM_ON|ATTACH_AVATAR_CENTER|ATTACH_BACK|" +\n
+            "ATTACH_BELLY|ATTACH_CHEST|ATTACH_CHIN|ATTACH_HEAD|ATTACH_HUD_BOTTOM|" +\n
+            "ATTACH_HUD_BOTTOM_LEFT|ATTACH_HUD_BOTTOM_RIGHT|ATTACH_HUD_CENTER_1|ATTACH_HUD_CENTER_2|" +\n
+            "ATTACH_HUD_TOP_CENTER|ATTACH_HUD_TOP_LEFT|ATTACH_HUD_TOP_RIGHT|ATTACH_LEAR|" +\n
+            "ATTACH_LEFT_PEC|ATTACH_LEYE|ATTACH_LFOOT|ATTACH_LHAND|ATTACH_LHIP|ATTACH_LLARM|" +\n
+            "ATTACH_LLLEG|ATTACH_LSHOULDER|ATTACH_LUARM|ATTACH_LULEG|ATTACH_MOUTH|" +\n
+            "ATTACH_NECK|ATTACH_NOSE|ATTACH_PELVIS|ATTACH_REAR|ATTACH_REYE|ATTACH_RFOOT|" +\n
+            "ATTACH_RHAND|ATTACH_RHIP|ATTACH_RIGHT_PEC|ATTACH_RLARM|ATTACH_RLLEG|" +\n
+            "ATTACH_RSHOULDER|ATTACH_RUARM|ATTACH_RULEG|AVOID_CHARACTERS|AVOID_DYNAMIC_OBSTACLES|" +\n
+            "AVOID_NONE|CAMERA_ACTIVE|CAMERA_BEHINDNESS_ANGLE|CAMERA_BEHINDNESS_LAG|" +\n
+            "CAMERA_DISTANCE|CAMERA_FOCUS|CAMERA_FOCUS_LAG|CAMERA_FOCUS_LOCKED|CAMERA_FOCUS_OFFSET|" +\n
+            "CAMERA_FOCUS_THRESHOLD|CAMERA_PITCH|CAMERA_POSITION|CAMERA_POSITION_LAG|" +\n
+            "CAMERA_POSITION_LOCKED|CAMERA_POSITION_THRESHOLD|CHANGED_ALLOWED_DROP|" +\n
+            "CHANGED_COLOR|CHANGED_INVENTORY|CHANGED_LINK|CHANGED_MEDIA|CHANGED_OWNER|" +\n
+            "CHANGED_REGION|CHANGED_REGION_START|CHANGED_SCALE|CHANGED_SHAPE|CHANGED_TELEPORT|" +\n
+            "CHANGED_TEXTURE|CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES|CHARACTER_AVOIDANCE_MODE|" +\n
+            "CHARACTER_CMD_JUMP|CHARACTER_CMD_SMOOTH_STOP|CHARACTER_CMD_STOP|CHARACTER_DESIRED_SPEED|" +\n
+            "CHARACTER_DESIRED_TURN_SPEED|CHARACTER_LENGTH|CHARACTER_MAX_ACCEL|CHARACTER_MAX_DECEL|" +\n
+            "CHARACTER_MAX_SPEED|CHARACTER_MAX_TURN_RADIUS|CHARACTER_ORIENTATION|" +\n
+            "CHARACTER_RADIUS|CHARACTER_STAY_WITHIN_PARCEL|CHARACTER_TYPE|CHARACTER_TYPE_A|" +\n
+            "CHARACTER_TYPE_B|CHARACTER_TYPE_C|CHARACTER_TYPE_D|CHARACTER_TYPE_NONE|" +\n
+            "CLICK_ACTION_BUY|CLICK_ACTION_NONE|CLICK_ACTION_OPEN|CLICK_ACTION_OPEN_MEDIA|" +\n
+            "CLICK_ACTION_PAY|CLICK_ACTION_PLAY|CLICK_ACTION_SIT|CLICK_ACTION_TOUCH|" +\n
+            "CONTENT_TYPE_ATOM|CONTENT_TYPE_FORM|CONTENT_TYPE_HTML|CONTENT_TYPE_JSON|" +\n
+            "CONTENT_TYPE_LLSD|CONTENT_TYPE_RSS|CONTENT_TYPE_TEXT|CONTENT_TYPE_XHTML|" +\n
+            "CONTENT_TYPE_XML|CONTROL_BACK|CONTROL_DOWN|CONTROL_FWD|CONTROL_LBUTTON|" +\n
+            "CONTROL_LEFT|CONTROL_ML_LBUTTON|CONTROL_RIGHT|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT|" +\n
+            "CONTROL_UP|DATA_BORN|DATA_NAME|DATA_ONLINE|DATA_PAYINFO|DATA_SIM_POS|" +\n
+            "DATA_SIM_RATING|DATA_SIM_STATUS|DEBUG_CHANNEL|DENSITY|ERR_GENERIC|ERR_MALFORMED_PARAMS|" +\n
+            "ERR_PARCEL_PERMISSIONS|ERR_RUNTIME_PERMISSIONS|ERR_THROTTLED|ESTATE_ACCESS_ALLOWED_AGENT_ADD|" +\n
+            "ESTATE_ACCESS_ALLOWED_AGENT_REMOVE|ESTATE_ACCESS_ALLOWED_GROUP_ADD|ESTATE_ACCESS_ALLOWED_GROUP_REMOVE|" +\n
+            "ESTATE_ACCESS_BANNED_AGENT_ADD|ESTATE_ACCESS_BANNED_AGENT_REMOVE|FORCE_DIRECT_PATH|" +\n
+            "FRICTION|GCNP_RADIUS|GCNP_STATIC|GRAVITY_MULTIPLIER|HORIZONTAL|HTTP_BODY_MAXLENGTH|" +\n
+            "HTTP_BODY_TRUNCATED|HTTP_CUSTOM_HEADER|HTTP_METHOD|HTTP_MIMETYPE|HTTP_PRAGMA_NO_CACHE|" +\n
+            "HTTP_VERBOSE_THROTTLE|HTTP_VERIFY_CERT|INVENTORY_ALL|INVENTORY_ANIMATION|" +\n
+            "INVENTORY_BODYPART|INVENTORY_CLOTHING|INVENTORY_GESTURE|INVENTORY_LANDMARK|" +\n
+            "INVENTORY_NONE|INVENTORY_NOTECARD|INVENTORY_OBJECT|INVENTORY_SCRIPT|" +\n
+            "INVENTORY_SOUND|INVENTORY_TEXTURE|JSON_APPEND|KFM_CMD_PAUSE|KFM_CMD_PLAY|" +\n
+            "KFM_CMD_SET_MODE|KFM_CMD_STOP|KFM_COMMAND|KFM_DATA|KFM_FORWARD|KFM_LOOP|" +\n
+            "KFM_MODE|KFM_PING_PONG|KFM_REVERSE|KFM_ROTATION|KFM_TRANSLATION|LAND_LEVEL|" +\n
+            "LAND_LOWER|LAND_NOISE|LAND_RAISE|LAND_REVERT|LAND_SMOOTH|LINK_ALL_CHILDREN|" +\n
+            "LINK_ALL_OTHERS|LINK_ROOT|LINK_SET|LINK_THIS|LIST_STAT_GEOMETRIC_MEAN|" +\n
+            "LIST_STAT_MAX|LIST_STAT_MEAN|LIST_STAT_MEDIAN|LIST_STAT_MIN|LIST_STAT_NUM_COUNT|" +\n
+            "LIST_STAT_RANGE|LIST_STAT_STD_DEV|LIST_STAT_SUM|LIST_STAT_SUM_SQUARES|" +\n
+            "LOOP|MASK_BASE|MASK_EVERYONE|MASK_GROUP|MASK_NEXT|MASK_OWNER|OBJECT_ATTACHED_POINT|" +\n
+            "OBJECT_CHARACTER_TIME|OBJECT_CREATOR|OBJECT_DESC|OBJECT_GROUP|OBJECT_NAME|" +\n
+            "OBJECT_OWNER|OBJECT_PATHFINDING_TYPE|OBJECT_PHANTOM|OBJECT_PHYSICS|OBJECT_PHYSICS_COST|" +\n
+            "OBJECT_POS|OBJECT_PRIM_EQUIVALENCE|OBJECT_RETURN_PARCEL|OBJECT_RETURN_PARCEL_OWNER|" +\n
+            "OBJECT_RETURN_REGION|OBJECT_ROOT|OBJECT_ROT|OBJECT_RUNNING_SCRIPT_COUNT|" +\n
             "OBJECT_SCRIPT_MEMORY|OBJECT_SCRIPT_TIME|OBJECT_SERVER_COST|OBJECT_STREAMING_COST|" +\n
-            "OBJECT_TOTAL_SCRIPT_COUNT|OBJECT_UNKNOWN_DETAIL|OBJECT_VELOCITY|OPT_AVATAR|" +\n
-            "OPT_CHARACTER|OPT_EXCLUSION_VOLUME|OPT_LEGACY_LINKSET|OPT_MATERIAL_VOLUME|" +\n
+            "OBJECT_TEMP_ON_REZ|OBJECT_TOTAL_SCRIPT_COUNT|OBJECT_UNKNOWN_DETAIL|OBJECT_VELOCITY|" +\n
+            "OPT_AVATAR|OPT_CHARACTER|OPT_EXCLUSION_VOLUME|OPT_LEGACY_LINKSET|OPT_MATERIAL_VOLUME|" +\n
             "OPT_OTHER|OPT_STATIC_OBSTACLE|OPT_WALKABLE|PARCEL_COUNT_GROUP|PARCEL_COUNT_OTHER|" +\n
             "PARCEL_COUNT_OWNER|PARCEL_COUNT_SELECTED|PARCEL_COUNT_TEMP|PARCEL_COUNT_TOTAL|" +\n
             "PARCEL_DETAILS_AREA|PARCEL_DETAILS_DESC|PARCEL_DETAILS_GROUP|PARCEL_DETAILS_ID|" +\n
@@ -196,75 +197,79 @@ function LSLHighlightRules() {\n
             "PARCEL_MEDIA_COMMAND_PLAY|PARCEL_MEDIA_COMMAND_SIZE|PARCEL_MEDIA_COMMAND_STOP|" +\n
             "PARCEL_MEDIA_COMMAND_TEXTURE|PARCEL_MEDIA_COMMAND_TIME|PARCEL_MEDIA_COMMAND_TYPE|" +\n
             "PARCEL_MEDIA_COMMAND_UNLOAD|PARCEL_MEDIA_COMMAND_URL|PASSIVE|PATROL_PAUSE_AT_WAYPOINTS|" +\n
-            "PAYMENT_INFO_ON_FILE|PAYMENT_INFO_USED|PAY_DEFAULT|PAY_HIDE|PERMISSION_ATTACH|" +\n
-            "PERMISSION_CHANGE_LINKS|PERMISSION_CONTROL_CAMERA|PERMISSION_DEBIT|PERMISSION_OVERRIDE_ANIMATIONS|" +\n
-            "PERMISSION_SILENT_ESTATE_MANAGEMENT|PERMISSION_TAKE_CONTROLS|PERMISSION_TELEPORT|" +\n
-            "PERMISSION_TRACK_CAMERA|PERMISSION_TRIGGER_ANIMATION|PERM_ALL|PERM_COPY|PERM_MODIFY|" +\n
-            "PERM_MOVE|PERM_TRANSFER|PING_PONG|PRIM_BUMP_BARK|PRIM_BUMP_BLOBS|PRIM_BUMP_BRICKS|" +\n
-            "PRIM_BUMP_BRIGHT|PRIM_BUMP_CHECKER|PRIM_BUMP_CONCRETE|PRIM_BUMP_DARK|PRIM_BUMP_DISKS|" +\n
-            "PRIM_BUMP_GRAVEL|PRIM_BUMP_LARGETILE|PRIM_BUMP_NONE|PRIM_BUMP_SHINY|PRIM_BUMP_SIDING|" +\n
-            "PRIM_BUMP_STONE|PRIM_BUMP_STUCCO|PRIM_BUMP_SUCTION|PRIM_BUMP_TILE|PRIM_BUMP_WEAVE|" +\n
-            "PRIM_BUMP_WOOD|PRIM_COLOR|PRIM_DESC|PRIM_FLEXIBLE|PRIM_FULLBRIGHT|PRIM_GLOW|" +\n
-            "PRIM_HOLE_CIRCLE|PRIM_HOLE_DEFAULT|PRIM_HOLE_SQUARE|PRIM_HOLE_TRIANGLE|PRIM_LINK_TARGET|" +\n
-            "PRIM_MATERIAL|PRIM_MATERIAL_FLESH|PRIM_MATERIAL_GLASS|PRIM_MATERIAL_LIGHT|" +\n
-            "PRIM_MATERIAL_METAL|PRIM_MATERIAL_PLASTIC|PRIM_MATERIAL_RUBBER|PRIM_MATERIAL_STONE|" +\n
-            "PRIM_MATERIAL_WOOD|PRIM_MEDIA_ALT_IMAGE_ENABLE|PRIM_MEDIA_AUTO_LOOP|PRIM_MEDIA_AUTO_PLAY|" +\n
-            "PRIM_MEDIA_AUTO_SCALE|PRIM_MEDIA_AUTO_ZOOM|PRIM_MEDIA_CONTROLS|PRIM_MEDIA_CONTROLS_STANDARD|" +\n
-            "PRIM_MEDIA_CONTROLS_MINI|PRIM_MEDIA_CURRENT_URL|PRIM_MEDIA_FIRST_CLICK_INTERACT|" +\n
-            "PRIM_MEDIA_HEIGHT_PIXELS|PRIM_MEDIA_HOME_URL|PRIM_MEDIA_MAX_HEIGHT_PIXELS|" +\n
-            "PRIM_MEDIA_MAX_URL_LENGTH|PRIM_MEDIA_MAX_WHITELIST_COUNT|PRIM_MEDIA_MAX_WHITELIST_SIZE|" +\n
-            "PRIM_MEDIA_MAX_WIDTH_PIXELS|PRIM_MEDIA_PARAM_MAX|PRIM_MEDIA_PERM_ANYONE|PRIM_MEDIA_PERM_GROUP|" +\n
-            "PRIM_MEDIA_PERM_NONE|PRIM_MEDIA_PERM_OWNER|PRIM_MEDIA_PERMS_CONTROL|PRIM_MEDIA_PERMS_INTERACT|" +\n
-            "PRIM_MEDIA_WIDTH_PIXELS|PRIM_MEDIA_WHITELIST|PRIM_MEDIA_WHITELIST_ENABLE|" +\n
-            "PRIM_NAME|PRIM_OMEGA|PRIM_PHANTOM|PRIM_PHYSICS|PRIM_PHYSICS_SHAPE_CONVEX|" +\n
-            "PRIM_PHYSICS_SHAPE_NONE|PRIM_PHYSICS_SHAPE_PRIM|PRIM_PHYSICS_SHAPE_TYPE|" +\n
-            "PRIM_POINT_LIGHT|PRIM_POSITION|PRIM_POS_LOCAL|PRIM_ROTATION|PRIM_ROT_LOCAL|" +\n
-            "PRIM_SCULPT_FLAG_INVERT|PRIM_SCULPT_FLAG_MIRROR|PRIM_SCULPT_TYPE_CYLINDER|" +\n
-            "PRIM_SCULPT_TYPE_MASK|PRIM_SCULPT_TYPE_PLANE|PRIM_SCULPT_TYPE_SPHERE|PRIM_SCULPT_TYPE_TORUS|" +\n
-            "PRIM_SHINY_HIGH|PRIM_SHINY_LOW|PRIM_SHINY_MEDIUM|PRIM_SHINY_NONE|PRIM_SIZE|" +\n
-            "PRIM_SLICE|PRIM_TEMP_ON_REZ|PRIM_TEXGEN|PRIM_TEXGEN_DEFAULT|PRIM_TEXGEN_PLANAR|" +\n
-            "PRIM_TEXT|PRIM_TEXTURE|PRIM_TYPE|PRIM_TYPE_BOX|PRIM_TYPE_CYLINDER|PRIM_TYPE_PRISM|PRIM_TYPE_RING|" +\n
+            "PAY_DEFAULT|PAY_HIDE|PAYMENT_INFO_ON_FILE|PAYMENT_INFO_USED|PERM_ALL|" +\n
+            "PERM_COPY|PERM_MODIFY|PERM_MOVE|PERM_TRANSFER|PERMISSION_ATTACH|PERMISSION_CHANGE_LINKS|" +\n
+            "PERMISSION_CONTROL_CAMERA|PERMISSION_DEBIT|PERMISSION_OVERRIDE_ANIMATIONS|" +\n
+            "PERMISSION_RETURN_OBJECTS|PERMISSION_SILENT_ESTATE_MANAGEMENT|PERMISSION_TAKE_CONTROLS|" +\n
+            "PERMISSION_TELEPORT|PERMISSION_TRACK_CAMERA|PERMISSION_TRIGGER_ANIMATION|" +\n
+            "PING_PONG|PRIM_BUMP_BARK|PRIM_BUMP_BLOBS|PRIM_BUMP_BRICKS|PRIM_BUMP_BRIGHT|" +\n
+            "PRIM_BUMP_CHECKER|PRIM_BUMP_CONCRETE|PRIM_BUMP_DARK|PRIM_BUMP_DISKS|" +\n
+            "PRIM_BUMP_GRAVEL|PRIM_BUMP_LARGETILE|PRIM_BUMP_NONE|PRIM_BUMP_SHINY|" +\n
+            "PRIM_BUMP_SIDING|PRIM_BUMP_STONE|PRIM_BUMP_STUCCO|PRIM_BUMP_SUCTION|" +\n
+            "PRIM_BUMP_TILE|PRIM_BUMP_WEAVE|PRIM_BUMP_WOOD|PRIM_COLOR|PRIM_DESC|PRIM_FLEXIBLE|" +\n
+            "PRIM_FULLBRIGHT|PRIM_GLOW|PRIM_HOLE_CIRCLE|PRIM_HOLE_DEFAULT|PRIM_HOLE_SQUARE|" +\n
+            "PRIM_HOLE_TRIANGLE|PRIM_LINK_TARGET|PRIM_MATERIAL|PRIM_MATERIAL_FLESH|" +\n
+            "PRIM_MATERIAL_GLASS|PRIM_MATERIAL_METAL|PRIM_MATERIAL_PLASTIC|PRIM_MATERIAL_RUBBER|" +\n
+            "PRIM_MATERIAL_STONE|PRIM_MATERIAL_WOOD|PRIM_MEDIA_ALT_IMAGE_ENABLE|PRIM_MEDIA_AUTO_LOOP|" +\n
+            "PRIM_MEDIA_AUTO_PLAY|PRIM_MEDIA_AUTO_SCALE|PRIM_MEDIA_AUTO_ZOOM|PRIM_MEDIA_CONTROLS|" +\n
+            "PRIM_MEDIA_CONTROLS_MINI|PRIM_MEDIA_CONTROLS_STANDARD|PRIM_MEDIA_CURRENT_URL|" +\n
+            "PRIM_MEDIA_FIRST_CLICK_INTERACT|PRIM_MEDIA_HEIGHT_PIXELS|PRIM_MEDIA_HOME_URL|" +\n
+            "PRIM_MEDIA_MAX_HEIGHT_PIXELS|PRIM_MEDIA_MAX_URL_LENGTH|PRIM_MEDIA_MAX_WHITELIST_COUNT|" +\n
+            "PRIM_MEDIA_MAX_WHITELIST_SIZE|PRIM_MEDIA_MAX_WIDTH_PIXELS|PRIM_MEDIA_PARAM_MAX|" +\n
+            "PRIM_MEDIA_PERM_ANYONE|PRIM_MEDIA_PERM_GROUP|PRIM_MEDIA_PERM_NONE|PRIM_MEDIA_PERM_OWNER|" +\n
+            "PRIM_MEDIA_PERMS_CONTROL|PRIM_MEDIA_PERMS_INTERACT|PRIM_MEDIA_WHITELIST|" +\n
+            "PRIM_MEDIA_WHITELIST_ENABLE|PRIM_MEDIA_WIDTH_PIXELS|PRIM_NAME|PRIM_OMEGA|" +\n
+            "PRIM_PHANTOM|PRIM_PHYSICS|PRIM_PHYSICS_SHAPE_CONVEX|PRIM_PHYSICS_SHAPE_NONE|" +\n
+            "PRIM_PHYSICS_SHAPE_PRIM|PRIM_PHYSICS_SHAPE_TYPE|PRIM_POINT_LIGHT|PRIM_POS_LOCAL|" +\n
+            "PRIM_POSITION|PRIM_ROT_LOCAL|PRIM_ROTATION|PRIM_SCULPT_FLAG_INVERT|PRIM_SCULPT_FLAG_MIRROR|" +\n
+            "PRIM_SCULPT_TYPE_CYLINDER|PRIM_SCULPT_TYPE_MASK|PRIM_SCULPT_TYPE_PLANE|" +\n
+            "PRIM_SCULPT_TYPE_SPHERE|PRIM_SCULPT_TYPE_TORUS|PRIM_SHINY_HIGH|PRIM_SHINY_LOW|" +\n
+            "PRIM_SHINY_MEDIUM|PRIM_SHINY_NONE|PRIM_SIZE|PRIM_SLICE|PRIM_TEMP_ON_REZ|" +\n
+            "PRIM_TEXGEN|PRIM_TEXGEN_DEFAULT|PRIM_TEXGEN_PLANAR|PRIM_TEXT|PRIM_TEXTURE|" +\n
+            "PRIM_TYPE|PRIM_TYPE_BOX|PRIM_TYPE_CYLINDER|PRIM_TYPE_PRISM|PRIM_TYPE_RING|" +\n
             "PRIM_TYPE_SCULPT|PRIM_TYPE_SPHERE|PRIM_TYPE_TORUS|PRIM_TYPE_TUBE|PROFILE_NONE|" +\n
-            "PROFILE_SCRIPT_MEMORY|PSYS_PART_BOUNCE_MASK|PSYS_PART_EMISSIVE_MASK|PSYS_PART_END_ALPHA|" +\n
-            "PSYS_PART_END_COLOR|PSYS_PART_END_SCALE|PSYS_PART_FLAGS|PSYS_PART_FOLLOW_SRC_MASK|" +\n
-            "PSYS_PART_FOLLOW_VELOCITY_MASK|PSYS_PART_INTERP_COLOR_MASK|PSYS_PART_INTERP_SCALE_MASK|" +\n
-            "PSYS_PART_MAX_AGE|PSYS_PART_START_ALPHA|PSYS_PART_START_COLOR|PSYS_PART_START_SCALE|" +\n
-            "PSYS_PART_TARGET_LINEAR_MASK|PSYS_PART_TARGET_POS_MASK|PSYS_PART_WIND_MASK|" +\n
-            "PSYS_SRC_ACCEL|PSYS_SRC_ANGLE_BEGIN|PSYS_SRC_ANGLE_END|PSYS_SRC_BURST_PART_COUNT|" +\n
-            "PSYS_SRC_BURST_RADIUS|PSYS_SRC_BURST_RATE|PSYS_SRC_BURST_SPEED_MAX|PSYS_SRC_BURST_SPEED_MIN|" +\n
-            "PSYS_SRC_MAX_AGE|PSYS_SRC_OMEGA|PSYS_SRC_PATTERN|PSYS_SRC_PATTERN_ANGLE|" +\n
-            "PSYS_SRC_PATTERN_ANGLE_CONE|PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY|PSYS_SRC_PATTERN_DROP|" +\n
-            "PSYS_SRC_PATTERN_EXPLODE|PSYS_SRC_TARGET_KEY|PSYS_SRC_TEXTURE|PUBLIC_CHANNEL|" +\n
-            "PURSUIT_FUZZ_FACTOR|PURSUIT_GOAL_TOLERANCE|PURSUIT_INTERCEPT|PURSUIT_OFFSET|" +\n
-            "PU_EVADE_HIDDEN|PU_EVADE_SPOTTED|PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED|" +\n
-            "PU_FAILURE_INVALID_GOAL|PU_FAILURE_INVALID_START|PU_FAILURE_NO_NAVMESH|" +\n
-            "PU_FAILURE_NO_VALID_DESTINATION|PU_FAILURE_OTHER|PU_FAILURE_PARCEL_UNREACHABLE|" +\n
-            "PU_FAILURE_TARGET_GONE|PU_FAILURE_UNREACHABLE|PU_GOAL_REACHED|PU_SLOWDOWN_DISTANCE_REACHED|" +\n
-            "RC_DATA_FLAGS|RC_DETECT_PHANTOM|RC_GET_LINK_NUM|RC_GET_NORMAL|RC_GET_ROOT_KEY|" +\n
-            "RC_MAX_HITS|RC_REJECT_AGENTS|RC_REJECT_LAND|RC_REJECT_NONPHYSICAL|RC_REJECT_PHYSICAL|" +\n
+            "PROFILE_SCRIPT_MEMORY|PSYS_PART_BOUNCE_MASK|PSYS_PART_EMISSIVE_MASK|" +\n
+            "PSYS_PART_END_ALPHA|PSYS_PART_END_COLOR|PSYS_PART_END_SCALE|PSYS_PART_FLAGS|" +\n
+            "PSYS_PART_FOLLOW_SRC_MASK|PSYS_PART_FOLLOW_VELOCITY_MASK|PSYS_PART_INTERP_COLOR_MASK|" +\n
+            "PSYS_PART_INTERP_SCALE_MASK|PSYS_PART_MAX_AGE|PSYS_PART_START_ALPHA|" +\n
+            "PSYS_PART_START_COLOR|PSYS_PART_START_SCALE|PSYS_PART_TARGET_LINEAR_MASK|" +\n
+            "PSYS_PART_TARGET_POS_MASK|PSYS_PART_WIND_MASK|PSYS_SRC_ACCEL|PSYS_SRC_ANGLE_BEGIN|" +\n
+            "PSYS_SRC_ANGLE_END|PSYS_SRC_BURST_PART_COUNT|PSYS_SRC_BURST_RADIUS|PSYS_SRC_BURST_RATE|" +\n
+            "PSYS_SRC_BURST_SPEED_MAX|PSYS_SRC_BURST_SPEED_MIN|PSYS_SRC_MAX_AGE|PSYS_SRC_OMEGA|" +\n
+            "PSYS_SRC_PATTERN|PSYS_SRC_PATTERN_ANGLE|PSYS_SRC_PATTERN_ANGLE_CONE|" +\n
+            "PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY|PSYS_SRC_PATTERN_DROP|PSYS_SRC_PATTERN_EXPLODE|" +\n
+            "PSYS_SRC_TARGET_KEY|PSYS_SRC_TEXTURE|PU_EVADE_HIDDEN|PU_EVADE_SPOTTED|" +\n
+            "PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED|PU_FAILURE_INVALID_GOAL|PU_FAILURE_INVALID_START|" +\n
+            "PU_FAILURE_NO_NAVMESH|PU_FAILURE_NO_VALID_DESTINATION|PU_FAILURE_OTHER|" +\n
+            "PU_FAILURE_PARCEL_UNREACHABLE|PU_FAILURE_TARGET_GONE|PU_FAILURE_UNREACHABLE|" +\n
+            "PU_GOAL_REACHED|PU_SLOWDOWN_DISTANCE_REACHED|PUBLIC_CHANNEL|PURSUIT_FUZZ_FACTOR|" +\n
+            "PURSUIT_GOAL_TOLERANCE|PURSUIT_INTERCEPT|PURSUIT_OFFSET|RC_DATA_FLAGS|" +\n
+            "RC_DETECT_PHANTOM|RC_GET_LINK_NUM|RC_GET_NORMAL|RC_GET_ROOT_KEY|RC_MAX_HITS|" +\n
+            "RC_REJECT_AGENTS|RC_REJECT_LAND|RC_REJECT_NONPHYSICAL|RC_REJECT_PHYSICAL|" +\n
             "RC_REJECT_TYPES|RCERR_CAST_TIME_EXCEEDED|RCERR_SIM_PERF_LOW|RCERR_UNKNOWN|" +\n
             "REGION_FLAG_ALLOW_DAMAGE|REGION_FLAG_ALLOW_DIRECT_TELEPORT|REGION_FLAG_BLOCK_FLY|" +\n
             "REGION_FLAG_BLOCK_TERRAFORM|REGION_FLAG_DISABLE_COLLISIONS|REGION_FLAG_DISABLE_PHYSICS|" +\n
             "REGION_FLAG_FIXED_SUN|REGION_FLAG_RESTRICT_PUSHOBJECT|REGION_FLAG_SANDBOX|" +\n
             "REMOTE_DATA_CHANNEL|REMOTE_DATA_REPLY|REMOTE_DATA_REQUEST|REQUIRE_LINE_OF_SIGHT|" +\n
-            "RESTITUTION|REVERSE|ROTATE|SCALE|SCRIPTED|SIM_STAT_PCT_CHARS_STEPPED|SMOOTH|" +\n
-            "STATUS_BLOCK_GRAB|STATUS_BLOCK_GRAB_OBJECT|STATUS_BOUNDS_ERROR|STATUS_CAST_SHADOWS|" +\n
-            "STATUS_DIE_AT_EDGE|STATUS_INTERNAL_ERROR|STATUS_MALFORMED_PARAMS|STATUS_NOT_FOUND|" +\n
-            "STATUS_NOT_SUPPORTED|STATUS_OK|STATUS_PHANTOM|STATUS_PHYSICS|STATUS_RETURN_AT_EDGE|" +\n
-            "STATUS_ROTATE_X|STATUS_ROTATE_Y|STATUS_ROTATE_Z|STATUS_SANDBOX|STATUS_TYPE_MISMATCH|" +\n
-            "STATUS_WHITELIST_FAILED|STRING_TRIM|STRING_TRIM_HEAD|STRING_TRIM_TAIL|TOUCH_INVALID_FACE|" +\n
-            "TRAVERSAL_TYPE|TRAVERSAL_TYPE_FAST|TRAVERSAL_TYPE_NONE|TRAVERSAL_TYPE_SLOW|" +\n
-            "TYPE_FLOAT|TYPE_INTEGER|TYPE_INVALID|TYPE_KEY|TYPE_ROTATION|TYPE_STRING|" +\n
-            "TYPE_VECTOR|VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY|" +\n
-            "VEHICLE_ANGULAR_DEFLECTION_TIMESCALE|VEHICLE_ANGULAR_FRICTION_TIMESCALE|" +\n
-            "VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DIRECTION|VEHICLE_ANGULAR_MOTOR_TIMESCALE|" +\n
-            "VEHICLE_BANKING_EFFICIENCY|VEHICLE_BANKING_MIX|VEHICLE_BANKING_TIMESCALE|" +\n
-            "VEHICLE_BUOYANCY|VEHICLE_FLAG_CAMERA_DECOUPLED|VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT|" +\n
-            "VEHICLE_FLAG_HOVER_TERRAIN_ONLY|VEHICLE_FLAG_HOVER_UP_ONLY|VEHICLE_FLAG_HOVER_WATER_ONLY|" +\n
-            "VEHICLE_FLAG_LIMIT_MOTOR_UP|VEHICLE_FLAG_LIMIT_ROLL_ONLY|VEHICLE_FLAG_MOUSELOOK_BANK|" +\n
-            "VEHICLE_FLAG_MOUSELOOK_STEER|VEHICLE_FLAG_NO_DEFLECTION_UP|VEHICLE_HOVER_EFFICIENCY|" +\n
-            "VEHICLE_HOVER_HEIGHT|VEHICLE_HOVER_TIMESCALE|VEHICLE_LINEAR_DEFLECTION_EFFICIENCY|" +\n
-            "VEHICLE_LINEAR_DEFLECTION_TIMESCALE|VEHICLE_LINEAR_FRICTION_TIMESCALE|VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE|" +\n
+            "RESTITUTION|REVERSE|ROTATE|SCALE|SCRIPTED|SIM_STAT_PCT_CHARS_STEPPED|" +\n
+            "SMOOTH|STATUS_BLOCK_GRAB|STATUS_BLOCK_GRAB_OBJECT|STATUS_BOUNDS_ERROR|" +\n
+            "STATUS_CAST_SHADOWS|STATUS_DIE_AT_EDGE|STATUS_INTERNAL_ERROR|STATUS_MALFORMED_PARAMS|" +\n
+            "STATUS_NOT_FOUND|STATUS_NOT_SUPPORTED|STATUS_OK|STATUS_PHANTOM|STATUS_PHYSICS|" +\n
+            "STATUS_RETURN_AT_EDGE|STATUS_ROTATE_X|STATUS_ROTATE_Y|STATUS_ROTATE_Z|" +\n
+            "STATUS_SANDBOX|STATUS_TYPE_MISMATCH|STATUS_WHITELIST_FAILED|STRING_TRIM|" +\n
+            "STRING_TRIM_HEAD|STRING_TRIM_TAIL|TOUCH_INVALID_FACE|TRAVERSAL_TYPE|" +\n
+            "TRAVERSAL_TYPE_FAST|TRAVERSAL_TYPE_NONE|TRAVERSAL_TYPE_SLOW|TYPE_FLOAT|" +\n
+            "TYPE_INTEGER|TYPE_INVALID|TYPE_KEY|TYPE_ROTATION|TYPE_STRING|TYPE_VECTOR|" +\n
+            "VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY|VEHICLE_ANGULAR_DEFLECTION_TIMESCALE|" +\n
+            "VEHICLE_ANGULAR_FRICTION_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE|" +\n
+            "VEHICLE_ANGULAR_MOTOR_DIRECTION|VEHICLE_ANGULAR_MOTOR_TIMESCALE|VEHICLE_BANKING_EFFICIENCY|" +\n
+            "VEHICLE_BANKING_MIX|VEHICLE_BANKING_TIMESCALE|VEHICLE_BUOYANCY|VEHICLE_FLAG_CAMERA_DECOUPLED|" +\n
+            "VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT|VEHICLE_FLAG_HOVER_TERRAIN_ONLY|VEHICLE_FLAG_HOVER_UP_ONLY|" +\n
+            "VEHICLE_FLAG_HOVER_WATER_ONLY|VEHICLE_FLAG_LIMIT_MOTOR_UP|VEHICLE_FLAG_LIMIT_ROLL_ONLY|" +\n
+            "VEHICLE_FLAG_MOUSELOOK_BANK|VEHICLE_FLAG_MOUSELOOK_STEER|VEHICLE_FLAG_NO_DEFLECTION_UP|" +\n
+            "VEHICLE_HOVER_EFFICIENCY|VEHICLE_HOVER_HEIGHT|VEHICLE_HOVER_TIMESCALE|" +\n
+            "VEHICLE_LINEAR_DEFLECTION_EFFICIENCY|VEHICLE_LINEAR_DEFLECTION_TIMESCALE|" +\n
+            "VEHICLE_LINEAR_FRICTION_TIMESCALE|VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE|" +\n
             "VEHICLE_LINEAR_MOTOR_DIRECTION|VEHICLE_LINEAR_MOTOR_OFFSET|VEHICLE_LINEAR_MOTOR_TIMESCALE|" +\n
             "VEHICLE_REFERENCE_FRAME|VEHICLE_TYPE_AIRPLANE|VEHICLE_TYPE_BALLOON|VEHICLE_TYPE_BOAT|" +\n
             "VEHICLE_TYPE_CAR|VEHICLE_TYPE_NONE|VEHICLE_TYPE_SLED|VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY|" +\n
@@ -276,16 +281,21 @@ function LSLHighlightRules() {\n
             "TEXTURE_BLANK|TEXTURE_DEFAULT|TEXTURE_MEDIA|TEXTURE_PLYWOOD|" +\n
             "TEXTURE_TRANSPARENT|URL_REQUEST_DENIED|URL_REQUEST_GRANTED",\n
         "constant.language.vector.lsl" : "TOUCH_INVALID_TEXCOORD|TOUCH_INVALID_VECTOR|ZERO_VECTOR",\n
-        "invalid.deprecated.lsl" : "llCloud|llCollisionSprite|llGodLikeRezObject|llMakeExplosion|" +\n
-            "llMakeFountain|llMakeSmoke|llMakeFire|llPointAt|llStopPointAt|llRefreshPrimURL|" +\n
-            "llSetPrimURL|llReleaseCamera|llTakeCamera|llRemoteDataSetRegion|llRemoteLoadScript|" +\n
-            "llSetInventoryPermMask|llSound|llSoundPreload|llXorBase64Strings|AGENT|" +\n
-            "CHARACTER_MAX_ANGULAR_ACCEL|CHARACTER_MAX_ANGULAR_SPEED|CHARACTER_TURN_SPEED_MULTIPLIER|" +\n
-            "DATA_RATING|LAND_LARGE_BRUSH|LAND_MEDIUM_BRUSH|LAND_SMALL_BRUSH|PERMISSION_CHANGE_JOINTS|" +\n
-            "PERMISSION_CHANGE_PERMISSIONS|PERMISSION_RELEASE_OWNERSHIP|PERMISSION_REMAP_CONTROLS|" +\n
-            "PRIM_CAST_SHADOWS|PRIM_PHYSICS_MATERIAL|PRIM_TYPE_LEGACY|PSYS_SRC_INNERANGLE|" +\n
-            "PSYS_SRC_OUTERANGLE|VEHICLE_FLAG_NO_FLY_UP",\n
-        "invalid.illegal.lsl" : "event|print",\n
+        "invalid.broken.lsl": "LAND_LARGE_BRUSH|LAND_MEDIUM_BRUSH|LAND_SMALL_BRUSH",\n
+        "invalid.deprecated.lsl" : "ATTACH_LPEC|ATTACH_RPEC|CHARACTER_MAX_ANGULAR_ACCEL|" +\n
+            "CHARACTER_MAX_ANGULAR_SPEED|CHARACTER_TURN_SPEED_MULTIPLIER|DATA_RATING|" +\n
+            "PRIM_CAST_SHADOWS|PRIM_MATERIAL_LIGHT|PRIM_PHYSICS_MATERIAL|PRIM_TYPE_LEGACY|" +\n
+            "PSYS_SRC_INNERANGLE|PSYS_SRC_OUTERANGLE|VEHICLE_FLAG_NO_FLY_UP|llCloud|" +\n
+            "llGodLikeRezObject|llMakeExplosion|llMakeFire|llMakeFountain|llMakeSmoke|" +\n
+            "llRemoteDataSetRegion|llSetInventoryPermMask|llSetObjectPermMask|llSound|" +\n
+            "llSoundPreload|llXorBase64Strings|llXorBase64StringsCorrect",\n
+        "invalid.godmode.lsl": "llGodLikeRezObject|llSetInventoryPermMask|llSetObjectPermMask",\n
+        "invalid.illegal.lsl" : "print",\n
+        "invalid.unimplemented.lsl": "CHARACTER_MAX_ANGULAR_ACCEL|CHARACTER_MAX_ANGULAR_SPEED|" +\n
+            "CHARACTER_TURN_SPEED_MULTIPLIER|PERMISSION_CHANGE_JOINTS|PERMISSION_CHANGE_PERMISSIONS|" +\n
+            "PERMISSION_RELEASE_OWNERSHIP|PERMISSION_REMAP_CONTROLS|PRIM_PHYSICS_MATERIAL|PRIM_TYPE_LEGACY|" +\n
+            "PSYS_SRC_OBJ_REL_MASK|event|llCollisionSprite|llPointAt|llRefreshPrimURL|" +\n
+            "llReleaseCamera|llRemoteLoadScript|llSetPrimURL|llStopPointAt|llTakeCamera",\n
         "keyword.control.lsl" : "do|else|for|if|jump|return|while",\n
         "storage.type.lsl" : "float|integer|key|list|quaternion|rotation|string|vector",\n
         "support.function.lsl": "llAbs|llAcos|llAddToLandBanList|llAddToLandPassList|" +\n
@@ -345,7 +355,8 @@ function LSLHighlightRules() {\n
             "llRequestAgentData|llRequestDisplayName|llRequestInventoryData|llRequestPermissions|" +\n
             "llRequestSecureURL|llRequestSimulatorData|llRequestURL|llRequestUsername|" +\n
             "llResetAnimationOverride|llResetLandBanList|llResetLandPassList|llResetOtherScript|" +\n
-            "llResetScript|llResetTime|llRezAtRoot|llRezObject|llRot2Angle|llRot2Axis|llRot2Euler|" +\n
+            "llResetScript|llResetTime|llReturnObjectsByID|llReturnObjectsByOwner|" +\n
+            "llRezAtRoot|llRezObject|llRot2Angle|llRot2Axis|llRot2Euler|" +\n
             "llRot2Fwd|llRot2Left|llRot2Up|llRotateTexture|llRotBetween|llRotLookAt|" +\n
             "llRotTarget|llRotTargetRemove|llRound|llSameGroup|llSay|llScaleTexture|" +\n
             "llScriptDanger|llScriptProfiler|llSendRemoteData|llSensor|llSensorRemove|" +\n
@@ -367,7 +378,7 @@ function LSLHighlightRules() {\n
             "llTeleportAgent|llTeleportAgentGlobalCoords|llTeleportAgentHome|llTextBox|" +\n
             "llToLower|llToUpper|llTransferLindenDollars|llTriggerSound|llTriggerSoundLimited|" +\n
             "llUnescapeURL|llUnSit|llUpdateCharacter|llVecDist|llVecMag|llVecNorm|" +\n
-            "llVolumeDetect|llWanderWithin|llWater|llWhisper|llWind|llXorBase64StringsCorrect",\n
+            "llVolumeDetect|llWanderWithin|llWater|llWhisper|llWind|llXorBase64",\n
         "support.function.event.lsl" : "at_rot_target|at_target|attach|changed|collision|" +\n
             "collision_end|collision_start|control|dataserver|email|http_request|" +\n
             "http_response|land_collision|land_collision_end|land_collision_start|" +\n
@@ -864,7 +875,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>45785</int> </value>
+            <value> <int>46609</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lua.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lua.js.xml
index 764de24238..afdff86ba0 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lua.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lua.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.45</string> </value>
+            <value> <string>ts83646621.76</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,7 +64,8 @@ var Range = require("../range").Range;\n
 var WorkerClient = require("../worker/worker_client").WorkerClient;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules());\n
+    this.HighlightRules = LuaHighlightRules;\n
+    \n
     this.foldingRules = new LuaFoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -118,7 +119,7 @@ oop.inherits(Mode, TextMode);\n
         var indent = this.$getIndent(line);\n
         var level = 0;\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (state == "start") {\n
@@ -141,7 +142,7 @@ oop.inherits(Mode, TextMode);\n
         if (line.match(/^\\s*[\\)\\}\\]]$/))\n
             return true;\n
 \n
-        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n
 \n
         if (!tokens || !tokens.length)\n
             return false;\n
@@ -152,7 +153,7 @@ oop.inherits(Mode, TextMode);\n
     this.autoOutdent = function(state, session, row) {\n
         var prevLine = session.getLine(row - 1);\n
         var prevIndent = this.$getIndent(prevLine).length;\n
-        var prevTokens = this.$tokenizer.getLineTokens(prevLine, "start").tokens;\n
+        var prevTokens = this.getTokenizer().getLineTokens(prevLine, "start").tokens;\n
         var tabLength = session.getTabString().length;\n
         var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens);\n
         var curIndent = this.$getIndent(session.getLine(row)).length;\n
@@ -251,7 +252,7 @@ var LuaHighlightRules = function() {\n
         "start" : [{\n
             stateName: "bracketedComment",\n
             onMatch : function(value, currentState, stack){\n
-                stack.unshift(this.next, value.length, currentState);\n
+                stack.unshift(this.next, value.length - 2, currentState);\n
                 return "comment";\n
             },\n
             regex : /\\-\\-\\[=*\\[/,\n
@@ -267,7 +268,7 @@ var LuaHighlightRules = function() {\n
                         }\n
                         return "comment";\n
                     },\n
-                    regex : /(?:[^\\\\]|\\\\.)*?\\]=*\\]/,\n
+                    regex : /\\]=*\\]/,\n
                     next  : "start"\n
                 }, {\n
                     defaultToken : "comment"\n
@@ -299,7 +300,7 @@ var LuaHighlightRules = function() {\n
                         return "comment";\n
                     },\n
                     \n
-                    regex : /(?:[^\\\\]|\\\\.)*?\\]=*\\]/,\n
+                    regex : /\\]=*\\]/,\n
                     next  : "start"\n
                 }, {\n
                     defaultToken : "comment"\n
@@ -487,7 +488,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>16186</int> </value>
+            <value> <int>16149</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-luapage.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-luapage.js.xml
index 985393ca90..9ea2de4861 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-luapage.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-luapage.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.56</string> </value>
+            <value> <string>ts83646621.75</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>91308</int> </value>
+            <value> <int>104757</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -59,10 +59,9 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var LuaPageHighlightRules = require("./luapage_highlight_rules").LuaPageHighlightRules;\n
 \n
 var Mode = function() {\n
-    var highlighter = new LuaPageHighlightRules();\n
+    this.HighlightRules = LuaPageHighlightRules;\n
     \n
-    this.$tokenizer = new Tokenizer(new LuaPageHighlightRules().getRules());\n
-    this.$embeds = highlighter.getEmbeds();\n
+    this.HighlightRules = LuaPageHighlightRules;\n
     this.createModeDelegates({\n
         "lua-": LuaMode\n
     });\n
@@ -72,7 +71,7 @@ oop.inherits(Mode, HtmlMode);\n
 exports.Mode = Mode;\n
 });\n
 \n
-define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -83,13 +82,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HtmlHighlightRules;\n
     this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -110,6 +109,10 @@ oop.inherits(Mode, TextMode);\n
     this.checkOutdent = function(state, line, input) {\n
         return false;\n
     };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -130,7 +133,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -145,7 +149,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -251,7 +255,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -326,7 +331,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -371,8 +376,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -459,6 +464,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -976,7 +989,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -990,7 +1003,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1057,152 +1070,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1290,15 +1268,14 @@ oop.inherits(CssBehaviour, CstyleBehaviour);\n
 exports.CssBehaviour = CssBehaviour;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -1307,6 +1284,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -1320,80 +1298,255 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
             token : "text",\n
             regex : "\\\\s+"\n
         }, {\n
-            token : "constant.character.entity",\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
             regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
         }, {\n
-            defaultToken : "comment"\n
-        } ]\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
 \n
-exports.HtmlHighlightRules = HtmlHighlightRules;\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
 });\n
 \n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
@@ -1476,14 +1629,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1498,7 +1646,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1508,8 +1656,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1539,14 +1687,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1560,6 +1703,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1568,8 +1714,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1586,11 +1732,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1669,6 +1815,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -1745,7 +1893,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -1778,7 +1926,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1811,7 +1959,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1926,6 +2074,286 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 });\n
 \n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
+\n
 define(\'ace/mode/lua\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/lua_highlight_rules\', \'ace/mode/folding/lua\', \'ace/range\', \'ace/worker/worker_client\'], function(require, exports, module) {\n
 \n
 \n
@@ -1938,7 +2366,8 @@ var Range = require("../range").Range;\n
 var WorkerClient = require("../worker/worker_client").WorkerClient;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new LuaHighlightRules().getRules());\n
+    this.HighlightRules = LuaHighlightRules;\n
+    \n
     this.foldingRules = new LuaFoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -1992,7 +2421,7 @@ oop.inherits(Mode, TextMode);\n
         var indent = this.$getIndent(line);\n
         var level = 0;\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (state == "start") {\n
@@ -2015,7 +2444,7 @@ oop.inherits(Mode, TextMode);\n
         if (line.match(/^\\s*[\\)\\}\\]]$/))\n
             return true;\n
 \n
-        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n
 \n
         if (!tokens || !tokens.length)\n
             return false;\n
@@ -2026,7 +2455,7 @@ oop.inherits(Mode, TextMode);\n
     this.autoOutdent = function(state, session, row) {\n
         var prevLine = session.getLine(row - 1);\n
         var prevIndent = this.$getIndent(prevLine).length;\n
-        var prevTokens = this.$tokenizer.getLineTokens(prevLine, "start").tokens;\n
+        var prevTokens = this.getTokenizer().getLineTokens(prevLine, "start").tokens;\n
         var tabLength = session.getTabString().length;\n
         var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens);\n
         var curIndent = this.$getIndent(session.getLine(row)).length;\n
@@ -2125,7 +2554,7 @@ var LuaHighlightRules = function() {\n
         "start" : [{\n
             stateName: "bracketedComment",\n
             onMatch : function(value, currentState, stack){\n
-                stack.unshift(this.next, value.length, currentState);\n
+                stack.unshift(this.next, value.length - 2, currentState);\n
                 return "comment";\n
             },\n
             regex : /\\-\\-\\[=*\\[/,\n
@@ -2141,7 +2570,7 @@ var LuaHighlightRules = function() {\n
                         }\n
                         return "comment";\n
                     },\n
-                    regex : /(?:[^\\\\]|\\\\.)*?\\]=*\\]/,\n
+                    regex : /\\]=*\\]/,\n
                     next  : "start"\n
                 }, {\n
                     defaultToken : "comment"\n
@@ -2173,7 +2602,7 @@ var LuaHighlightRules = function() {\n
                         return "comment";\n
                     },\n
                     \n
-                    regex : /(?:[^\\\\]|\\\\.)*?\\]=*\\]/,\n
+                    regex : /\\]=*\\]/,\n
                     next  : "start"\n
                 }, {\n
                     defaultToken : "comment"\n
@@ -2359,31 +2788,38 @@ var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules;\n
 \n
 var LuaPageHighlightRules = function() {\n
-    this.$rules = new HtmlHighlightRules().getRules();\n
-    \n
-    for (var i in this.$rules) {\n
-        this.$rules[i].unshift({\n
+    HtmlHighlightRules.call(this);\n
+\n
+    var startRules = [\n
+        {\n
             token: "keyword",\n
             regex: "<\\\\%\\\\=?",\n
-            next: "lua-start"\n
+            push: "lua-start"\n
         }, {\n
             token: "keyword",\n
             regex: "<\\\\?lua\\\\=?",\n
-            next: "lua-start"\n
-        });\n
-    }\n
-    this.embedRules(LuaHighlightRules, "lua-", [\n
+            push: "lua-start"\n
+        }\n
+    ];\n
+\n
+    var endRules = [\n
         {\n
             token: "keyword",\n
             regex: "\\\\%>",\n
-            next: "start"\n
-        },\n
-        {\n
+            next: "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "\\\\?>",\n
-            next: "start"\n
+            next: "pop"\n
         }\n
-    ]);\n
+    ];\n
+\n
+    this.embedRules(LuaHighlightRules, "lua-", endRules, ["start"]);\n
+\n
+    for (var key in this.$rules)\n
+        this.$rules[key].unshift.apply(this.$rules[key], startRules);\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(LuaPageHighlightRules, HtmlHighlightRules);\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lucene.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lucene.js.xml
index db61223c5f..3b933bf792 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lucene.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-lucene.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.66</string> </value>
+            <value> <string>ts83646621.7</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-makefile.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-makefile.js.xml
index 7254252443..440f05665b 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-makefile.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-makefile.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.76</string> </value>
+            <value> <string>ts83646621.68</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,16 +67,16 @@ var MakefileHighlightRules = require("./makefile_highlight_rules").MakefileHighl
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new MakefileHighlightRules();\n
+    this.HighlightRules = MakefileHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
 (function() {\n
        \n
-    this.lineCommentStart = "#";\n
+    this.lineCommentStart = "#";    \n
+    this.$indentWithTabs = true;\n
+    \n
 }).call(Mode.prototype);\n
 \n
 exports.Mode = Mode;\n
@@ -201,12 +201,28 @@ var ShHighlightRules = function() {\n
     var func = "(?:" + variableName + "\\\\s*\\\\(\\\\))";\n
 \n
     this.$rules = {\n
-        "start" : [ {\n
+        "start" : [{\n
+            token : "constant",\n
+            regex : /\\\\./\n
+        }, {\n
             token : ["text", "comment"],\n
             regex : /(^|\\s)(#.*)$/\n
         }, {\n
-            token : "string",           // " string\n
-            regex : \'"(?:[^\\\\\\\\]|\\\\\\\\.)*?"\'\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : [{\n
+                token : "constant.language.escape",\n
+                regex : /\\\\(?:[$abeEfnrtv\\\\\'"]|x[a-fA-F\\d]{1,2}|u[a-fA-F\\d]{4}([a-fA-F\\d]{4})?|c.|\\d{1,3})/\n
+            }, {\n
+                token : "constant",\n
+                regex : /\\$\\w+/\n
+            }, {\n
+                token : "string",\n
+                regex : \'"\',\n
+                next: "pop"\n
+            }, {\n
+                defaultToken: "string"\n
+            }]\n
         }, {\n
             token : "variable.language",\n
             regex : builtinVariable\n
@@ -221,7 +237,7 @@ var ShHighlightRules = function() {\n
             regex : fileDescriptor\n
         }, {\n
             token : "string",           // \' string\n
-            regex : "\'(?:[^\\\\\\\\]|\\\\\\\\.)*?\'"\n
+            start : "\'", end : "\'"\n
         }, {\n
             token : "constant.numeric", // float\n
             regex : floatNumber\n
@@ -242,6 +258,8 @@ var ShHighlightRules = function() {\n
             regex : "[\\\\]\\\\)\\\\}]"\n
         } ]\n
     };\n
+    \n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(ShHighlightRules, TextHighlightRules);\n
@@ -345,7 +363,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10463</int> </value>
+            <value> <int>10935</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-markdown.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-markdown.js.xml
index d9bd5704c4..bd6d0f9cb6 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-markdown.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-markdown.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155560.91</string> </value>
+            <value> <string>ts83646621.67</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>89860</int> </value>
+            <value> <int>101742</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -92,14 +92,12 @@ var MarkdownHighlightRules = require("./markdown_highlight_rules").MarkdownHighl
 var MarkdownFoldMode = require("./folding/markdown").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new MarkdownHighlightRules();\n
+    this.HighlightRules = MarkdownHighlightRules;\n
     \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
-      "js-": JavaScriptMode,\n
-      "xml-": XmlMode,\n
-      "html-": HtmlMode\n
+        "js-": JavaScriptMode,\n
+        "xml-": XmlMode,\n
+        "html-": HtmlMode\n
     });\n
     \n
     this.foldingRules = new MarkdownFoldMode();\n
@@ -107,7 +105,7 @@ var Mode = function() {\n
 oop.inherits(Mode, TextMode);\n
 \n
 (function() {\n
-   \n
+    this.type = "text";\n
     this.lineCommentStart = ">";\n
     \n
     this.getNextLineIndent = function(state, line, tab) {\n
@@ -142,7 +140,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -157,7 +156,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -263,7 +262,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -338,7 +338,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -383,8 +383,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -471,6 +471,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -986,7 +994,7 @@ var XmlBehaviour = require("./behaviour/xml").XmlBehaviour;\n
 var XmlFoldMode = require("./folding/xml").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules());\n
+    this.HighlightRules = XmlHighlightRules;\n
     this.$behaviour = new XmlBehaviour();\n
     this.foldingRules = new XmlFoldMode();\n
 };\n
@@ -1009,36 +1017,181 @@ var oop = require("../lib/oop");\n
 var xmlUtil = require("./xml_util");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 \n
-var XmlHighlightRules = function() {\n
+var XmlHighlightRules = function(normalize) {\n
     this.$rules = {\n
         start : [\n
-            {token : "text", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
-            {token : "xml-pe", regex : "<\\\\?.*?\\\\?>"},\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
             {token : "comment", regex : "<\\\\!--", next : "comment"},\n
-            {token : "xml-pe", regex : "<\\\\!.*?>"},\n
-            {token : "meta.tag", regex : "<\\\\/?", next : "tag"},\n
-            {token : "text", regex : "\\\\s+"},\n
             {\n
-                token : "constant.character.entity", \n
-                regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
-            }\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
         ],\n
-        \n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
         cdata : [\n
-            {token : "text", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
             {token : "text", regex : "\\\\s+"},\n
             {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
         ],\n
 \n
         comment : [\n
-            {token : "comment", regex : ".*?-->", next : "start"},\n
-            {token : "comment", regex : ".+"}\n
-        ]\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start");\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
 oop.inherits(XmlHighlightRules, TextHighlightRules);\n
 \n
 exports.XmlHighlightRules = XmlHighlightRules;\n
@@ -1123,14 +1276,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1144,6 +1292,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1152,8 +1303,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1170,11 +1321,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1230,7 +1381,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -1263,7 +1414,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1296,7 +1447,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1411,7 +1562,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 });\n
 \n
-define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -1422,13 +1573,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HtmlHighlightRules;\n
     this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -1449,6 +1600,10 @@ oop.inherits(Mode, TextMode);\n
     this.checkOutdent = function(state, line, input) {\n
         return false;\n
     };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -1468,7 +1623,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1482,7 +1637,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1549,152 +1704,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1782,15 +1902,14 @@ oop.inherits(CssBehaviour, CstyleBehaviour);\n
 exports.CssBehaviour = CssBehaviour;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -1799,6 +1918,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -1812,78 +1932,66 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "text",\n
-            regex : "\\\\s+"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
-            token : "constant.character.entity",\n
-            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ]\n
-    };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
 \n
 exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
@@ -1898,14 +2006,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1920,7 +2023,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1930,8 +2033,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -2015,6 +2118,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -2051,27 +2156,354 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 });\n
 \n
-define(\'ace/mode/markdown_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'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) {\n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
+\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
 var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 \n
+var escaped = function(ch) {\n
+    return "(?:[^" + lang.escapeRegExp(ch) + "\\\\\\\\]|\\\\\\\\.)*";\n
+}\n
+\n
 function github_embed(tag, prefix) {\n
     return { // Github style block\n
         token : "support.function",\n
         regex : "^```" + tag + "\\\\s*$",\n
-        next  : prefix + "start"\n
+        push  : prefix + "start"\n
     };\n
 }\n
 \n
 var MarkdownHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
+\n
+    this.$rules["start"].unshift({\n
+        token : "empty_line",\n
+        regex : \'^$\',\n
+        next: "allowBlock"\n
+    }, { // h1\n
+        token: "markup.heading.1",\n
+        regex: "^=+(?=\\\\s*$)"\n
+    }, { // h2\n
+        token: "markup.heading.2",\n
+        regex: "^\\\\-+(?=\\\\s*$)"\n
+    }, {\n
+        token : function(value) {\n
+            return "markup.heading." + value.length;\n
+        },\n
+        regex : /^#{1,6}(?=\\s*[^ #]|\\s+#.)/,\n
+        next : "header"\n
+    },\n
+       github_embed("(?:javascript|js)", "jscode-"),\n
+       github_embed("xml", "xmlcode-"),\n
+       github_embed("html", "htmlcode-"),\n
+       github_embed("css", "csscode-"),\n
+    { // Github style block\n
+        token : "support.function",\n
+        regex : "^```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$",\n
+        next  : "githubblock"\n
+    }, { // block quote\n
+        token : "string",\n
+        regex : "^>[ ].+$",\n
+        next  : "blockquote"\n
+    }, { // HR * - _\n
+        token : "constant",\n
+        regex : "^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$",\n
+        next: "allowBlock"\n
+    }, { // list\n
+        token : "markup.list",\n
+        regex : "^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+",\n
+        next  : "listblock-start"\n
+    }, {\n
+        include : "basic"\n
+    });\n
 \n
-    this.$rules = {\n
+    this.addRules({\n
         "basic" : [{\n
             token : "constant.language.escape",\n
             regex : /\\\\[\\\\`*_{}\\[\\]()#+\\-.!]/\n
@@ -2083,15 +2515,15 @@ var MarkdownHighlightRules = function() {\n
             regex : "^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\\"][^\\"]+[\\"])?(\\\\s*))$"\n
         }, { // link by reference\n
             token : ["text", "string", "text", "constant", "text"],\n
-            regex : "(\\\\[)((?:[[^\\\\]]*\\\\]|[^\\\\[\\\\]])*)(\\\\][ ]?(?:\\\\n[ ]*)?\\\\[)(.*?)(\\\\])"\n
+            regex : "(\\\\[)(" + escaped("]") + ")(\\\\]\\s*\\\\[)("+ escaped("]") + ")(\\\\])"\n
         }, { // link by url\n
             token : ["text", "string", "text", "markup.underline", "string", "text"],\n
-            regex : "(\\\\[)"+\n
-                    "(\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]*)"+\n
-                    "(\\\\]\\\\([ \\\\t]*)"+\n
-                    "(<?(?:(?:[^\\\\(]*?\\\\([^\\\\)]*?\\\\)\\\\S*?)|(?:.*?))>?)"+\n
-                    "((?:[ \\t]*\\"(?:.*?)\\"[ \\\\t]*)?)"+\n
-                    "(\\\\))"\n
+            regex : "(\\\\[)(" +                                        // [\n
+                    escaped("]") +                                    // link text\n
+                    ")(\\\\]\\\\()"+                                      // ](\n
+                    \'((?:[^\\\\)\\\\s\\\\\\\\]|\\\\\\\\.|\\\\s(?=[^"]))*)\' +        // href\n
+                    \'(\\\\s*"\' +  escaped(\'"\') + \'"\\\\s*)?\' +            // "title"\n
+                    "(\\\\))"                                           // )\n
         }, { // strong ** __\n
             token : "string",\n
             regex : "([*]{2}|[_]{2}(?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)"\n
@@ -2111,54 +2543,13 @@ var MarkdownHighlightRules = function() {\n
             {token : "empty", regex : "", next : "start"}\n
         ],\n
 \n
-        "start" : [{\n
-            token : "empty_line",\n
-            regex : \'^$\',\n
-            next: "allowBlock"\n
-        }, { // h1\n
-            token: "markup.heading.1",\n
-            regex: "^=+(?=\\\\s*$)"\n
-        }, { // h2\n
-            token: "markup.heading.2",\n
-            regex: "^\\\\-+(?=\\\\s*$)"\n
-        }, {\n
-            token : function(value) {\n
-                return "markup.heading." + value.length;\n
-            },\n
-            regex : /^#{1,6}(?=\\s*[^ #]|\\s+#.)/,\n
-            next : "header"\n
-        },\n
-           github_embed("(?:javascript|js)", "js-"),\n
-           github_embed("xml", "xml-"),\n
-           github_embed("html", "html-"),\n
-           github_embed("css", "css-"),\n
-        { // Github style block\n
-            token : "support.function",\n
-            regex : "^```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$",\n
-            next  : "githubblock"\n
-        }, { // block quote\n
-            token : "string",\n
-            regex : "^>[ ].+$",\n
-            next  : "blockquote"\n
-        }, { // HR * - _\n
-            token : "constant",\n
-            regex : "^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$",\n
-            next: "allowBlock"\n
-        }, { // list\n
-            token : "markup.list",\n
-            regex : "^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+",\n
-            next  : "listblock-start"\n
-        }, {\n
-            include : "basic"\n
-        }],\n
-        \n
         "header" : [{\n
             regex: "$",\n
             next : "start"\n
         }, {\n
             include: "basic"\n
         }, {\n
-            defaultToken : "markup.heading"\n
+            defaultToken : "heading"\n
         } ],\n
 \n
         "listblock-start" : [{\n
@@ -2178,7 +2569,7 @@ var MarkdownHighlightRules = function() {\n
         }, {\n
             include : "basic", noEscape: true\n
         }, {\n
-            defaultToken : "markup.list"\n
+            defaultToken : "list"\n
         } ],\n
 \n
         "blockquote" : [ { // BLockquotes only escape on blank lines.\n
@@ -2198,39 +2589,31 @@ var MarkdownHighlightRules = function() {\n
             token : "support.function",\n
             regex : ".+"\n
         } ]\n
-    };\n
+    });\n
 \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
+    this.embedRules(JavaScriptHighlightRules, "jscode-", [{\n
        token : "support.function",\n
        regex : "^```",\n
-       next  : "start"\n
+       next  : "pop"\n
     }]);\n
 \n
-    this.embedRules(HtmlHighlightRules, "html-", [{\n
+    this.embedRules(HtmlHighlightRules, "htmlcode-", [{\n
        token : "support.function",\n
        regex : "^```",\n
-       next  : "start"\n
+       next  : "pop"\n
     }]);\n
 \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
+    this.embedRules(CssHighlightRules, "csscode-", [{\n
        token : "support.function",\n
        regex : "^```",\n
-       next  : "start"\n
+       next  : "pop"\n
     }]);\n
 \n
-    this.embedRules(XmlHighlightRules, "xml-", [{\n
+    this.embedRules(XmlHighlightRules, "xmlcode-", [{\n
        token : "support.function",\n
        regex : "^```",\n
-       next  : "start"\n
+       next  : "pop"\n
     }]);\n
-\n
-    var html = new HtmlHighlightRules().getRules();\n
-    for (var i in html) {\n
-        if (this.$rules[i])\n
-            this.$rules[i] = this.$rules[i].concat(html[i]);\n
-        else\n
-            this.$rules[i] = html[i];\n
-    }\n
 \n
     this.normalizeRules();\n
 };\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-matlab.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-matlab.js.xml
index c59055287b..b1c8cc13c5 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-matlab.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-matlab.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.01</string> </value>
+            <value> <string>ts83646621.65</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var MatlabHighlightRules = require("./matlab_highlight_rules").MatlabHighlightRu
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new MatlabHighlightRules().getRules());\n
+    this.HighlightRules = MatlabHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -260,7 +260,7 @@ exports.MatlabHighlightRules = MatlabHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>23383</int> </value>
+            <value> <int>23355</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mushcode.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mushcode.js.xml
index bff3d5f7cd..a17100fdfd 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mushcode.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mushcode.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.21</string> </value>
+            <value> <string>ts83646621.64</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,7 +63,7 @@ var PythonFoldMode = require("./folding/pythonic").FoldMode;\n
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new MushCodeRules().getRules());\n
+    this.HighlightRules = MushCodeRules;\n
     this.foldingRules = new PythonFoldMode("\\\\:");\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -75,7 +75,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -104,7 +104,7 @@ oop.inherits(Mode, TextMode);\n
         if (input !== "\\r\\n" && input !== "\\r" && input !== "\\n")\n
             return false;\n
 \n
-        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n
 \n
         if (!tokens)\n
             return false;\n
@@ -689,7 +689,7 @@ var MushCodeRules = function() {\n
         }, {\n
             token : "text",\n
             regex : "\\\\s+"\n
-        } ],\n
+        } ]\n
     };\n
 };\n
 \n
@@ -736,7 +736,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>13720</int> </value>
+            <value> <int>13699</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mushcode_high_rules.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mushcode_high_rules.js.xml
index 27f87318fe..6216295fdb 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mushcode_high_rules.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mushcode_high_rules.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.11</string> </value>
+            <value> <string>ts83646621.62</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -583,7 +583,7 @@ var MushCodeRules = function() {\n
         }, {\n
             token : "text",\n
             regex : "\\\\s+"\n
-        } ],\n
+        } ]\n
     };\n
 };\n
 \n
@@ -601,7 +601,7 @@ exports.MushCodeRules = MushCodeRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>8780</int> </value>
+            <value> <int>8779</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mysql.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mysql.js.xml
index 2efed87867..d2a3c6006a 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mysql.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-mysql.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.31</string> </value>
+            <value> <string>ts83646622.62</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -61,7 +61,7 @@ var MysqlHighlightRules = require("./mysql_highlight_rules").MysqlHighlightRules
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new MysqlHighlightRules().getRules());\n
+    this.HighlightRules = MysqlHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -151,7 +151,7 @@ var MysqlHighlightRules = function() {\n
         "comment" : [\n
             {token : "comment", regex : "\\\\*\\\\/", next : "start"},\n
             {defaultToken : "comment"}\n
-        ],\n
+        ]\n
     };\n
 \n
     this.embedRules(DocCommentHighlightRules, "doc-", [ DocCommentHighlightRules.getEndRule("start") ]);\n
@@ -216,7 +216,7 @@ exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10182</int> </value>
+            <value> <int>10153</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-nix.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-nix.js.xml
new file mode 100644
index 0000000000..10a21513d8
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-nix.js.xml
@@ -0,0 +1,930 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.3</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-nix.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2012, Ajax.org B.V.\n
+ * All rights reserved.\n
+ * \n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ * \n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ *\n
+ * Contributor(s):\n
+ * \n
+ *    Zef Hemel\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/mode/nix\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/c_cpp\', \'ace/tokenizer\', \'ace/mode/nix_highlight_rules\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var CMode = require("./c_cpp").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var NixHighlightRules = require("./nix_highlight_rules").NixHighlightRules;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    CMode.call(this);\n
+    this.HighlightRules = NixHighlightRules;\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, CMode);\n
+\n
+(function() { \n
+    this.lineCommentStart = "#";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/c_cpp\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var Range = require("../range").Range;\n
+var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = c_cppHighlightRules;\n
+\n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CstyleBehaviour();\n
+\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.lineCommentStart = "//";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        var indent = this.$getIndent(line);\n
+\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
+        var tokens = tokenizedLine.tokens;\n
+        var endState = tokenizedLine.state;\n
+\n
+        if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
+            return indent;\n
+        }\n
+\n
+        if (state == "start") {\n
+            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n
+            if (match) {\n
+                indent += tab;\n
+            }\n
+        } else if (state == "doc-start") {\n
+            if (endState == "start") {\n
+                return "";\n
+            }\n
+            var match = line.match(/^\\s*(\\/?)\\*/);\n
+            if (match) {\n
+                if (match[1]) {\n
+                    indent += " ";\n
+                }\n
+                indent += "* ";\n
+            }\n
+        }\n
+\n
+        return indent;\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return this.$outdent.checkOutdent(line, input);\n
+    };\n
+\n
+    this.autoOutdent = function(state, doc, row) {\n
+        this.$outdent.autoOutdent(doc, row);\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var cFunctions = exports.cFunctions = "\\\\s*\\\\bhypot(?: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"\n
+\n
+var c_cppHighlightRules = function() {\n
+\n
+    var keywordControls = (\n
+        "break|case|continue|default|do|else|for|goto|if|_Pragma|" +\n
+        "return|switch|while|catch|operator|try|throw|using"\n
+    );\n
+    \n
+    var storageType = (\n
+        "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" +\n
+        "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" +\n
+        "class|wchar_t|template"\n
+    );\n
+\n
+    var storageModifiers = (\n
+        "const|extern|register|restrict|static|volatile|inline|private:|" +\n
+        "protected:|public:|friend|explicit|virtual|export|mutable|typename"\n
+    );\n
+\n
+    var keywordOperators = (\n
+        "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" +\n
+        "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace"\n
+    );\n
+\n
+    var builtinConstants = (\n
+        "NULL|true|false|TRUE|FALSE"\n
+    );\n
+\n
+    var keywordMapper = this.$keywords = this.createKeywordMapper({\n
+        "keyword.control" : keywordControls,\n
+        "storage.type" : storageType,\n
+        "storage.modifier" : storageModifiers,\n
+        "keyword.operator" : keywordOperators,\n
+        "variable.language": "this",\n
+        "constant.language": builtinConstants\n
+    }, "identifier");\n
+\n
+    var identifierRe = "[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b";\n
+\n
+    this.$rules = {\n
+        "start" : [\n
+            {\n
+                token : "comment",\n
+                regex : "\\\\/\\\\/.*$"\n
+            },\n
+            DocCommentHighlightRules.getStartRule("doc-start"),\n
+            {\n
+                token : "comment", // multi line comment\n
+                regex : "\\\\/\\\\*",\n
+                next : "comment"\n
+            }, {\n
+                token : "string", // single line\n
+                regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+            }, {\n
+                token : "string", // multi line string start\n
+                regex : \'["].*\\\\\\\\$\',\n
+                next : "qqstring"\n
+            }, {\n
+                token : "string", // single line\n
+                regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+            }, {\n
+                token : "string", // multi line string start\n
+                regex : "[\'].*\\\\\\\\$",\n
+                next : "qstring"\n
+            }, {\n
+                token : "constant.numeric", // hex\n
+                regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b"\n
+            }, {\n
+                token : "constant.numeric", // float\n
+                regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b"\n
+            }, {\n
+                token : "keyword", // pre-compiler directives\n
+                regex : "#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b",\n
+                next  : "directive"\n
+            }, {\n
+                token : "keyword", // special case pre-compiler directive\n
+                regex : "(?:#\\\\s*endif)\\\\b"\n
+            }, {\n
+                token : "support.function.C99.c",\n
+                regex : cFunctions\n
+            }, {\n
+                token : keywordMapper,\n
+                regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : "!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)"\n
+            }, {\n
+              token : "punctuation.operator",\n
+              regex : "\\\\?|\\\\:|\\\\,|\\\\;|\\\\."\n
+            }, {\n
+                token : "paren.lparen",\n
+                regex : "[[({]"\n
+            }, {\n
+                token : "paren.rparen",\n
+                regex : "[\\\\])}]"\n
+            }, {\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            }\n
+        ],\n
+        "comment" : [\n
+            {\n
+                token : "comment", // closing comment\n
+                regex : ".*?\\\\*\\\\/",\n
+                next : "start"\n
+            }, {\n
+                token : "comment", // comment spanning whole line\n
+                regex : ".+"\n
+            }\n
+        ],\n
+        "qqstring" : [\n
+            {\n
+                token : "string",\n
+                regex : \'(?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?"\',\n
+                next : "start"\n
+            }, {\n
+                token : "string",\n
+                regex : \'.+\'\n
+            }\n
+        ],\n
+        "qstring" : [\n
+            {\n
+                token : "string",\n
+                regex : "(?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?\'",\n
+                next : "start"\n
+            }, {\n
+                token : "string",\n
+                regex : \'.+\'\n
+            }\n
+        ],\n
+        "directive" : [\n
+            {\n
+                token : "constant.other.multiline",\n
+                regex : /\\\\/\n
+            },\n
+            {\n
+                token : "constant.other.multiline",\n
+                regex : /.*\\\\/\n
+            },\n
+            {\n
+                token : "constant.other",\n
+                regex : "\\\\s*<.+?>",\n
+                next : "start"\n
+            },\n
+            {\n
+                token : "constant.other", // single line\n
+                regex : \'\\\\s*["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\',\n
+                next : "start"\n
+            }, \n
+            {\n
+                token : "constant.other", // single line\n
+                regex : "\\\\s*[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']",\n
+                next : "start"\n
+            },\n
+            {\n
+                token : "constant.other",\n
+                regex : /[^\\\\\\/]+/,\n
+                next : "start"\n
+            }\n
+        ]\n
+    };\n
+\n
+    this.embedRules(DocCommentHighlightRules, "doc-",\n
+        [ DocCommentHighlightRules.getEndRule("start") ]);\n
+};\n
+\n
+oop.inherits(c_cppHighlightRules, TextHighlightRules);\n
+\n
+exports.c_cppHighlightRules = c_cppHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/doc_comment_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var DocCommentHighlightRules = function() {\n
+\n
+    this.$rules = {\n
+        "start" : [ {\n
+            token : "comment.doc.tag",\n
+            regex : "@[\\\\w\\\\d_]+" // TODO: fix email addresses\n
+        }, {\n
+            token : "comment.doc.tag",\n
+            regex : "\\\\bTODO\\\\b"\n
+        }, {\n
+            defaultToken : "comment.doc"\n
+        }]\n
+    };\n
+};\n
+\n
+oop.inherits(DocCommentHighlightRules, TextHighlightRules);\n
+\n
+DocCommentHighlightRules.getStartRule = function(start) {\n
+    return {\n
+        token : "comment.doc", // doc comment\n
+        regex : "\\\\/\\\\*(?=\\\\*)",\n
+        next  : start\n
+    };\n
+};\n
+\n
+DocCommentHighlightRules.getEndRule = function (start) {\n
+    return {\n
+        token : "comment.doc", // closing comment\n
+        regex : "\\\\*\\\\/",\n
+        next  : start\n
+    };\n
+};\n
+\n
+\n
+exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
+\n
+});\n
+\n
+define(\'ace/mode/matching_brace_outdent\', [\'require\', \'exports\', \'module\' , \'ace/range\'], function(require, exports, module) {\n
+\n
+\n
+var Range = require("../range").Range;\n
+\n
+var MatchingBraceOutdent = function() {};\n
+\n
+(function() {\n
+\n
+    this.checkOutdent = function(line, input) {\n
+        if (! /^\\s+$/.test(line))\n
+            return false;\n
+\n
+        return /^\\s*\\}/.test(input);\n
+    };\n
+\n
+    this.autoOutdent = function(doc, row) {\n
+        var line = doc.getLine(row);\n
+        var match = line.match(/^(\\s*\\})/);\n
+\n
+        if (!match) return 0;\n
+\n
+        var column = match[1].length;\n
+        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n
+\n
+        if (!openBracePos || openBracePos.row == row) return 0;\n
+\n
+        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n
+        doc.replace(new Range(row, 0, row, column-1), indent);\n
+    };\n
+\n
+    this.$getIndent = function(line) {\n
+        return line.match(/^\\s*/)[0];\n
+    };\n
+\n
+}).call(MatchingBraceOutdent.prototype);\n
+\n
+exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
+});\n
+\n
+define(\'ace/mode/behaviour/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour\', \'ace/token_iterator\', \'ace/lib/lang\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+var lang = require("../../lib/lang");\n
+\n
+var SAFE_INSERT_IN_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator"];\n
+var SAFE_INSERT_BEFORE_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator", "comment"];\n
+\n
+\n
+var autoInsertedBrackets = 0;\n
+var autoInsertedRow = -1;\n
+var autoInsertedLineEnd = "";\n
+var maybeInsertedBrackets = 0;\n
+var maybeInsertedRow = -1;\n
+var maybeInsertedLineStart = "";\n
+var maybeInsertedLineEnd = "";\n
+\n
+var CstyleBehaviour = function () {\n
+    \n
+    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n
+        var cursor = editor.getCursorPosition();\n
+        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+        if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {\n
+            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n
+            if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))\n
+                return false;\n
+        }\n
+        iterator.stepForward();\n
+        return iterator.getCurrentTokenRow() !== cursor.row ||\n
+            this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);\n
+    };\n
+    \n
+    CstyleBehaviour.$matchTokenType = function(token, types) {\n
+        return types.indexOf(token.type || token) > -1;\n
+    };\n
+    \n
+    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n
+            autoInsertedBrackets = 0;\n
+        autoInsertedRow = cursor.row;\n
+        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n
+        autoInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isMaybeInsertedClosing(cursor, line))\n
+            maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = cursor.row;\n
+        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n
+        maybeInsertedLineEnd = line.substr(cursor.column);\n
+        maybeInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n
+        return autoInsertedBrackets > 0 &&\n
+            cursor.row === autoInsertedRow &&\n
+            bracket === autoInsertedLineEnd[0] &&\n
+            line.substr(cursor.column) === autoInsertedLineEnd;\n
+    };\n
+    \n
+    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n
+        return maybeInsertedBrackets > 0 &&\n
+            cursor.row === maybeInsertedRow &&\n
+            line.substr(cursor.column) === maybeInsertedLineEnd &&\n
+            line.substr(0, cursor.column) == maybeInsertedLineStart;\n
+    };\n
+    \n
+    CstyleBehaviour.popAutoInsertedClosing = function() {\n
+        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n
+        autoInsertedBrackets--;\n
+    };\n
+    \n
+    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n
+        maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = -1;\n
+    };\n
+\n
+    this.add("braces", "insertion", function (state, action, editor, session, text) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (text == \'{\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'{\' + selected + \'}\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n
+                    CstyleBehaviour.recordAutoInsert(editor, session, "}");\n
+                    return {\n
+                        text: \'{}\',\n
+                        selection: [1, 1]\n
+                    };\n
+                } else {\n
+                    CstyleBehaviour.recordMaybeInsert(editor, session, "{");\n
+                    return {\n
+                        text: \'{\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == \'}\') {\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\') {\n
+                var matching = session.$findOpeningBracket(\'}\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == "\\n" || text == "\\r\\n") {\n
+            var closing = "";\n
+            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n
+                closing = lang.stringRepeat("}", maybeInsertedBrackets);\n
+                CstyleBehaviour.clearMaybeInsertedClosing();\n
+            }\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\' || closing !== "") {\n
+                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, \'}\');\n
+                if (!openBracePos)\n
+                     return null;\n
+\n
+                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n
+                var next_indent = this.$getIndent(line);\n
+\n
+                return {\n
+                    text: \'\\n\' + indent + \'\\n\' + next_indent + closing,\n
+                    selection: [1, indent.length, 1, indent.length]\n
+                };\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("braces", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'{\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.end.column, range.end.column + 1);\n
+            if (rightChar == \'}\') {\n
+                range.end.column++;\n
+                return range;\n
+            } else {\n
+                maybeInsertedBrackets--;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'(\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'(\' + selected + \')\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, ")");\n
+                return {\n
+                    text: \'()\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \')\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \')\') {\n
+                var matching = session.$findOpeningBracket(\')\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'(\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \')\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'[\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'[\' + selected + \']\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, "]");\n
+                return {\n
+                    text: \'[]\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \']\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \']\') {\n
+                var matching = session.$findOpeningBracket(\']\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'[\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \']\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'"\' || text == "\'") {\n
+            var quote = text;\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "\'" && selected != \'"\' && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: quote + selected + quote,\n
+                    selection: false\n
+                };\n
+            } else {\n
+                var cursor = editor.getCursorPosition();\n
+                var line = session.doc.getLine(cursor.row);\n
+                var leftChar = line.substring(cursor.column-1, cursor.column);\n
+                if (leftChar == \'\\\\\') {\n
+                    return null;\n
+                }\n
+                var tokens = session.getTokens(selection.start.row);\n
+                var col = 0, token;\n
+                var quotepos = -1; // Track whether we\'re inside an open quote.\n
+\n
+                for (var x = 0; x < tokens.length; x++) {\n
+                    token = tokens[x];\n
+                    if (token.type == "string") {\n
+                      quotepos = -1;\n
+                    } else if (quotepos < 0) {\n
+                      quotepos = token.value.indexOf(quote);\n
+                    }\n
+                    if ((token.value.length + col) > selection.start.column) {\n
+                        break;\n
+                    }\n
+                    col += tokens[x].value.length;\n
+                }\n
+                if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n
+                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n
+                        return;\n
+                    return {\n
+                        text: quote + quote,\n
+                        selection: [1,1]\n
+                    };\n
+                } else if (token && token.type === "string") {\n
+                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+                    if (rightChar == quote) {\n
+                        return {\n
+                            text: \'\',\n
+                            selection: [1, 1]\n
+                        };\n
+                    }\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && (selected == \'"\' || selected == "\'")) {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == selected) {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+};\n
+\n
+oop.inherits(CstyleBehaviour, Behaviour);\n
+\n
+exports.CstyleBehaviour = CstyleBehaviour;\n
+});\n
+\n
+define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Range = require("../../range").Range;\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(commentRegex) {\n
+    if (commentRegex) {\n
+        this.foldingStartMarker = new RegExp(\n
+            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
+        );\n
+        this.foldingStopMarker = new RegExp(\n
+            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
+        );\n
+    }\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n
+    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var line = session.getLine(row);\n
+        var match = line.match(this.foldingStartMarker);\n
+        if (match) {\n
+            var i = match.index;\n
+\n
+            if (match[1])\n
+                return this.openingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i + match[0].length, 1);\n
+        }\n
+\n
+        if (foldStyle !== "markbeginend")\n
+            return;\n
+\n
+        var match = line.match(this.foldingStopMarker);\n
+        if (match) {\n
+            var i = match.index + match[0].length;\n
+\n
+            if (match[1])\n
+                return this.closingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i, -1);\n
+        }\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+define(\'ace/mode/nix_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+    \n
+\n
+    var oop = require("../lib/oop");\n
+    var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+    var NixHighlightRules = function() {\n
+\n
+        var constantLanguage = "true|false";\n
+        var keywordControl = "with|import|if|else|then|inherit";\n
+        var keywordDeclaration = "let|in|rec";\n
+\n
+        var keywordMapper = this.createKeywordMapper({\n
+            "constant.language.nix": constantLanguage,\n
+            "keyword.control.nix": keywordControl,\n
+            "keyword.declaration.nix": keywordDeclaration\n
+        }, "identifier");\n
+\n
+        this.$rules = {\n
+            "start": [{\n
+                    token: "comment",\n
+                    regex: /#.*$/\n
+                }, {\n
+                    token: "comment",\n
+                    regex: /\\/\\*/,\n
+                    next: "comment"\n
+                }, {\n
+                    token: "constant",\n
+                    regex: "<[^>]+>"\n
+                }, {\n
+                    regex: "(==|!=|<=?|>=?)",\n
+                    token: ["keyword.operator.comparison.nix"]\n
+                }, {\n
+                    regex: "((?:[+*/%-]|\\\\~)=)",\n
+                    token: ["keyword.operator.assignment.arithmetic.nix"]\n
+                }, {\n
+                    regex: "=",\n
+                    token: "keyword.operator.assignment.nix"\n
+                }, {\n
+                    token: "string",\n
+                    regex: "\'\'",\n
+                    next: "qqdoc"\n
+                }, {\n
+                    token: "string",\n
+                    regex: "\'",\n
+                    next: "qstring"\n
+                }, {\n
+                    token: "string",\n
+                    regex: \'"\',\n
+                    push: "qqstring"\n
+                }, {\n
+                    token: "constant.numeric", // hex\n
+                    regex: "0[xX][0-9a-fA-F]+\\\\b"\n
+                }, {\n
+                    token: "constant.numeric", // float\n
+                    regex: "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
+                }, {\n
+                    token: keywordMapper,\n
+                    regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
+                }, {\n
+                    regex: "}",\n
+                    token: function(val, start, stack) {\n
+                        return stack[1] && stack[1].charAt(0) == "q" ? "constant.language.escape" : "text";\n
+                    },\n
+                    next: "pop"\n
+                }],\n
+            "comment": [{\n
+                token: "comment", // closing comment\n
+                regex: ".*?\\\\*\\\\/",\n
+                next: "start"\n
+            }, {\n
+                token: "comment", // comment spanning whole line\n
+                regex: ".+"\n
+            }],\n
+            "qqdoc": [\n
+                {\n
+                    token: "constant.language.escape",\n
+                    regex: /\\$\\{/,\n
+                    push: "start"\n
+                }, {\n
+                    token: "string",\n
+                    regex: "\'\'",\n
+                    next: "pop"\n
+                }, {\n
+                    defaultToken: "string"\n
+                }],\n
+            "qqstring": [\n
+                {\n
+                    token: "constant.language.escape",\n
+                    regex: /\\$\\{/,\n
+                    push: "start"\n
+                }, {\n
+                    token: "string",\n
+                    regex: \'"\',\n
+                    next: "pop"\n
+                }, {\n
+                    defaultToken: "string"\n
+                }],\n
+            "qstring": [\n
+                {\n
+                    token: "constant.language.escape",\n
+                    regex: /\\$\\{/,\n
+                    push: "start"\n
+                }, {\n
+                    token: "string",\n
+                    regex: "\'",\n
+                    next: "pop"\n
+                }, {\n
+                    defaultToken: "string"\n
+                }]\n
+        };\n
+\n
+        this.normalizeRules();\n
+    };\n
+\n
+    oop.inherits(NixHighlightRules, TextHighlightRules);\n
+\n
+    exports.NixHighlightRules = NixHighlightRules;\n
+});
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>35142</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-objectivec.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-objectivec.js.xml
index 0366485e78..5edad2ddac 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-objectivec.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-objectivec.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.42</string> </value>
+            <value> <string>ts83646621.6</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,10 +67,8 @@ var ObjectiveCHighlightRules = require("./objectivec_highlight_rules").Objective
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new ObjectiveCHighlightRules();\n
+    this.HighlightRules = ObjectiveCHighlightRules;\n
     this.foldingRules = new CStyleFoldMode();\n
-\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -691,7 +689,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>63204</int> </value>
+            <value> <int>63140</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ocaml.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ocaml.js.xml
index 573970e110..21a21daa91 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ocaml.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ocaml.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.49</string> </value>
+            <value> <string>ts83646621.58</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,7 +63,8 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new OcamlHighlightRules().getRules());\n
+    this.HighlightRules = OcamlHighlightRules;\n
+    \n
     this.$outdent   = new MatchingBraceOutdent();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -97,7 +98,7 @@ var indenter = /(?:[({[=:]|[-=]>|\\b(?:else|try|with))\\s*$/;\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
 \n
         if (!(tokens.length && tokens[tokens.length - 1].type === \'comment\') &&\n
             state === \'start\' && indenter.test(line))\n
@@ -475,7 +476,7 @@ exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>23167</int> </value>
+            <value> <int>23148</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-pascal.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-pascal.js.xml
index 6adefd469c..1ab1a29b1d 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-pascal.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-pascal.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.6</string> </value>
+            <value> <string>ts83646621.57</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,9 +67,8 @@ var PascalHighlightRules = require("./pascal_highlight_rules").PascalHighlightRu
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new PascalHighlightRules();\n
+    this.HighlightRules = PascalHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -265,7 +264,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>9336</int> </value>
+            <value> <int>9273</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-perl.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-perl.js.xml
index b1e5a79fd2..c3723345f0 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-perl.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-perl.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.74</string> </value>
+            <value> <string>ts83646621.55</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,7 +64,8 @@ var Range = require("../range").Range;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new PerlHighlightRules().getRules());\n
+    this.HighlightRules = PerlHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new CStyleFoldMode({start: "^=(begin|item)\\\\b", end: "^=(cut)\\\\b"});\n
 };\n
@@ -82,7 +83,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -161,9 +162,6 @@ var PerlHighlightRules = function() {\n
     this.$rules = {\n
         "start" : [\n
             {\n
-                token : "comment",\n
-                regex : "#.*$"\n
-            }, {\n
                 token : "comment.doc",\n
                 regex : "^=(?:begin|item)\\\\b",\n
                 next : "block_comment"\n
@@ -195,7 +193,10 @@ var PerlHighlightRules = function() {\n
                 regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
             }, {\n
                 token : "keyword.operator",\n
-                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)"\n
+                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)"\n
+            }, {\n
+                token : "comment",\n
+                regex : "#.*$"\n
             }, {\n
                 token : "lparen",\n
                 regex : "[[({]"\n
@@ -348,7 +349,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>11746</int> </value>
+            <value> <int>11735</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-pgsql.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-pgsql.js.xml
index 47c67b107d..046a6d8dc1 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-pgsql.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-pgsql.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155561.89</string> </value>
+            <value> <string>ts83646621.54</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -61,11 +61,11 @@ var PgsqlHighlightRules = require("./pgsql_highlight_rules").PgsqlHighlightRules
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new PgsqlHighlightRules().getRules());\n
+    this.HighlightRules = PgsqlHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
-(function() {       \n
+(function() {\n
     this.lineCommentStart = "--";\n
     this.blockComment = {start: "/*", end: "*/"};\n
 \n
@@ -712,9 +712,6 @@ var PerlHighlightRules = function() {\n
     this.$rules = {\n
         "start" : [\n
             {\n
-                token : "comment",\n
-                regex : "#.*$"\n
-            }, {\n
                 token : "comment.doc",\n
                 regex : "^=(?:begin|item)\\\\b",\n
                 next : "block_comment"\n
@@ -746,7 +743,10 @@ var PerlHighlightRules = function() {\n
                 regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
             }, {\n
                 token : "keyword.operator",\n
-                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)"\n
+                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)"\n
+            }, {\n
+                token : "comment",\n
+                regex : "#.*$"\n
             }, {\n
                 token : "lparen",\n
                 regex : "[[({]"\n
@@ -961,7 +961,7 @@ exports.PythonHighlightRules = PythonHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>53780</int> </value>
+            <value> <int>53753</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-php.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-php.js.xml
index 5c31519101..a7146be405 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-php.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-php.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155562.03</string> </value>
+            <value> <string>ts83646621.52</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>180760</int> </value>
+            <value> <int>186061</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -97,7 +97,7 @@ var unicode = require("../unicode");\n
 var Mode = function(opts) {\n
     var inline = opts && opts.inline;\n
     var HighlightRules = inline ? PhpLangHighlightRules : PhpHighlightRules;\n
-    this.$tokenizer = new Tokenizer(new HighlightRules().getRules());\n
+    this.HighlightRules = HighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -127,7 +127,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -1021,7 +1021,30 @@ var PhpLangHighlightRules = function() {\n
         \'ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|\' +\n
         \'ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|\' +\n
         \'ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|\' +\n
-        \'ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|\' +\n
+        \'ociserverversion|ocisetprefetch|
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|\' +\n
         \'PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|\' +\n
         \'PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|\' +\n
         \'PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|\' +\n
@@ -1132,7 +1155,7 @@ var PhpLangHighlightRules = function() {\n
                 next: "heredoc"\n
             }, {\n
                 token : "keyword.operator",\n
-                regex : "::|!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)"\n
+                regex : "::|!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|!=|!==|<=|>=|=>|<<=|>>=|>>>=|<>|<|>|=|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)"\n
             }, {\n
                 token : "paren.lparen",\n
                 regex : "[[({]"\n
@@ -1147,17 +1170,17 @@ var PhpLangHighlightRules = function() {\n
         "heredoc" : [\n
             {\n
                 onMatch : function(value, currentSate, stack) {\n
-                    if (stack[1]  + ";" != value)\n
+                    if (stack[1] != value)\n
                         return "string";\n
                     stack.shift();\n
                     stack.shift();\n
                     return "markup.list"\n
                 },\n
-                regex : "^\\\\w+;$",\n
+                regex : "^\\\\w+(?=;?$)",\n
                 next: "start"\n
             }, {\n
                 token: "string",\n
-                regex : ".*",\n
+                regex : ".*"\n
             }\n
         ],\n
         "comment" : [\n
@@ -1201,21 +1224,27 @@ oop.inherits(PhpLangHighlightRules, TextHighlightRules);\n
 var PhpHighlightRules = function() {\n
     HtmlHighlightRules.call(this);\n
 \n
-    for (var i in this.$rules) {\n
-        this.$rules[i].unshift({\n
+    var startRules = [\n
+        {\n
             token : "support.php_tag", // php open tag\n
             regex : "<\\\\?(?:php|=)?",\n
             push  : "php-start"\n
-        });\n
-    }\n
+        }\n
+    ];\n
 \n
-    this.embedRules(PhpLangHighlightRules, "php-");\n
+    var endRules = [\n
+        {\n
+            token : "support.php_tag", // php close tag\n
+            regex : "\\\\?>",\n
+            next  : "pop"\n
+        }\n
+    ];\n
+\n
+    for (var key in this.$rules)\n
+        this.$rules[key].unshift.apply(this.$rules[key], startRules);\n
+\n
+    this.embedRules(PhpLangHighlightRules, "php-", endRules, ["start"]);\n
 \n
-    this.$rules["php-start"].unshift({\n
-        token : "support.php_tag", // php close tag\n
-        regex : "\\\\?>",\n
-        next  : "pop"\n
-    });\n
     this.normalizeRules();\n
 };\n
 \n
@@ -1269,15 +1298,14 @@ exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
 \n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -1286,6 +1314,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -1299,78 +1328,66 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
-        }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "text",\n
-            regex : "\\\\s+"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
-            token : "constant.character.entity",\n
-            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
-        }, {\n
-            defaultToken : "comment"\n
-        } ]\n
-    };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
 \n
 exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
@@ -1400,152 +1417,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1603,7 +1585,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -1678,7 +1661,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -1723,8 +1706,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -1811,6 +1794,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1854,6 +1845,193 @@ oop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n
 exports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n
 });\n
 \n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 \n
@@ -2344,6 +2522,12 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 
 ]]></string> </value>
         </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
       </dictionary>
     </pickle>
   </record>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-plain_text.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-plain_text.js.xml
new file mode 100644
index 0000000000..358a9e9e02
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-plain_text.js.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.28</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-plain_text.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/mode/plain_text\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/text_highlight_rules\', \'ace/mode/behaviour\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var Behaviour = require("./behaviour").Behaviour;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = TextHighlightRules;\n
+    this.$behaviour = new Behaviour();\n
+};\n
+\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+    this.type = "text";\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        return \'\';\n
+    };\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});</string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>2453</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-powershell.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-powershell.js.xml
index 4c342caadf..81262c618b 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-powershell.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-powershell.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155562.21</string> </value>
+            <value> <string>ts83646621.46</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -34,7 +34,7 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new PowershellHighlightRules().getRules());\n
+    this.HighlightRules = PowershellHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode({start: "^\\\\s*(<#)", end: "^[#\\\\s]>\\\\s*$"});\n
@@ -49,7 +49,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -650,7 +650,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>25803</int> </value>
+            <value> <int>25779</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-prolog.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-prolog.js.xml
index 27c5a7d43d..0f8d9337c2 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-prolog.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-prolog.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155562.31</string> </value>
+            <value> <string>ts83646621.44</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,9 +67,8 @@ var PrologHighlightRules = require("./prolog_highlight_rules").PrologHighlightRu
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new PrologHighlightRules();\n
+    this.HighlightRules = PrologHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -345,7 +344,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>13071</int> </value>
+            <value> <int>13008</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-properties.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-properties.js.xml
index b979f2174c..aa608fc378 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-properties.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-properties.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155562.45</string> </value>
+            <value> <string>ts83646621.42</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -59,8 +59,7 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var PropertiesHighlightRules = require("./properties_highlight_rules").PropertiesHighlightRules;\n
 \n
 var Mode = function() {\n
-    var highlighter = new PropertiesHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = PropertiesHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -91,7 +90,7 @@ var PropertiesHighlightRules = function() {\n
                 next  : "value"\n
             }, {\n
                 token : "constant.language.escape",\n
-                regex : escapeRe,\n
+                regex : escapeRe\n
             }, {\n
                 defaultToken: "variable"\n
             }\n
@@ -129,7 +128,7 @@ exports.PropertiesHighlightRules = PropertiesHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>3731</int> </value>
+            <value> <int>3667</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-protobuf.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-protobuf.js.xml
new file mode 100644
index 0000000000..ff990e9aa7
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-protobuf.js.xml
@@ -0,0 +1,880 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.26</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-protobuf.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2012, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ *\n
+ * Contributor(s):\n
+ *\n
+ *    Zef Hemel\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/mode/protobuf\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/c_cpp\', \'ace/tokenizer\', \'ace/mode/protobuf_highlight_rules\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var CMode = require("./c_cpp").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var ProtobufHighlightRules = require("./protobuf_highlight_rules").ProtobufHighlightRules;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    CMode.call(this);\n
+    var highlighter = new ProtobufHighlightRules();\n
+    this.foldingRules = new CStyleFoldMode();\n
+\n
+    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.$keywordList = highlighter.$keywordList;\n
+};\n
+oop.inherits(Mode, CMode);\n
+\n
+(function() {\n
+    this.lineCommentStart = "//";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/c_cpp\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var c_cppHighlightRules = require("./c_cpp_highlight_rules").c_cppHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var Range = require("../range").Range;\n
+var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = c_cppHighlightRules;\n
+\n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CstyleBehaviour();\n
+\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.lineCommentStart = "//";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        var indent = this.$getIndent(line);\n
+\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
+        var tokens = tokenizedLine.tokens;\n
+        var endState = tokenizedLine.state;\n
+\n
+        if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
+            return indent;\n
+        }\n
+\n
+        if (state == "start") {\n
+            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n
+            if (match) {\n
+                indent += tab;\n
+            }\n
+        } else if (state == "doc-start") {\n
+            if (endState == "start") {\n
+                return "";\n
+            }\n
+            var match = line.match(/^\\s*(\\/?)\\*/);\n
+            if (match) {\n
+                if (match[1]) {\n
+                    indent += " ";\n
+                }\n
+                indent += "* ";\n
+            }\n
+        }\n
+\n
+        return indent;\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return this.$outdent.checkOutdent(line, input);\n
+    };\n
+\n
+    this.autoOutdent = function(state, doc, row) {\n
+        this.$outdent.autoOutdent(doc, row);\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var cFunctions = exports.cFunctions = "\\\\s*\\\\bhypot(?: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"\n
+\n
+var c_cppHighlightRules = function() {\n
+\n
+    var keywordControls = (\n
+        "break|case|continue|default|do|else|for|goto|if|_Pragma|" +\n
+        "return|switch|while|catch|operator|try|throw|using"\n
+    );\n
+    \n
+    var storageType = (\n
+        "asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|" +\n
+        "_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|" +\n
+        "class|wchar_t|template"\n
+    );\n
+\n
+    var storageModifiers = (\n
+        "const|extern|register|restrict|static|volatile|inline|private:|" +\n
+        "protected:|public:|friend|explicit|virtual|export|mutable|typename"\n
+    );\n
+\n
+    var keywordOperators = (\n
+        "and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq" +\n
+        "const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace"\n
+    );\n
+\n
+    var builtinConstants = (\n
+        "NULL|true|false|TRUE|FALSE"\n
+    );\n
+\n
+    var keywordMapper = this.$keywords = this.createKeywordMapper({\n
+        "keyword.control" : keywordControls,\n
+        "storage.type" : storageType,\n
+        "storage.modifier" : storageModifiers,\n
+        "keyword.operator" : keywordOperators,\n
+        "variable.language": "this",\n
+        "constant.language": builtinConstants\n
+    }, "identifier");\n
+\n
+    var identifierRe = "[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b";\n
+\n
+    this.$rules = {\n
+        "start" : [\n
+            {\n
+                token : "comment",\n
+                regex : "\\\\/\\\\/.*$"\n
+            },\n
+            DocCommentHighlightRules.getStartRule("doc-start"),\n
+            {\n
+                token : "comment", // multi line comment\n
+                regex : "\\\\/\\\\*",\n
+                next : "comment"\n
+            }, {\n
+                token : "string", // single line\n
+                regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+            }, {\n
+                token : "string", // multi line string start\n
+                regex : \'["].*\\\\\\\\$\',\n
+                next : "qqstring"\n
+            }, {\n
+                token : "string", // single line\n
+                regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+            }, {\n
+                token : "string", // multi line string start\n
+                regex : "[\'].*\\\\\\\\$",\n
+                next : "qstring"\n
+            }, {\n
+                token : "constant.numeric", // hex\n
+                regex : "0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b"\n
+            }, {\n
+                token : "constant.numeric", // float\n
+                regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b"\n
+            }, {\n
+                token : "keyword", // pre-compiler directives\n
+                regex : "#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b",\n
+                next  : "directive"\n
+            }, {\n
+                token : "keyword", // special case pre-compiler directive\n
+                regex : "(?:#\\\\s*endif)\\\\b"\n
+            }, {\n
+                token : "support.function.C99.c",\n
+                regex : cFunctions\n
+            }, {\n
+                token : keywordMapper,\n
+                regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : "!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)"\n
+            }, {\n
+              token : "punctuation.operator",\n
+              regex : "\\\\?|\\\\:|\\\\,|\\\\;|\\\\."\n
+            }, {\n
+                token : "paren.lparen",\n
+                regex : "[[({]"\n
+            }, {\n
+                token : "paren.rparen",\n
+                regex : "[\\\\])}]"\n
+            }, {\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            }\n
+        ],\n
+        "comment" : [\n
+            {\n
+                token : "comment", // closing comment\n
+                regex : ".*?\\\\*\\\\/",\n
+                next : "start"\n
+            }, {\n
+                token : "comment", // comment spanning whole line\n
+                regex : ".+"\n
+            }\n
+        ],\n
+        "qqstring" : [\n
+            {\n
+                token : "string",\n
+                regex : \'(?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?"\',\n
+                next : "start"\n
+            }, {\n
+                token : "string",\n
+                regex : \'.+\'\n
+            }\n
+        ],\n
+        "qstring" : [\n
+            {\n
+                token : "string",\n
+                regex : "(?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?\'",\n
+                next : "start"\n
+            }, {\n
+                token : "string",\n
+                regex : \'.+\'\n
+            }\n
+        ],\n
+        "directive" : [\n
+            {\n
+                token : "constant.other.multiline",\n
+                regex : /\\\\/\n
+            },\n
+            {\n
+                token : "constant.other.multiline",\n
+                regex : /.*\\\\/\n
+            },\n
+            {\n
+                token : "constant.other",\n
+                regex : "\\\\s*<.+?>",\n
+                next : "start"\n
+            },\n
+            {\n
+                token : "constant.other", // single line\n
+                regex : \'\\\\s*["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\',\n
+                next : "start"\n
+            }, \n
+            {\n
+                token : "constant.other", // single line\n
+                regex : "\\\\s*[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']",\n
+                next : "start"\n
+            },\n
+            {\n
+                token : "constant.other",\n
+                regex : /[^\\\\\\/]+/,\n
+                next : "start"\n
+            }\n
+        ]\n
+    };\n
+\n
+    this.embedRules(DocCommentHighlightRules, "doc-",\n
+        [ DocCommentHighlightRules.getEndRule("start") ]);\n
+};\n
+\n
+oop.inherits(c_cppHighlightRules, TextHighlightRules);\n
+\n
+exports.c_cppHighlightRules = c_cppHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/doc_comment_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var DocCommentHighlightRules = function() {\n
+\n
+    this.$rules = {\n
+        "start" : [ {\n
+            token : "comment.doc.tag",\n
+            regex : "@[\\\\w\\\\d_]+" // TODO: fix email addresses\n
+        }, {\n
+            token : "comment.doc.tag",\n
+            regex : "\\\\bTODO\\\\b"\n
+        }, {\n
+            defaultToken : "comment.doc"\n
+        }]\n
+    };\n
+};\n
+\n
+oop.inherits(DocCommentHighlightRules, TextHighlightRules);\n
+\n
+DocCommentHighlightRules.getStartRule = function(start) {\n
+    return {\n
+        token : "comment.doc", // doc comment\n
+        regex : "\\\\/\\\\*(?=\\\\*)",\n
+        next  : start\n
+    };\n
+};\n
+\n
+DocCommentHighlightRules.getEndRule = function (start) {\n
+    return {\n
+        token : "comment.doc", // closing comment\n
+        regex : "\\\\*\\\\/",\n
+        next  : start\n
+    };\n
+};\n
+\n
+\n
+exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
+\n
+});\n
+\n
+define(\'ace/mode/matching_brace_outdent\', [\'require\', \'exports\', \'module\' , \'ace/range\'], function(require, exports, module) {\n
+\n
+\n
+var Range = require("../range").Range;\n
+\n
+var MatchingBraceOutdent = function() {};\n
+\n
+(function() {\n
+\n
+    this.checkOutdent = function(line, input) {\n
+        if (! /^\\s+$/.test(line))\n
+            return false;\n
+\n
+        return /^\\s*\\}/.test(input);\n
+    };\n
+\n
+    this.autoOutdent = function(doc, row) {\n
+        var line = doc.getLine(row);\n
+        var match = line.match(/^(\\s*\\})/);\n
+\n
+        if (!match) return 0;\n
+\n
+        var column = match[1].length;\n
+        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n
+\n
+        if (!openBracePos || openBracePos.row == row) return 0;\n
+\n
+        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n
+        doc.replace(new Range(row, 0, row, column-1), indent);\n
+    };\n
+\n
+    this.$getIndent = function(line) {\n
+        return line.match(/^\\s*/)[0];\n
+    };\n
+\n
+}).call(MatchingBraceOutdent.prototype);\n
+\n
+exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
+});\n
+\n
+define(\'ace/mode/behaviour/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour\', \'ace/token_iterator\', \'ace/lib/lang\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+var lang = require("../../lib/lang");\n
+\n
+var SAFE_INSERT_IN_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator"];\n
+var SAFE_INSERT_BEFORE_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator", "comment"];\n
+\n
+\n
+var autoInsertedBrackets = 0;\n
+var autoInsertedRow = -1;\n
+var autoInsertedLineEnd = "";\n
+var maybeInsertedBrackets = 0;\n
+var maybeInsertedRow = -1;\n
+var maybeInsertedLineStart = "";\n
+var maybeInsertedLineEnd = "";\n
+\n
+var CstyleBehaviour = function () {\n
+    \n
+    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n
+        var cursor = editor.getCursorPosition();\n
+        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+        if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {\n
+            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n
+            if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))\n
+                return false;\n
+        }\n
+        iterator.stepForward();\n
+        return iterator.getCurrentTokenRow() !== cursor.row ||\n
+            this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);\n
+    };\n
+    \n
+    CstyleBehaviour.$matchTokenType = function(token, types) {\n
+        return types.indexOf(token.type || token) > -1;\n
+    };\n
+    \n
+    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n
+            autoInsertedBrackets = 0;\n
+        autoInsertedRow = cursor.row;\n
+        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n
+        autoInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isMaybeInsertedClosing(cursor, line))\n
+            maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = cursor.row;\n
+        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n
+        maybeInsertedLineEnd = line.substr(cursor.column);\n
+        maybeInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n
+        return autoInsertedBrackets > 0 &&\n
+            cursor.row === autoInsertedRow &&\n
+            bracket === autoInsertedLineEnd[0] &&\n
+            line.substr(cursor.column) === autoInsertedLineEnd;\n
+    };\n
+    \n
+    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n
+        return maybeInsertedBrackets > 0 &&\n
+            cursor.row === maybeInsertedRow &&\n
+            line.substr(cursor.column) === maybeInsertedLineEnd &&\n
+            line.substr(0, cursor.column) == maybeInsertedLineStart;\n
+    };\n
+    \n
+    CstyleBehaviour.popAutoInsertedClosing = function() {\n
+        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n
+        autoInsertedBrackets--;\n
+    };\n
+    \n
+    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n
+        maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = -1;\n
+    };\n
+\n
+    this.add("braces", "insertion", function (state, action, editor, session, text) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (text == \'{\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'{\' + selected + \'}\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n
+                    CstyleBehaviour.recordAutoInsert(editor, session, "}");\n
+                    return {\n
+                        text: \'{}\',\n
+                        selection: [1, 1]\n
+                    };\n
+                } else {\n
+                    CstyleBehaviour.recordMaybeInsert(editor, session, "{");\n
+                    return {\n
+                        text: \'{\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == \'}\') {\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\') {\n
+                var matching = session.$findOpeningBracket(\'}\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == "\\n" || text == "\\r\\n") {\n
+            var closing = "";\n
+            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n
+                closing = lang.stringRepeat("}", maybeInsertedBrackets);\n
+                CstyleBehaviour.clearMaybeInsertedClosing();\n
+            }\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\' || closing !== "") {\n
+                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, \'}\');\n
+                if (!openBracePos)\n
+                     return null;\n
+\n
+                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n
+                var next_indent = this.$getIndent(line);\n
+\n
+                return {\n
+                    text: \'\\n\' + indent + \'\\n\' + next_indent + closing,\n
+                    selection: [1, indent.length, 1, indent.length]\n
+                };\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("braces", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'{\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.end.column, range.end.column + 1);\n
+            if (rightChar == \'}\') {\n
+                range.end.column++;\n
+                return range;\n
+            } else {\n
+                maybeInsertedBrackets--;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'(\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'(\' + selected + \')\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, ")");\n
+                return {\n
+                    text: \'()\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \')\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \')\') {\n
+                var matching = session.$findOpeningBracket(\')\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'(\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \')\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'[\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'[\' + selected + \']\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, "]");\n
+                return {\n
+                    text: \'[]\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \']\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \']\') {\n
+                var matching = session.$findOpeningBracket(\']\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'[\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \']\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'"\' || text == "\'") {\n
+            var quote = text;\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "\'" && selected != \'"\' && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: quote + selected + quote,\n
+                    selection: false\n
+                };\n
+            } else {\n
+                var cursor = editor.getCursorPosition();\n
+                var line = session.doc.getLine(cursor.row);\n
+                var leftChar = line.substring(cursor.column-1, cursor.column);\n
+                if (leftChar == \'\\\\\') {\n
+                    return null;\n
+                }\n
+                var tokens = session.getTokens(selection.start.row);\n
+                var col = 0, token;\n
+                var quotepos = -1; // Track whether we\'re inside an open quote.\n
+\n
+                for (var x = 0; x < tokens.length; x++) {\n
+                    token = tokens[x];\n
+                    if (token.type == "string") {\n
+                      quotepos = -1;\n
+                    } else if (quotepos < 0) {\n
+                      quotepos = token.value.indexOf(quote);\n
+                    }\n
+                    if ((token.value.length + col) > selection.start.column) {\n
+                        break;\n
+                    }\n
+                    col += tokens[x].value.length;\n
+                }\n
+                if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n
+                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n
+                        return;\n
+                    return {\n
+                        text: quote + quote,\n
+                        selection: [1,1]\n
+                    };\n
+                } else if (token && token.type === "string") {\n
+                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+                    if (rightChar == quote) {\n
+                        return {\n
+                            text: \'\',\n
+                            selection: [1, 1]\n
+                        };\n
+                    }\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && (selected == \'"\' || selected == "\'")) {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == selected) {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+};\n
+\n
+oop.inherits(CstyleBehaviour, Behaviour);\n
+\n
+exports.CstyleBehaviour = CstyleBehaviour;\n
+});\n
+\n
+define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Range = require("../../range").Range;\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(commentRegex) {\n
+    if (commentRegex) {\n
+        this.foldingStartMarker = new RegExp(\n
+            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
+        );\n
+        this.foldingStopMarker = new RegExp(\n
+            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
+        );\n
+    }\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n
+    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var line = session.getLine(row);\n
+        var match = line.match(this.foldingStartMarker);\n
+        if (match) {\n
+            var i = match.index;\n
+\n
+            if (match[1])\n
+                return this.openingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i + match[0].length, 1);\n
+        }\n
+\n
+        if (foldStyle !== "markbeginend")\n
+            return;\n
+\n
+        var match = line.match(this.foldingStopMarker);\n
+        if (match) {\n
+            var i = match.index + match[0].length;\n
+\n
+            if (match[1])\n
+                return this.closingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i, -1);\n
+        }\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+define(\'ace/mode/protobuf_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+    \n
+\n
+    var oop = require("../lib/oop");\n
+    var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+    var ProtobufHighlightRules = function() {\n
+\n
+        var builtinTypes = "double|float|int32|int64|uint32|uint64|sint32|" +\n
+                           "sint64|fixed32|fixed64|sfixed32|sfixed64|bool|" +\n
+                           "string|bytes";\n
+        var keywordDeclaration = "message|required|optional|repeated|package|" +\n
+                                 "import|option|enum";\n
+\n
+        var keywordMapper = this.createKeywordMapper({\n
+            "keyword.declaration.protobuf": keywordDeclaration,\n
+            "support.type": builtinTypes\n
+        }, "identifier");\n
+\n
+        this.$rules = {\n
+            "start": [{\n
+                    token: "comment",\n
+                    regex: /\\/\\/.*$/\n
+                }, {\n
+                    token: "comment",\n
+                    regex: /\\/\\*/,\n
+                    next: "comment"\n
+                }, {\n
+                    token: "constant",\n
+                    regex: "<[^>]+>"\n
+                }, {\n
+                    regex: "=",\n
+                    token: "keyword.operator.assignment.protobuf"\n
+                }, {\n
+                    token : "string", // single line\n
+                    regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+                }, {\n
+                    token : "string", // single line\n
+                    regex : \'[\\\'](?:(?:\\\\\\\\.)|(?:[^\\\'\\\\\\\\]))*?[\\\']\'\n
+                }, {\n
+                    token: "constant.numeric", // hex\n
+                    regex: "0[xX][0-9a-fA-F]+\\\\b"\n
+                }, {\n
+                    token: "constant.numeric", // float\n
+                    regex: "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
+                }, {\n
+                    token: keywordMapper,\n
+                    regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
+                }],\n
+            "comment": [{\n
+                    token: "comment", // closing comment\n
+                    regex: ".*?\\\\*\\\\/",\n
+                    next: "start"\n
+                }, {\n
+                    token: "comment", // comment spanning whole line\n
+                    regex: ".+"\n
+                }]\n
+        };\n
+\n
+        this.normalizeRules();\n
+    };\n
+\n
+    oop.inherits(ProtobufHighlightRules, TextHighlightRules);\n
+\n
+    exports.ProtobufHighlightRules = ProtobufHighlightRules;\n
+});
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>33700</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-python.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-python.js.xml
index 9f0a63722d..de0e3dfcf3 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-python.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-python.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155562.6</string> </value>
+            <value> <string>ts83646621.41</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,7 +63,7 @@ var PythonFoldMode = require("./folding/pythonic").FoldMode;\n
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new PythonHighlightRules().getRules());\n
+    this.HighlightRules = PythonHighlightRules;\n
     this.foldingRules = new PythonFoldMode("\\\\:");\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -75,7 +75,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -104,7 +104,7 @@ oop.inherits(Mode, TextMode);\n
         if (input !== "\\r\\n" && input !== "\\r" && input !== "\\n")\n
             return false;\n
 \n
-        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n
         \n
         if (!tokens)\n
             return false;\n
@@ -326,7 +326,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10385</int> </value>
+            <value> <int>10365</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-r.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-r.js.xml
index ca981de3ec..e96031189b 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-r.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-r.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155562.99</string> </value>
+            <value> <string>ts83646621.39</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -32,11 +32,31 @@
  * Portions created by the Initial Developer are Copyright (C) 2010\n
  * the Initial Developer. All Rights Reserved.\n
  *\n
- * This program is licensed to you under the terms of version 3 of the\n
- * GNU Affero General Public License. This program is distributed WITHOUT\n
- * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n
- * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n
  *\n
  */\n
 define(\'ace/mode/r\', [\'require\', \'exports\', \'module\' , \'ace/range\', \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/text_highlight_rules\', \'ace/mode/r_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/unicode\'], function(require, exports, module) {\n
@@ -53,7 +73,7 @@ define(\'ace/mode/r\', [\'require\', \'exports\', \'module\' , \'ace/range\', \'
 \n
    var Mode = function()\n
    {\n
-      this.$tokenizer = new Tokenizer(new RHighlightRules().getRules());\n
+      this.HighlightRules = RHighlightRules;\n
       this.$outdent = new MatchingBraceOutdent();\n
    };\n
    oop.inherits(Mode, TextMode);\n
@@ -348,7 +368,7 @@ exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10236</int> </value>
+            <value> <int>11377</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rdoc.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rdoc.js.xml
index 1815bba2fa..94ec4efa8e 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rdoc.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rdoc.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155562.71</string> </value>
+            <value> <string>ts83646621.38</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -27,11 +27,36 @@
  *\n
  * Copyright (C) 2009-11 by RStudio, Inc.\n
  *\n
- * This program is licensed to you under the terms of version 3 of the\n
- * GNU Affero General Public License. This program is distributed WITHOUT\n
- * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n
- * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n
+ * The Initial Developer of the Original Code is\n
+ * Ajax.org B.V.\n
+ * Portions created by the Initial Developer are Copyright (C) 2010\n
+ * the Initial Developer. All Rights Reserved.\n
+ *\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n
  *\n
  */\n
 define(\'ace/mode/rdoc\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/text_highlight_rules\', \'ace/mode/rdoc_highlight_rules\', \'ace/mode/matching_brace_outdent\'], function(require, exports, module) {\n
@@ -45,7 +70,7 @@ var RDocHighlightRules = require("./rdoc_highlight_rules").RDocHighlightRules;\n
 var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
 \n
 var Mode = function(suppressHighlighting) {\n
-\tthis.$tokenizer = new Tokenizer(new RDocHighlightRules().getRules());\n
+\tthis.HighlightRules = RDocHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -216,7 +241,7 @@ exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6173</int> </value>
+            <value> <int>7498</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rhtml.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rhtml.js.xml
index 70929e37b6..4914f98415 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rhtml.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rhtml.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155562.84</string> </value>
+            <value> <string>ts83646621.37</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>85016</int> </value>
+            <value> <int>99555</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -59,12 +59,31 @@
  * Portions created by the Initial Developer are Copyright (C) 2010\n
  * the Initial Developer. All Rights Reserved.\n
  *\n
- * This program is licensed to you under the terms of version 3 of the\n
- * GNU Affero General Public License. This program is distributed WITHOUT\n
- * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n
- * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n
+ * Distributed under the BSD license:\n
  *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n
  */\n
 \n
 define(\'ace/mode/rhtml\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/html\', \'ace/tokenizer\', \'ace/mode/rhtml_highlight_rules\'], function(require, exports, module) {\n
@@ -78,7 +97,7 @@ var RHtmlHighlightRules = require("./rhtml_highlight_rules").RHtmlHighlightRules
 \n
 var Mode = function(doc, session) {\n
    this.$session = session;\n
-   this.$tokenizer = new Tokenizer(new RHtmlHighlightRules().getRules());\n
+   this.HighlightRules = RHtmlHighlightRules;\n
 };\n
 oop.inherits(Mode, HtmlMode);\n
 \n
@@ -98,7 +117,7 @@ oop.inherits(Mode, HtmlMode);\n
 exports.Mode = Mode;\n
 });\n
 \n
-define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\'], function(require, exports, module) {\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
@@ -109,13 +128,13 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
 \n
 var Mode = function() {\n
-    var highlighter = new HtmlHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = HtmlHighlightRules;\n
     this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
     \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -136,6 +155,10 @@ oop.inherits(Mode, TextMode);\n
     this.checkOutdent = function(state, line, input) {\n
         return false;\n
     };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
 \n
 }).call(Mode.prototype);\n
 \n
@@ -156,7 +179,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -171,7 +195,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -277,7 +301,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -352,7 +377,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -397,8 +422,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -485,6 +510,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1002,7 +1035,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1016,7 +1049,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1083,152 +1116,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1316,15 +1314,14 @@ oop.inherits(CssBehaviour, CstyleBehaviour);\n
 exports.CssBehaviour = CssBehaviour;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -1333,6 +1330,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -1346,80 +1344,255 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
             token : "text",\n
             regex : "\\\\s+"\n
         }, {\n
-            token : "constant.character.entity",\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
             regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
         }, {\n
-            defaultToken : "comment"\n
-        } ]\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
 \n
-exports.HtmlHighlightRules = HtmlHighlightRules;\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
 });\n
 \n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
@@ -1502,14 +1675,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1524,7 +1692,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1534,8 +1702,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1565,14 +1733,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1586,6 +1749,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1594,8 +1760,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1612,11 +1778,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1695,6 +1861,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -1771,7 +1939,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -1804,7 +1972,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1837,7 +2005,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1951,6 +2119,286 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 }).call(FoldMode.prototype);\n
 \n
 });\n
+\n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
 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) {\n
 \n
 \n
@@ -1960,21 +2408,21 @@ var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 \n
 var RHtmlHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
 \n
-    this.$rules = new HtmlHighlightRules().getRules();\n
     this.$rules["start"].unshift({\n
         token: "support.function.codebegin",\n
         regex: "^<" + "!--\\\\s*begin.rcode\\\\s*(?:.*)",\n
         next: "r-start"\n
     });\n
 \n
-    var rRules = new RHighlightRules().getRules();\n
-    this.addRules(rRules, "r-");\n
-    this.$rules["r-start"].unshift({\n
+    this.embedRules(RHighlightRules, "r-", [{\n
         token: "support.function.codeend",\n
         regex: "^\\\\s*end.rcode\\\\s*-->",\n
         next: "start"\n
-    });\n
+    }], ["start"]);\n
+\n
+    this.normalizeRules();\n
 };\n
 oop.inherits(RHtmlHighlightRules, TextHighlightRules);\n
 \n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ruby.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ruby.js.xml
index 0f88ccf96f..bd942c127e 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ruby.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-ruby.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155563.14</string> </value>
+            <value> <string>ts83646621.35</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,7 +64,7 @@ var Range = require("../range").Range;\n
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new RubyHighlightRules().getRules());\n
+    this.HighlightRules = RubyHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new FoldMode();\n
 };\n
@@ -78,7 +78,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -463,7 +463,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>17027</int> </value>
+            <value> <int>17003</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rust.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rust.js.xml
index f9ecb06ac9..59a68a25b5 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rust.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-rust.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155563.28</string> </value>
+            <value> <string>ts83646621.33</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,9 +67,8 @@ var RustHighlightRules = require("./rust_highlight_rules").RustHighlightRules;\n
 var FoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new RustHighlightRules();\n
+    this.HighlightRules = RustHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -236,7 +235,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>9593</int> </value>
+            <value> <int>9530</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sass.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sass.js.xml
index 17235ff798..519a750ded 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sass.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sass.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155563.4</string> </value>
+            <value> <string>ts83646621.32</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var SassHighlightRules = require("./sass_highlight_rules").SassHighlightRules;\n
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new SassHighlightRules().getRules());\n
+    this.HighlightRules = SassHighlightRules;\n
     this.foldingRules = new FoldMode();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -474,7 +474,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>18814</int> </value>
+            <value> <int>18786</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scad.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scad.js.xml
index 87f479d0fd..a6005f263f 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scad.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scad.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155563.5</string> </value>
+            <value> <string>ts83646621.3</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -65,7 +65,7 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new scadHighlightRules().getRules());\n
+    this.HighlightRules = scadHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -80,7 +80,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -702,7 +702,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>25201</int> </value>
+            <value> <int>25177</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scala.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scala.js.xml
index d65ddcf168..bbbd33c1f8 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scala.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scala.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155563.61</string> </value>
+            <value> <string>ts83646621.28</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -33,7 +33,7 @@ var ScalaHighlightRules = require("./scala_highlight_rules").ScalaHighlightRules
 var Mode = function() {\n
     JavaScriptMode.call(this);\n
     \n
-    this.$tokenizer = new Tokenizer(new ScalaHighlightRules().getRules());\n
+    this.HighlightRules = ScalaHighlightRules;\n
 };\n
 oop.inherits(Mode, JavaScriptMode);\n
 \n
@@ -62,7 +62,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -77,7 +78,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -183,7 +184,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -258,7 +260,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -303,8 +305,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -391,6 +393,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1057,7 +1067,7 @@ exports.ScalaHighlightRules = ScalaHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>43132</int> </value>
+            <value> <int>43436</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scheme.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scheme.js.xml
index bc92ec0eb5..aad2204ed5 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scheme.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scheme.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155563.72</string> </value>
+            <value> <string>ts83646621.27</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,9 +64,7 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var SchemeHighlightRules = require("./scheme_highlight_rules").SchemeHighlightRules;\n
 \n
 var Mode = function() {\n
-    var highlighter = new SchemeHighlightRules();\n
-    \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = SchemeHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -172,7 +170,7 @@ exports.SchemeHighlightRules = SchemeHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5085</int> </value>
+            <value> <int>5017</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scss.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scss.js.xml
index 2ce73ddbef..fef99094ef 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scss.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-scss.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155563.81</string> </value>
+            <value> <string>ts83646621.26</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,7 +64,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new ScssHighlightRules().getRules());\n
+    this.HighlightRules = ScssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -78,7 +78,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -864,7 +864,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>34813</int> </value>
+            <value> <int>34789</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sh.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sh.js.xml
index 2503c18c35..1b38357fdd 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sh.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sh.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155563.96</string> </value>
+            <value> <string>ts83646621.24</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var ShHighlightRules = require("./sh_highlight_rules").ShHighlightRules;\n
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new ShHighlightRules().getRules());\n
+    this.HighlightRules = ShHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -74,7 +74,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -103,7 +103,7 @@ oop.inherits(Mode, TextMode);\n
         if (input !== "\\r\\n" && input !== "\\r" && input !== "\\n")\n
             return false;\n
 \n
-        var tokens = this.$tokenizer.getLineTokens(line.trim(), state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n
 \n
         if (!tokens)\n
             return false;\n
@@ -179,12 +179,28 @@ var ShHighlightRules = function() {\n
     var func = "(?:" + variableName + "\\\\s*\\\\(\\\\))";\n
 \n
     this.$rules = {\n
-        "start" : [ {\n
+        "start" : [{\n
+            token : "constant",\n
+            regex : /\\\\./\n
+        }, {\n
             token : ["text", "comment"],\n
             regex : /(^|\\s)(#.*)$/\n
         }, {\n
-            token : "string",           // " string\n
-            regex : \'"(?:[^\\\\\\\\]|\\\\\\\\.)*?"\'\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : [{\n
+                token : "constant.language.escape",\n
+                regex : /\\\\(?:[$abeEfnrtv\\\\\'"]|x[a-fA-F\\d]{1,2}|u[a-fA-F\\d]{4}([a-fA-F\\d]{4})?|c.|\\d{1,3})/\n
+            }, {\n
+                token : "constant",\n
+                regex : /\\$\\w+/\n
+            }, {\n
+                token : "string",\n
+                regex : \'"\',\n
+                next: "pop"\n
+            }, {\n
+                defaultToken: "string"\n
+            }]\n
         }, {\n
             token : "variable.language",\n
             regex : builtinVariable\n
@@ -199,7 +215,7 @@ var ShHighlightRules = function() {\n
             regex : fileDescriptor\n
         }, {\n
             token : "string",           // \' string\n
-            regex : "\'(?:[^\\\\\\\\]|\\\\\\\\.)*?\'"\n
+            start : "\'", end : "\'"\n
         }, {\n
             token : "constant.numeric", // float\n
             regex : floatNumber\n
@@ -220,6 +236,8 @@ var ShHighlightRules = function() {\n
             regex : "[\\\\]\\\\)\\\\}]"\n
         } ]\n
     };\n
+    \n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(ShHighlightRules, TextHighlightRules);\n
@@ -236,7 +254,7 @@ exports.ShHighlightRules = ShHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6999</int> </value>
+            <value> <int>7477</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sjs.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sjs.js.xml
new file mode 100644
index 0000000000..363ddcad77
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sjs.js.xml
@@ -0,0 +1,1150 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.24</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-sjs.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/mode/sjs\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/javascript\', \'ace/tokenizer\', \'ace/mode/sjs_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/mode/behaviour/cstyle\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+var oop = require("../lib/oop");\n
+var JSMode = require("./javascript").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var SJSHighlightRules = require("./sjs_highlight_rules").SJSHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    var highlighter = new SJSHighlightRules();\n
+\n
+    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CstyleBehaviour();\n
+    this.$keywordList = highlighter.$keywordList;\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, JSMode);\n
+(function() {\n
+    this.createWorker = function(session) {\n
+        return null;\n
+    }\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/javascript\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/javascript_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/range\', \'ace/worker/worker_client\', \'ace/mode/behaviour/cstyle\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var Range = require("../range").Range;\n
+var WorkerClient = require("../worker/worker_client").WorkerClient;\n
+var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CstyleBehaviour();\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.lineCommentStart = "//";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        var indent = this.$getIndent(line);\n
+\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
+        var tokens = tokenizedLine.tokens;\n
+        var endState = tokenizedLine.state;\n
+\n
+        if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
+            return indent;\n
+        }\n
+\n
+        if (state == "start" || state == "no_regex") {\n
+            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n
+            if (match) {\n
+                indent += tab;\n
+            }\n
+        } else if (state == "doc-start") {\n
+            if (endState == "start" || endState == "no_regex") {\n
+                return "";\n
+            }\n
+            var match = line.match(/^\\s*(\\/?)\\*/);\n
+            if (match) {\n
+                if (match[1]) {\n
+                    indent += " ";\n
+                }\n
+                indent += "* ";\n
+            }\n
+        }\n
+\n
+        return indent;\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return this.$outdent.checkOutdent(line, input);\n
+    };\n
+\n
+    this.autoOutdent = function(state, doc, row) {\n
+        this.$outdent.autoOutdent(doc, row);\n
+    };\n
+\n
+    this.createWorker = function(session) {\n
+        var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker");\n
+        worker.attachToDocument(session.getDocument());\n
+\n
+        worker.on("jslint", function(results) {\n
+            session.setAnnotations(results.data);\n
+        });\n
+\n
+        worker.on("terminate", function() {\n
+            session.clearAnnotations();\n
+        });\n
+\n
+        return worker;\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var JavaScriptHighlightRules = function() {\n
+    var keywordMapper = this.createKeywordMapper({\n
+        "variable.language":\n
+            "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|"  + // Constructors\n
+            "Namespace|QName|XML|XMLList|"                                             + // E4X\n
+            "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|"   +\n
+            "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|"                    +\n
+            "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|"   + // Errors\n
+            "SyntaxError|TypeError|URIError|"                                          +\n
+            "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions\n
+            "isNaN|parseFloat|parseInt|"                                               +\n
+            "JSON|Math|"                                                               + // Other\n
+            "this|arguments|prototype|window|document"                                 , // Pseudo\n
+        "keyword":\n
+            "const|yield|import|get|set|" +\n
+            "break|case|catch|continue|default|delete|do|else|finally|for|function|" +\n
+            "if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +\n
+            "__parent__|__count__|escape|unescape|with|__proto__|" +\n
+            "class|enum|extends|super|export|implements|private|public|interface|package|protected|static",\n
+        "storage.type":\n
+            "const|let|var|function",\n
+        "constant.language":\n
+            "null|Infinity|NaN|undefined",\n
+        "support.function":\n
+            "alert",\n
+        "constant.language.boolean": "true|false"\n
+    }, "identifier");\n
+    var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";\n
+    var identifierRe = "[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b";\n
+\n
+    var escapedRe = "\\\\\\\\(?:x[0-9a-fA-F]{2}|" + // hex\n
+        "u[0-9a-fA-F]{4}|" + // unicode\n
+        "[0-2][0-7]{0,2}|" + // oct\n
+        "3[0-6][0-7]?|" + // oct\n
+        "37[0-7]?|" + // oct\n
+        "[4-7][0-7]?|" + //oct\n
+        ".)";\n
+\n
+    this.$rules = {\n
+        "no_regex" : [\n
+            {\n
+                token : "comment",\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
+            },\n
+            DocCommentHighlightRules.getStartRule("doc-start"),\n
+            {\n
+                token : "comment", // multi line comment\n
+                regex : /\\/\\*/,\n
+                next : "comment"\n
+            }, {\n
+                token : "string",\n
+                regex : "\'(?=.)",\n
+                next  : "qstring"\n
+            }, {\n
+                token : "string",\n
+                regex : \'"(?=.)\',\n
+                next  : "qqstring"\n
+            }, {\n
+                token : "constant.numeric", // hex\n
+                regex : /0[xX][0-9a-fA-F]+\\b/\n
+            }, {\n
+                token : "constant.numeric", // float\n
+                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "support.function",\n
+                    "punctuation.operator", "entity.name.function", "text","keyword.operator"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(prototype)(\\\\.)(" + identifierRe +")(\\\\s*)(=)",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "entity.name.function", "text",\n
+                    "keyword.operator", "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "entity.name.function", "text", "keyword.operator", "text", "storage.type",\n
+                    "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "entity.name.function", "text",\n
+                    "keyword.operator", "text",\n
+                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"\n
+                ],\n
+                regex : "(function)(\\\\s+)(" + identifierRe + ")(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "entity.name.function", "text", "punctuation.operator",\n
+                    "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "text", "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(:)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : "keyword",\n
+                regex : "(?:" + kwBeforeRe + ")\\\\b",\n
+                next : "start"\n
+            }, {\n
+                token : ["punctuation.operator", "support.function"],\n
+                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(?=\\()/\n
+            }, {\n
+                token : ["punctuation.operator", "support.function.dom"],\n
+                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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
+            }, {\n
+                token : ["punctuation.operator", "support.constant"],\n
+                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/\n
+            }, {\n
+                token : ["storage.type", "punctuation.operator", "support.function.firebug"],\n
+                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n
+            }, {\n
+                token : keywordMapper,\n
+                regex : identifierRe\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : /--|\\+\\+|[!$%&*+\\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=/,\n
+                next  : "start"\n
+            }, {\n
+                token : "punctuation.operator",\n
+                regex : /\\?|\\:|\\,|\\;|\\./,\n
+                next  : "start"\n
+            }, {\n
+                token : "paren.lparen",\n
+                regex : /[\\[({]/,\n
+                next  : "start"\n
+            }, {\n
+                token : "paren.rparen",\n
+                regex : /[\\])}]/\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : /\\/=?/,\n
+                next  : "start"\n
+            }, {\n
+                token: "comment",\n
+                regex: /^#!.*$/\n
+            }\n
+        ],\n
+        "start": [\n
+            DocCommentHighlightRules.getStartRule("doc-start"),\n
+            {\n
+                token : "comment", // multi line comment\n
+                regex : "\\\\/\\\\*",\n
+                next : "comment_regex_allowed"\n
+            }, {\n
+                token : "comment",\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
+            }, {\n
+                token: "string.regexp",\n
+                regex: "\\\\/",\n
+                next: "regex"\n
+            }, {\n
+                token : "text",\n
+                regex : "\\\\s+|^$",\n
+                next : "start"\n
+            }, {\n
+                token: "empty",\n
+                regex: "",\n
+                next: "no_regex"\n
+            }\n
+        ],\n
+        "regex": [\n
+            {\n
+                token: "regexp.keyword.operator",\n
+                regex: "\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)"\n
+            }, {\n
+                token: "string.regexp",\n
+                regex: "/\\\\w*",\n
+                next: "no_regex"\n
+            }, {\n
+                token : "invalid",\n
+                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n
+            }, {\n
+                token : "constant.language.escape",\n
+                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?]/\n
+            }, {\n
+                token : "constant.language.delimiter",\n
+                regex: /\\|/\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: /\\[\\^?/,\n
+                next: "regex_character_class"\n
+            }, {\n
+                token: "empty",\n
+                regex: "$",\n
+                next: "no_regex"\n
+            }, {\n
+                defaultToken: "string.regexp"\n
+            }\n
+        ],\n
+        "regex_character_class": [\n
+            {\n
+                token: "regexp.keyword.operator",\n
+                regex: "\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)"\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: "]",\n
+                next: "regex"\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: "-"\n
+            }, {\n
+                token: "empty",\n
+                regex: "$",\n
+                next: "no_regex"\n
+            }, {\n
+                defaultToken: "string.regexp.charachterclass"\n
+            }\n
+        ],\n
+        "function_arguments": [\n
+            {\n
+                token: "variable.parameter",\n
+                regex: identifierRe\n
+            }, {\n
+                token: "punctuation.operator",\n
+                regex: "[, ]+"\n
+            }, {\n
+                token: "punctuation.operator",\n
+                regex: "$"\n
+            }, {\n
+                token: "empty",\n
+                regex: "",\n
+                next: "no_regex"\n
+            }\n
+        ],\n
+        "comment_regex_allowed" : [\n
+            {token : "comment", regex : "\\\\*\\\\/", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "comment" : [\n
+            {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "qqstring" : [\n
+            {\n
+                token : "constant.language.escape",\n
+                regex : escapedRe\n
+            }, {\n
+                token : "string",\n
+                regex : "\\\\\\\\$",\n
+                next  : "qqstring"\n
+            }, {\n
+                token : "string",\n
+                regex : \'"|$\',\n
+                next  : "no_regex"\n
+            }, {\n
+                defaultToken: "string"\n
+            }\n
+        ],\n
+        "qstring" : [\n
+            {\n
+                token : "constant.language.escape",\n
+                regex : escapedRe\n
+            }, {\n
+                token : "string",\n
+                regex : "\\\\\\\\$",\n
+                next  : "qstring"\n
+            }, {\n
+                token : "string",\n
+                regex : "\'|$",\n
+                next  : "no_regex"\n
+            }, {\n
+                defaultToken: "string"\n
+            }\n
+        ]\n
+    };\n
+\n
+    this.embedRules(DocCommentHighlightRules, "doc-",\n
+        [ DocCommentHighlightRules.getEndRule("no_regex") ]);\n
+};\n
+\n
+oop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n
+\n
+exports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/doc_comment_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var DocCommentHighlightRules = function() {\n
+\n
+    this.$rules = {\n
+        "start" : [ {\n
+            token : "comment.doc.tag",\n
+            regex : "@[\\\\w\\\\d_]+" // TODO: fix email addresses\n
+        }, {\n
+            token : "comment.doc.tag",\n
+            regex : "\\\\bTODO\\\\b"\n
+        }, {\n
+            defaultToken : "comment.doc"\n
+        }]\n
+    };\n
+};\n
+\n
+oop.inherits(DocCommentHighlightRules, TextHighlightRules);\n
+\n
+DocCommentHighlightRules.getStartRule = function(start) {\n
+    return {\n
+        token : "comment.doc", // doc comment\n
+        regex : "\\\\/\\\\*(?=\\\\*)",\n
+        next  : start\n
+    };\n
+};\n
+\n
+DocCommentHighlightRules.getEndRule = function (start) {\n
+    return {\n
+        token : "comment.doc", // closing comment\n
+        regex : "\\\\*\\\\/",\n
+        next  : start\n
+    };\n
+};\n
+\n
+\n
+exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
+\n
+});\n
+\n
+define(\'ace/mode/matching_brace_outdent\', [\'require\', \'exports\', \'module\' , \'ace/range\'], function(require, exports, module) {\n
+\n
+\n
+var Range = require("../range").Range;\n
+\n
+var MatchingBraceOutdent = function() {};\n
+\n
+(function() {\n
+\n
+    this.checkOutdent = function(line, input) {\n
+        if (! /^\\s+$/.test(line))\n
+            return false;\n
+\n
+        return /^\\s*\\}/.test(input);\n
+    };\n
+\n
+    this.autoOutdent = function(doc, row) {\n
+        var line = doc.getLine(row);\n
+        var match = line.match(/^(\\s*\\})/);\n
+\n
+        if (!match) return 0;\n
+\n
+        var column = match[1].length;\n
+        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n
+\n
+        if (!openBracePos || openBracePos.row == row) return 0;\n
+\n
+        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n
+        doc.replace(new Range(row, 0, row, column-1), indent);\n
+    };\n
+\n
+    this.$getIndent = function(line) {\n
+        return line.match(/^\\s*/)[0];\n
+    };\n
+\n
+}).call(MatchingBraceOutdent.prototype);\n
+\n
+exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
+});\n
+\n
+define(\'ace/mode/behaviour/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour\', \'ace/token_iterator\', \'ace/lib/lang\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+var lang = require("../../lib/lang");\n
+\n
+var SAFE_INSERT_IN_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator"];\n
+var SAFE_INSERT_BEFORE_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator", "comment"];\n
+\n
+\n
+var autoInsertedBrackets = 0;\n
+var autoInsertedRow = -1;\n
+var autoInsertedLineEnd = "";\n
+var maybeInsertedBrackets = 0;\n
+var maybeInsertedRow = -1;\n
+var maybeInsertedLineStart = "";\n
+var maybeInsertedLineEnd = "";\n
+\n
+var CstyleBehaviour = function () {\n
+    \n
+    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n
+        var cursor = editor.getCursorPosition();\n
+        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+        if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {\n
+            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n
+            if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))\n
+                return false;\n
+        }\n
+        iterator.stepForward();\n
+        return iterator.getCurrentTokenRow() !== cursor.row ||\n
+            this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);\n
+    };\n
+    \n
+    CstyleBehaviour.$matchTokenType = function(token, types) {\n
+        return types.indexOf(token.type || token) > -1;\n
+    };\n
+    \n
+    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n
+            autoInsertedBrackets = 0;\n
+        autoInsertedRow = cursor.row;\n
+        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n
+        autoInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isMaybeInsertedClosing(cursor, line))\n
+            maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = cursor.row;\n
+        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n
+        maybeInsertedLineEnd = line.substr(cursor.column);\n
+        maybeInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n
+        return autoInsertedBrackets > 0 &&\n
+            cursor.row === autoInsertedRow &&\n
+            bracket === autoInsertedLineEnd[0] &&\n
+            line.substr(cursor.column) === autoInsertedLineEnd;\n
+    };\n
+    \n
+    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n
+        return maybeInsertedBrackets > 0 &&\n
+            cursor.row === maybeInsertedRow &&\n
+            line.substr(cursor.column) === maybeInsertedLineEnd &&\n
+            line.substr(0, cursor.column) == maybeInsertedLineStart;\n
+    };\n
+    \n
+    CstyleBehaviour.popAutoInsertedClosing = function() {\n
+        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n
+        autoInsertedBrackets--;\n
+    };\n
+    \n
+    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n
+        maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = -1;\n
+    };\n
+\n
+    this.add("braces", "insertion", function (state, action, editor, session, text) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (text == \'{\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'{\' + selected + \'}\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n
+                    CstyleBehaviour.recordAutoInsert(editor, session, "}");\n
+                    return {\n
+                        text: \'{}\',\n
+                        selection: [1, 1]\n
+                    };\n
+                } else {\n
+                    CstyleBehaviour.recordMaybeInsert(editor, session, "{");\n
+                    return {\n
+                        text: \'{\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == \'}\') {\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\') {\n
+                var matching = session.$findOpeningBracket(\'}\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == "\\n" || text == "\\r\\n") {\n
+            var closing = "";\n
+            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n
+                closing = lang.stringRepeat("}", maybeInsertedBrackets);\n
+                CstyleBehaviour.clearMaybeInsertedClosing();\n
+            }\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\' || closing !== "") {\n
+                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, \'}\');\n
+                if (!openBracePos)\n
+                     return null;\n
+\n
+                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n
+                var next_indent = this.$getIndent(line);\n
+\n
+                return {\n
+                    text: \'\\n\' + indent + \'\\n\' + next_indent + closing,\n
+                    selection: [1, indent.length, 1, indent.length]\n
+                };\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("braces", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'{\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.end.column, range.end.column + 1);\n
+            if (rightChar == \'}\') {\n
+                range.end.column++;\n
+                return range;\n
+            } else {\n
+                maybeInsertedBrackets--;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'(\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'(\' + selected + \')\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, ")");\n
+                return {\n
+                    text: \'()\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \')\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \')\') {\n
+                var matching = session.$findOpeningBracket(\')\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'(\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \')\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'[\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'[\' + selected + \']\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, "]");\n
+                return {\n
+                    text: \'[]\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \']\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \']\') {\n
+                var matching = session.$findOpeningBracket(\']\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'[\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \']\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'"\' || text == "\'") {\n
+            var quote = text;\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "\'" && selected != \'"\' && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: quote + selected + quote,\n
+                    selection: false\n
+                };\n
+            } else {\n
+                var cursor = editor.getCursorPosition();\n
+                var line = session.doc.getLine(cursor.row);\n
+                var leftChar = line.substring(cursor.column-1, cursor.column);\n
+                if (leftChar == \'\\\\\') {\n
+                    return null;\n
+                }\n
+                var tokens = session.getTokens(selection.start.row);\n
+                var col = 0, token;\n
+                var quotepos = -1; // Track whether we\'re inside an open quote.\n
+\n
+                for (var x = 0; x < tokens.length; x++) {\n
+                    token = tokens[x];\n
+                    if (token.type == "string") {\n
+                      quotepos = -1;\n
+                    } else if (quotepos < 0) {\n
+                      quotepos = token.value.indexOf(quote);\n
+                    }\n
+                    if ((token.value.length + col) > selection.start.column) {\n
+                        break;\n
+                    }\n
+                    col += tokens[x].value.length;\n
+                }\n
+                if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n
+                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n
+                        return;\n
+                    return {\n
+                        text: quote + quote,\n
+                        selection: [1,1]\n
+                    };\n
+                } else if (token && token.type === "string") {\n
+                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+                    if (rightChar == quote) {\n
+                        return {\n
+                            text: \'\',\n
+                            selection: [1, 1]\n
+                        };\n
+                    }\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && (selected == \'"\' || selected == "\'")) {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == selected) {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+};\n
+\n
+oop.inherits(CstyleBehaviour, Behaviour);\n
+\n
+exports.CstyleBehaviour = CstyleBehaviour;\n
+});\n
+\n
+define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Range = require("../../range").Range;\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(commentRegex) {\n
+    if (commentRegex) {\n
+        this.foldingStartMarker = new RegExp(\n
+            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
+        );\n
+        this.foldingStopMarker = new RegExp(\n
+            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
+        );\n
+    }\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n
+    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var line = session.getLine(row);\n
+        var match = line.match(this.foldingStartMarker);\n
+        if (match) {\n
+            var i = match.index;\n
+\n
+            if (match[1])\n
+                return this.openingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i + match[0].length, 1);\n
+        }\n
+\n
+        if (foldStyle !== "markbeginend")\n
+            return;\n
+\n
+        var match = line.match(this.foldingStopMarker);\n
+        if (match) {\n
+            var i = match.index + match[0].length;\n
+\n
+            if (match[1])\n
+                return this.closingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i, -1);\n
+        }\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var SJSHighlightRules = function() {\n
+    var parent = new JavaScriptHighlightRules();\n
+    var escapedRe = "\\\\\\\\(?:x[0-9a-fA-F]{2}|" + // hex\n
+        "u[0-9a-fA-F]{4}|" + // unicode\n
+        "[0-2][0-7]{0,2}|" + // oct\n
+        "3[0-6][0-7]?|" + // oct\n
+        "37[0-7]?|" + // oct\n
+        "[4-7][0-7]?|" + //oct\n
+        ".)";\n
+\n
+    var contextAware = function(f) {\n
+        f.isContextAware = true;\n
+        return f;\n
+    };\n
+\n
+    var ctxBegin = function(opts) {\n
+        return {\n
+            token: opts.token,\n
+            regex: opts.regex,\n
+            next: contextAware(function(currentState, stack) {\n
+                if (stack.length === 0)\n
+                    stack.unshift(currentState);\n
+                stack.unshift(opts.next);\n
+                return opts.next;\n
+            }),\n
+        };\n
+    };\n
+\n
+    var ctxEnd = function(opts) {\n
+        return {\n
+            token: opts.token,\n
+            regex: opts.regex,\n
+            next: contextAware(function(currentState, stack) {\n
+                stack.shift();\n
+                return stack[0] || "start";\n
+            }),\n
+        };\n
+    };\n
+\n
+    this.$rules = parent.$rules;\n
+    this.$rules.no_regex = [\n
+        {\n
+            token: "keyword",\n
+            regex: "(waitfor|or|and|collapse|spawn|retract)\\\\b"\n
+        },\n
+        {\n
+            token: "keyword.operator",\n
+            regex: "(->|=>|\\\\.\\\\.)"\n
+        },\n
+        {\n
+            token: "variable.language",\n
+            regex: "(hold|default)\\\\b"\n
+        },\n
+        ctxBegin({\n
+            token: "string",\n
+            regex: "`",\n
+            next: "bstring"\n
+        }),\n
+        ctxBegin({\n
+            token: "string",\n
+            regex: \'"\',\n
+            next: "qqstring"\n
+        }),\n
+        ctxBegin({\n
+            token: "string",\n
+            regex: \'"\',\n
+            next: "qqstring"\n
+        }),\n
+        {\n
+            token: ["paren.lparen", "text", "paren.rparen"],\n
+            regex: "(\\\\{)(\\\\s*)(\\\\|)",\n
+            next: "block_arguments",\n
+        }\n
+\n
+    ].concat(this.$rules.no_regex);\n
+\n
+    this.$rules.block_arguments = [\n
+        {\n
+            token: "paren.rparen",\n
+            regex: "\\\\|",\n
+            next: "no_regex",\n
+        }\n
+    ].concat(this.$rules.function_arguments);\n
+\n
+    this.$rules.bstring = [\n
+        {\n
+            token : "constant.language.escape",\n
+            regex : escapedRe\n
+        },\n
+        {\n
+            token : "string",\n
+            regex : "\\\\\\\\$",\n
+            next: "bstring"\n
+        },\n
+        ctxBegin({\n
+            token : "paren.lparen",\n
+            regex : "\\\\$\\\\{",\n
+            next: "string_interp"\n
+        }),\n
+        ctxBegin({\n
+            token : "paren.lparen",\n
+            regex : "\\\\$",\n
+            next: "bstring_interp_single"\n
+        }),\n
+        ctxEnd({\n
+            token : "string",\n
+            regex : "`",\n
+        }),\n
+        {\n
+            defaultToken: "string"\n
+        }\n
+    ];\n
+    \n
+    this.$rules.qqstring = [\n
+        {\n
+            token : "constant.language.escape",\n
+            regex : escapedRe\n
+        },\n
+        {\n
+            token : "string",\n
+            regex : "\\\\\\\\$",\n
+            next: "qqstring",\n
+        },\n
+        ctxBegin({\n
+            token : "paren.lparen",\n
+            regex : "#\\\\{",\n
+            next: "string_interp"\n
+        }),\n
+        ctxEnd({\n
+            token : "string",\n
+            regex : \'"\',\n
+        }),\n
+        {\n
+            defaultToken: "string"\n
+        }\n
+    ];\n
+    var embeddableRules = [];\n
+    for (var i=0; i<this.$rules.no_regex.length; i++) {\n
+        var rule = this.$rules.no_regex[i];\n
+        var token = String(rule.token);\n
+        if(token.indexOf(\'paren\') == -1 && (!rule.next || rule.next.isContextAware)) {\n
+            embeddableRules.push(rule);\n
+        }\n
+    };\n
+\n
+    this.$rules.string_interp = [\n
+        ctxEnd({\n
+            token: "paren.rparen",\n
+            regex: "\\\\}"\n
+        }),\n
+        ctxBegin({\n
+            token: "paren.lparen",\n
+            regex: \'{\',\n
+            next: "string_interp"\n
+        }),\n
+    ].concat(embeddableRules);\n
+    this.$rules.bstring_interp_single = [\n
+        {\n
+            token: ["identifier", "paren.lparen"],\n
+            regex: \'(\\\\w+)(\\\\()\',\n
+            next: \'bstring_interp_single_call\'\n
+        },\n
+        ctxEnd({\n
+            token : "identifier",\n
+            regex : "\\\\w*",\n
+        })\n
+    ];\n
+    this.$rules.bstring_interp_single_call = [\n
+        ctxBegin({\n
+            token: "paren.lparen",\n
+            regex: "\\\\(",\n
+            next: "bstring_interp_single_call"\n
+        }),\n
+        ctxEnd({\n
+            token: "paren.rparen",\n
+            regex: "\\\\)"\n
+        })\n
+    ].concat(embeddableRules);\n
+}\n
+oop.inherits(SJSHighlightRules, TextHighlightRules);\n
+\n
+exports.SJSHighlightRules = SJSHighlightRules;\n
+});\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>44535</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-snippets.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-snippets.js.xml
index 03ffbcb6c7..6d4c67f286 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-snippets.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-snippets.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155564.07</string> </value>
+            <value> <string>ts83646621.22</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -108,7 +108,7 @@ var SnippetGroupHighlightRules = function() {\n
 \t\t{onMatch: function(value, state, stack) {\n
 \t\t\tstack.splice(stack.length);\n
 \t\t\treturn this.tokenName;\n
-\t\t}, tokenName: "text", regex: "^(?!\\t)", next: "start"},\n
+\t\t}, tokenName: "text", regex: "^(?!\\t)", next: "start"}\n
 \t])\n
 \t\n
 };\n
@@ -120,16 +120,13 @@ exports.SnippetGroupHighlightRules = SnippetGroupHighlightRules;\n
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new SnippetGroupHighlightRules();\n
+    this.HighlightRules = SnippetGroupHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
 (function() {\n
-    this.getNextLineIndent = function(state, line, tab) {\n
-        return this.$getIndent(line);\n
-    };\n
+    this.$indentWithTabs = true;\n
 }).call(Mode.prototype);\n
 exports.Mode = Mode;\n
 \n
@@ -232,7 +229,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>6849</int> </value>
+            <value> <int>6715</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-soy_template.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-soy_template.js.xml
new file mode 100644
index 0000000000..c8522d1b73
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-soy_template.js.xml
@@ -0,0 +1,2715 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.22</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-soy_template.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>103670</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2012, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ *\n
+ * Contributor(s):\n
+ *\n
+ *\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/mode/soy_template\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/html\', \'ace/tokenizer\', \'ace/mode/soy_template_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var HtmlMode = require("./html").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var SoyTemplateHighlightRules = require("./soy_template_highlight_rules").SoyTemplateHighlightRules;\n
+\n
+var Mode = function() {\n
+    HtmlMode.call(this);\n
+    this.HighlightRules = SoyTemplateHighlightRules;\n
+};\n
+oop.inherits(Mode, HtmlMode);\n
+\n
+(function() {\n
+    this.lineCommentStart = "//";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/mode/javascript\', \'ace/mode/css\', \'ace/tokenizer\', \'ace/mode/html_highlight_rules\', \'ace/mode/behaviour/html\', \'ace/mode/folding/html\', \'ace/mode/html_completions\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var JavaScriptMode = require("./javascript").Mode;\n
+var CssMode = require("./css").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
+var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
+var HtmlFoldMode = require("./folding/html").FoldMode;\n
+var HtmlCompletions = require("./html_completions").HtmlCompletions;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = HtmlHighlightRules;\n
+    this.$behaviour = new HtmlBehaviour();\n
+    this.$completer = new HtmlCompletions();\n
+    \n
+    this.createModeDelegates({\n
+        "js-": JavaScriptMode,\n
+        "css-": CssMode\n
+    });\n
+    \n
+    this.foldingRules = new HtmlFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.blockComment = {start: "<!--", end: "-->"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        return this.$getIndent(line);\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return false;\n
+    };\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        return this.$completer.getCompletions(state, session, pos, prefix);\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/javascript\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/javascript_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/range\', \'ace/worker/worker_client\', \'ace/mode/behaviour/cstyle\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var Range = require("../range").Range;\n
+var WorkerClient = require("../worker/worker_client").WorkerClient;\n
+var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CstyleBehaviour();\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.lineCommentStart = "//";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        var indent = this.$getIndent(line);\n
+\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
+        var tokens = tokenizedLine.tokens;\n
+        var endState = tokenizedLine.state;\n
+\n
+        if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
+            return indent;\n
+        }\n
+\n
+        if (state == "start" || state == "no_regex") {\n
+            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n
+            if (match) {\n
+                indent += tab;\n
+            }\n
+        } else if (state == "doc-start") {\n
+            if (endState == "start" || endState == "no_regex") {\n
+                return "";\n
+            }\n
+            var match = line.match(/^\\s*(\\/?)\\*/);\n
+            if (match) {\n
+                if (match[1]) {\n
+                    indent += " ";\n
+                }\n
+                indent += "* ";\n
+            }\n
+        }\n
+\n
+        return indent;\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return this.$outdent.checkOutdent(line, input);\n
+    };\n
+\n
+    this.autoOutdent = function(state, doc, row) {\n
+        this.$outdent.autoOutdent(doc, row);\n
+    };\n
+\n
+    this.createWorker = function(session) {\n
+        var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker");\n
+        worker.attachToDocument(session.getDocument());\n
+\n
+        worker.on("jslint", function(results) {\n
+            session.setAnnotations(results.data);\n
+        });\n
+\n
+        worker.on("terminate", function() {\n
+            session.clearAnnotations();\n
+        });\n
+\n
+        return worker;\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var JavaScriptHighlightRules = function() {\n
+    var keywordMapper = this.createKeywordMapper({\n
+        "variable.language":\n
+            "Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|"  + // Constructors\n
+            "Namespace|QName|XML|XMLList|"                                             + // E4X\n
+            "ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|"   +\n
+            "Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|"                    +\n
+            "Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|"   + // Errors\n
+            "SyntaxError|TypeError|URIError|"                                          +\n
+            "decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions\n
+            "isNaN|parseFloat|parseInt|"                                               +\n
+            "JSON|Math|"                                                               + // Other\n
+            "this|arguments|prototype|window|document"                                 , // Pseudo\n
+        "keyword":\n
+            "const|yield|import|get|set|" +\n
+            "break|case|catch|continue|default|delete|do|else|finally|for|function|" +\n
+            "if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +\n
+            "__parent__|__count__|escape|unescape|with|__proto__|" +\n
+            "class|enum|extends|super|export|implements|private|public|interface|package|protected|static",\n
+        "storage.type":\n
+            "const|let|var|function",\n
+        "constant.language":\n
+            "null|Infinity|NaN|undefined",\n
+        "support.function":\n
+            "alert",\n
+        "constant.language.boolean": "true|false"\n
+    }, "identifier");\n
+    var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";\n
+    var identifierRe = "[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b";\n
+\n
+    var escapedRe = "\\\\\\\\(?:x[0-9a-fA-F]{2}|" + // hex\n
+        "u[0-9a-fA-F]{4}|" + // unicode\n
+        "[0-2][0-7]{0,2}|" + // oct\n
+        "3[0-6][0-7]?|" + // oct\n
+        "37[0-7]?|" + // oct\n
+        "[4-7][0-7]?|" + //oct\n
+        ".)";\n
+\n
+    this.$rules = {\n
+        "no_regex" : [\n
+            {\n
+                token : "comment",\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
+            },\n
+            DocCommentHighlightRules.getStartRule("doc-start"),\n
+            {\n
+                token : "comment", // multi line comment\n
+                regex : /\\/\\*/,\n
+                next : "comment"\n
+            }, {\n
+                token : "string",\n
+                regex : "\'(?=.)",\n
+                next  : "qstring"\n
+            }, {\n
+                token : "string",\n
+                regex : \'"(?=.)\',\n
+                next  : "qqstring"\n
+            }, {\n
+                token : "constant.numeric", // hex\n
+                regex : /0[xX][0-9a-fA-F]+\\b/\n
+            }, {\n
+                token : "constant.numeric", // float\n
+                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "support.function",\n
+                    "punctuation.operator", "entity.name.function", "text","keyword.operator"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(prototype)(\\\\.)(" + identifierRe +")(\\\\s*)(=)",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "entity.name.function", "text",\n
+                    "keyword.operator", "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "entity.name.function", "text", "keyword.operator", "text", "storage.type",\n
+                    "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "punctuation.operator", "entity.name.function", "text",\n
+                    "keyword.operator", "text",\n
+                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\.)(" + identifierRe +")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "storage.type", "text", "entity.name.function", "text", "paren.lparen"\n
+                ],\n
+                regex : "(function)(\\\\s+)(" + identifierRe + ")(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "entity.name.function", "text", "punctuation.operator",\n
+                    "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(" + identifierRe + ")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : [\n
+                    "text", "text", "storage.type", "text", "paren.lparen"\n
+                ],\n
+                regex : "(:)(\\\\s*)(function)(\\\\s*)(\\\\()",\n
+                next: "function_arguments"\n
+            }, {\n
+                token : "keyword",\n
+                regex : "(?:" + kwBeforeRe + ")\\\\b",\n
+                next : "start"\n
+            }, {\n
+                token : ["punctuation.operator", "support.function"],\n
+                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(?=\\()/\n
+            }, {\n
+                token : ["punctuation.operator", "support.function.dom"],\n
+                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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
+            }, {\n
+                token : ["punctuation.operator", "support.constant"],\n
+                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/\n
+            }, {\n
+                token : ["storage.type", "punctuation.operator", "support.function.firebug"],\n
+                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n
+            }, {\n
+                token : keywordMapper,\n
+                regex : identifierRe\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : /--|\\+\\+|[!$%&*+\\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=/,\n
+                next  : "start"\n
+            }, {\n
+                token : "punctuation.operator",\n
+                regex : /\\?|\\:|\\,|\\;|\\./,\n
+                next  : "start"\n
+            }, {\n
+                token : "paren.lparen",\n
+                regex : /[\\[({]/,\n
+                next  : "start"\n
+            }, {\n
+                token : "paren.rparen",\n
+                regex : /[\\])}]/\n
+            }, {\n
+                token : "keyword.operator",\n
+                regex : /\\/=?/,\n
+                next  : "start"\n
+            }, {\n
+                token: "comment",\n
+                regex: /^#!.*$/\n
+            }\n
+        ],\n
+        "start": [\n
+            DocCommentHighlightRules.getStartRule("doc-start"),\n
+            {\n
+                token : "comment", // multi line comment\n
+                regex : "\\\\/\\\\*",\n
+                next : "comment_regex_allowed"\n
+            }, {\n
+                token : "comment",\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
+            }, {\n
+                token: "string.regexp",\n
+                regex: "\\\\/",\n
+                next: "regex"\n
+            }, {\n
+                token : "text",\n
+                regex : "\\\\s+|^$",\n
+                next : "start"\n
+            }, {\n
+                token: "empty",\n
+                regex: "",\n
+                next: "no_regex"\n
+            }\n
+        ],\n
+        "regex": [\n
+            {\n
+                token: "regexp.keyword.operator",\n
+                regex: "\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)"\n
+            }, {\n
+                token: "string.regexp",\n
+                regex: "/\\\\w*",\n
+                next: "no_regex"\n
+            }, {\n
+                token : "invalid",\n
+                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n
+            }, {\n
+                token : "constant.language.escape",\n
+                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?]/\n
+            }, {\n
+                token : "constant.language.delimiter",\n
+                regex: /\\|/\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: /\\[\\^?/,\n
+                next: "regex_character_class"\n
+            }, {\n
+                token: "empty",\n
+                regex: "$",\n
+                next: "no_regex"\n
+            }, {\n
+                defaultToken: "string.regexp"\n
+            }\n
+        ],\n
+        "regex_character_class": [\n
+            {\n
+                token: "regexp.keyword.operator",\n
+                regex: "\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)"\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: "]",\n
+                next: "regex"\n
+            }, {\n
+                token: "constant.language.escape",\n
+                regex: "-"\n
+            }, {\n
+                token: "empty",\n
+                regex: "$",\n
+                next: "no_regex"\n
+            }, {\n
+                defaultToken: "string.regexp.charachterclass"\n
+            }\n
+        ],\n
+        "function_arguments": [\n
+            {\n
+                token: "variable.parameter",\n
+                regex: identifierRe\n
+            }, {\n
+                token: "punctuation.operator",\n
+                regex: "[, ]+"\n
+            }, {\n
+                token: "punctuation.operator",\n
+                regex: "$"\n
+            }, {\n
+                token: "empty",\n
+                regex: "",\n
+                next: "no_regex"\n
+            }\n
+        ],\n
+        "comment_regex_allowed" : [\n
+            {token : "comment", regex : "\\\\*\\\\/", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "comment" : [\n
+            {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "qqstring" : [\n
+            {\n
+                token : "constant.language.escape",\n
+                regex : escapedRe\n
+            }, {\n
+                token : "string",\n
+                regex : "\\\\\\\\$",\n
+                next  : "qqstring"\n
+            }, {\n
+                token : "string",\n
+                regex : \'"|$\',\n
+                next  : "no_regex"\n
+            }, {\n
+                defaultToken: "string"\n
+            }\n
+        ],\n
+        "qstring" : [\n
+            {\n
+                token : "constant.language.escape",\n
+                regex : escapedRe\n
+            }, {\n
+                token : "string",\n
+                regex : "\\\\\\\\$",\n
+                next  : "qstring"\n
+            }, {\n
+                token : "string",\n
+                regex : "\'|$",\n
+                next  : "no_regex"\n
+            }, {\n
+                defaultToken: "string"\n
+            }\n
+        ]\n
+    };\n
+\n
+    this.embedRules(DocCommentHighlightRules, "doc-",\n
+        [ DocCommentHighlightRules.getEndRule("no_regex") ]);\n
+};\n
+\n
+oop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n
+\n
+exports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/doc_comment_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var DocCommentHighlightRules = function() {\n
+\n
+    this.$rules = {\n
+        "start" : [ {\n
+            token : "comment.doc.tag",\n
+            regex : "@[\\\\w\\\\d_]+" // TODO: fix email addresses\n
+        }, {\n
+            token : "comment.doc.tag",\n
+            regex : "\\\\bTODO\\\\b"\n
+        }, {\n
+            defaultToken : "comment.doc"\n
+        }]\n
+    };\n
+};\n
+\n
+oop.inherits(DocCommentHighlightRules, TextHighlightRules);\n
+\n
+DocCommentHighlightRules.getStartRule = function(start) {\n
+    return {\n
+        token : "comment.doc", // doc comment\n
+        regex : "\\\\/\\\\*(?=\\\\*)",\n
+        next  : start\n
+    };\n
+};\n
+\n
+DocCommentHighlightRules.getEndRule = function (start) {\n
+    return {\n
+        token : "comment.doc", // closing comment\n
+        regex : "\\\\*\\\\/",\n
+        next  : start\n
+    };\n
+};\n
+\n
+\n
+exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
+\n
+});\n
+\n
+define(\'ace/mode/matching_brace_outdent\', [\'require\', \'exports\', \'module\' , \'ace/range\'], function(require, exports, module) {\n
+\n
+\n
+var Range = require("../range").Range;\n
+\n
+var MatchingBraceOutdent = function() {};\n
+\n
+(function() {\n
+\n
+    this.checkOutdent = function(line, input) {\n
+        if (! /^\\s+$/.test(line))\n
+            return false;\n
+\n
+        return /^\\s*\\}/.test(input);\n
+    };\n
+\n
+    this.autoOutdent = function(doc, row) {\n
+        var line = doc.getLine(row);\n
+        var match = line.match(/^(\\s*\\})/);\n
+\n
+        if (!match) return 0;\n
+\n
+        var column = match[1].length;\n
+        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n
+\n
+        if (!openBracePos || openBracePos.row == row) return 0;\n
+\n
+        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n
+        doc.replace(new Range(row, 0, row, column-1), indent);\n
+    };\n
+\n
+    this.$getIndent = function(line) {\n
+        return line.match(/^\\s*/)[0];\n
+    };\n
+\n
+}).call(MatchingBraceOutdent.prototype);\n
+\n
+exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
+});\n
+\n
+define(\'ace/mode/behaviour/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour\', \'ace/token_iterator\', \'ace/lib/lang\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+var lang = require("../../lib/lang");\n
+\n
+var SAFE_INSERT_IN_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator"];\n
+var SAFE_INSERT_BEFORE_TOKENS =\n
+    ["text", "paren.rparen", "punctuation.operator", "comment"];\n
+\n
+\n
+var autoInsertedBrackets = 0;\n
+var autoInsertedRow = -1;\n
+var autoInsertedLineEnd = "";\n
+var maybeInsertedBrackets = 0;\n
+var maybeInsertedRow = -1;\n
+var maybeInsertedLineStart = "";\n
+var maybeInsertedLineEnd = "";\n
+\n
+var CstyleBehaviour = function () {\n
+    \n
+    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n
+        var cursor = editor.getCursorPosition();\n
+        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+        if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) {\n
+            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n
+            if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS))\n
+                return false;\n
+        }\n
+        iterator.stepForward();\n
+        return iterator.getCurrentTokenRow() !== cursor.row ||\n
+            this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS);\n
+    };\n
+    \n
+    CstyleBehaviour.$matchTokenType = function(token, types) {\n
+        return types.indexOf(token.type || token) > -1;\n
+    };\n
+    \n
+    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n
+            autoInsertedBrackets = 0;\n
+        autoInsertedRow = cursor.row;\n
+        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n
+        autoInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (!this.isMaybeInsertedClosing(cursor, line))\n
+            maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = cursor.row;\n
+        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n
+        maybeInsertedLineEnd = line.substr(cursor.column);\n
+        maybeInsertedBrackets++;\n
+    };\n
+    \n
+    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n
+        return autoInsertedBrackets > 0 &&\n
+            cursor.row === autoInsertedRow &&\n
+            bracket === autoInsertedLineEnd[0] &&\n
+            line.substr(cursor.column) === autoInsertedLineEnd;\n
+    };\n
+    \n
+    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n
+        return maybeInsertedBrackets > 0 &&\n
+            cursor.row === maybeInsertedRow &&\n
+            line.substr(cursor.column) === maybeInsertedLineEnd &&\n
+            line.substr(0, cursor.column) == maybeInsertedLineStart;\n
+    };\n
+    \n
+    CstyleBehaviour.popAutoInsertedClosing = function() {\n
+        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n
+        autoInsertedBrackets--;\n
+    };\n
+    \n
+    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n
+        maybeInsertedBrackets = 0;\n
+        maybeInsertedRow = -1;\n
+    };\n
+\n
+    this.add("braces", "insertion", function (state, action, editor, session, text) {\n
+        var cursor = editor.getCursorPosition();\n
+        var line = session.doc.getLine(cursor.row);\n
+        if (text == \'{\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'{\' + selected + \'}\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n
+                    CstyleBehaviour.recordAutoInsert(editor, session, "}");\n
+                    return {\n
+                        text: \'{}\',\n
+                        selection: [1, 1]\n
+                    };\n
+                } else {\n
+                    CstyleBehaviour.recordMaybeInsert(editor, session, "{");\n
+                    return {\n
+                        text: \'{\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == \'}\') {\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\') {\n
+                var matching = session.$findOpeningBracket(\'}\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        } else if (text == "\\n" || text == "\\r\\n") {\n
+            var closing = "";\n
+            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n
+                closing = lang.stringRepeat("}", maybeInsertedBrackets);\n
+                CstyleBehaviour.clearMaybeInsertedClosing();\n
+            }\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \'}\' || closing !== "") {\n
+                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column}, \'}\');\n
+                if (!openBracePos)\n
+                     return null;\n
+\n
+                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n
+                var next_indent = this.$getIndent(line);\n
+\n
+                return {\n
+                    text: \'\\n\' + indent + \'\\n\' + next_indent + closing,\n
+                    selection: [1, indent.length, 1, indent.length]\n
+                };\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("braces", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'{\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.end.column, range.end.column + 1);\n
+            if (rightChar == \'}\') {\n
+                range.end.column++;\n
+                return range;\n
+            } else {\n
+                maybeInsertedBrackets--;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'(\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'(\' + selected + \')\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, ")");\n
+                return {\n
+                    text: \'()\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \')\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \')\') {\n
+                var matching = session.$findOpeningBracket(\')\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("parens", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'(\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \')\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'[\') {\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: \'[\' + selected + \']\',\n
+                    selection: false\n
+                };\n
+            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n
+                CstyleBehaviour.recordAutoInsert(editor, session, "]");\n
+                return {\n
+                    text: \'[]\',\n
+                    selection: [1, 1]\n
+                };\n
+            }\n
+        } else if (text == \']\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar == \']\') {\n
+                var matching = session.$findOpeningBracket(\']\', {column: cursor.column + 1, row: cursor.row});\n
+                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n
+                    CstyleBehaviour.popAutoInsertedClosing();\n
+                    return {\n
+                        text: \'\',\n
+                        selection: [1, 1]\n
+                    };\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("brackets", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected == \'[\') {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == \']\') {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'"\' || text == "\'") {\n
+            var quote = text;\n
+            var selection = editor.getSelectionRange();\n
+            var selected = session.doc.getTextRange(selection);\n
+            if (selected !== "" && selected !== "\'" && selected != \'"\' && editor.getWrapBehavioursEnabled()) {\n
+                return {\n
+                    text: quote + selected + quote,\n
+                    selection: false\n
+                };\n
+            } else {\n
+                var cursor = editor.getCursorPosition();\n
+                var line = session.doc.getLine(cursor.row);\n
+                var leftChar = line.substring(cursor.column-1, cursor.column);\n
+                if (leftChar == \'\\\\\') {\n
+                    return null;\n
+                }\n
+                var tokens = session.getTokens(selection.start.row);\n
+                var col = 0, token;\n
+                var quotepos = -1; // Track whether we\'re inside an open quote.\n
+\n
+                for (var x = 0; x < tokens.length; x++) {\n
+                    token = tokens[x];\n
+                    if (token.type == "string") {\n
+                      quotepos = -1;\n
+                    } else if (quotepos < 0) {\n
+                      quotepos = token.value.indexOf(quote);\n
+                    }\n
+                    if ((token.value.length + col) > selection.start.column) {\n
+                        break;\n
+                    }\n
+                    col += tokens[x].value.length;\n
+                }\n
+                if (!token || (quotepos < 0 && token.type !== "comment" && (token.type !== "string" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n
+                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n
+                        return;\n
+                    return {\n
+                        text: quote + quote,\n
+                        selection: [1,1]\n
+                    };\n
+                } else if (token && token.type === "string") {\n
+                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+                    if (rightChar == quote) {\n
+                        return {\n
+                            text: \'\',\n
+                            selection: [1, 1]\n
+                        };\n
+                    }\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && (selected == \'"\' || selected == "\'")) {\n
+            var line = session.doc.getLine(range.start.row);\n
+            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n
+            if (rightChar == selected) {\n
+                range.end.column++;\n
+                return range;\n
+            }\n
+        }\n
+    });\n
+\n
+};\n
+\n
+oop.inherits(CstyleBehaviour, Behaviour);\n
+\n
+exports.CstyleBehaviour = CstyleBehaviour;\n
+});\n
+\n
+define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Range = require("../../range").Range;\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(commentRegex) {\n
+    if (commentRegex) {\n
+        this.foldingStartMarker = new RegExp(\n
+            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
+        );\n
+        this.foldingStopMarker = new RegExp(\n
+            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
+        );\n
+    }\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n
+    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var line = session.getLine(row);\n
+        var match = line.match(this.foldingStartMarker);\n
+        if (match) {\n
+            var i = match.index;\n
+\n
+            if (match[1])\n
+                return this.openingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i + match[0].length, 1);\n
+        }\n
+\n
+        if (foldStyle !== "markbeginend")\n
+            return;\n
+\n
+        var match = line.match(this.foldingStopMarker);\n
+        if (match) {\n
+            var i = match.index + match[0].length;\n
+\n
+            if (match[1])\n
+                return this.closingBracketBlock(session, match[1], row, i);\n
+\n
+            return session.getCommentFoldRange(row, i, -1);\n
+        }\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+\n
+define(\'ace/mode/css\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/css_highlight_rules\', \'ace/mode/matching_brace_outdent\', \'ace/worker/worker_client\', \'ace/mode/behaviour/css\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
+var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
+var WorkerClient = require("../worker/worker_client").WorkerClient;\n
+var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
+var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
+\n
+var Mode = function() {\n
+    this.HighlightRules = CssHighlightRules;\n
+    this.$outdent = new MatchingBraceOutdent();\n
+    this.$behaviour = new CssBehaviour();\n
+    this.foldingRules = new CStyleFoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+\n
+(function() {\n
+\n
+    this.foldingRules = "cStyle";\n
+    this.blockComment = {start: "/*", end: "*/"};\n
+\n
+    this.getNextLineIndent = function(state, line, tab) {\n
+        var indent = this.$getIndent(line);\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
+        if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
+            return indent;\n
+        }\n
+\n
+        var match = line.match(/^.*\\{\\s*$/);\n
+        if (match) {\n
+            indent += tab;\n
+        }\n
+\n
+        return indent;\n
+    };\n
+\n
+    this.checkOutdent = function(state, line, input) {\n
+        return this.$outdent.checkOutdent(line, input);\n
+    };\n
+\n
+    this.autoOutdent = function(state, doc, row) {\n
+        this.$outdent.autoOutdent(doc, row);\n
+    };\n
+\n
+    this.createWorker = function(session) {\n
+        var worker = new WorkerClient(["ace"], "ace/mode/css_worker", "Worker");\n
+        worker.attachToDocument(session.getDocument());\n
+\n
+        worker.on("csslint", function(e) {\n
+            session.setAnnotations(e.data);\n
+        });\n
+\n
+        worker.on("terminate", function() {\n
+            session.clearAnnotations();\n
+        });\n
+\n
+        return worker;\n
+    };\n
+\n
+}).call(Mode.prototype);\n
+\n
+exports.Mode = Mode;\n
+\n
+});\n
+\n
+define(\'ace/mode/css_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/lang\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+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|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";\n
+var supportFunction = exports.supportFunction = "rgb|rgba|url|attr|counter|counters";\n
+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";\n
+var supportConstantColor = exports.supportConstantColor = "aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow";\n
+var supportConstantFonts = exports.supportConstantFonts = "arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace";\n
+\n
+var numRe = exports.numRe = "\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))";\n
+var pseudoElements = exports.pseudoElements = "(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b";\n
+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";\n
+\n
+var CssHighlightRules = function() {\n
+\n
+    var keywordMapper = this.createKeywordMapper({\n
+        "support.function": supportFunction,\n
+        "support.constant": supportConstant,\n
+        "support.type": supportType,\n
+        "support.constant.color": supportConstantColor,\n
+        "support.constant.fonts": supportConstantFonts\n
+    }, "text", true);\n
+\n
+    this.$rules = {\n
+        "start" : [{\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token: "paren.lparen",\n
+            regex: "\\\\{",\n
+            push:  "ruleset"\n
+        }, {\n
+            token: "string",\n
+            regex: "@.*?{",\n
+            push:  "media"\n
+        }, {\n
+            token: "keyword",\n
+            regex: "#[a-z0-9-_]+"\n
+        }, {\n
+            token: "variable",\n
+            regex: "\\\\.[a-z0-9-_]+"\n
+        }, {\n
+            token: "string",\n
+            regex: ":[a-z0-9-_]+"\n
+        }, {\n
+            token: "constant",\n
+            regex: "[a-z0-9-_]+"\n
+        }, {\n
+            caseInsensitive: true\n
+        }],\n
+\n
+        "media" : [{\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token: "paren.lparen",\n
+            regex: "\\\\{",\n
+            push:  "ruleset"\n
+        }, {\n
+            token: "string",\n
+            regex: "\\\\}",\n
+            next:  "pop"\n
+        }, {\n
+            token: "keyword",\n
+            regex: "#[a-z0-9-_]+"\n
+        }, {\n
+            token: "variable",\n
+            regex: "\\\\.[a-z0-9-_]+"\n
+        }, {\n
+            token: "string",\n
+            regex: ":[a-z0-9-_]+"\n
+        }, {\n
+            token: "constant",\n
+            regex: "[a-z0-9-_]+"\n
+        }, {\n
+            caseInsensitive: true\n
+        }],\n
+\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
+\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
+    };\n
+\n
+    this.normalizeRules();\n
+};\n
+\n
+oop.inherits(CssHighlightRules, TextHighlightRules);\n
+\n
+exports.CssHighlightRules = CssHighlightRules;\n
+\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+\n
+var CssBehaviour = function () {\n
+\n
+    this.inherit(CstyleBehaviour);\n
+\n
+    this.add("colon", "insertion", function (state, action, editor, session, text) {\n
+        if (text === \':\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+            var token = iterator.getCurrentToken();\n
+            if (token && token.value.match(/\\s+/)) {\n
+                token = iterator.stepBackward();\n
+            }\n
+            if (token && token.type === \'support.type\') {\n
+                var line = session.doc.getLine(cursor.row);\n
+                var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+                if (rightChar === \':\') {\n
+                    return {\n
+                       text: \'\',\n
+                       selection: [1, 1]\n
+                    }\n
+                }\n
+                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n
+                    return {\n
+                       text: \':;\',\n
+                       selection: [1, 1]\n
+                    }\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("colon", "deletion", function (state, action, editor, session, range) {\n
+        var selected = session.doc.getTextRange(range);\n
+        if (!range.isMultiLine() && selected === \':\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n
+            var token = iterator.getCurrentToken();\n
+            if (token && token.value.match(/\\s+/)) {\n
+                token = iterator.stepBackward();\n
+            }\n
+            if (token && token.type === \'support.type\') {\n
+                var line = session.doc.getLine(range.start.row);\n
+                var rightChar = line.substring(range.end.column, range.end.column + 1);\n
+                if (rightChar === \';\') {\n
+                    range.end.column ++;\n
+                    return range;\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add("semicolon", "insertion", function (state, action, editor, session, text) {\n
+        if (text === \';\') {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.doc.getLine(cursor.row);\n
+            var rightChar = line.substring(cursor.column, cursor.column + 1);\n
+            if (rightChar === \';\') {\n
+                return {\n
+                   text: \'\',\n
+                   selection: [1, 1]\n
+                }\n
+            }\n
+        }\n
+    });\n
+\n
+}\n
+oop.inherits(CssBehaviour, CstyleBehaviour);\n
+\n
+exports.CssBehaviour = CssBehaviour;\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
+var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
+\n
+var tagMap = lang.createMap({\n
+    a           : \'anchor\',\n
+    button \t    : \'form\',\n
+    form        : \'form\',\n
+    img         : \'image\',\n
+    input       : \'form\',\n
+    label       : \'form\',\n
+    option      : \'form\',\n
+    script      : \'script\',\n
+    select      : \'form\',\n
+    textarea    : \'form\',\n
+    style       : \'style\',\n
+    table       : \'table\',\n
+    tbody       : \'table\',\n
+    td          : \'table\',\n
+    tfoot       : \'table\',\n
+    th          : \'table\',\n
+    tr          : \'table\'\n
+});\n
+\n
+var HtmlHighlightRules = function() {\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
+        }, {\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
+        }, {\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
+        }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+function string(state) {\n
+    return [{\n
+        token : "string",\n
+        regex : \'"\',\n
+        next : state + "_qqstring"\n
+    }, {\n
+        token : "string",\n
+        regex : "\'",\n
+        next : state + "_qstring"\n
+    }];\n
+}\n
+\n
+function multiLineString(quote, state) {\n
+    return [\n
+        {token : "string", regex : quote, next : state},\n
+        {\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
+        },\n
+        {defaultToken : "string"}\n
+    ];\n
+}\n
+\n
+exports.tag = function(states, name, nextState, tagMap) {\n
+    states[name] = [{\n
+        token : "text",\n
+        regex : "\\\\s+"\n
+    }, {\n
+        \n
+    token : !tagMap ? "meta.tag.tag-name" : function(value) {\n
+            if (tagMap[value])\n
+                return "meta.tag.tag-name." + tagMap[value];\n
+            else\n
+                return "meta.tag.tag-name";\n
+        },\n
+        regex : "[-_a-zA-Z0-9:]+",\n
+        next : name + "_embed_attribute_list" \n
+    }, {\n
+        token: "empty",\n
+        regex: "",\n
+        next : name + "_embed_attribute_list"\n
+    }];\n
+\n
+    states[name + "_qstring"] = multiLineString("\'", name + "_embed_attribute_list");\n
+    states[name + "_qqstring"] = multiLineString("\\"", name + "_embed_attribute_list");\n
+    \n
+    states[name + "_embed_attribute_list"] = [{\n
+        token : "meta.tag.r",\n
+        regex : "/?>",\n
+        next : nextState\n
+    }, {\n
+        token : "keyword.operator",\n
+        regex : "="\n
+    }, {\n
+        token : "entity.other.attribute-name",\n
+        regex : "[-_a-zA-Z0-9:]+"\n
+    }, {\n
+        token : "constant.numeric", // float\n
+        regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
+    }, {\n
+        token : "text",\n
+        regex : "\\\\s+"\n
+    }].concat(string(name));\n
+};\n
+\n
+});\n
+\n
+define(\'ace/mode/behaviour/html\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour/xml\', \'ace/mode/behaviour/cstyle\', \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var XmlBehaviour = require("../behaviour/xml").XmlBehaviour;\n
+var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+    return hasType;\n
+}\n
+\n
+var HtmlBehaviour = function () {\n
+\n
+    this.inherit(XmlBehaviour); // Get xml behaviour\n
+    \n
+    this.add("autoclosing", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'>\') {\n
+            var position = editor.getCursorPosition();\n
+            var iterator = new TokenIterator(session, position.row, position.column);\n
+            var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
+            var atCursor = false;\n
+            if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+                do {\n
+                    token = iterator.stepBackward();\n
+                } while (token && (hasType(token, \'string\') || hasType(token, \'keyword.operator\') || hasType(token, \'entity.attribute-name\') || hasType(token, \'text\')));\n
+            } else {\n
+                atCursor = true;\n
+            }\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
+            }\n
+            var element = token.value;\n
+            if (atCursor){\n
+                var element = element.substring(0, position.column - token.start);\n
+            }\n
+            if (voidElements.indexOf(element) !== -1){\n
+                return;\n
+            }\n
+            return {\n
+               text: \'>\' + \'</\' + element + \'>\',\n
+               selection: [1, 1]\n
+            }\n
+        }\n
+    });\n
+}\n
+oop.inherits(HtmlBehaviour, XmlBehaviour);\n
+\n
+exports.HtmlBehaviour = HtmlBehaviour;\n
+});\n
+\n
+define(\'ace/mode/behaviour/xml\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/behaviour\', \'ace/mode/behaviour/cstyle\', \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var Behaviour = require("../behaviour").Behaviour;\n
+var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+    return hasType;\n
+}\n
+\n
+var XmlBehaviour = function () {\n
+    \n
+    this.inherit(CstyleBehaviour, ["string_dquotes"]); // Get string behaviour\n
+    \n
+    this.add("autoclosing", "insertion", function (state, action, editor, session, text) {\n
+        if (text == \'>\') {\n
+            var position = editor.getCursorPosition();\n
+            var iterator = new TokenIterator(session, position.row, position.column);\n
+            var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
+            var atCursor = false;\n
+            if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+                do {\n
+                    token = iterator.stepBackward();\n
+                } while (token && (hasType(token, \'string\') || hasType(token, \'keyword.operator\') || hasType(token, \'entity.attribute-name\') || hasType(token, \'text\')));\n
+            } else {\n
+                atCursor = true;\n
+            }\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
+            }\n
+            var tag = token.value;\n
+            if (atCursor){\n
+                var tag = tag.substring(0, position.column - token.start);\n
+            }\n
+\n
+            return {\n
+               text: \'>\' + \'</\' + tag + \'>\',\n
+               selection: [1, 1]\n
+            }\n
+        }\n
+    });\n
+\n
+    this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
+        if (text == "\\n") {\n
+            var cursor = editor.getCursorPosition();\n
+            var line = session.getLine(cursor.row);\n
+            var rightChars = line.substring(cursor.column, cursor.column + 2);\n
+            if (rightChars == \'</\') {\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
+\n
+                return {\n
+                    text: \'\\n\' + indent + \'\\n\' + next_indent,\n
+                    selection: [1, indent.length, 1, indent.length]\n
+                }\n
+            }\n
+        }\n
+    });\n
+    \n
+}\n
+oop.inherits(XmlBehaviour, Behaviour);\n
+\n
+exports.XmlBehaviour = XmlBehaviour;\n
+});\n
+\n
+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) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var MixedFoldMode = require("./mixed").FoldMode;\n
+var XmlFoldMode = require("./xml").FoldMode;\n
+var CStyleFoldMode = require("./cstyle").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function() {\n
+    MixedFoldMode.call(this, new XmlFoldMode({\n
+        "area": 1,\n
+        "base": 1,\n
+        "br": 1,\n
+        "col": 1,\n
+        "command": 1,\n
+        "embed": 1,\n
+        "hr": 1,\n
+        "img": 1,\n
+        "input": 1,\n
+        "keygen": 1,\n
+        "link": 1,\n
+        "meta": 1,\n
+        "param": 1,\n
+        "source": 1,\n
+        "track": 1,\n
+        "wbr": 1,\n
+        "li": 1,\n
+        "dt": 1,\n
+        "dd": 1,\n
+        "p": 1,\n
+        "rt": 1,\n
+        "rp": 1,\n
+        "optgroup": 1,\n
+        "option": 1,\n
+        "colgroup": 1,\n
+        "td": 1,\n
+        "th": 1\n
+    }), {\n
+        "js-": new CStyleFoldMode(),\n
+        "css-": new CStyleFoldMode()\n
+    });\n
+};\n
+\n
+oop.inherits(FoldMode, MixedFoldMode);\n
+\n
+});\n
+\n
+define(\'ace/mode/folding/mixed\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+\n
+var FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n
+    this.defaultMode = defaultMode;\n
+    this.subModes = subModes;\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+\n
+    this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
+        for (var key in this.subModes) {\n
+            if (state.indexOf(key) === 0)\n
+                return this.subModes[key];\n
+        }\n
+        return null;\n
+    };\n
+    \n
+    this.$tryMode = function(state, session, foldStyle, row) {\n
+        var mode = this.$getMode(state);\n
+        return (mode ? mode.getFoldWidget(session, foldStyle, row) : "");\n
+    };\n
+\n
+    this.getFoldWidget = function(session, foldStyle, row) {\n
+        return (\n
+            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n
+            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n
+            this.defaultMode.getFoldWidget(session, foldStyle, row)\n
+        );\n
+    };\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var mode = this.$getMode(session.getState(row-1));\n
+        \n
+        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n
+            mode = this.$getMode(session.getState(row));\n
+        \n
+        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n
+            mode = this.defaultMode;\n
+        \n
+        return mode.getFoldWidgetRange(session, foldStyle, row);\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+\n
+define(\'ace/mode/folding/xml\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/lang\', \'ace/range\', \'ace/mode/folding/fold_mode\', \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var lang = require("../../lib/lang");\n
+var Range = require("../../range").Range;\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+var TokenIterator = require("../../token_iterator").TokenIterator;\n
+\n
+var FoldMode = exports.FoldMode = function(voidElements) {\n
+    BaseFoldMode.call(this);\n
+    this.voidElements = voidElements || {};\n
+};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.getFoldWidget = function(session, foldStyle, row) {\n
+        var tag = this._getFirstTagInLine(session, row);\n
+\n
+        if (tag.closing)\n
+            return foldStyle == "markbeginend" ? "end" : "";\n
+\n
+        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n
+            return "";\n
+\n
+        if (tag.selfClosing)\n
+            return "";\n
+\n
+        if (tag.value.indexOf("/" + tag.tagName) !== -1)\n
+            return "";\n
+\n
+        return "start";\n
+    };\n
+    \n
+    this._getFirstTagInLine = function(session, row) {\n
+        var tokens = session.getTokens(row);\n
+        var value = "";\n
+        for (var i = 0; i < tokens.length; i++) {\n
+            var token = tokens[i];\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
+                value += token.value;\n
+            else\n
+                value += lang.stringRepeat(" ", token.value.length);\n
+        }\n
+        \n
+        return this._parseTag(value);\n
+    };\n
+\n
+    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n
+    this._parseTag = function(tag) {\n
+        \n
+        var match = tag.match(this.tagRe);\n
+        var column = 0;\n
+\n
+        return {\n
+            value: tag,\n
+            match: match ? match[2] : "",\n
+            closing: match ? !!match[3] : false,\n
+            selfClosing: match ? !!match[5] || match[2] == "/>" : false,\n
+            tagName: match ? match[4] : "",\n
+            column: match[1] ? column + match[1].length : column\n
+        };\n
+    };\n
+    this._readTagForward = function(iterator) {\n
+        var token = iterator.getCurrentToken();\n
+        if (!token)\n
+            return null;\n
+            \n
+        var value = "";\n
+        var start;\n
+        \n
+        do {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
+                if (!start) {\n
+                    var start = {\n
+                        row: iterator.getCurrentTokenRow(),\n
+                        column: iterator.getCurrentTokenColumn()\n
+                    };\n
+                }\n
+                value += token.value;\n
+                if (value.indexOf(">") !== -1) {\n
+                    var tag = this._parseTag(value);\n
+                    tag.start = start;\n
+                    tag.end = {\n
+                        row: iterator.getCurrentTokenRow(),\n
+                        column: iterator.getCurrentTokenColumn() + token.value.length\n
+                    };\n
+                    iterator.stepForward();\n
+                    return tag;\n
+                }\n
+            }\n
+        } while(token = iterator.stepForward());\n
+        \n
+        return null;\n
+    };\n
+    \n
+    this._readTagBackward = function(iterator) {\n
+        var token = iterator.getCurrentToken();\n
+        if (!token)\n
+            return null;\n
+            \n
+        var value = "";\n
+        var end;\n
+\n
+        do {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
+                if (!end) {\n
+                    end = {\n
+                        row: iterator.getCurrentTokenRow(),\n
+                        column: iterator.getCurrentTokenColumn() + token.value.length\n
+                    };\n
+                }\n
+                value = token.value + value;\n
+                if (value.indexOf("<") !== -1) {\n
+                    var tag = this._parseTag(value);\n
+                    tag.end = end;\n
+                    tag.start = {\n
+                        row: iterator.getCurrentTokenRow(),\n
+                        column: iterator.getCurrentTokenColumn()\n
+                    };\n
+                    iterator.stepBackward();\n
+                    return tag;\n
+                }\n
+            }\n
+        } while(token = iterator.stepBackward());\n
+        \n
+        return null;\n
+    };\n
+    \n
+    this._pop = function(stack, tag) {\n
+        while (stack.length) {\n
+            \n
+            var top = stack[stack.length-1];\n
+            if (!tag || top.tagName == tag.tagName) {\n
+                return stack.pop();\n
+            }\n
+            else if (this.voidElements[tag.tagName]) {\n
+                return;\n
+            }\n
+            else if (this.voidElements[top.tagName]) {\n
+                stack.pop();\n
+                continue;\n
+            } else {\n
+                return null;\n
+            }\n
+        }\n
+    };\n
+    \n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var firstTag = this._getFirstTagInLine(session, row);\n
+        \n
+        if (!firstTag.match)\n
+            return null;\n
+        \n
+        var isBackward = firstTag.closing || firstTag.selfClosing;\n
+        var stack = [];\n
+        var tag;\n
+        \n
+        if (!isBackward) {\n
+            var iterator = new TokenIterator(session, row, firstTag.column);\n
+            var start = {\n
+                row: row,\n
+                column: firstTag.column + firstTag.tagName.length + 2\n
+            };\n
+            while (tag = this._readTagForward(iterator)) {\n
+                if (tag.selfClosing) {\n
+                    if (!stack.length) {\n
+                        tag.start.column += tag.tagName.length + 2;\n
+                        tag.end.column -= 2;\n
+                        return Range.fromPoints(tag.start, tag.end);\n
+                    } else\n
+                        continue;\n
+                }\n
+                \n
+                if (tag.closing) {\n
+                    this._pop(stack, tag);\n
+                    if (stack.length == 0)\n
+                        return Range.fromPoints(start, tag.start);\n
+                }\n
+                else {\n
+                    stack.push(tag)\n
+                }\n
+            }\n
+        }\n
+        else {\n
+            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n
+            var end = {\n
+                row: row,\n
+                column: firstTag.column\n
+            };\n
+            \n
+            while (tag = this._readTagBackward(iterator)) {\n
+                if (tag.selfClosing) {\n
+                    if (!stack.length) {\n
+                        tag.start.column += tag.tagName.length + 2;\n
+                        tag.end.column -= 2;\n
+                        return Range.fromPoints(tag.start, tag.end);\n
+                    } else\n
+                        continue;\n
+                }\n
+                \n
+                if (!tag.closing) {\n
+                    this._pop(stack, tag);\n
+                    if (stack.length == 0) {\n
+                        tag.start.column += tag.tagName.length + 2;\n
+                        return Range.fromPoints(tag.start, end);\n
+                    }\n
+                }\n
+                else {\n
+                    stack.push(tag)\n
+                }\n
+            }\n
+        }\n
+        \n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+\n
+define(\'ace/mode/html_completions\', [\'require\', \'exports\', \'module\' , \'ace/token_iterator\'], function(require, exports, module) {\n
+\n
+\n
+var TokenIterator = require("../token_iterator").TokenIterator;\n
+\n
+var commonAttributes = [\n
+    "accesskey",\n
+    "class",\n
+    "contenteditable",\n
+    "contextmenu",\n
+    "dir",\n
+    "draggable",\n
+    "dropzone",\n
+    "hidden",\n
+    "id",\n
+    "lang",\n
+    "spellcheck",\n
+    "style",\n
+    "tabindex",\n
+    "title",\n
+    "translate"\n
+];\n
+\n
+var eventAttributes = [\n
+    "onabort",\n
+    "onblur",\n
+    "oncancel",\n
+    "oncanplay",\n
+    "oncanplaythrough",\n
+    "onchange",\n
+    "onclick",\n
+    "onclose",\n
+    "oncontextmenu",\n
+    "oncuechange",\n
+    "ondblclick",\n
+    "ondrag",\n
+    "ondragend",\n
+    "ondragenter",\n
+    "ondragleave",\n
+    "ondragover",\n
+    "ondragstart",\n
+    "ondrop",\n
+    "ondurationchange",\n
+    "onemptied",\n
+    "onended",\n
+    "onerror",\n
+    "onfocus",\n
+    "oninput",\n
+    "oninvalid",\n
+    "onkeydown",\n
+    "onkeypress",\n
+    "onkeyup",\n
+    "onload",\n
+    "onloadeddata",\n
+    "onloadedmetadata",\n
+    "onloadstart",\n
+    "onmousedown",\n
+    "onmousemove",\n
+    "onmouseout",\n
+    "onmouseover",\n
+    "onmouseup",\n
+    "onmousewheel",\n
+    "onpause",\n
+    "onplay",\n
+    "onplaying",\n
+    "onprogress",\n
+    "onratechange",\n
+    "onreset",\n
+    "onscroll",\n
+    "onseeked",\n
+    "onseeking",\n
+    "onselect",\n
+    "onshow",\n
+    "onstalled",\n
+    "onsubmit",\n
+    "onsuspend",\n
+    "ontimeupdate",\n
+    "onvolumechange",\n
+    "onwaiting"\n
+];\n
+\n
+var globalAttributes = commonAttributes.concat(eventAttributes);\n
+\n
+var attributeMap = {\n
+    "html": ["manifest"],\n
+    "head": [],\n
+    "title": [],\n
+    "base": ["href", "target"],\n
+    "link": ["href", "hreflang", "rel", "media", "type", "sizes"],\n
+    "meta": ["http-equiv", "name", "content", "charset"],\n
+    "style": ["type", "media", "scoped"],\n
+    "script": ["charset", "type", "src", "defer", "async"],\n
+    "noscript": ["href"],\n
+    "body": ["onafterprint", "onbeforeprint", "onbeforeunload", "onhashchange", "onmessage", "onoffline", "onpopstate", "onredo", "onresize", "onstorage", "onundo", "onunload"],\n
+    "section": [],\n
+    "nav": [],\n
+    "article": ["pubdate"],\n
+    "aside": [],\n
+    "h1": [],\n
+    "h2": [],\n
+    "h3": [],\n
+    "h4": [],\n
+    "h5": [],\n
+    "h6": [],\n
+    "header": [],\n
+    "footer": [],\n
+    "address": [],\n
+    "main": [],\n
+    "p": [],\n
+    "hr": [],\n
+    "pre": [],\n
+    "blockquote": ["cite"],\n
+    "ol": ["start", "reversed"],\n
+    "ul": [],\n
+    "li": ["value"],\n
+    "dl": [],\n
+    "dt": [],\n
+    "dd": [],\n
+    "figure": [],\n
+    "figcaption": [],\n
+    "div": [],\n
+    "a": ["href", "target", "ping", "rel", "media", "hreflang", "type"],\n
+    "em": [],\n
+    "strong": [],\n
+    "small": [],\n
+    "s": [],\n
+    "cite": [],\n
+    "q": ["cite"],\n
+    "dfn": [],\n
+    "abbr": [],\n
+    "data": [],\n
+    "time": ["datetime"],\n
+    "code": [],\n
+    "var": [],\n
+    "samp": [],\n
+    "kbd": [],\n
+    "sub": [],\n
+    "sup": [],\n
+    "i": [],\n
+    "b": [],\n
+    "u": [],\n
+    "mark": [],\n
+    "ruby": [],\n
+    "rt": [],\n
+    "rp": [],\n
+    "bdi": [],\n
+    "bdo": [],\n
+    "span": [],\n
+    "br": [],\n
+    "wbr": [],\n
+    "ins": ["cite", "datetime"],\n
+    "del": ["cite", "datetime"],\n
+    "img": ["alt", "src", "height", "width", "usemap", "ismap"],\n
+    "iframe": ["name", "src", "height", "width", "sandbox", "seamless"],\n
+    "embed": ["src", "height", "width", "type"],\n
+    "object": ["param", "data", "type", "height" , "width", "usemap", "name", "form", "classid"],\n
+    "param": ["name", "value"],\n
+    "video": ["src", "autobuffer", "autoplay", "loop", "controls", "width", "height", "poster"],\n
+    "audio": ["src", "autobuffer", "autoplay", "loop", "controls"],\n
+    "source": ["src", "type", "media"],\n
+    "track": ["kind", "src", "srclang", "label", "default"],\n
+    "canvas": ["width", "height"],\n
+    "map": ["name"],\n
+    "area": ["shape", "coords", "href", "hreflang", "alt", "target", "media", "rel", "ping", "type"],\n
+    "svg": [],\n
+    "math": [],\n
+    "table": ["summary"],\n
+    "caption": [],\n
+    "colgroup": ["span"],\n
+    "col": ["span"],\n
+    "tbody": [],\n
+    "thead": [],\n
+    "tfoot": [],\n
+    "tr": [],\n
+    "td": ["headers", "rowspan", "colspan"],\n
+    "th": ["headers", "rowspan", "colspan", "scope"],\n
+    "form": ["accept-charset", "action", "autocomplete", "enctype", "method", "name", "novalidate", "target"],\n
+    "fieldset": ["disabled", "form", "name"],\n
+    "legend": [],\n
+    "label": ["form", "for"],\n
+    "input": ["type", "accept", "alt", "autocomplete", "checked", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "height", "list", "max", "maxlength", "min", "multiple", "pattern", "placeholder", "readonly", "required", "size", "src", "step", "width", "files", "value"],\n
+    "button": ["autofocus", "disabled", "form", "formaction", "formenctype", "formmethod", "formnovalidate", "formtarget", "name", "value", "type"],\n
+    "select": ["autofocus", "disabled", "form", "multiple", "name", "size"],\n
+    "datalist": [],\n
+    "optgroup": ["disabled", "label"],\n
+    "option": ["disabled", "selected", "label", "value"],\n
+    "textarea": ["autofocus", "disabled", "form", "maxlength", "name", "placeholder", "readonly", "required", "rows", "cols", "wrap"],\n
+    "keygen": ["autofocus", "challenge", "disabled", "form", "keytype", "name"],\n
+    "output": ["for", "form", "name"],\n
+    "progress": ["value", "max"],\n
+    "meter": ["value", "min", "max", "low", "high", "optimum"],\n
+    "details": ["open"],\n
+    "summary": [],\n
+    "command": ["type", "label", "icon", "disabled", "checked", "radiogroup", "command"],\n
+    "menu": ["type", "label"],\n
+    "dialog": ["open"]\n
+};\n
+\n
+var allElements = Object.keys(attributeMap);\n
+\n
+function hasType(token, type) {\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
+    });\n
+}\n
+\n
+function findTagName(session, pos) {\n
+    var iterator = new TokenIterator(session, pos.row, pos.column);\n
+    var token = iterator.getCurrentToken();\n
+    if (!token || !hasType(token, \'tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
+        do {\n
+            token = iterator.stepBackward();\n
+        } while (token && (hasType(token, \'string\') || hasType(token, \'operator\') || hasType(token, \'attribute-name\') || hasType(token, \'text\')));\n
+    }\n
+    if (token && hasType(token, \'tag-name\') && !iterator.stepBackward().value.match(\'/\'))\n
+        return token.value;\n
+}\n
+\n
+var HtmlCompletions = function() {\n
+\n
+};\n
+\n
+(function() {\n
+\n
+    this.getCompletions = function(state, session, pos, prefix) {\n
+        var token = session.getTokenAt(pos.row, pos.column);\n
+\n
+        if (!token)\n
+            return [];\n
+        if (hasType(token, "tag-name") || (token.value == \'<\' && hasType(token, "text")))\n
+            return this.getTagCompletions(state, session, pos, prefix);\n
+        if (hasType(token, \'text\') || hasType(token, \'attribute-name\'))\n
+            return this.getAttributeCompetions(state, session, pos, prefix);\n
+\n
+        return [];\n
+    };\n
+\n
+    this.getTagCompletions = function(state, session, pos, prefix) {\n
+        var elements = allElements;\n
+        if (prefix) {\n
+            elements = elements.filter(function(element){\n
+                return element.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return elements.map(function(element){\n
+            return {\n
+                value: element,\n
+                meta: "tag"\n
+            };\n
+        });\n
+    };\n
+\n
+    this.getAttributeCompetions = function(state, session, pos, prefix) {\n
+        var tagName = findTagName(session, pos);\n
+        if (!tagName)\n
+            return [];\n
+        var attributes = globalAttributes;\n
+        if (tagName in attributeMap) {\n
+            attributes = attributes.concat(attributeMap[tagName]);\n
+        }\n
+        if (prefix) {\n
+            attributes = attributes.filter(function(attribute){\n
+                return attribute.indexOf(prefix) === 0;\n
+            });\n
+        }\n
+        return attributes.map(function(attribute){\n
+            return {\n
+                caption: attribute,\n
+                snippet: attribute + \'="$0"\',\n
+                meta: "attribute"\n
+            };\n
+        });\n
+    };\n
+\n
+}).call(HtmlCompletions.prototype);\n
+\n
+exports.HtmlCompletions = HtmlCompletions;\n
+});\n
+\n
+define(\'ace/mode/soy_template_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/html_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
+\n
+var SoyTemplateHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
+\n
+    var soyRules = { start: \n
+       [ { include: \'#template\' },\n
+         { include: \'#if\' },\n
+         { include: \'#comment-line\' },\n
+         { include: \'#comment-block\' },\n
+         { include: \'#comment-doc\' },\n
+         { include: \'#call\' },\n
+         { include: \'#css\' },\n
+         { include: \'#param\' },\n
+         { include: \'#print\' },\n
+         { include: \'#msg\' },\n
+         { include: \'#for\' },\n
+         { include: \'#foreach\' },\n
+         { include: \'#switch\' },\n
+         { include: \'#tag\' },\n
+         { include: \'text.html.basic\' } ],\n
+      \'#call\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.call.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(?=call|delcall)\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { include: \'#string-quoted-single\' },\n
+              { include: \'#string-quoted-double\' },\n
+              { token: [\'entity.name.tag.soy\', \'variable.parameter.soy\'],\n
+                regex: \'(call|delcall)(\\\\s+[\\\\.\\\\w]+)\'},\n
+              { token: \n
+                 [ \'entity.other.attribute-name.soy\',\n
+                   \'text\',\n
+                   \'keyword.operator.soy\' ],\n
+                regex: \'\\\\b(data)(\\\\s*)(=)\' },\n
+              { defaultToken: \'meta.tag.call.soy\' } ] } ],\n
+      \'#comment-line\': \n
+       [ { token: \n
+            [ \'comment.line.double-slash.soy\',\n
+              \'punctuation.definition.comment.soy\',\n
+              \'comment.line.double-slash.soy\' ],\n
+           regex: \'(\\\\s+)(//)(.*$)\' } ],\n
+      \'#comment-block\': \n
+       [ { token: \'punctuation.definition.comment.begin.soy\',\n
+           regex: \'/\\\\*(?!\\\\*)\',\n
+           push: \n
+            [ { token: \'punctuation.definition.comment.end.soy\',\n
+                regex: \'\\\\*/\',\n
+                next: \'pop\' },\n
+              { defaultToken: \'comment.block.soy\' } ] } ],\n
+      \'#comment-doc\': \n
+       [ { token: \'punctuation.definition.comment.begin.soy\',\n
+           regex: \'/\\\\*\\\\*(?!/)\',\n
+           push: \n
+            [ { token: \'punctuation.definition.comment.end.soy\',\n
+                regex: \'\\\\*/\',\n
+                next: \'pop\' },\n
+              { token: [ \'support.type.soy\', \'text\', \'variable.parameter.soy\' ],\n
+                regex: \'(@param|@param\\\\?)(\\\\s+)(\\\\w+)\' },\n
+              { defaultToken: \'comment.block.documentation.soy\' } ] } ],\n
+      \'#css\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.css.soy\',\n
+              \'entity.name.tag.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(css)\\\\b\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { token: \'support.constant.soy\',\n
+                regex: \'\\\\b(?:LITERAL|REFERENCE|BACKEND_SPECIFIC|GOOG)\\\\b\' },\n
+              { defaultToken: \'meta.tag.css.soy\' } ] } ],\n
+      \'#for\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.for.soy\',\n
+              \'entity.name.tag.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(for)\\\\b\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { token: \'keyword.operator.soy\', regex: \'\\\\bin\\\\b\' },\n
+              { token: \'support.function.soy\', regex: \'\\\\brange\\\\b\' },\n
+              { include: \'#variable\' },\n
+              { include: \'#number\' },\n
+              { include: \'#primitive\' },\n
+              { defaultToken: \'meta.tag.for.soy\' } ] } ],\n
+      \'#foreach\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.foreach.soy\',\n
+              \'entity.name.tag.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(foreach)\\\\b\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { token: \'keyword.operator.soy\', regex: \'\\\\bin\\\\b\' },\n
+              { include: \'#variable\' },\n
+              { defaultToken: \'meta.tag.foreach.soy\' } ] } ],\n
+      \'#function\': \n
+       [ { token: \'support.function.soy\',\n
+           regex: \'\\\\b(?:isFirst|isLast|index|hasData|length|keys|round|floor|ceiling|min|max|randomInt)\\\\b\' } ],\n
+      \'#if\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.if.soy\',\n
+              \'entity.name.tag.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(if|elseif)\\\\b\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { include: \'#variable\' },\n
+              { include: \'#operator\' },\n
+              { include: \'#function\' },\n
+              { include: \'#string-quoted-single\' },\n
+              { include: \'#string-quoted-double\' },\n
+              { defaultToken: \'meta.tag.if.soy\' } ] } ],\n
+      \'#namespace\': \n
+       [ { token: [ \'entity.name.tag.soy\', \'text\', \'variable.parameter.soy\' ],\n
+           regex: \'(namespace|delpackage)(\\\\s+)([\\\\w\\\\.]+)\' } ],\n
+      \'#number\': [ { token: \'constant.numeric\', regex: \'[\\\\d]+\' } ],\n
+      \'#operator\': \n
+       [ { token: \'keyword.operator.soy\',\n
+           regex: \'==|!=|\\\\band\\\\b|\\\\bor\\\\b|\\\\bnot\\\\b|-|\\\\+|/|\\\\?:\' } ],\n
+      \'#param\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.param.soy\',\n
+              \'entity.name.tag.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(param)\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { include: \'#variable\' },\n
+              { token: \n
+                 [ \'entity.other.attribute-name.soy\',\n
+                   \'text\',\n
+                   \'keyword.operator.soy\' ],\n
+                regex: \'\\\\b([\\\\w]*)(\\\\s*)((?::)?)\' },\n
+              { defaultToken: \'meta.tag.param.soy\' } ] } ],\n
+      \'#primitive\': \n
+       [ { token: \'constant.language.soy\',\n
+           regex: \'\\\\b(?:null|false|true)\\\\b\' } ],\n
+      \'#msg\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.msg.soy\',\n
+              \'entity.name.tag.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(msg)\\\\b\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { include: \'#string-quoted-single\' },\n
+              { include: \'#string-quoted-double\' },\n
+              { token: \n
+                 [ \'entity.other.attribute-name.soy\',\n
+                   \'text\',\n
+                   \'keyword.operator.soy\' ],\n
+                regex: \'\\\\b(meaning|desc)(\\\\s*)(=)\' },\n
+              { defaultToken: \'meta.tag.msg.soy\' } ] } ],\n
+      \'#print\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.print.soy\',\n
+              \'entity.name.tag.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(print)\\\\b\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { include: \'#variable\' },\n
+              { include: \'#print-parameter\' },\n
+              { include: \'#number\' },\n
+              { include: \'#primitive\' },\n
+              { include: \'#attribute-lookup\' },\n
+              { defaultToken: \'meta.tag.print.soy\' } ] } ],\n
+      \'#print-parameter\': \n
+       [ { token: \'keyword.operator.soy\', regex: \'\\\\|\' },\n
+         { token: \'variable.parameter.soy\',\n
+           regex: \'noAutoescape|id|escapeHtml|escapeJs|insertWorkBreaks|truncate\' } ],\n
+      \'#special-character\': \n
+       [ { token: \'support.constant.soy\',\n
+           regex: \'\\\\bsp\\\\b|\\\\bnil\\\\b|\\\\\\\\r|\\\\\\\\n|\\\\\\\\t|\\\\blb\\\\b|\\\\brb\\\\b\' } ],\n
+      \'#string-quoted-double\': [ { token: \'string.quoted.double\', regex: \'"[^"]*"\' } ],\n
+      \'#string-quoted-single\': [ { token: \'string.quoted.single\', regex: \'\\\'[^\\\']*\\\'\' } ],\n
+      \'#switch\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.switch.soy\',\n
+              \'entity.name.tag.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(switch|case)\\\\b\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { include: \'#variable\' },\n
+              { include: \'#function\' },\n
+              { include: \'#number\' },\n
+              { include: \'#string-quoted-single\' },\n
+              { include: \'#string-quoted-double\' },\n
+              { defaultToken: \'meta.tag.switch.soy\' } ] } ],\n
+      \'#attribute-lookup\': \n
+       [ { token: \'punctuation.definition.attribute-lookup.begin.soy\',\n
+           regex: \'\\\\[\',\n
+           push: \n
+            [ { token: \'punctuation.definition.attribute-lookup.end.soy\',\n
+                regex: \'\\\\]\',\n
+                next: \'pop\' },\n
+              { include: \'#variable\' },\n
+              { include: \'#function\' },\n
+              { include: \'#operator\' },\n
+              { include: \'#number\' },\n
+              { include: \'#primitive\' },\n
+              { include: \'#string-quoted-single\' },\n
+              { include: \'#string-quoted-double\' } ] } ],\n
+      \'#tag\': \n
+       [ { token: \'punctuation.definition.tag.begin.soy\',\n
+           regex: \'\\\\{\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { include: \'#namespace\' },\n
+              { include: \'#variable\' },\n
+              { include: \'#special-character\' },\n
+              { include: \'#tag-simple\' },\n
+              { include: \'#function\' },\n
+              { include: \'#operator\' },\n
+              { include: \'#attribute-lookup\' },\n
+              { include: \'#number\' },\n
+              { include: \'#primitive\' },\n
+              { include: \'#print-parameter\' } ] } ],\n
+      \'#tag-simple\': \n
+       [ { token: \'entity.name.tag.soy\',\n
+           regex: \'{{\\\\s*(?:literal|else|ifempty|default)\\\\s*(?=\\\\})\'} ],\n
+      \'#template\': \n
+       [ { token: \n
+            [ \'punctuation.definition.tag.begin.soy\',\n
+              \'meta.tag.template.soy\' ],\n
+           regex: \'(\\\\{/?)(\\\\s*)(?=template|deltemplate)\',\n
+           push: \n
+            [ { token: \'punctuation.definition.tag.end.soy\',\n
+                regex: \'\\\\}\',\n
+                next: \'pop\' },\n
+              { token: [\'entity.name.tag.soy\', \'text\', \'entity.name.function.soy\' ],\n
+                regex: \'(template|deltemplate)(\\\\s+)([\\\\.\\\\w]+)\',\n
+                originalRegex: \'(?<=template|deltemplate)\\\\s+([\\\\.\\\\w]+)\' },\n
+              { token: \n
+                 [ \'entity.other.attribute-name.soy\',\n
+                   \'text\',\n
+                   \'keyword.operator.soy\',\n
+                   \'text\',\n
+                   \'string.quoted.double.soy\' ],\n
+                regex: \'\\\\b(private)(\\\\s*)(=)(\\\\s*)("true"|"false")\' },\n
+              { token: \n
+                 [ \'entity.other.attribute-name.soy\',\n
+                   \'text\',\n
+                   \'keyword.operator.soy\',\n
+                   \'text\',\n
+                   \'string.quoted.single.soy\' ],\n
+                regex: \'\\\\b(private)(\\\\s*)(=)(\\\\s*)(\\\'true\\\'|\\\'false\\\')\' },\n
+              { token: \n
+                 [ \'entity.other.attribute-name.soy\',\n
+                   \'text\',\n
+                   \'keyword.operator.soy\',\n
+                   \'text\',\n
+                   \'string.quoted.double.soy\' ],\n
+                regex: \'\\\\b(autoescape)(\\\\s*)(=)(\\\\s*)("true"|"false"|"contextual")\' },\n
+              { token: \n
+                 [ \'entity.other.attribute-name.soy\',\n
+                   \'text\',\n
+                   \'keyword.operator.soy\',\n
+                   \'text\',\n
+                   \'string.quoted.single.soy\' ],\n
+                regex: \'\\\\b(autoescape)(\\\\s*)(=)(\\\\s*)(\\\'true\\\'|\\\'false\\\'|\\\'contextual\\\')\' },\n
+              { defaultToken: \'meta.tag.template.soy\' } ] } ],\n
+      \'#variable\': [ { token: \'variable.other.soy\', regex: \'\\\\$[\\\\w\\\\.]+\' } ] }\n
+    \n
+    \n
+    for (var i in soyRules) {\n
+        if (this.$rules[i]) {\n
+            this.$rules[i].unshift.call(this.$rules[i], soyRules[i]);\n
+        } else {\n
+            this.$rules[i] = soyRules[i];\n
+        }\n
+    }\n
+    \n
+    this.normalizeRules();\n
+};\n
+\n
+SoyTemplateHighlightRules.metaData = { comment: \'SoyTemplate\',\n
+      fileTypes: [ \'soy\' ],\n
+      firstLineMatch: \'\\\\{\\\\s*namespace\\\\b\',\n
+      foldingStartMarker: \'\\\\{\\\\s*template\\\\s+[^\\\\}]*\\\\}\',\n
+      foldingStopMarker: \'\\\\{\\\\s*/\\\\s*template\\\\s*\\\\}\',\n
+      name: \'SoyTemplate\',\n
+      scopeName: \'source.soy\' }\n
+\n
+\n
+oop.inherits(SoyTemplateHighlightRules, HtmlHighlightRules);\n
+\n
+exports.SoyTemplateHighlightRules = SoyTemplateHighlightRules;\n
+});
+
+]]></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-space.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-space.js.xml
new file mode 100644
index 0000000000..16a58ad9b0
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-space.js.xml
@@ -0,0 +1,203 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.2</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-space.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+define(\'ace/mode/space\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/folding/coffee\', \'ace/mode/space_highlight_rules\'], function(require, exports, module) {\n
+\n
+var oop = require("../lib/oop");\n
+var TextMode = require("./text").Mode;\n
+var Tokenizer = require("../tokenizer").Tokenizer;\n
+var FoldMode = require("./folding/coffee").FoldMode;\n
+var SpaceHighlightRules = require("./space_highlight_rules").SpaceHighlightRules;\n
+var Mode = function() {\n
+    var highlighter = new SpaceHighlightRules();\n
+    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.foldingRules = new FoldMode();\n
+};\n
+oop.inherits(Mode, TextMode);\n
+(function() {\n
+    \n
+}).call(Mode.prototype);\n
+exports.Mode = Mode;\n
+});\n
+\n
+define(\'ace/mode/folding/coffee\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/folding/fold_mode\', \'ace/range\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../../lib/oop");\n
+var BaseFoldMode = require("./fold_mode").FoldMode;\n
+var Range = require("../../range").Range;\n
+\n
+var FoldMode = exports.FoldMode = function() {};\n
+oop.inherits(FoldMode, BaseFoldMode);\n
+\n
+(function() {\n
+\n
+    this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var range = this.indentationBlock(session, row);\n
+        if (range)\n
+            return range;\n
+\n
+        var re = /\\S/;\n
+        var line = session.getLine(row);\n
+        var startLevel = line.search(re);\n
+        if (startLevel == -1 || line[startLevel] != "#")\n
+            return;\n
+\n
+        var startColumn = line.length;\n
+        var maxRow = session.getLength();\n
+        var startRow = row;\n
+        var endRow = row;\n
+\n
+        while (++row < maxRow) {\n
+            line = session.getLine(row);\n
+            var level = line.search(re);\n
+\n
+            if (level == -1)\n
+                continue;\n
+\n
+            if (line[level] != "#")\n
+                break;\n
+\n
+            endRow = row;\n
+        }\n
+\n
+        if (endRow > startRow) {\n
+            var endColumn = session.getLine(endRow).length;\n
+            return new Range(startRow, startColumn, endRow, endColumn);\n
+        }\n
+    };\n
+    this.getFoldWidget = function(session, foldStyle, row) {\n
+        var line = session.getLine(row);\n
+        var indent = line.search(/\\S/);\n
+        var next = session.getLine(row + 1);\n
+        var prev = session.getLine(row - 1);\n
+        var prevIndent = prev.search(/\\S/);\n
+        var nextIndent = next.search(/\\S/);\n
+\n
+        if (indent == -1) {\n
+            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? "start" : "";\n
+            return "";\n
+        }\n
+        if (prevIndent == -1) {\n
+            if (indent == nextIndent && line[indent] == "#" && next[indent] == "#") {\n
+                session.foldWidgets[row - 1] = "";\n
+                session.foldWidgets[row + 1] = "";\n
+                return "start";\n
+            }\n
+        } else if (prevIndent == indent && line[indent] == "#" && prev[indent] == "#") {\n
+            if (session.getLine(row - 2).search(/\\S/) == -1) {\n
+                session.foldWidgets[row - 1] = "start";\n
+                session.foldWidgets[row + 1] = "";\n
+                return "";\n
+            }\n
+        }\n
+\n
+        if (prevIndent!= -1 && prevIndent < indent)\n
+            session.foldWidgets[row - 1] = "start";\n
+        else\n
+            session.foldWidgets[row - 1] = "";\n
+\n
+        if (indent < nextIndent)\n
+            return "start";\n
+        else\n
+            return "";\n
+    };\n
+\n
+}).call(FoldMode.prototype);\n
+\n
+});\n
+define(\'ace/mode/space_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var SpaceHighlightRules = function() {\n
+    this.$rules = {\n
+        "start" : [\n
+            {\n
+                token : "empty_line",\n
+                regex : / */,\n
+                next : "key"\n
+            },\n
+            {\n
+                token : "empty_line",\n
+                regex : /$/,\n
+                next : "key"\n
+            }\n
+        ],\n
+        "key" : [\n
+            {\n
+                token : "variable",\n
+                regex : /\\S+/\n
+            },\n
+            {\n
+                token : "empty_line",\n
+                regex : /$/,\n
+                next : "start"\n
+            },{\n
+                token : "keyword.operator",\n
+                regex : / /,\n
+                next  : "value"\n
+            }\n
+        ],\n
+        "value" : [\n
+            {\n
+                token : "keyword.operator",\n
+                regex : /$/,\n
+                next  : "start"\n
+            },\n
+            {\n
+                token : "string",\n
+                regex : /[^$]/\n
+            }\n
+        ]\n
+    };\n
+    \n
+};\n
+\n
+oop.inherits(SpaceHighlightRules, TextHighlightRules);\n
+\n
+exports.SpaceHighlightRules = SpaceHighlightRules;\n
+});\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>4819</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sql.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sql.js.xml
index b533632c90..b0d04f2bac 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sql.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-sql.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155564.21</string> </value>
+            <value> <string>ts83646621.21</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var SqlHighlightRules = require("./sql_highlight_rules").SqlHighlightRules;\n
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new SqlHighlightRules().getRules());\n
+    this.HighlightRules = SqlHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -150,7 +150,7 @@ exports.SqlHighlightRules = SqlHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4202</int> </value>
+            <value> <int>4174</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-stylus.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-stylus.js.xml
index 84ba1db77b..ae63914f6c 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-stylus.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-stylus.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155564.32</string> </value>
+            <value> <string>ts83646621.19</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,14 +67,12 @@ var StylusHighlightRules = require("./stylus_highlight_rules").StylusHighlightRu
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new StylusHighlightRules();\n
+    this.HighlightRules = StylusHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
-(function() {\n
+(function() { \n
 }).call(Mode.prototype);\n
 \n
 exports.Mode = Mode;\n
@@ -265,152 +263,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -515,7 +478,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>22102</int> </value>
+            <value> <int>21100</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-svg.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-svg.js.xml
index dfe29bf085..dffb1d5f61 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-svg.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-svg.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155564.42</string> </value>
+            <value> <string>ts83646621.17</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,10 +67,8 @@ var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 var Mode = function() {\n
     XmlMode.call(this);\n
     \n
-    this.highlighter = new SvgHighlightRules();\n
-    this.$tokenizer = new Tokenizer(this.highlighter.getRules());\n
+    this.HighlightRules = SvgHighlightRules;\n
     \n
-    this.$embeds = this.highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode\n
     });\n
@@ -105,7 +103,7 @@ var XmlBehaviour = require("./behaviour/xml").XmlBehaviour;\n
 var XmlFoldMode = require("./folding/xml").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules());\n
+    this.HighlightRules = XmlHighlightRules;\n
     this.$behaviour = new XmlBehaviour();\n
     this.foldingRules = new XmlFoldMode();\n
 };\n
@@ -128,36 +126,181 @@ var oop = require("../lib/oop");\n
 var xmlUtil = require("./xml_util");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 \n
-var XmlHighlightRules = function() {\n
+var XmlHighlightRules = function(normalize) {\n
     this.$rules = {\n
         start : [\n
-            {token : "text", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
-            {token : "xml-pe", regex : "<\\\\?.*?\\\\?>"},\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
             {token : "comment", regex : "<\\\\!--", next : "comment"},\n
-            {token : "xml-pe", regex : "<\\\\!.*?>"},\n
-            {token : "meta.tag", regex : "<\\\\/?", next : "tag"},\n
-            {token : "text", regex : "\\\\s+"},\n
             {\n
-                token : "constant.character.entity", \n
-                regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
-            }\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
         ],\n
-        \n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
         cdata : [\n
-            {token : "text", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
             {token : "text", regex : "\\\\s+"},\n
             {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
         ],\n
 \n
         comment : [\n
-            {token : "comment", regex : ".*?-->", next : "start"},\n
-            {token : "comment", regex : ".+"}\n
-        ]\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start");\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
 oop.inherits(XmlHighlightRules, TextHighlightRules);\n
 \n
 exports.XmlHighlightRules = XmlHighlightRules;\n
@@ -242,14 +385,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -263,6 +401,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -271,8 +412,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -289,11 +430,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -672,7 +813,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -705,7 +846,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -738,7 +879,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -867,7 +1008,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -882,7 +1024,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -988,7 +1130,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -1063,7 +1206,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -1108,8 +1251,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -1196,6 +1339,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1377,34 +1528,19 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 });\n
 \n
-define(\'ace/mode/svg_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/javascript_highlight_rules\', \'ace/mode/xml_highlight_rules\', \'ace/mode/xml_util\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
 var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
 \n
 var SvgHighlightRules = function() {\n
     XmlHighlightRules.call(this);\n
 \n
-    this.$rules.start.splice(3, 0, {\n
-        token : "meta.tag",\n
-        regex : "<(?=script)",\n
-        next : "script"\n
-    });\n
-    \n
-    xmlUtil.tag(this.$rules, "script", "js-start");\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(SvgHighlightRules, XmlHighlightRules);\n
@@ -1428,6 +1564,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -1473,7 +1611,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>56203</int> </value>
+            <value> <int>60437</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tcl.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tcl.js.xml
index 9497ed2e3c..c71c5ce457 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tcl.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tcl.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155564.53</string> </value>
+            <value> <string>ts83646621.16</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,7 +64,7 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new TclHighlightRules().getRules());\n
+    this.HighlightRules = TclHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new CStyleFoldMode();\n
 };\n
@@ -77,7 +77,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
 \n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
@@ -351,7 +351,7 @@ exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10853</int> </value>
+            <value> <int>10829</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tex.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tex.js.xml
index 2af0d5e7f5..c9ba0a478c 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tex.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tex.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155564.67</string> </value>
+            <value> <string>ts83646621.15</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -32,11 +32,31 @@
  * Portions created by the Initial Developer are Copyright (C) 2010\n
  * the Initial Developer. All Rights Reserved.\n
  *\n
- * This program is licensed to you under the terms of version 3 of the\n
- * GNU Affero General Public License. This program is distributed WITHOUT\n
- * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n
- * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ *\n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ *\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n
  *\n
  */\n
 define(\'ace/mode/tex\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/text_highlight_rules\', \'ace/mode/tex_highlight_rules\', \'ace/mode/matching_brace_outdent\'], function(require, exports, module) {\n
@@ -51,9 +71,9 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
 \n
 var Mode = function(suppressHighlighting) {\n
 \tif (suppressHighlighting)\n
-    \tthis.$tokenizer = new Tokenizer(new TextHighlightRules().getRules());\n
+    \tthis.HighlightRules = TextHighlightRules;\n
 \telse\n
-    \tthis.$tokenizer = new Tokenizer(new TexHighlightRules().getRules());\n
+    \tthis.HighlightRules = TexHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -198,7 +218,7 @@ exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5466</int> </value>
+            <value> <int>6579</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-text.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-text.js.xml
index 2f20007e85..fcb6efd3a8 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-text.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-text.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155564.88</string> </value>
+            <value> <string>ts83646621.13</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-textile.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-textile.js.xml
index df85fb5115..bcb8f8ac94 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-textile.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-textile.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155564.77</string> </value>
+            <value> <string>ts83646621.12</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -60,7 +60,7 @@ var TextileHighlightRules = require("./textile_highlight_rules").TextileHighligh
 var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new TextileHighlightRules().getRules());\n
+    this.HighlightRules = TextileHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
 };\n
 oop.inherits(Mode, TextMode);\n
@@ -198,7 +198,7 @@ exports.MatchingBraceOutdent = MatchingBraceOutdent;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5601</int> </value>
+            <value> <int>5573</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tmsnippet.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tmsnippet.js.xml
index 76f82300cc..127297dbf8 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tmsnippet.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-tmsnippet.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155565.02</string> </value>
+            <value> <string>ts83646621.1</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-toml.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-toml.js.xml
index 43bc7b1aa2..15443347b8 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-toml.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-toml.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155565.12</string> </value>
+            <value> <string>ts83646621.82</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -20,7 +20,9 @@
         </item>
         <item>
             <key> <string>data</string> </key>
-            <value> <string>/* ***** BEGIN LICENSE BLOCK *****\n
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\n
  * Distributed under the BSD license:\n
  *\n
  * Copyright (c) 2013, Ajax.org B.V.\n
@@ -55,19 +57,18 @@
  *\n
  * ***** END LICENSE BLOCK ***** */\n
 \n
-define(\'ace/mode/toml\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/toml_highlight_rules\', \'ace/mode/folding/cstyle\'], function(require, exports, module) {\n
+define(\'ace/mode/toml\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/toml_highlight_rules\', \'ace/mode/folding/ini\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var TextMode = require("./text").Mode;\n
 var Tokenizer = require("../tokenizer").Tokenizer;\n
 var TomlHighlightRules = require("./toml_highlight_rules").TomlHighlightRules;\n
-var FoldMode = require("./folding/cstyle").FoldMode;\n
+var FoldMode = require("./folding/ini").FoldMode;\n
 \n
 var Mode = function() {\n
-    var highlighter = new TomlHighlightRules();\n
+    this.HighlightRules = TomlHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -147,60 +148,59 @@ oop.inherits(TomlHighlightRules, TextHighlightRules);\n
 exports.TomlHighlightRules = TomlHighlightRules;\n
 });\n
 \n
-define(\'ace/mode/folding/cstyle\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
+define(\'ace/mode/folding/ini\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/range\', \'ace/mode/folding/fold_mode\'], function(require, exports, module) {\n
 \n
 \n
 var oop = require("../../lib/oop");\n
 var Range = require("../../range").Range;\n
 var BaseFoldMode = require("./fold_mode").FoldMode;\n
 \n
-var FoldMode = exports.FoldMode = function(commentRegex) {\n
-    if (commentRegex) {\n
-        this.foldingStartMarker = new RegExp(\n
-            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.start)\n
-        );\n
-        this.foldingStopMarker = new RegExp(\n
-            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, "|" + commentRegex.end)\n
-        );\n
-    }\n
+var FoldMode = exports.FoldMode = function() {\n
 };\n
 oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 (function() {\n
 \n
-    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n
-    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n
+    this.foldingStartMarker = /^\\s*\\[([^\\])]*)]\\s*(?:$|[;#])/;\n
 \n
     this.getFoldWidgetRange = function(session, foldStyle, row) {\n
+        var re = this.foldingStartMarker;\n
         var line = session.getLine(row);\n
-        var match = line.match(this.foldingStartMarker);\n
-        if (match) {\n
-            var i = match.index;\n
-\n
-            if (match[1])\n
-                return this.openingBracketBlock(session, match[1], row, i);\n
-\n
-            return session.getCommentFoldRange(row, i + match[0].length, 1);\n
+        \n
+        var m = line.match(re);\n
+        \n
+        if (!m) return;\n
+        \n
+        var startName = m[1] + ".";\n
+        \n
+        var startColumn = line.length;\n
+        var maxRow = session.getLength();\n
+        var startRow = row;\n
+        var endRow = row;\n
+\n
+        while (++row < maxRow) {\n
+            line = session.getLine(row);\n
+            if (/^\\s*$/.test(line))\n
+                continue;\n
+            m = line.match(re);\n
+            if (m && m[1].lastIndexOf(startName, 0) !== 0)\n
+                break;\n
+\n
+            endRow = row;\n
         }\n
 \n
-        if (foldStyle !== "markbeginend")\n
-            return;\n
-\n
-        var match = line.match(this.foldingStopMarker);\n
-        if (match) {\n
-            var i = match.index + match[0].length;\n
-\n
-            if (match[1])\n
-                return this.closingBracketBlock(session, match[1], row, i);\n
-\n
-            return session.getCommentFoldRange(row, i, -1);\n
+        if (endRow > startRow) {\n
+            var endColumn = session.getLine(endRow).length;\n
+            return new Range(startRow, startColumn, endRow, endColumn);\n
         }\n
     };\n
 \n
 }).call(FoldMode.prototype);\n
 \n
 });\n
-</string> </value>
+
+
+]]></string> </value>
         </item>
         <item>
             <key> <string>precondition</string> </key>
@@ -208,7 +208,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5886</int> </value>
+            <value> <int>5521</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-twig.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-twig.js.xml
index 20d15e15db..002ebeda22 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-twig.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-twig.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155565.22</string> </value>
+            <value> <string>ts83646621.08</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>81415</int> </value>
+            <value> <int>86564</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -93,12 +93,10 @@ var HtmlFoldMode = require("./folding/html").FoldMode;\n
 var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
 \n
 var Mode = function() {\n
-    var highlighter = new TwigHighlightRules();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = TwigHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new HtmlBehaviour();\n
 \n
-    this.$embeds = highlighter.getEmbeds();\n
     this.createModeDelegates({\n
         "js-": JavaScriptMode,\n
         "css-": CssMode\n
@@ -114,7 +112,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -158,7 +156,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -173,7 +172,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -279,7 +278,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -354,7 +354,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -399,8 +399,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -487,6 +487,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -1004,7 +1012,7 @@ var CssBehaviour = require("./behaviour/css").CssBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new CssHighlightRules().getRules());\n
+    this.HighlightRules = CssHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CssBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -1018,7 +1026,7 @@ oop.inherits(Mode, TextMode);\n
 \n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
-        var tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n
+        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n
         if (tokens.length && tokens[tokens.length-1].type == "comment") {\n
             return indent;\n
         }\n
@@ -1085,152 +1093,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -1343,33 +1316,35 @@ var TwigHighlightRules = function() {\n
         "keyword.operator.twig":  operators,\n
         "constant.language.twig": constants\n
     }, "identifier");\n
-    this.$rules.start.unshift({\n
-        token : "variable.other.readwrite.local.twig",\n
-        regex : "\\\\{\\\\{-?",\n
-        next : "twig-start"\n
-    }, {\n
-        token : "meta.tag.twig",\n
-        regex : "\\\\{%-?",\n
-        next : "twig-start"\n
-    }, {\n
-        token : "comment.block.twig",\n
-        regex : "\\\\{#-?",\n
-        next : "comment"\n
-    });\n
-    this.$rules.comment.unshift({\n
+    for (var rule in this.$rules) {\n
+        this.$rules[rule].unshift({\n
+            token : "variable.other.readwrite.local.twig",\n
+            regex : "\\\\{\\\\{-?",\n
+            push : "twig-start"\n
+        }, {\n
+            token : "meta.tag.twig",\n
+            regex : "\\\\{%-?",\n
+            push : "twig-start"\n
+        }, {\n
+            token : "comment.block.twig",\n
+            regex : "\\\\{#-?",\n
+            push : "twig-comment"\n
+        });\n
+    }\n
+    this.$rules["twig-comment"] = [{\n
         token : "comment.block.twig",\n
         regex : ".*-?#\\\\}",\n
-        next : "start"\n
-    });\n
+        next : "pop"\n
+    }];\n
 \n
     this.$rules["twig-start"] = [{\n
         token : "variable.other.readwrite.local.twig",\n
         regex : "-?\\\\}\\\\}",\n
-        next : "start"\n
+        next : "pop"\n
     }, {\n
         token : "meta.tag.twig",\n
         regex : "-?%\\\\}",\n
-        next : "start"\n
+        next : "pop"\n
     }, {\n
         token : "string",\n
         regex : "\'",\n
@@ -1415,8 +1390,6 @@ var TwigHighlightRules = function() {\n
         token : "text",\n
         regex : "\\\\s+"\n
     } ];\n
-\n
-   \n
 \n
     this.$rules["twig-qqstring"] = [{\n
             token : "constant.language.escape",\n
@@ -1424,7 +1397,7 @@ var TwigHighlightRules = function() {\n
         }, {\n
             token : "string",\n
             regex : \'"\',\n
-            next  : "twig-start",\n
+            next  : "twig-start"\n
         }, {\n
             defaultToken : "string"\n
         }\n
@@ -1436,11 +1409,13 @@ var TwigHighlightRules = function() {\n
         }, {\n
             token : "string",\n
             regex : "\'",\n
-            next  : "twig-start",\n
+            next  : "twig-start"\n
         }, {\n
             defaultToken : "string"\n
         }\n
     ];\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(TwigHighlightRules, TextHighlightRules);\n
@@ -1448,15 +1423,14 @@ oop.inherits(TwigHighlightRules, TextHighlightRules);\n
 exports.TwigHighlightRules = TwigHighlightRules;\n
 });\n
 \n
-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_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
 var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
 var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
-var xmlUtil = require("./xml_util");\n
-var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
 \n
 var tagMap = lang.createMap({\n
     a           : \'anchor\',\n
@@ -1465,6 +1439,7 @@ var tagMap = lang.createMap({\n
     img         : \'image\',\n
     input       : \'form\',\n
     label       : \'form\',\n
+    option      : \'form\',\n
     script      : \'script\',\n
     select      : \'form\',\n
     textarea    : \'form\',\n
@@ -1478,80 +1453,255 @@ var tagMap = lang.createMap({\n
 });\n
 \n
 var HtmlHighlightRules = function() {\n
-    this.$rules = {\n
-        start : [{\n
-            token : "text",\n
-            regex : "<\\\\!\\\\[CDATA\\\\[",\n
-            next : "cdata"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\?.*?\\\\?>"\n
-        }, {\n
-            token : "comment",\n
-            regex : "<\\\\!--",\n
-            next : "comment"\n
-        }, {\n
-            token : "xml-pe",\n
-            regex : "<\\\\!.*?>"\n
+    XmlHighlightRules.call(this);\n
+\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=script\\\\b)",\n
-            next : "script"\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
         }, {\n
-            token : "meta.tag",\n
-            regex : "<(?=style\\\\b)",\n
-            next : "style"\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
         }, {\n
-            token : "meta.tag", // opening tag\n
-            regex : "<\\\\/?(?=\\\\S)",\n
-            next : "tag"\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
         }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
+\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
             token : "text",\n
             regex : "\\\\s+"\n
         }, {\n
-            token : "constant.character.entity",\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
             regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
         }],\n
-    \n
-        cdata : [ {\n
-            token : "text",\n
-            regex : "\\\\]\\\\]>",\n
-            next : "start"\n
-        } ],\n
 \n
-        comment : [ {\n
-            token : "comment",\n
-            regex : ".*?-->",\n
-            next : "start"\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
         }, {\n
-            defaultToken : "comment"\n
-        } ]\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start", tagMap);\n
-    xmlUtil.tag(this.$rules, "style", "css-start", tagMap);\n
-    xmlUtil.tag(this.$rules, "script", "js-start", tagMap);\n
-    \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
-    \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
-oop.inherits(HtmlHighlightRules, TextHighlightRules);\n
 \n
-exports.HtmlHighlightRules = HtmlHighlightRules;\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
 });\n
 \n
 define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
@@ -1634,14 +1784,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1656,7 +1801,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1666,8 +1811,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1697,14 +1842,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1718,6 +1858,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1726,8 +1869,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1744,11 +1887,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1827,6 +1970,8 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 \n
 \n
     this.$getMode = function(state) {\n
+        if (typeof state != "string") \n
+            state = state[0];\n
         for (var key in this.subModes) {\n
             if (state.indexOf(key) === 0)\n
                 return this.subModes[key];\n
@@ -1903,7 +2048,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -1936,7 +2081,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -1969,7 +2114,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-typescript.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-typescript.js.xml
index 1ced0852c8..8c12b17fde 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-typescript.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-typescript.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155565.29</string> </value>
+            <value> <string>ts83646621.06</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -64,9 +64,8 @@ var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;\n
 \n
 var Mode = function() {\n
-    var highlighter = new TypeScriptHighlightRules();\n
+    this.HighlightRules = TypeScriptHighlightRules;\n
     \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -96,7 +95,8 @@ var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;\n
 var CStyleFoldMode = require("./folding/cstyle").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new JavaScriptHighlightRules().getRules());\n
+    this.HighlightRules = JavaScriptHighlightRules;\n
+    \n
     this.$outdent = new MatchingBraceOutdent();\n
     this.$behaviour = new CstyleBehaviour();\n
     this.foldingRules = new CStyleFoldMode();\n
@@ -111,7 +111,7 @@ oop.inherits(Mode, TextMode);\n
     this.getNextLineIndent = function(state, line, tab) {\n
         var indent = this.$getIndent(line);\n
 \n
-        var tokenizedLine = this.$tokenizer.getLineTokens(line, state);\n
+        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n
         var tokens = tokenizedLine.tokens;\n
         var endState = tokenizedLine.state;\n
 \n
@@ -217,7 +217,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -292,7 +293,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -337,8 +338,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -425,6 +426,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -992,7 +1001,7 @@ exports.TypeScriptHighlightRules = TypeScriptHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>41207</int> </value>
+            <value> <int>41476</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-vbscript.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-vbscript.js.xml
index ec22de5f8c..40af88c562 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-vbscript.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-vbscript.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155565.43</string> </value>
+            <value> <string>ts83646621.04</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -66,9 +66,7 @@ var Tokenizer = require("../tokenizer").Tokenizer;\n
 var VBScriptHighlightRules = require("./vbscript_highlight_rules").VBScriptHighlightRules;\n
 \n
 var Mode = function() {\n
-    var highlighter = new VBScriptHighlightRules();\n
-    \n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
+    this.HighlightRules = VBScriptHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -192,7 +190,7 @@ var VBScriptHighlightRules = function() {\n
             token: [\n
                 "support.function.asp"\n
             ],\n
-            regex: "(?:\\\\b(Lock|Unlock|SetAbort|SetComplete|BianryRead|AddHeader|AppendToLog|BinaryWrite|Clear|End|Flush|Redirect|Write|CreateObject|HTMLEncode|MapPath|URLEncode|Abandon|Convert|Regex)\\\\b)"\n
+            regex: "(?:\\\\b(Lock|Unlock|SetAbort|SetComplete|BinaryRead|AddHeader|AppendToLog|BinaryWrite|Clear|End|Flush|Redirect|Write|CreateObject|HTMLEncode|MapPath|URLEncode|Abandon|Convert|Regex)\\\\b)"\n
         },\n
         {\n
             token: [\n
@@ -312,7 +310,7 @@ exports.VBScriptHighlightRules = VBScriptHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>10027</int> </value>
+            <value> <int>9959</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-velocity.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-velocity.js.xml
index 47bbc34b8c..c8c9ea82cb 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-velocity.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-velocity.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155565.56</string> </value>
+            <value> <string>ts83646621.03</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -18,6 +18,33 @@
             <key> <string>content_type</string> </key>
             <value> <string>application/javascript</string> </value>
         </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>68951</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
         <item>
             <key> <string>data</string> </key>
             <value> <string encoding="cdata"><![CDATA[
@@ -64,30 +91,29 @@ var FoldMode = require("./folding/velocity").FoldMode;\n
 var HtmlBehaviour = require("./behaviour/html").HtmlBehaviour;\n
 \n
 var Mode = function() {\n
-    var highlighter = new VelocityHighlightRules();\n
+    this.HighlightRules = VelocityHighlightRules;\n
     this.foldingRules = new FoldMode();\n
-    this.$tokenizer = new Tokenizer(highlighter.getRules());\n
     this.$behaviour = new HtmlBehaviour();\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
 (function() {\n
-  this.lineCommentStart = "##";\n
-  this.blockComment = {start: "#*", end: "*#"};\n
+    this.lineCommentStart = "##";\n
+    this.blockComment = {start: "#*", end: "*#"};\n
 }).call(Mode.prototype);\n
 \n
 exports.Mode = Mode;\n
-});define(\'ace/mode/velocity_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/lang\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\', \'ace/mode/css_highlight_rules\', \'ace/mode/javascript_highlight_rules\'], function(require, exports, module) {\n
+});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) {\n
 \n
 \n
 var oop = require("../lib/oop");\n
 var lang = require("../lib/lang");\n
-var xmlUtil = require("./xml_util");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
-var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
-var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;\n
 \n
 var VelocityHighlightRules = function() {\n
+    HtmlHighlightRules.call(this);\n
+\n
     var builtinConstants = lang.arrayToMap(\n
         (\'true|false|null\').split(\'|\')\n
     );\n
@@ -107,194 +133,140 @@ var VelocityHighlightRules = function() {\n
         ).split(\'|\')\n
     );\n
 \n
-    this.$rules = {\n
-        "start" : [\n
-            {\n
-                token : "meta.tag",\n
-                regex : "<\\\\!\\\\[CDATA\\\\[",\n
-                next : "cdata"\n
-            }, {\n
-                token : "xml-pe",\n
-                regex : "<\\\\?.*?\\\\?>"\n
-            }, {\n
-                token : "comment",\n
-                regex : "<\\\\!--",\n
-                next : "comment"\n
-            }, {\n
-                token : "meta.tag",\n
-                regex : "<(?=\\\\s*script\\\\b)",\n
-                next : "script"\n
-            }, {\n
-                token : "meta.tag",\n
-                regex : "<(?=\\\\s*style\\\\b)",\n
-                next : "style"\n
-            }, {\n
-                token : "meta.tag", // opening tag\n
-                regex : "<\\\\/?(?=[a-z])",\n
-                next : "tag"\n
-            }, {\n
-                token : "comment",\n
-                regex : "##.*$"\n
-            },{\n
-                token : "comment.block", // multi line comment\n
-                regex : "#\\\\*",\n
-                next : "comment"\n
-            }, {\n
-                token : "string.regexp",\n
-                regex : "[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)"\n
-            }, {\n
-                token : "string", // single line\n
-                regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-            }, {\n
-                token : "string", // single line\n
-                regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-            }, {\n
-                token : "constant.numeric", // hex\n
-                regex : "0[xX][0-9a-fA-F]+\\\\b"\n
-            }, {\n
-                token : "constant.numeric", // float\n
-                regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
-            }, {\n
-                token : "constant.language.boolean",\n
-                regex : "(?:true|false)\\\\b"\n
-            }, {\n
-                token : function(value) {\n
-                    if (keywords.hasOwnProperty(value))\n
-                        return "keyword";\n
-                    else if (builtinConstants.hasOwnProperty(value))\n
-                        return "constant.language";\n
-                    else if (builtinVariables.hasOwnProperty(value))\n
-                        return "variable.language";\n
-                    else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1)))\n
-                        return "support.function";\n
-                    else if (value == "debugger")\n
-                        return "invalid.deprecated";\n
-                    else\n
-                        if(value.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*)$/))\n
-                            return "variable";\n
-                        return "identifier";\n
-                },\n
-                regex : "[a-zA-Z$#][a-zA-Z0-9_]*\\\\b"\n
-            }, {\n
-                token : "keyword.operator",\n
-                regex : "!|&|\\\\*|\\\\-|\\\\+|=|!=|<=|>=|<|>|&&|\\\\|\\\\|"\n
-            }, {\n
-                token : "lparen",\n
-                regex : "[[({]"\n
-            }, {\n
-                token : "rparen",\n
-                regex : "[\\\\])}]"\n
-            }, {\n
-                token : "text",\n
-                regex : "\\\\s+"\n
-            }\n
-        ],\n
-        "cdata" : [\n
-            {\n
-                token : "text",\n
-                regex : "\\\\]\\\\]>",\n
-                next : "start"\n
-            }, {\n
-                token : "text",\n
-                regex : "\\\\s+"\n
-            }, {\n
-                token : "text",\n
-                regex : ".+"\n
-            }\n
-        ],\n
-        "comment" : [\n
-            {\n
-                token : "comment", // closing comment\n
-                regex : "\\\\*#|-->",\n
-                next : "start"\n
-            }, {\n
-                defaultToken: "comment"\n
-            }\n
-        ],\n
-        "vm_start" : [\n
-            {\n
-                token: "variable",\n
-                regex: "}",\n
-                next: "start"\n
-            }, {\n
-                token : "string.regexp",\n
-                regex : "[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)"\n
-            }, {\n
-                token : "string", // single line\n
-                regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-            }, {\n
-                token : "string", // single line\n
-                regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-            }, {\n
-                token : "constant.numeric", // hex\n
-                regex : "0[xX][0-9a-fA-F]+\\\\b"\n
-            }, {\n
-                token : "constant.numeric", // float\n
-                regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
-            }, {\n
-                token : "constant.language.boolean",\n
-                regex : "(?:true|false)\\\\b"\n
-            }, {\n
-                token : function(value) {\n
-                    if (keywords.hasOwnProperty(value))\n
-                        return "keyword";\n
-                    else if (builtinConstants.hasOwnProperty(value))\n
-                        return "constant.language";\n
-                    else if (builtinVariables.hasOwnProperty(value))\n
-                        return "variable.language";\n
-                    else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1)))\n
-                        return "support.function";\n
-                    else if (value == "debugger")\n
-                        return "invalid.deprecated";\n
-                    else\n
-                        if(value.match(/^(\\$[a-zA-Z_$][a-zA-Z0-9_]*)$/))\n
-                            return "variable";\n
-                        return "identifier";\n
-                },\n
-                regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
-            }, {\n
-                token : "keyword.operator",\n
-                regex : "!|&|\\\\*|\\\\-|\\\\+|=|!=|<=|>=|<|>|&&|\\\\|\\\\|"\n
-            }, {\n
-                token : "lparen",\n
-                regex : "[[({]"\n
-            }, {\n
-                token : "rparen",\n
-                regex : "[\\\\])}]"\n
-            }, {\n
-                token : "text",\n
-                regex : "\\\\s+"\n
-            }\n
-        ]\n
-    };\n
-\n
-    xmlUtil.tag(this.$rules, "tag", "start");\n
-    xmlUtil.tag(this.$rules, "style", "css-start");\n
-    xmlUtil.tag(this.$rules, "script", "js-start");\n
+    this.$rules.start.push(\n
+        {\n
+            token : "comment",\n
+            regex : "##.*$"\n
+        },{\n
+            token : "comment.block", // multi line comment\n
+            regex : "#\\\\*",\n
+            next : "vm_comment"\n
+        }, {\n
+            token : "string.regexp",\n
+            regex : "[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : "constant.numeric", // hex\n
+            regex : "0[xX][0-9a-fA-F]+\\\\b"\n
+        }, {\n
+            token : "constant.numeric", // float\n
+            regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
+        }, {\n
+            token : "constant.language.boolean",\n
+            regex : "(?:true|false)\\\\b"\n
+        }, {\n
+            token : function(value) {\n
+                if (keywords.hasOwnProperty(value))\n
+                    return "keyword";\n
+                else if (builtinConstants.hasOwnProperty(value))\n
+                    return "constant.language";\n
+                else if (builtinVariables.hasOwnProperty(value))\n
+                    return "variable.language";\n
+                else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1)))\n
+                    return "support.function";\n
+                else if (value == "debugger")\n
+                    return "invalid.deprecated";\n
+                else\n
+                    if(value.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*)$/))\n
+                        return "variable";\n
+                    return "identifier";\n
+            },\n
+            regex : "[a-zA-Z$#][a-zA-Z0-9_]*\\\\b"\n
+        }, {\n
+            token : "keyword.operator",\n
+            regex : "!|&|\\\\*|\\\\-|\\\\+|=|!=|<=|>=|<|>|&&|\\\\|\\\\|"\n
+        }, {\n
+            token : "lparen",\n
+            regex : "[[({]"\n
+        }, {\n
+            token : "rparen",\n
+            regex : "[\\\\])}]"\n
+        }, {\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }\n
+    );\n
 \n
-    this.embedRules(JavaScriptHighlightRules, "js-", [{\n
-        token: "comment",\n
-        regex: "\\\\/\\\\/.*(?=<\\\\/script>)",\n
-        next: "tag"\n
-    }, {\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=script)",\n
-        next: "tag"\n
-    }]);\n
+    this.$rules["vm_comment"] = [\n
+        {\n
+            token : "comment", // closing comment\n
+            regex : "\\\\*#|-->",\n
+            next : "start"\n
+        }, {\n
+            defaultToken: "comment"\n
+        }\n
+    ];\n
 \n
-    this.embedRules(CssHighlightRules, "css-", [{\n
-        token: "meta.tag",\n
-        regex: "<\\\\/(?=style)",\n
-        next: "tag"\n
-    }]);\n
+    this.$rules["vm_start"] = [\n
+        {\n
+            token: "variable",\n
+            regex: "}",\n
+            next: "pop"\n
+        }, {\n
+            token : "string.regexp",\n
+            regex : "[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : "constant.numeric", // hex\n
+            regex : "0[xX][0-9a-fA-F]+\\\\b"\n
+        }, {\n
+            token : "constant.numeric", // float\n
+            regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
+        }, {\n
+            token : "constant.language.boolean",\n
+            regex : "(?:true|false)\\\\b"\n
+        }, {\n
+            token : function(value) {\n
+                if (keywords.hasOwnProperty(value))\n
+                    return "keyword";\n
+                else if (builtinConstants.hasOwnProperty(value))\n
+                    return "constant.language";\n
+                else if (builtinVariables.hasOwnProperty(value))\n
+                    return "variable.language";\n
+                else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1)))\n
+                    return "support.function";\n
+                else if (value == "debugger")\n
+                    return "invalid.deprecated";\n
+                else\n
+                    if(value.match(/^(\\$[a-zA-Z_$][a-zA-Z0-9_]*)$/))\n
+                        return "variable";\n
+                    return "identifier";\n
+            },\n
+            regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
+        }, {\n
+            token : "keyword.operator",\n
+            regex : "!|&|\\\\*|\\\\-|\\\\+|=|!=|<=|>=|<|>|&&|\\\\|\\\\|"\n
+        }, {\n
+            token : "lparen",\n
+            regex : "[[({]"\n
+        }, {\n
+            token : "rparen",\n
+            regex : "[\\\\])}]"\n
+        }, {\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }\n
+    ];\n
 \n
     for (var i in this.$rules) {\n
         this.$rules[i].unshift({\n
             token: "variable",\n
             regex: "\\\\${",\n
-            next: "vm_start"\n
+            push: "vm_start"\n
         });\n
     }\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(VelocityHighlightRules, TextHighlightRules);\n
@@ -302,74 +274,98 @@ oop.inherits(VelocityHighlightRules, TextHighlightRules);\n
 exports.VelocityHighlightRules = VelocityHighlightRules;\n
 });\n
 \n
-define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+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) {\n
 \n
 \n
-function string(state) {\n
-    return [{\n
-        token : "string",\n
-        regex : \'"\',\n
-        next : state + "_qqstring"\n
-    }, {\n
-        token : "string",\n
-        regex : "\'",\n
-        next : state + "_qstring"\n
-    }];\n
-}\n
+var oop = require("../lib/oop");\n
+var lang = require("../lib/lang");\n
+var CssHighlightRules = require("./css_highlight_rules").CssHighlightRules;\n
+var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;\n
+var XmlHighlightRules = require("./xml_highlight_rules").XmlHighlightRules;\n
+\n
+var tagMap = lang.createMap({\n
+    a           : \'anchor\',\n
+    button \t    : \'form\',\n
+    form        : \'form\',\n
+    img         : \'image\',\n
+    input       : \'form\',\n
+    label       : \'form\',\n
+    option      : \'form\',\n
+    script      : \'script\',\n
+    select      : \'form\',\n
+    textarea    : \'form\',\n
+    style       : \'style\',\n
+    table       : \'table\',\n
+    tbody       : \'table\',\n
+    td          : \'table\',\n
+    tfoot       : \'table\',\n
+    th          : \'table\',\n
+    tr          : \'table\'\n
+});\n
 \n
-function multiLineString(quote, state) {\n
-    return [\n
-        {token : "string", regex : quote, next : state},\n
-        {\n
-            token : "constant.language.escape",\n
-            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
-        },\n
-        {defaultToken : "string"}\n
-    ];\n
-}\n
+var HtmlHighlightRules = function() {\n
+    XmlHighlightRules.call(this);\n
 \n
-exports.tag = function(states, name, nextState, tagMap) {\n
-    states[name] = [{\n
-        token : "text",\n
-        regex : "\\\\s+"\n
-    }, {\n
-        \n
-    token : !tagMap ? "meta.tag.tag-name" : function(value) {\n
-            if (tagMap[value])\n
-                return "meta.tag.tag-name." + tagMap[value];\n
-            else\n
-                return "meta.tag.tag-name";\n
-        },\n
-        regex : "[-_a-zA-Z0-9:]+",\n
-        next : name + "_embed_attribute_list" \n
-    }, {\n
-        token: "empty",\n
-        regex: "",\n
-        next : name + "_embed_attribute_list"\n
-    }];\n
+    this.addRules({\n
+        attributes: [{\n
+            include : "space"\n
+        }, {\n
+            token : "entity.other.attribute-name",\n
+            regex : "[-_a-zA-Z0-9:]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "=",\n
+            push : [{\n
+                include: "space"\n
+            }, {\n
+                token : "string",\n
+                regex : "[^<>=\'\\"`\\\\s]+",\n
+                next : "pop"\n
+            }, {\n
+                token : "empty",\n
+                regex : "",\n
+                next : "pop"\n
+            }]\n
+        }, {\n
+            include : "string"\n
+        }],\n
+        tag: [{\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(<)([-_a-zA-Z0-9:]+)",\n
+            next: "start_tag_stuff"\n
+        }, {\n
+            token : function(start, tag) {\n
+                var group = tagMap[tag];\n
+                return ["meta.tag.punctuation.begin",\n
+                    "meta.tag.name" + (group ? "." + group : "")];\n
+            },\n
+            regex : "(</)([-_a-zA-Z0-9:]+)",\n
+            next: "end_tag_stuff"\n
+        }],\n
+        start_tag_stuff: [\n
+            {include : "attributes"},\n
+            {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+        ],\n
+        end_tag_stuff: [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+        ]\n
+    });\n
 \n
-    states[name + "_qstring"] = multiLineString("\'", name + "_embed_attribute_list");\n
-    states[name + "_qqstring"] = multiLineString("\\"", name + "_embed_attribute_list");\n
-    \n
-    states[name + "_embed_attribute_list"] = [{\n
-        token : "meta.tag.r",\n
-        regex : "/?>",\n
-        next : nextState\n
-    }, {\n
-        token : "keyword.operator",\n
-        regex : "="\n
-    }, {\n
-        token : "entity.other.attribute-name",\n
-        regex : "[-_a-zA-Z0-9:]+"\n
-    }, {\n
-        token : "constant.numeric", // float\n
-        regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
-    }, {\n
-        token : "text",\n
-        regex : "\\\\s+"\n
-    }].concat(string(name));\n
+    this.embedTagRules(CssHighlightRules, "css-", "style");\n
+    this.embedTagRules(JavaScriptHighlightRules, "js-", "script");\n
+\n
+    if (this.constructor === HtmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
+oop.inherits(HtmlHighlightRules, XmlHighlightRules);\n
+\n
+exports.HtmlHighlightRules = HtmlHighlightRules;\n
 });\n
 \n
 define(\'ace/mode/css_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/lib/lang\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
@@ -397,152 +393,117 @@ var CssHighlightRules = function() {\n
         "support.constant.color": supportConstantColor,\n
         "support.constant.fonts": supportConstantFonts\n
     }, "text", true);\n
-\n
-    var base_ruleset = [\n
-        {\n
-            token : "comment", // multi line comment\n
-            regex : "\\\\/\\\\*",\n
-            next : "ruleset_comment"\n
-        }, {\n
-            token : "string", // single line\n
-            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
-        }, {\n
-            token : "string", // single line\n
-            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
-        }, {\n
-            token : ["constant.numeric", "keyword"],\n
-            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|%)"\n
-        }, {\n
-            token : "constant.numeric",\n
-            regex : numRe\n
-        }, {\n
-            token : "constant.numeric",  // hex6 color\n
-            regex : "#[a-f0-9]{6}"\n
-        }, {\n
-            token : "constant.numeric", // hex3 color\n
-            regex : "#[a-f0-9]{3}"\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
-            regex : pseudoElements\n
-        }, {\n
-            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
-            regex : pseudoClasses\n
-        }, {\n
-            token : ["support.function", "string", "support.function"],\n
-            regex : "(url\\\\()(.*)(\\\\))"\n
-        }, {\n
-            token : keywordMapper,\n
-            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
-        }, {\n
-            caseInsensitive: true\n
-        }\n
-      ];\n
-\n
-    var ruleset = lang.copyArray(base_ruleset);\n
-    ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "start"\n
-    });\n
-\n
-    var media_ruleset = lang.copyArray( base_ruleset );\n
-    media_ruleset.unshift({\n
-        token : "paren.rparen",\n
-        regex : "\\\\}",\n
-        next:   "media"\n
-    });\n
-\n
-    var base_comment = [{\n
-          token : "comment", // comment spanning whole line\n
-          regex : ".+"\n
-    }];\n
-\n
-    var comment = lang.copyArray(base_comment);\n
-    comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "start"\n
-    });\n
-\n
-    var media_comment = lang.copyArray(base_comment);\n
-    media_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "media"\n
-    });\n
-\n
-    var ruleset_comment = lang.copyArray(base_comment);\n
-    ruleset_comment.unshift({\n
-          token : "comment", // closing comment\n
-          regex : ".*?\\\\*\\\\/",\n
-          next : "ruleset"\n
-    });\n
 \n
     this.$rules = {\n
         "start" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "ruleset"\n
+            push:  "ruleset"\n
         }, {\n
             token: "string",\n
             regex: "@.*?{",\n
-            next:  "media"\n
-        },{\n
+            push:  "media"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "media" : [ {\n
+        "media" : [{\n
             token : "comment", // multi line comment\n
             regex : "\\\\/\\\\*",\n
-            next : "media_comment"\n
+            push : "comment"\n
         }, {\n
             token: "paren.lparen",\n
             regex: "\\\\{",\n
-            next:  "media_ruleset"\n
-        },{\n
+            push:  "ruleset"\n
+        }, {\n
             token: "string",\n
             regex: "\\\\}",\n
-            next:  "start"\n
-        },{\n
+            next:  "pop"\n
+        }, {\n
             token: "keyword",\n
             regex: "#[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "variable",\n
             regex: "\\\\.[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "string",\n
             regex: ":[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             token: "constant",\n
             regex: "[a-z0-9-_]+"\n
-        },{\n
+        }, {\n
             caseInsensitive: true\n
         }],\n
 \n
-        "comment" : comment,\n
-\n
-        "ruleset" : ruleset,\n
-        "ruleset_comment" : ruleset_comment,\n
+        "comment" : [{\n
+            token : "comment",\n
+            regex : "\\\\*\\\\/",\n
+            next : "pop"\n
+        }, {\n
+            defaultToken : "comment"\n
+        }],\n
 \n
-        "media_ruleset" : media_ruleset,\n
-        "media_comment" : media_comment\n
+        "ruleset" : [\n
+        {\n
+            token : "paren.rparen",\n
+            regex : "\\\\}",\n
+            next:   "pop"\n
+        }, {\n
+            token : "comment", // multi line comment\n
+            regex : "\\\\/\\\\*",\n
+            push : "comment"\n
+        }, {\n
+            token : "string", // single line\n
+            regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
+        }, {\n
+            token : "string", // single line\n
+            regex : "[\'](?:(?:\\\\\\\\.)|(?:[^\'\\\\\\\\]))*?[\']"\n
+        }, {\n
+            token : ["constant.numeric", "keyword"],\n
+            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|%)"\n
+        }, {\n
+            token : "constant.numeric",\n
+            regex : numRe\n
+        }, {\n
+            token : "constant.numeric",  // hex6 color\n
+            regex : "#[a-f0-9]{6}"\n
+        }, {\n
+            token : "constant.numeric", // hex3 color\n
+            regex : "#[a-f0-9]{3}"\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-element.css"],\n
+            regex : pseudoElements\n
+        }, {\n
+            token : ["punctuation", "entity.other.attribute-name.pseudo-class.css"],\n
+            regex : pseudoClasses\n
+        }, {\n
+            token : ["support.function", "string", "support.function"],\n
+            regex : "(url\\\\()(.*)(\\\\))"\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*"\n
+        }, {\n
+            caseInsensitive: true\n
+        }]\n
     };\n
+\n
+    this.normalizeRules();\n
 };\n
 \n
 oop.inherits(CssHighlightRules, TextHighlightRules);\n
@@ -600,7 +561,8 @@ var JavaScriptHighlightRules = function() {\n
         "no_regex" : [\n
             {\n
                 token : "comment",\n
-                regex : /\\/\\/.*$/\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment"\n
             },\n
             DocCommentHighlightRules.getStartRule("doc-start"),\n
             {\n
@@ -675,7 +637,7 @@ var JavaScriptHighlightRules = function() {\n
                 next : "start"\n
             }, {\n
                 token : ["punctuation.operator", "support.function"],\n
-                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:opzzzz|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(?=\\()/\n
+                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(?=\\()/\n
             }, {\n
                 token : ["punctuation.operator", "support.function.dom"],\n
                 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)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n
@@ -720,8 +682,8 @@ var JavaScriptHighlightRules = function() {\n
                 next : "comment_regex_allowed"\n
             }, {\n
                 token : "comment",\n
-                regex : "\\\\/\\\\/.*$",\n
-                next : "start"\n
+                regex : "\\\\/\\\\/",\n
+                next : "line_comment_regex_allowed"\n
             }, {\n
                 token: "string.regexp",\n
                 regex: "\\\\/",\n
@@ -808,6 +770,14 @@ var JavaScriptHighlightRules = function() {\n
             {token : "comment", regex : "\\\\*\\\\/", next : "no_regex"},\n
             {defaultToken : "comment"}\n
         ],\n
+        "line_comment_regex_allowed" : [\n
+            {token : "comment", regex : "$|^", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+        "line_comment" : [\n
+            {token : "comment", regex : "$|^", next : "no_regex"},\n
+            {defaultToken : "comment"}\n
+        ],\n
         "qqstring" : [\n
             {\n
                 token : "constant.language.escape",\n
@@ -895,6 +865,263 @@ exports.DocCommentHighlightRules = DocCommentHighlightRules;\n
 \n
 });\n
 \n
+define(\'ace/mode/xml_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/xml_util\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var xmlUtil = require("./xml_util");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var XmlHighlightRules = function(normalize) {\n
+    this.$rules = {\n
+        start : [\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
+            {token : "comment", regex : "<\\\\!--", next : "comment"},\n
+            {\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
+        ],\n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
+        cdata : [\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "text", regex : "\\\\s+"},\n
+            {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
+        ],\n
+\n
+        comment : [\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
+    };\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
+};\n
+\n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
+oop.inherits(XmlHighlightRules, TextHighlightRules);\n
+\n
+exports.XmlHighlightRules = XmlHighlightRules;\n
+});\n
+\n
+define(\'ace/mode/xml_util\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+function string(state) {\n
+    return [{\n
+        token : "string",\n
+        regex : \'"\',\n
+        next : state + "_qqstring"\n
+    }, {\n
+        token : "string",\n
+        regex : "\'",\n
+        next : state + "_qstring"\n
+    }];\n
+}\n
+\n
+function multiLineString(quote, state) {\n
+    return [\n
+        {token : "string", regex : quote, next : state},\n
+        {\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
+        },\n
+        {defaultToken : "string"}\n
+    ];\n
+}\n
+\n
+exports.tag = function(states, name, nextState, tagMap) {\n
+    states[name] = [{\n
+        token : "text",\n
+        regex : "\\\\s+"\n
+    }, {\n
+        \n
+    token : !tagMap ? "meta.tag.tag-name" : function(value) {\n
+            if (tagMap[value])\n
+                return "meta.tag.tag-name." + tagMap[value];\n
+            else\n
+                return "meta.tag.tag-name";\n
+        },\n
+        regex : "[-_a-zA-Z0-9:]+",\n
+        next : name + "_embed_attribute_list" \n
+    }, {\n
+        token: "empty",\n
+        regex: "",\n
+        next : name + "_embed_attribute_list"\n
+    }];\n
+\n
+    states[name + "_qstring"] = multiLineString("\'", name + "_embed_attribute_list");\n
+    states[name + "_qqstring"] = multiLineString("\\"", name + "_embed_attribute_list");\n
+    \n
+    states[name + "_embed_attribute_list"] = [{\n
+        token : "meta.tag.r",\n
+        regex : "/?>",\n
+        next : nextState\n
+    }, {\n
+        token : "keyword.operator",\n
+        regex : "="\n
+    }, {\n
+        token : "entity.other.attribute-name",\n
+        regex : "[-_a-zA-Z0-9:]+"\n
+    }, {\n
+        token : "constant.numeric", // float\n
+        regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
+    }, {\n
+        token : "text",\n
+        regex : "\\\\s+"\n
+    }].concat(string(name));\n
+};\n
+\n
+});\n
+\n
 define(\'ace/mode/folding/velocity\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/folding/fold_mode\', \'ace/range\'], function(require, exports, module) {\n
 \n
 \n
@@ -992,14 +1219,9 @@ var TokenIterator = require("../../token_iterator").TokenIterator;\n
 var voidElements = [\'area\', \'base\', \'br\', \'col\', \'command\', \'embed\', \'hr\', \'img\', \'input\', \'keygen\', \'link\', \'meta\', \'param\', \'source\', \'track\', \'wbr\'];\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1014,7 +1236,7 @@ var HtmlBehaviour = function () {\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
 \n
-            if (hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
                 return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
@@ -1024,8 +1246,8 @@ var HtmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var element = token.value;\n
             if (atCursor){\n
@@ -1055,14 +1277,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -1076,6 +1293,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -1084,8 +1304,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -1102,11 +1322,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -1448,18 +1668,6 @@ exports.CstyleBehaviour = CstyleBehaviour;\n
 
 ]]></string> </value>
         </item>
-        <item>
-            <key> <string>precondition</string> </key>
-            <value> <string></string> </value>
-        </item>
-        <item>
-            <key> <string>size</string> </key>
-            <value> <int>63034</int> </value>
-        </item>
-        <item>
-            <key> <string>title</string> </key>
-            <value> <string></string> </value>
-        </item>
       </dictionary>
     </pickle>
   </record>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-verilog.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-verilog.js.xml
index 3ac806a348..a88ef39fca 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-verilog.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-verilog.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155565.71</string> </value>
+            <value> <string>ts83646621.01</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,7 +62,7 @@ var VerilogHighlightRules = require("./verilog_highlight_rules").VerilogHighligh
 var Range = require("../range").Range;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new VerilogHighlightRules().getRules());\n
+    this.HighlightRules = VerilogHighlightRules;\n
 };\n
 oop.inherits(Mode, TextMode);\n
 \n
@@ -158,7 +158,7 @@ exports.VerilogHighlightRules = VerilogHighlightRules;\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5364</int> </value>
+            <value> <int>5336</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-vhdl.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-vhdl.js.xml
new file mode 100644
index 0000000000..f1b05169d7
--- /dev/null
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-vhdl.js.xml
@@ -0,0 +1,182 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="File" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_EtagSupport__etag</string> </key>
+            <value> <string>ts83646620.18</string> </value>
+        </item>
+        <item>
+            <key> <string>__name__</string> </key>
+            <value> <string>mode-vhdl.js</string> </value>
+        </item>
+        <item>
+            <key> <string>content_type</string> </key>
+            <value> <string>application/javascript</string> </value>
+        </item>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+/* ***** BEGIN LICENSE BLOCK *****\r\n
+ * Distributed under the BSD license:\r\n
+ *\r\n
+ * Copyright (c) 2013, Ajax.org B.V.\r\n
+ * All rights reserved.\r\n
+ * \r\n
+ * Redistribution and use in source and binary forms, with or without\r\n
+ * modification, are permitted provided that the following conditions are met:\r\n
+ *     * Redistributions of source code must retain the above copyright\r\n
+ *       notice, this list of conditions and the following disclaimer.\r\n
+ *     * Redistributions in binary form must reproduce the above copyright\r\n
+ *       notice, this list of conditions and the following disclaimer in the\r\n
+ *       documentation and/or other materials provided with the distribution.\r\n
+ *     * Neither the name of Ajax.org B.V. nor the\r\n
+ *       names of its contributors may be used to endorse or promote products\r\n
+ *       derived from this software without specific prior written permission.\r\n
+ * \r\n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\r\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n
+ *\r\n
+ * ***** END LICENSE BLOCK ***** */\r\n
+define(\'ace/mode/vhdl\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text\', \'ace/tokenizer\', \'ace/mode/vhdl_highlight_rules\', \'ace/range\'], function(require, exports, module) {\r\n
+\r\n
+\r\n
+var oop = require("../lib/oop");\r\n
+var TextMode = require("./text").Mode;\r\n
+var Tokenizer = require("../tokenizer").Tokenizer;\r\n
+var VHDLHighlightRules = require("./vhdl_highlight_rules").VHDLHighlightRules;\r\n
+var Range = require("../range").Range;\r\n
+\r\n
+var Mode = function() {\r\n
+    this.HighlightRules = VHDLHighlightRules;\r\n
+};\r\n
+oop.inherits(Mode, TextMode);\r\n
+\r\n
+(function() {\r\n
+\r\n
+    this.lineCommentStart = "--";\r\n
+\r\n
+}).call(Mode.prototype);\r\n
+\r\n
+exports.Mode = Mode;\r\n
+\r\n
+});\n
+define(\'ace/mode/vhdl_highlight_rules\', [\'require\', \'exports\', \'module\' , \'ace/lib/oop\', \'ace/mode/text_highlight_rules\'], function(require, exports, module) {\n
+\n
+\n
+var oop = require("../lib/oop");\n
+var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
+\n
+var VHDLHighlightRules = function() {\n
+\n
+\n
+    \n
+    var keywords = "access|after|ailas|all|architecture|assert|attribute|"+\n
+                   "begin|block|buffer|bus|case|component|configuration|"+\n
+                   "disconnect|downto|else|elsif|end|entity|file|for|function|"+\n
+                   "generate|generic|guarded|if|impure|in|inertial|inout|is|"+\n
+                   "label|linkage|literal|loop|mapnew|next|of|on|open|"+\n
+                   "others|out|port|process|pure|range|record|reject|"+\n
+                   "report|return|select|shared|subtype|then|to|transport|"+\n
+                   "type|unaffected|united|until|wait|when|while|with";\n
+    \n
+    var storageType = "bit|bit_vector|boolean|character|integer|line|natural|"+\n
+                      "positive|real|register|severity|signal|signed|"+\n
+                      "std_logic|std_logic_vector|string||text|time|unsigned|"+\n
+                      "variable";\n
+    \n
+    var storageModifiers = "array|constant";\n
+    \n
+    var keywordOperators = "abs|and|mod|nand|nor|not|rem|rol|ror|sla|sll|sra"+\n
+                           "srl|xnor|xor";\n
+    \n
+    var builtinConstants = (\n
+        "true|false|null"\n
+    );\n
+\n
+\n
+    var keywordMapper = this.createKeywordMapper({\n
+        "keyword.operator": keywordOperators,\n
+        "keyword": keywords,\n
+        "constant.language": builtinConstants,\n
+        "storage.modifier": storageModifiers,\n
+        "storage.type": storageType\n
+    }, "identifier", true);\n
+\n
+    this.$rules = {\n
+        "start" : [ {\n
+            token : "comment",\n
+            regex : "--.*$"\n
+        }, {\n
+            token : "string",           // " string\n
+            regex : \'".*?"\'\n
+        }, {\n
+            token : "string",           // \' string\n
+            regex : "\'.*?\'"\n
+        }, {\n
+            token : "constant.numeric", // float\n
+            regex : "[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b"\n
+        }, {\n
+            token : "keyword", // pre-compiler directives\n
+            regex : "\\\\s*(?:library|package|use)\\\\b",\n
+        }, {\n
+            token : keywordMapper,\n
+            regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b"\n
+        }, {\n
+            token : "keyword.operator",\n
+            regex : "&|\\\\*|\\\\+|\\\\-|\\\\/|<|=|>|\\\\||=>|\\\\*\\\\*|:=|\\\\/=|>=|<=|<>" \n
+        }, {\n
+              token : "punctuation.operator",\n
+              regex : "\\\\\'|\\\\:|\\\\,|\\\\;|\\\\."\n
+        },{\n
+            token : "paren.lparen",\n
+            regex : "[[(]"\n
+        }, {\n
+            token : "paren.rparen",\n
+            regex : "[\\\\])]"\n
+        }, {\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        } ],\n
+\n
+       \n
+    };\n
+};\n
+\n
+oop.inherits(VHDLHighlightRules, TextHighlightRules);\n
+\n
+exports.VHDLHighlightRules = VHDLHighlightRules;\n
+});\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>precondition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>size</string> </key>
+            <value> <int>5333</int> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-xml.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-xml.js.xml
index 925434d6c3..46a68cdb11 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-xml.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-xml.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155565.87</string> </value>
+            <value> <string>ts83646621.0</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,7 +63,7 @@ var XmlBehaviour = require("./behaviour/xml").XmlBehaviour;\n
 var XmlFoldMode = require("./folding/xml").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new XmlHighlightRules().getRules());\n
+    this.HighlightRules = XmlHighlightRules;\n
     this.$behaviour = new XmlBehaviour();\n
     this.foldingRules = new XmlFoldMode();\n
 };\n
@@ -86,36 +86,181 @@ var oop = require("../lib/oop");\n
 var xmlUtil = require("./xml_util");\n
 var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;\n
 \n
-var XmlHighlightRules = function() {\n
+var XmlHighlightRules = function(normalize) {\n
     this.$rules = {\n
         start : [\n
-            {token : "text", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
-            {token : "xml-pe", regex : "<\\\\?.*?\\\\?>"},\n
+            {token : "punctuation.string.begin", regex : "<\\\\!\\\\[CDATA\\\\[", next : "cdata"},\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)(xml)(?=[\\\\s])", next : "xml_declaration"\n
+            },\n
+            {\n
+                token : ["punctuation.instruction.begin", "keyword.instruction"],\n
+                regex : "(<\\\\?)([-_a-zA-Z0-9]+)", next : "instruction"\n
+            },\n
             {token : "comment", regex : "<\\\\!--", next : "comment"},\n
-            {token : "xml-pe", regex : "<\\\\!.*?>"},\n
-            {token : "meta.tag", regex : "<\\\\/?", next : "tag"},\n
-            {token : "text", regex : "\\\\s+"},\n
             {\n
-                token : "constant.character.entity", \n
-                regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)" \n
-            }\n
+                token : ["punctuation.doctype.begin", "meta.tag.doctype"],\n
+                regex : "(<\\\\!)(DOCTYPE)(?=[\\\\s])", next : "doctype"\n
+            },\n
+            {include : "tag"},\n
+            {include : "reference"}\n
         ],\n
-        \n
+\n
+        xml_declaration : [\n
+            {include : "attributes"},\n
+            {include : "instruction"}\n
+        ],\n
+\n
+        instruction : [\n
+            {token : "punctuation.instruction.end", regex : "\\\\?>", next : "start"}\n
+        ],\n
+\n
+        doctype : [\n
+            {include : "space"},\n
+            {include : "string"},\n
+            {token : "punctuation.doctype.end", regex : ">", next : "start"},\n
+            {token : "xml-pe", regex : "[-_a-zA-Z0-9:]+"},\n
+            {token : "punctuation.begin", regex : "\\\\[", push : "declarations"}\n
+        ],\n
+\n
+        declarations : [{\n
+            token : "text",\n
+            regex : "\\\\s+"\n
+        }, {\n
+            token: "punctuation.end",\n
+            regex: "]",\n
+            next: "pop"\n
+        }, {\n
+            token : ["punctuation.begin", "keyword"],\n
+            regex : "(<\\\\!)([-_a-zA-Z0-9]+)",\n
+            push : [{\n
+                token : "text",\n
+                regex : "\\\\s+"\n
+            },\n
+            {\n
+                token : "punctuation.end",\n
+                regex : ">",\n
+                next : "pop"\n
+            },\n
+            {include : "string"}]\n
+        }],\n
+\n
         cdata : [\n
-            {token : "text", regex : "\\\\]\\\\]>", next : "start"},\n
+            {token : "string.end", regex : "\\\\]\\\\]>", next : "start"},\n
             {token : "text", regex : "\\\\s+"},\n
             {token : "text", regex : "(?:[^\\\\]]|\\\\](?!\\\\]>))+"}\n
         ],\n
 \n
         comment : [\n
-            {token : "comment", regex : ".*?-->", next : "start"},\n
-            {token : "comment", regex : ".+"}\n
-        ]\n
+            {token : "comment", regex : "-->", next : "start"},\n
+            {defaultToken : "comment"}\n
+        ],\n
+\n
+        tag : [{\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : "start"}\n
+            ]\n
+        }, {\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name"],\n
+            regex : "(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)",\n
+            next: [\n
+                {include : "space"},\n
+                {token : "meta.tag.punctuation.end", regex : ">", next : "start"}\n
+            ]\n
+        }],\n
+\n
+        space : [\n
+            {token : "text", regex : "\\\\s+"}\n
+        ],\n
+\n
+        reference : [{\n
+            token : "constant.language.escape",\n
+            regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)"\n
+        }, {\n
+            token : "invalid.illegal", regex : "&"\n
+        }],\n
+\n
+        string: [{\n
+            token : "string",\n
+            regex : "\'",\n
+            push : "qstring_inner"\n
+        }, {\n
+            token : "string",\n
+            regex : \'"\',\n
+            push : "qqstring_inner"\n
+        }],\n
+\n
+        qstring_inner: [\n
+            {token : "string", regex: "\'", next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        qqstring_inner: [\n
+            {token : "string", regex: \'"\', next: "pop"},\n
+            {include : "reference"},\n
+            {defaultToken : "string"}\n
+        ],\n
+\n
+        attributes: [{\n
+            token : "entity.other.attribute-name",\n
+            regex : "(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+"\n
+        }, {\n
+            token : "keyword.operator.separator",\n
+            regex : "="\n
+        }, {\n
+            include : "space"\n
+        }, {\n
+            include : "string"\n
+        }]\n
     };\n
-    \n
-    xmlUtil.tag(this.$rules, "tag", "start");\n
+\n
+    if (this.constructor === XmlHighlightRules)\n
+        this.normalizeRules();\n
 };\n
 \n
+\n
+(function() {\n
+\n
+    this.embedTagRules = function(HighlightRules, prefix, tag){\n
+        this.$rules.tag.unshift({\n
+            token : ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(<)(" + tag + ")",\n
+            next: [\n
+                {include : "space"},\n
+                {include : "attributes"},\n
+                {token : "meta.tag.punctuation.end", regex : "/?>", next : prefix + "start"}\n
+            ]\n
+        });\n
+\n
+        this.$rules[tag + "-end"] = [\n
+            {include : "space"},\n
+            {token : "meta.tag.punctuation.end", regex : ">",  next: "start",\n
+                onMatch : function(value, currentState, stack) {\n
+                    stack.splice(0);\n
+                    return this.token;\n
+            }}\n
+        ]\n
+\n
+        this.embedRules(HighlightRules, prefix, [{\n
+            token: ["meta.tag.punctuation.begin", "meta.tag.name." + tag],\n
+            regex : "(</)(" + tag + ")",\n
+            next: tag + "-end"\n
+        }, {\n
+            token: "string.begin",\n
+            regex : "<\\\\!\\\\[CDATA\\\\["\n
+        }, {\n
+            token: "string.end",\n
+            regex : "\\\\]\\\\]>"\n
+        }]);\n
+    };\n
+\n
+}).call(TextHighlightRules.prototype);\n
+\n
 oop.inherits(XmlHighlightRules, TextHighlightRules);\n
 \n
 exports.XmlHighlightRules = XmlHighlightRules;\n
@@ -200,14 +345,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -221,6 +361,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token && hasType(token, \'string\') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') && !(hasType(token, \'text\') && token.value.match(\'/\'))){\n
                 do {\n
@@ -229,8 +372,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -247,11 +390,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'</\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -630,7 +773,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var value = "";\n
         for (var i = 0; i < tokens.length; i++) {\n
             var token = tokens[i];\n
-            if (token.type.indexOf("meta.tag") === 0)\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0)\n
                 value += token.value;\n
             else\n
                 value += lang.stringRepeat(" ", token.value.length);\n
@@ -663,7 +806,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var start;\n
         \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!start) {\n
                     var start = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -696,7 +839,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         var end;\n
 \n
         do {\n
-            if (token.type.indexOf("meta.tag") === 0) {\n
+            if (token.type.lastIndexOf("meta.tag", 0) === 0) {\n
                 if (!end) {\n
                     end = {\n
                         row: iterator.getCurrentTokenRow(),\n
@@ -820,7 +963,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>29530</int> </value>
+            <value> <int>33876</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-xquery.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-xquery.js.xml
index 2784b14635..a4e8a9d0d6 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-xquery.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-xquery.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.01</string> </value>
+            <value> <string>ts83646620.98</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>330201</int> </value>
+            <value> <int>330172</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -1982,7 +1982,26 @@ XQueryTokenizer.MAP0 =\n
 ];\n
 \n
 XQueryTokenizer.MAP1 =\n
-[ 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\n
+[ 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, 21</string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>4, 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\n
 ];\n
 \n
 XQueryTokenizer.MAP2 =\n
@@ -1994,7 +2013,64 @@ XQueryTokenizer.INITIAL =\n
 ];\n
 \n
 XQueryTokenizer.TRANSITION =\n
-[ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 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\n
+[ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 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</string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 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, </string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>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, </string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="6" aka="AAAAAAAAAAY=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>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\n
 ];\n
 \n
 XQueryTokenizer.EXPECTED =\n
@@ -2677,14 +2753,9 @@ var CstyleBehaviour = require("./cstyle").CstyleBehaviour;\n
 var TokenIterator = require("../../token_iterator").TokenIterator;\n
 \n
 function hasType(token, type) {\n
-    var hasType = true;\n
-    var typeList = token.type.split(\'.\');\n
-    var needleList = type.split(\'.\');\n
-    needleList.forEach(function(needle){\n
-        if (typeList.indexOf(needle) == -1) {\n
-            hasType = false;\n
-            return false;\n
-        }\n
+    var tokenTypes = token.type.split(\'.\');\n
+    return type.split(\'.\').every(function(type){\n
+        return (tokenTypes.indexOf(type) !== -1);\n
     });\n
     return hasType;\n
 }\n
@@ -2698,6 +2769,9 @@ var XmlBehaviour = function () {\n
             var position = editor.getCursorPosition();\n
             var iterator = new TokenIterator(session, position.row, position.column);\n
             var token = iterator.getCurrentToken();\n
+\n
+            if (token \046\046 hasType(token, \'string\') \046\046 iterator.getCurrentTokenColumn() + token.value.length \076 position.column)\n
+                return;\n
             var atCursor = false;\n
             if (!token || !hasType(token, \'meta.tag\') \046\046 !(hasType(token, \'text\') \046\046 token.value.match(\'/\'))){\n
                 do {\n
@@ -2706,8 +2780,8 @@ var XmlBehaviour = function () {\n
             } else {\n
                 atCursor = true;\n
             }\n
-            if (!token || !hasType(token, \'meta.tag-name\') || iterator.stepBackward().value.match(\'/\')) {\n
-                return\n
+            if (!token || !hasType(token, \'meta.tag.name\') || iterator.stepBackward().value.match(\'/\')) {\n
+                return;\n
             }\n
             var tag = token.value;\n
             if (atCursor){\n
@@ -2724,11 +2798,11 @@ var XmlBehaviour = function () {\n
     this.add(\'autoindent\', \'insertion\', function (state, action, editor, session, text) {\n
         if (text == "\\n") {\n
             var cursor = editor.getCursorPosition();\n
-            var line = session.doc.getLine(cursor.row);\n
+            var line = session.getLine(cursor.row);\n
             var rightChars = line.substring(cursor.column, cursor.column + 2);\n
             if (rightChars == \'\074/\') {\n
-                var indent = this.$getIndent(session.doc.getLine(cursor.row)) + session.getTabString();\n
-                var next_indent = this.$getIndent(session.doc.getLine(cursor.row));\n
+                var next_indent = this.$getIndent(line);\n
+                var indent = next_indent + session.getTabString();\n
 \n
                 return {\n
                     text: \'\\n\' + indent + \'\\n\' + next_indent,\n
@@ -2799,6 +2873,12 @@ oop.inherits(FoldMode, BaseFoldMode);\n
 });\n
 </string> </value>
         </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
       </dictionary>
     </pickle>
   </record>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-yaml.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-yaml.js.xml
index ed8d2a3c9f..93f12b655f 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-yaml.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/mode-yaml.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.12</string> </value>
+            <value> <string>ts83646620.94</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -63,7 +63,7 @@ var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutd
 var FoldMode = require("./folding/coffee").FoldMode;\n
 \n
 var Mode = function() {\n
-    this.$tokenizer = new Tokenizer(new YamlHighlightRules().getRules());\n
+    this.HighlightRules = YamlHighlightRules;\n
     this.$outdent = new MatchingBraceOutdent();\n
     this.foldingRules = new FoldMode();\n
 };\n
@@ -142,7 +142,7 @@ var YamlHighlightRules = function() {\n
                 regex : \'["](?:(?:\\\\\\\\.)|(?:[^"\\\\\\\\]))*?["]\'\n
             }, {\n
                 token : "string", // multi line string start\n
-                regex : \'[\\\\|>]\\\\w*\',\n
+                regex : \'[|>][-+\\\\d\\\\s]*$\',\n
                 next : "qqstring"\n
             }, {\n
                 token : "string", // single quoted string\n
@@ -321,7 +321,7 @@ oop.inherits(FoldMode, BaseFoldMode);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>9699</int> </value>
+            <value> <int>9677</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-ambiance.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-ambiance.js.xml
index 37760f906f..cfe4f0a00c 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-ambiance.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-ambiance.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.2</string> </value>
+            <value> <string>ts83646620.9</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-chaos.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-chaos.js.xml
index ab733d1ee4..04c775ee2c 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-chaos.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-chaos.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.34</string> </value>
+            <value> <string>ts83646620.89</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-chrome.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-chrome.js.xml
index c8873d84a7..9f12049e9e 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-chrome.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-chrome.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.48</string> </value>
+            <value> <string>ts83646620.92</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background: #e8e8e8;\\\n
 background-color: #FFFFFF;\\\n
 }\\\n
 .ace-chrome .ace_cursor {\\\n
-border-left: 2px solid black;\\\n
-}\\\n
-.ace-chrome .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid black;\\\n
+color: black;\\\n
 }\\\n
 .ace-chrome .ace_invisible {\\\n
 color: rgb(191, 191, 191);\\\n
@@ -130,10 +126,10 @@ color: rgb(104, 104, 91);\\\n
 .ace-chrome .ace_entity.ace_name.ace_function {\\\n
 color: #0000A2;\\\n
 }\\\n
-.ace-chrome .ace_markup.ace_heading {\\\n
+.ace-chrome .ace_heading {\\\n
 color: rgb(12, 7, 255);\\\n
 }\\\n
-.ace-chrome .ace_markup.ace_list {\\\n
+.ace-chrome .ace_list {\\\n
 color:rgb(185, 6, 144);\\\n
 }\\\n
 .ace-chrome .ace_marker-layer .ace_selection {\\\n
@@ -189,7 +185,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4843</int> </value>
+            <value> <int>4700</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-clouds.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-clouds.js.xml
index fd9301c82f..48bcdfe0ee 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-clouds.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-clouds.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.58</string> </value>
+            <value> <string>ts83646620.87</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #FFFFFF;\\\n
 color: #000000\\\n
 }\\\n
 .ace-clouds .ace_cursor {\\\n
-border-left: 2px solid #000000\\\n
-}\\\n
-.ace-clouds .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #000000\\\n
+color: #000000\\\n
 }\\\n
 .ace-clouds .ace_marker-layer .ace_selection {\\\n
 background: #BDD5FC\\\n
@@ -143,9 +139,6 @@ color: #BCC8BA\\\n
 .ace-clouds .ace_entity.ace_other.ace_attribute-name {\\\n
 color: #606060\\\n
 }\\\n
-.ace-clouds .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-clouds .ace_indent-guide {\\\n
 background: url(\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\") right repeat-y\\\n
 }";\n
@@ -161,7 +154,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4231</int> </value>
+            <value> <int>4037</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-clouds_midnight.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-clouds_midnight.js.xml
index 67ecb85a95..77618e8391 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-clouds_midnight.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-clouds_midnight.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.72</string> </value>
+            <value> <string>ts83646620.86</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #191919;\\\n
 color: #929292\\\n
 }\\\n
 .ace-clouds-midnight .ace_cursor {\\\n
-border-left: 2px solid #7DA5DC\\\n
-}\\\n
-.ace-clouds-midnight .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #7DA5DC\\\n
+color: #7DA5DC\\\n
 }\\\n
 .ace-clouds-midnight .ace_marker-layer .ace_selection {\\\n
 background: #000000\\\n
@@ -144,9 +140,6 @@ color: #3C403B\\\n
 .ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\\\n
 color: #606060\\\n
 }\\\n
-.ace-clouds-midnight .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-clouds-midnight .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -162,7 +155,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4602</int> </value>
+            <value> <int>4390</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-cobalt.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-cobalt.js.xml
index 15b9b00576..fa68bcee71 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-cobalt.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-cobalt.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.85</string> </value>
+            <value> <string>ts83646620.85</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #002240;\\\n
 color: #FFFFFF\\\n
 }\\\n
 .ace-cobalt .ace_cursor {\\\n
-border-left: 2px solid #FFFFFF\\\n
-}\\\n
-.ace-cobalt .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #FFFFFF\\\n
+color: #FFFFFF\\\n
 }\\\n
 .ace-cobalt .ace_marker-layer .ace_selection {\\\n
 background: rgba(179, 101, 57, 0.75)\\\n
@@ -151,14 +147,11 @@ color: #FF80E1\\\n
 .ace-cobalt .ace_meta.ace_tag {\\\n
 color: #9EFFFF\\\n
 }\\\n
-.ace-cobalt .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
-.ace-cobalt .ace_markup.ace_heading {\\\n
+.ace-cobalt .ace_heading {\\\n
 color: #C8E4FD;\\\n
 background-color: #001221\\\n
 }\\\n
-.ace-cobalt .ace_markup.ace_list {\\\n
+.ace-cobalt .ace_list {\\\n
 background-color: #130D26\\\n
 }\\\n
 .ace-cobalt .ace_indent-guide {\\\n
@@ -176,7 +169,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4472</int> </value>
+            <value> <int>4256</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-crimson_editor.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-crimson_editor.js.xml
index 894a34707e..b60d04ff11 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-crimson_editor.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-crimson_editor.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155566.99</string> </value>
+            <value> <string>ts83646620.83</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -70,11 +70,7 @@ background-color: #FFFFFF;\\\n
 color: rgb(64, 64, 64);\\\n
 }\\\n
 .ace-crimson-editor .ace_cursor {\\\n
-border-left: 2px solid black;\\\n
-}\\\n
-.ace-crimson-editor .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid black;\\\n
+color: black;\\\n
 }\\\n
 .ace-crimson-editor .ace_invisible {\\\n
 color: rgb(191, 191, 191);\\\n
@@ -180,7 +176,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4924</int> </value>
+            <value> <int>4795</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-dawn.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-dawn.js.xml
index 5d1d4f5c8d..17c3153b48 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-dawn.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-dawn.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155567.14</string> </value>
+            <value> <string>ts83646620.82</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #F9F9F9;\\\n
 color: #080808\\\n
 }\\\n
 .ace-dawn .ace_cursor {\\\n
-border-left: 2px solid #000000\\\n
-}\\\n
-.ace-dawn .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #000000\\\n
+color: #000000\\\n
 }\\\n
 .ace-dawn .ace_marker-layer .ace_selection {\\\n
 background: rgba(39, 95, 255, 0.30)\\\n
@@ -130,7 +126,7 @@ color: #B4371F\\\n
 background-color: #794938;\\\n
 border-color: #080808\\\n
 }\\\n
-.ace-dawn .ace_markup.ace_list,\\\n
+.ace-dawn .ace_list,\\\n
 .ace-dawn .ace_support.ace_function {\\\n
 color: #693A17\\\n
 }\\\n
@@ -151,10 +147,7 @@ color: #5A525F\\\n
 .ace-dawn .ace_variable {\\\n
 color: #234A97\\\n
 }\\\n
-.ace-dawn .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
-.ace-dawn .ace_markup.ace_heading {\\\n
+.ace-dawn .ace_heading {\\\n
 color: #19356D\\\n
 }\\\n
 .ace-dawn .ace_indent-guide {\\\n
@@ -172,7 +165,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4364</int> </value>
+            <value> <int>4152</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-dreamweaver.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-dreamweaver.js.xml
index 58a4a08b75..6e62d04f39 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-dreamweaver.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-dreamweaver.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155567.27</string> </value>
+            <value> <string>ts83646620.8</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -68,11 +68,7 @@ background-color: #FFFFFF;\\\n
 background-color: #757AD8;\\\n
 }\\\n
 .ace-dreamweaver .ace_cursor {\\\n
-border-left: 2px solid black;\\\n
-}\\\n
-.ace-dreamweaver .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid black;\\\n
+color: black;\\\n
 }\\\n
 .ace-dreamweaver .ace_invisible {\\\n
 color: rgb(191, 191, 191);\\\n
@@ -134,10 +130,10 @@ color: rgb(104, 104, 91);\\\n
 .ace-dreamweaver .ace_entity.ace_name.ace_function {\\\n
 color: #00F;\\\n
 }\\\n
-.ace-dreamweaver .ace_markup.ace_heading {\\\n
+.ace-dreamweaver .ace_heading {\\\n
 color: rgb(12, 7, 255);\\\n
 }\\\n
-.ace-dreamweaver .ace_markup.ace_list {\\\n
+.ace-dreamweaver .ace_list {\\\n
 color:rgb(185, 6, 144);\\\n
 }\\\n
 .ace-dreamweaver .ace_marker-layer .ace_selection {\\\n
@@ -199,7 +195,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5225</int> </value>
+            <value> <int>5077</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-eclipse.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-eclipse.js.xml
index de3493052b..86e1098da9 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-eclipse.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-eclipse.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155567.38</string> </value>
+            <value> <string>ts83646620.79</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -70,7 +70,7 @@ background-color: #FFFFFF;\\\n
 background-color: rgb(60, 76, 114);\\\n
 }\\\n
 .ace-eclipse .ace_cursor {\\\n
-border-left: 2px solid black;\\\n
+color: black;\\\n
 }\\\n
 .ace-eclipse .ace_storage,\\\n
 .ace-eclipse .ace_keyword,\\\n
@@ -152,7 +152,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4000</int> </value>
+            <value> <int>3984</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-github.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-github.js.xml
index 9eb5827ab3..61872ae3de 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-github.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-github.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155567.48</string> </value>
+            <value> <string>ts83646620.77</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -108,11 +108,7 @@ color: teal;\\\n
 font-weight: bold;\\\n
 }\\\n
 .ace-github .ace_cursor {\\\n
-border-left: 2px solid black;\\\n
-}\\\n
-.ace-github .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid black;\\\n
+color: black;\\\n
 }\\\n
 .ace-github .ace_marker-layer .ace_active-line {\\\n
 background: rgb(255, 255, 204);\\\n
@@ -167,7 +163,7 @@ background: url(\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAAC
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4390</int> </value>
+            <value> <int>4269</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-idle_fingers.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-idle_fingers.js.xml
index 12d03cabba..3062d2aa32 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-idle_fingers.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-idle_fingers.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155567.62</string> </value>
+            <value> <string>ts83646620.76</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -66,15 +66,8 @@ background: #3b3b3b\\\n
 background-color: #323232;\\\n
 color: #FFFFFF\\\n
 }\\\n
-.ace-idle-fingers .ace_text-layer {\\\n
-color: #FFFFFF\\\n
-}\\\n
 .ace-idle-fingers .ace_cursor {\\\n
-border-left: 2px solid #91FF00\\\n
-}\\\n
-.ace-idle-fingers .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #91FF00\\\n
+color: #91FF00\\\n
 }\\\n
 .ace-idle-fingers .ace_marker-layer .ace_selection {\\\n
 background: rgba(90, 100, 126, 0.88)\\\n
@@ -143,9 +136,6 @@ color: #FFE5BB\\\n
 .ace-idle-fingers .ace_entity.ace_name {\\\n
 color: #FFC66D\\\n
 }\\\n
-.ace-idle-fingers .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-idle-fingers .ace_collab.ace_user1 {\\\n
 color: #323232;\\\n
 background-color: #FFF980\\\n
@@ -165,7 +155,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4454</int> </value>
+            <value> <int>4192</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-kr.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-kr.js.xml
index 7a10c7d87a..4633f00a74 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-kr.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-kr.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155567.73</string> </value>
+            <value> <string>ts83646620.75</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #0B0A09;\\\n
 color: #FCFFE0\\\n
 }\\\n
 .ace-kr-theme .ace_cursor {\\\n
-border-left: 2px solid #FF9900\\\n
-}\\\n
-.ace-kr-theme .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #FF9900\\\n
+color: #FF9900\\\n
 }\\\n
 .ace-kr-theme .ace_marker-layer .ace_selection {\\\n
 background: rgba(170, 0, 255, 0.45)\\\n
@@ -148,10 +144,7 @@ color: #FF80E1\\\n
 .ace-kr-theme .ace_meta.ace_tag {\\\n
 color: #BABD9C\\\n
 }\\\n
-.ace-kr-theme .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
-.ace-kr-theme .ace_markup.ace_list {\\\n
+.ace-kr-theme .ace_list {\\\n
 background-color: #0F0040\\\n
 }\\\n
 .ace-kr-theme .ace_indent-guide {\\\n
@@ -169,7 +162,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4440</int> </value>
+            <value> <int>4231</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-merbivore.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-merbivore.js.xml
index 8704d31b5a..789070c0d9 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-merbivore.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-merbivore.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155567.87</string> </value>
+            <value> <string>ts83646620.73</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #161616;\\\n
 color: #E6E1DC\\\n
 }\\\n
 .ace-merbivore .ace_cursor {\\\n
-border-left: 2px solid #FFFFFF\\\n
-}\\\n
-.ace-merbivore .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #FFFFFF\\\n
+color: #FFFFFF\\\n
 }\\\n
 .ace-merbivore .ace_marker-layer .ace_selection {\\\n
 background: #454545\\\n
@@ -143,9 +139,6 @@ color: #AD2EA4\\\n
 .ace-merbivore .ace_entity.ace_other.ace_attribute-name {\\\n
 color: #FFFF89\\\n
 }\\\n
-.ace-merbivore .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-merbivore .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -161,7 +154,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4390</int> </value>
+            <value> <int>4190</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-merbivore_soft.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-merbivore_soft.js.xml
index cdf9e3783a..6ec4132e96 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-merbivore_soft.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-merbivore_soft.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.01</string> </value>
+            <value> <string>ts83646620.72</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #1C1C1C;\\\n
 color: #E6E1DC\\\n
 }\\\n
 .ace-merbivore-soft .ace_cursor {\\\n
-border-left: 2px solid #FFFFFF\\\n
-}\\\n
-.ace-merbivore-soft .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #FFFFFF\\\n
+color: #FFFFFF\\\n
 }\\\n
 .ace-merbivore-soft .ace_marker-layer .ace_selection {\\\n
 background: #494949\\\n
@@ -144,9 +140,6 @@ color: #AC4BB8\\\n
 .ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\\\n
 color: #EAF1A3\\\n
 }\\\n
-.ace-merbivore-soft .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-merbivore-soft .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -162,7 +155,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4614</int> </value>
+            <value> <int>4404</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-mono_industrial.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-mono_industrial.js.xml
index f88a186657..7cd29ebe77 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-mono_industrial.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-mono_industrial.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.12</string> </value>
+            <value> <string>ts83646620.7</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #222C28;\\\n
 color: #FFFFFF\\\n
 }\\\n
 .ace-mono-industrial .ace_cursor {\\\n
-border-left: 2px solid #FFFFFF\\\n
-}\\\n
-.ace-mono-industrial .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #FFFFFF\\\n
+color: #FFFFFF\\\n
 }\\\n
 .ace-mono-industrial .ace_marker-layer .ace_selection {\\\n
 background: rgba(145, 153, 148, 0.40)\\\n
@@ -152,9 +148,6 @@ background-color: #151C19\\\n
 .ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\\\n
 color: #909993\\\n
 }\\\n
-.ace-mono-industrial .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-mono-industrial .ace_entity.ace_name.ace_tag {\\\n
 color: #A65EFF\\\n
 }\\\n
@@ -173,7 +166,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4981</int> </value>
+            <value> <int>4769</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-monokai.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-monokai.js.xml
index 6695238f8f..08c846a159 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-monokai.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-monokai.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.24</string> </value>
+            <value> <string>ts83646620.69</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #272822;\\\n
 color: #F8F8F2\\\n
 }\\\n
 .ace-monokai .ace_cursor {\\\n
-border-left: 2px solid #F8F8F0\\\n
-}\\\n
-.ace-monokai .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #F8F8F0\\\n
+color: #F8F8F0\\\n
 }\\\n
 .ace-monokai .ace_marker-layer .ace_selection {\\\n
 background: #49483E\\\n
@@ -105,6 +101,10 @@ color: #52524d\\\n
 .ace-monokai .ace_storage {\\\n
 color: #F92672\\\n
 }\\\n
+.ace-monokai .ace_punctuation,\\\n
+.ace-monokai .ace_punctuation.ace_tag {\\\n
+color: #fff\\\n
+}\\\n
 .ace-monokai .ace_constant.ace_character,\\\n
 .ace-monokai .ace_constant.ace_language,\\\n
 .ace-monokai .ace_constant.ace_numeric,\\\n
@@ -149,9 +149,6 @@ color: #E6DB74\\\n
 .ace-monokai .ace_comment {\\\n
 color: #75715E\\\n
 }\\\n
-.ace-monokai .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-monokai .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -167,7 +164,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4456</int> </value>
+            <value> <int>4349</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-pastel_on_dark.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-pastel_on_dark.js.xml
index 25f21ce3fa..fd96707b06 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-pastel_on_dark.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-pastel_on_dark.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.35</string> </value>
+            <value> <string>ts83646620.67</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #2C2828;\\\n
 color: #8F938F\\\n
 }\\\n
 .ace-pastel-on-dark .ace_cursor {\\\n
-border-left: 2px solid #A7A7A7\\\n
-}\\\n
-.ace-pastel-on-dark .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #A7A7A7\\\n
+color: #A7A7A7\\\n
 }\\\n
 .ace-pastel-on-dark .ace_marker-layer .ace_selection {\\\n
 background: rgba(221, 240, 255, 0.20)\\\n
@@ -156,9 +152,6 @@ color: #C1C144\\\n
 .ace-pastel-on-dark .ace_xml-pe {\\\n
 color: #494949\\\n
 }\\\n
-.ace-pastel-on-dark .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-pastel-on-dark .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -174,7 +167,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4823</int> </value>
+            <value> <int>4613</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-solarized_dark.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-solarized_dark.js.xml
index 5aa1e8d723..99c5457f41 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-solarized_dark.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-solarized_dark.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.46</string> </value>
+            <value> <string>ts83646620.66</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,16 +67,11 @@ background-color: #002B36;\\\n
 color: #93A1A1\\\n
 }\\\n
 .ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\\\n
-.ace-solarized-dark .ace_storage,\\\n
-.ace-solarized-dark .ace_text-layer {\\\n
+.ace-solarized-dark .ace_storage {\\\n
 color: #93A1A1\\\n
 }\\\n
 .ace-solarized-dark .ace_cursor {\\\n
-border-left: 2px solid #D30102\\\n
-}\\\n
-.ace-solarized-dark .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #D30102\\\n
+color: #D30102\\\n
 }\\\n
 .ace-solarized-dark .ace_marker-layer .ace_active-line,\\\n
 .ace-solarized-dark .ace_marker-layer .ace_selection {\\\n
@@ -139,9 +134,6 @@ color: #D30102\\\n
 font-style: italic;\\\n
 color: #657B83\\\n
 }\\\n
-.ace-solarized-dark .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-solarized-dark .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -157,7 +149,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4520</int> </value>
+            <value> <int>4272</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-solarized_light.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-solarized_light.js.xml
index b60f9dcd95..8c54ef0858 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-solarized_light.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-solarized_light.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.6</string> </value>
+            <value> <string>ts83646620.65</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #FDF6E3;\\\n
 color: #586E75\\\n
 }\\\n
 .ace-solarized-light .ace_cursor {\\\n
-border-left: 2px solid #000000\\\n
-}\\\n
-.ace-solarized-light .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #000000\\\n
+color: #000000\\\n
 }\\\n
 .ace-solarized-light .ace_marker-layer .ace_selection {\\\n
 background:  rgba(7, 54, 67, 0.09)\\\n
@@ -139,9 +135,6 @@ color: #D30102\\\n
 .ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\\\n
 color: #93A1A1\\\n
 }\\\n
-.ace-solarized-light .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-solarized-light .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -157,7 +150,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4520</int> </value>
+            <value> <int>4308</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-terminal.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-terminal.js.xml
index 16a1eae5e7..e667b39a2a 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-terminal.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-terminal.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.71</string> </value>
+            <value> <string>ts83646620.63</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: black;\\\n
 color: #DEDEDE\\\n
 }\\\n
 .ace-terminal-theme .ace_cursor {\\\n
-border-left: 2px solid springgreen\\\n
-}\\\n
-.ace-terminal-theme .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #9F9F9F\\\n
+color: #9F9F9F\\\n
 }\\\n
 .ace-terminal-theme .ace_marker-layer .ace_selection {\\\n
 background: #424242\\\n
@@ -147,7 +143,7 @@ color: #7AA6DA\\\n
 .ace-terminal-theme .ace_support.ace_type {\\\n
 color: #E7C547\\\n
 }\\\n
-.ace-terminal-theme .ace_markup.ace_heading,\\\n
+.ace-terminal-theme .ace_heading,\\\n
 .ace-terminal-theme .ace_string {\\\n
 color: #B9CA4A\\\n
 }\\\n
@@ -161,9 +157,6 @@ color: #D54E53\\\n
 .ace-terminal-theme .ace_comment {\\\n
 color: orangered\\\n
 }\\\n
-.ace-terminal-theme .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-terminal-theme .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }\\\n
@@ -180,7 +173,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5130</int> </value>
+            <value> <int>4905</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-textmate.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-textmate.js.xml
index 5e3ba9248b..c65f15ec75 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-textmate.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-textmate.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.81</string> </value>
+            <value> <string>ts83646620.62</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -20,7 +20,166 @@
         </item>
         <item>
             <key> <string>data</string> </key>
-            <value> <string></string> </value>
+            <value> <string>/* ***** BEGIN LICENSE BLOCK *****\n
+ * Distributed under the BSD license:\n
+ *\n
+ * Copyright (c) 2010, Ajax.org B.V.\n
+ * All rights reserved.\n
+ * \n
+ * Redistribution and use in source and binary forms, with or without\n
+ * modification, are permitted provided that the following conditions are met:\n
+ *     * Redistributions of source code must retain the above copyright\n
+ *       notice, this list of conditions and the following disclaimer.\n
+ *     * Redistributions in binary form must reproduce the above copyright\n
+ *       notice, this list of conditions and the following disclaimer in the\n
+ *       documentation and/or other materials provided with the distribution.\n
+ *     * Neither the name of Ajax.org B.V. nor the\n
+ *       names of its contributors may be used to endorse or promote products\n
+ *       derived from this software without specific prior written permission.\n
+ * \n
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n
+ * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n
+ *\n
+ * ***** END LICENSE BLOCK ***** */\n
+\n
+define(\'ace/theme/textmate\', [\'require\', \'exports\', \'module\' , \'ace/lib/dom\'], function(require, exports, module) {\n
+\n
+\n
+exports.isDark = false;\n
+exports.cssClass = "ace-tm";\n
+exports.cssText = ".ace-tm .ace_gutter {\\\n
+background: #f0f0f0;\\\n
+color: #333;\\\n
+}\\\n
+.ace-tm .ace_print-margin {\\\n
+width: 1px;\\\n
+background: #e8e8e8;\\\n
+}\\\n
+.ace-tm .ace_fold {\\\n
+background-color: #6B72E6;\\\n
+}\\\n
+.ace-tm {\\\n
+background-color: #FFFFFF;\\\n
+}\\\n
+.ace-tm .ace_cursor {\\\n
+color: black;\\\n
+}\\\n
+.ace-tm .ace_invisible {\\\n
+color: rgb(191, 191, 191);\\\n
+}\\\n
+.ace-tm .ace_storage,\\\n
+.ace-tm .ace_keyword {\\\n
+color: blue;\\\n
+}\\\n
+.ace-tm .ace_constant {\\\n
+color: rgb(197, 6, 11);\\\n
+}\\\n
+.ace-tm .ace_constant.ace_buildin {\\\n
+color: rgb(88, 72, 246);\\\n
+}\\\n
+.ace-tm .ace_constant.ace_language {\\\n
+color: rgb(88, 92, 246);\\\n
+}\\\n
+.ace-tm .ace_constant.ace_library {\\\n
+color: rgb(6, 150, 14);\\\n
+}\\\n
+.ace-tm .ace_invalid {\\\n
+background-color: rgba(255, 0, 0, 0.1);\\\n
+color: red;\\\n
+}\\\n
+.ace-tm .ace_support.ace_function {\\\n
+color: rgb(60, 76, 114);\\\n
+}\\\n
+.ace-tm .ace_support.ace_constant {\\\n
+color: rgb(6, 150, 14);\\\n
+}\\\n
+.ace-tm .ace_support.ace_type,\\\n
+.ace-tm .ace_support.ace_class {\\\n
+color: rgb(109, 121, 222);\\\n
+}\\\n
+.ace-tm .ace_keyword.ace_operator {\\\n
+color: rgb(104, 118, 135);\\\n
+}\\\n
+.ace-tm .ace_string {\\\n
+color: rgb(3, 106, 7);\\\n
+}\\\n
+.ace-tm .ace_comment {\\\n
+color: rgb(76, 136, 107);\\\n
+}\\\n
+.ace-tm .ace_comment.ace_doc {\\\n
+color: rgb(0, 102, 255);\\\n
+}\\\n
+.ace-tm .ace_comment.ace_doc.ace_tag {\\\n
+color: rgb(128, 159, 191);\\\n
+}\\\n
+.ace-tm .ace_constant.ace_numeric {\\\n
+color: rgb(0, 0, 205);\\\n
+}\\\n
+.ace-tm .ace_variable {\\\n
+color: rgb(49, 132, 149);\\\n
+}\\\n
+.ace-tm .ace_xml-pe {\\\n
+color: rgb(104, 104, 91);\\\n
+}\\\n
+.ace-tm .ace_entity.ace_name.ace_function {\\\n
+color: #0000A2;\\\n
+}\\\n
+.ace-tm .ace_heading {\\\n
+color: rgb(12, 7, 255);\\\n
+}\\\n
+.ace-tm .ace_list {\\\n
+color:rgb(185, 6, 144);\\\n
+}\\\n
+.ace-tm .ace_meta.ace_tag {\\\n
+color:rgb(0, 22, 142);\\\n
+}\\\n
+.ace-tm .ace_string.ace_regex {\\\n
+color: rgb(255, 0, 0)\\\n
+}\\\n
+.ace-tm .ace_marker-layer .ace_selection {\\\n
+background: rgb(181, 213, 255);\\\n
+}\\\n
+.ace-tm.ace_multiselect .ace_selection.ace_start {\\\n
+box-shadow: 0 0 3px 0px white;\\\n
+border-radius: 2px;\\\n
+}\\\n
+.ace-tm .ace_marker-layer .ace_step {\\\n
+background: rgb(252, 255, 0);\\\n
+}\\\n
+.ace-tm .ace_marker-layer .ace_stack {\\\n
+background: rgb(164, 229, 101);\\\n
+}\\\n
+.ace-tm .ace_marker-layer .ace_bracket {\\\n
+margin: -1px 0 0 -1px;\\\n
+border: 1px solid rgb(192, 192, 192);\\\n
+}\\\n
+.ace-tm .ace_marker-layer .ace_active-line {\\\n
+background: rgba(0, 0, 0, 0.07);\\\n
+}\\\n
+.ace-tm .ace_gutter-active-line {\\\n
+background-color : #dcdcdc;\\\n
+}\\\n
+.ace-tm .ace_marker-layer .ace_selected-word {\\\n
+background: rgb(250, 250, 255);\\\n
+border: 1px solid rgb(200, 200, 250);\\\n
+}\\\n
+.ace-tm .ace_indent-guide {\\\n
+background: url(\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\") right repeat-y;\\\n
+}\\\n
+";\n
+\n
+var dom = require("../lib/dom");\n
+dom.importCssString(exports.cssText, exports.cssClass);\n
+});\n
+</string> </value>
         </item>
         <item>
             <key> <string>precondition</string> </key>
@@ -28,7 +187,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>0</int> </value>
+            <value> <int>4582</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow.js.xml
index b5f9fec415..e5effe30f6 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155568.92</string> </value>
+            <value> <string>ts83646620.17</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -62,17 +62,12 @@ color: #4D4D4C\\\n
 width: 1px;\\\n
 background: #f6f6f6\\\n
 }\\\n
-.ace-tomorrow,\\\n
-.ace-tomorrow .ace_scroller {\\\n
+.ace-tomorrow {\\\n
 background-color: #FFFFFF;\\\n
 color: #4D4D4C\\\n
 }\\\n
 .ace-tomorrow .ace_cursor {\\\n
-border-left: 2px solid #AEAFAD\\\n
-}\\\n
-.ace-tomorrow .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #AEAFAD\\\n
+color: #AEAFAD\\\n
 }\\\n
 .ace-tomorrow .ace_marker-layer .ace_selection {\\\n
 background: #D6D6D6\\\n
@@ -142,7 +137,7 @@ color: #4271AE\\\n
 .ace-tomorrow .ace_support.ace_type {\\\n
 color: #C99E00\\\n
 }\\\n
-.ace-tomorrow .ace_markup.ace_heading,\\\n
+.ace-tomorrow .ace_heading,\\\n
 .ace-tomorrow .ace_string {\\\n
 color: #718C00\\\n
 }\\\n
@@ -156,9 +151,6 @@ color: #C82829\\\n
 .ace-tomorrow .ace_comment {\\\n
 color: #8E908C\\\n
 }\\\n
-.ace-tomorrow .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-tomorrow .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\\\n
 }";\n
@@ -174,7 +166,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4735</int> </value>
+            <value> <int>4496</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night.js.xml
index 77da33d1c8..1e08852a83 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155569.41</string> </value>
+            <value> <string>ts83646620.16</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #1D1F21;\\\n
 color: #C5C8C6\\\n
 }\\\n
 .ace-tomorrow-night .ace_cursor {\\\n
-border-left: 2px solid #AEAFAD\\\n
-}\\\n
-.ace-tomorrow-night .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #AEAFAD\\\n
+color: #AEAFAD\\\n
 }\\\n
 .ace-tomorrow-night .ace_marker-layer .ace_selection {\\\n
 background: #373B41\\\n
@@ -141,7 +137,7 @@ color: #81A2BE\\\n
 .ace-tomorrow-night .ace_support.ace_type {\\\n
 color: #F0C674\\\n
 }\\\n
-.ace-tomorrow-night .ace_markup.ace_heading,\\\n
+.ace-tomorrow-night .ace_heading,\\\n
 .ace-tomorrow-night .ace_string {\\\n
 color: #B5BD68\\\n
 }\\\n
@@ -155,9 +151,6 @@ color: #CC6666\\\n
 .ace-tomorrow-night .ace_comment {\\\n
 color: #969896\\\n
 }\\\n
-.ace-tomorrow-night .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-tomorrow-night .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -173,7 +166,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4976</int> </value>
+            <value> <int>4755</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_blue.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_blue.js.xml
index 9a075c3cc7..b36da29c6a 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_blue.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_blue.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155569.02</string> </value>
+            <value> <string>ts83646620.14</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -70,11 +70,7 @@ color: #FFFFFF\\\n
 color: #FFFFFF\\\n
 }\\\n
 .ace-tomorrow-night-blue .ace_cursor {\\\n
-border-left: 2px solid #FFFFFF\\\n
-}\\\n
-.ace-tomorrow-night-blue .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #FFFFFF\\\n
+color: #FFFFFF\\\n
 }\\\n
 .ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\\\n
 background: #003F8E\\\n
@@ -141,7 +137,7 @@ color: #BBDAFF\\\n
 .ace-tomorrow-night-blue .ace_support.ace_type {\\\n
 color: #FFEEAD\\\n
 }\\\n
-.ace-tomorrow-night-blue .ace_markup.ace_heading,\\\n
+.ace-tomorrow-night-blue .ace_heading,\\\n
 .ace-tomorrow-night-blue .ace_string {\\\n
 color: #D1F1A9\\\n
 }\\\n
@@ -155,9 +151,6 @@ color: #FF9DA4\\\n
 .ace-tomorrow-night-blue .ace_comment {\\\n
 color: #7285B7\\\n
 }\\\n
-.ace-tomorrow-night-blue .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-tomorrow-night-blue .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -173,7 +166,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5207</int> </value>
+            <value> <int>4976</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_bright.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_bright.js.xml
index 89cd35f951..7f6f9bc508 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_bright.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_bright.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155569.12</string> </value>
+            <value> <string>ts83646620.12</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #000000;\\\n
 color: #DEDEDE\\\n
 }\\\n
 .ace-tomorrow-night-bright .ace_cursor {\\\n
-border-left: 2px solid #9F9F9F\\\n
-}\\\n
-.ace-tomorrow-night-bright .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #9F9F9F\\\n
+color: #9F9F9F\\\n
 }\\\n
 .ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\\\n
 background: #424242\\\n
@@ -93,6 +89,9 @@ background: #2A2A2A\\\n
 .ace-tomorrow-night-bright .ace_gutter-active-line {\\\n
 background-color: #2A2A2A\\\n
 }\\\n
+.ace-tomorrow-night-bright .ace_stack {\\\n
+background-color: rgb(66, 90, 44);\\\n
+}\\\n
 .ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\\\n
 border: 1px solid #424242\\\n
 }\\\n
@@ -141,7 +140,7 @@ color: #7AA6DA\\\n
 .ace-tomorrow-night-bright .ace_support.ace_type {\\\n
 color: #E7C547\\\n
 }\\\n
-.ace-tomorrow-night-bright .ace_markup.ace_heading,\\\n
+.ace-tomorrow-night-bright .ace_heading,\\\n
 .ace-tomorrow-night-bright .ace_string {\\\n
 color: #B9CA4A\\\n
 }\\\n
@@ -155,9 +154,6 @@ color: #D54E53\\\n
 .ace-tomorrow-night-bright .ace_comment {\\\n
 color: #969896\\\n
 }\\\n
-.ace-tomorrow-night-bright .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-tomorrow-night-bright .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -173,7 +169,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5297</int> </value>
+            <value> <int>5142</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_eighties.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_eighties.js.xml
index 2910d45411..7bc5d6d73e 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_eighties.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-tomorrow_night_eighties.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155569.27</string> </value>
+            <value> <string>ts83646620.1</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -70,11 +70,7 @@ color: #CCCCCC\\\n
 color: #CCCCCC\\\n
 }\\\n
 .ace-tomorrow-night-eighties .ace_cursor {\\\n
-border-left: 2px solid #CCCCCC\\\n
-}\\\n
-.ace-tomorrow-night-eighties .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #CCCCCC\\\n
+color: #CCCCCC\\\n
 }\\\n
 .ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\\\n
 background: #515151\\\n
@@ -90,6 +86,9 @@ background: rgb(102, 82, 0)\\\n
 margin: -1px 0 0 -1px;\\\n
 border: 1px solid #6A6A6A\\\n
 }\\\n
+.ace-tomorrow-night-bright .ace_stack {\\\n
+background: rgb(66, 90, 44)\\\n
+}\\\n
 .ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\\\n
 background: #393939\\\n
 }\\\n
@@ -141,7 +140,7 @@ color: #6699CC\\\n
 .ace-tomorrow-night-eighties .ace_support.ace_type {\\\n
 color: #FFCC66\\\n
 }\\\n
-.ace-tomorrow-night-eighties .ace_markup.ace_heading,\\\n
+.ace-tomorrow-night-eighties .ace_heading,\\\n
 .ace-tomorrow-night-eighties .ace_string {\\\n
 color: #99CC99\\\n
 }\\\n
@@ -154,9 +153,6 @@ color: #999999\\\n
 .ace-tomorrow-night-eighties .ace_variable {\\\n
 color: #F2777A\\\n
 }\\\n
-.ace-tomorrow-night-eighties .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-tomorrow-night-eighties .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\\\n
 }";\n
@@ -172,7 +168,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>5331</int> </value>
+            <value> <int>5165</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-twilight.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-twilight.js.xml
index 4b65170fe3..3b81342a75 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-twilight.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-twilight.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155569.55</string> </value>
+            <value> <string>ts83646620.61</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #141414;\\\n
 color: #F8F8F8\\\n
 }\\\n
 .ace-twilight .ace_cursor {\\\n
-border-left: 2px solid #A7A7A7\\\n
-}\\\n
-.ace-twilight .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #A7A7A7\\\n
+color: #A7A7A7\\\n
 }\\\n
 .ace-twilight .ace_marker-layer .ace_selection {\\\n
 background: rgba(221, 240, 255, 0.20)\\\n
@@ -107,7 +103,7 @@ color: #CDA869\\\n
 .ace-twilight .ace_constant.ace_character,\\\n
 .ace-twilight .ace_constant.ace_character.ace_escape,\\\n
 .ace-twilight .ace_constant.ace_other,\\\n
-.ace-twilight .ace_markup.ace_heading,\\\n
+.ace-twilight .ace_heading,\\\n
 .ace-twilight .ace_support.ace_constant {\\\n
 color: #CF6A4C\\\n
 }\\\n
@@ -130,7 +126,7 @@ border-color: #F8F8F8\\\n
 .ace-twilight .ace_support.ace_function {\\\n
 color: #DAD085\\\n
 }\\\n
-.ace-twilight .ace_markup.ace_list,\\\n
+.ace-twilight .ace_list,\\\n
 .ace-twilight .ace_storage {\\\n
 color: #F9EE98\\\n
 }\\\n
@@ -155,9 +151,6 @@ color: #7587A6\\\n
 .ace-twilight .ace_xml-pe {\\\n
 color: #494949\\\n
 }\\\n
-.ace-twilight .ace_markup.ace_underline {\\\n
-text-decoration: underline\\\n
-}\\\n
 .ace-twilight .ace_indent-guide {\\\n
 background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y;\\\n
 }";\n
@@ -173,7 +166,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4624</int> </value>
+            <value> <int>4404</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-vibrant_ink.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-vibrant_ink.js.xml
index 14655907d6..4cf3ce5528 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-vibrant_ink.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-vibrant_ink.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155569.69</string> </value>
+            <value> <string>ts83646620.59</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -67,11 +67,7 @@ background-color: #0F0F0F;\\\n
 color: #FFFFFF\\\n
 }\\\n
 .ace-vibrant-ink .ace_cursor {\\\n
-border-left: 2px solid #FFFFFF\\\n
-}\\\n
-.ace-vibrant-ink .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #FFFFFF\\\n
+color: #FFFFFF\\\n
 }\\\n
 .ace-vibrant-ink .ace_marker-layer .ace_selection {\\\n
 background: #6699CC\\\n
@@ -157,7 +153,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4283</int> </value>
+            <value> <int>4156</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-xcode.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-xcode.js.xml
index 3ca2f72bc4..a2ec468ae5 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-xcode.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/theme-xcode.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155569.82</string> </value>
+            <value> <string>ts83646620.58</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -68,11 +68,7 @@ background-color: #FFFFFF;\\\n
 color: #000000\\\n
 }\\\n
 .ace-xcode .ace_cursor {\\\n
-border-left: 2px solid #000000\\\n
-}\\\n
-.ace-xcode .ace_overwrite-cursors .ace_cursor {\\\n
-border-left: 0px;\\\n
-border-bottom: 1px solid #000000\\\n
+color: #000000\\\n
 }\\\n
 .ace-xcode .ace_marker-layer .ace_selection {\\\n
 background: #B5D5FF\\\n
@@ -151,7 +147,7 @@ dom.importCssString(exports.cssText, exports.cssClass);\n
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>4076</int> </value>
+            <value> <int>3955</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-coffee.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-coffee.js.xml
index b3a9404966..789e981ce2 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-coffee.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-coffee.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155569.97</string> </value>
+            <value> <string>ts83646620.56</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>336303</int> </value>
+            <value> <int>339257</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -55,31 +55,30 @@ if (typeof window.window != "undefined" && window.document) {\n
     return;\n
 }\n
 \n
-window.console = {\n
-    log: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    },\n
-    error: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    }\n
+window.console = function() {\n
+    var msgs = Array.prototype.slice.call(arguments, 0);\n
+    postMessage({type: "log", data: msgs});\n
 };\n
+window.console.error =\n
+window.console.warn = \n
+window.console.log =\n
+window.console.trace = window.console;\n
+\n
 window.window = window;\n
 window.ace = window;\n
 \n
 window.normalizeModule = function(parentId, moduleName) {\n
     if (moduleName.indexOf("!") !== -1) {\n
         var chunks = moduleName.split("!");\n
-        return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);\n
+        return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);\n
     }\n
     if (moduleName.charAt(0) == ".") {\n
         var base = parentId.split("/").slice(0, -1).join("/");\n
-        moduleName = base + "/" + moduleName;\n
+        moduleName = (base ? base + "/" : "") + moduleName;\n
         \n
         while(moduleName.indexOf(".") !== -1 && previous != moduleName) {\n
             var previous = moduleName;\n
-            moduleName = moduleName.replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
+            moduleName = moduleName.replace(/^\\.\\//, "").replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
         }\n
     }\n
     \n
@@ -94,9 +93,9 @@ window.require = function(parentId, id) {\n
     if (!id.charAt)\n
         throw new Error("worker.js require() accepts only (parentId, id) as arguments");\n
 \n
-    id = normalizeModule(parentId, id);\n
+    id = window.normalizeModule(parentId, id);\n
 \n
-    var module = require.modules[id];\n
+    var module = window.require.modules[id];\n
     if (module) {\n
         if (!module.initialized) {\n
             module.initialized = true;\n
@@ -106,48 +105,60 @@ window.require = function(parentId, id) {\n
     }\n
     \n
     var chunks = id.split("/");\n
-    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n
+    if (!window.require.tlns)\n
+        return console.log("unable to load " + id);\n
+    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n
     var path = chunks.join("/") + ".js";\n
     \n
-    require.id = id;\n
+    window.require.id = id;\n
     importScripts(path);\n
-    return require(parentId, id);\n
+    return window.require(parentId, id);\n
 };\n
-\n
-require.modules = {};\n
-require.tlns = {};\n
+window.require.modules = {};\n
+window.require.tlns = {};\n
 \n
 window.define = function(id, deps, factory) {\n
     if (arguments.length == 2) {\n
         factory = deps;\n
         if (typeof id != "string") {\n
             deps = id;\n
-            id = require.id;\n
+            id = window.require.id;\n
         }\n
     } else if (arguments.length == 1) {\n
         factory = id;\n
-        id = require.id;\n
+        deps = []\n
+        id = window.require.id;\n
     }\n
+\n
+    if (!deps.length)\n
+        deps = [\'require\', \'exports\', \'module\']\n
 \n
     if (id.indexOf("text!") === 0) \n
         return;\n
     \n
-    var req = function(deps, factory) {\n
-        return require(id, deps, factory);\n
+    var req = function(childId) {\n
+        return window.require(id, childId);\n
     };\n
 \n
-    require.modules[id] = {\n
+    window.require.modules[id] = {\n
+        exports: {},\n
         factory: function() {\n
-            var module = {\n
-                exports: {}\n
-            };\n
-            var returnExports = factory(req, module.exports, module);\n
+            var module = this;\n
+            var returnExports = factory.apply(this, deps.map(function(dep) {\n
+              switch(dep) {\n
+                  case \'require\': return req\n
+                  case \'exports\': return module.exports\n
+                  case \'module\':  return module\n
+                  default:        return req(dep)\n
+              }\n
+            }));\n
             if (returnExports)\n
                 module.exports = returnExports;\n
             return module;\n
         }\n
     };\n
 };\n
+window.define.amd = {}\n
 \n
 window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
     require.tlns = topLevelNamespaces;\n
@@ -155,8 +166,8 @@ window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
 \n
 window.initSender = function initSender() {\n
 \n
-    var EventEmitter = require("ace/lib/event_emitter").EventEmitter;\n
-    var oop = require("ace/lib/oop");\n
+    var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;\n
+    var oop = window.require("ace/lib/oop");\n
     \n
     var Sender = function() {};\n
     \n
@@ -207,158 +218,7 @@ window.onmessage = function(e) {\n
         sender._emit(msg.event, msg.data);\n
     }\n
 };\n
-})(this);\n
-\n
-define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-var EventEmitter = {};\n
-var stopPropagation = function() { this.propagationStopped = true; };\n
-var preventDefault = function() { this.defaultPrevented = true; };\n
-\n
-EventEmitter._emit =\n
-EventEmitter._dispatchEvent = function(eventName, e) {\n
-    this._eventRegistry || (this._eventRegistry = {});\n
-    this._defaultHandlers || (this._defaultHandlers = {});\n
-\n
-    var listeners = this._eventRegistry[eventName] || [];\n
-    var defaultHandler = this._defaultHandlers[eventName];\n
-    if (!listeners.length && !defaultHandler)\n
-        return;\n
-\n
-    if (typeof e != "object" || !e)\n
-        e = {};\n
-\n
-    if (!e.type)\n
-        e.type = eventName;\n
-    if (!e.stopPropagation)\n
-        e.stopPropagation = stopPropagation;\n
-    if (!e.preventDefault)\n
-        e.preventDefault = preventDefault;\n
-\n
-    for (var i=0; i<listeners.length; i++) {\n
-        listeners[i](e, this);\n
-        if (e.propagationStopped)\n
-            break;\n
-    }\n
-    \n
-    if (defaultHandler && !e.defaultPrevented)\n
-        return defaultHandler(e, this);\n
-};\n
-\n
-\n
-EventEmitter._signal = function(eventName, e) {\n
-    var listeners = (this._eventRegistry || {})[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    for (var i=0; i<listeners.length; i++)\n
-        listeners[i](e, this);\n
-};\n
-\n
-EventEmitter.once = function(eventName, callback) {\n
-    var _self = this;\n
-    callback && this.addEventListener(eventName, function newCallback() {\n
-        _self.removeEventListener(eventName, newCallback);\n
-        callback.apply(null, arguments);\n
-    });\n
-};\n
-\n
-\n
-EventEmitter.setDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        handlers = this._defaultHandlers = {_disabled_: {}};\n
-    \n
-    if (handlers[eventName]) {\n
-        var old = handlers[eventName];\n
-        var disabled = handlers._disabled_[eventName];\n
-        if (!disabled)\n
-            handlers._disabled_[eventName] = disabled = [];\n
-        disabled.push(old);\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1) \n
-            disabled.splice(i, 1);\n
-    }\n
-    handlers[eventName] = callback;\n
-};\n
-EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        return;\n
-    var disabled = handlers._disabled_[eventName];\n
-    \n
-    if (handlers[eventName] == callback) {\n
-        var old = handlers[eventName];\n
-        if (disabled)\n
-            this.setDefaultHandler(eventName, disabled.pop());\n
-    } else if (disabled) {\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1)\n
-            disabled.splice(i, 1);\n
-    }\n
-};\n
-\n
-EventEmitter.on =\n
-EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        listeners = this._eventRegistry[eventName] = [];\n
-\n
-    if (listeners.indexOf(callback) == -1)\n
-        listeners[capturing ? "unshift" : "push"](callback);\n
-    return callback;\n
-};\n
-\n
-EventEmitter.off =\n
-EventEmitter.removeListener =\n
-EventEmitter.removeEventListener = function(eventName, callback) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    var index = listeners.indexOf(callback);\n
-    if (index !== -1)\n
-        listeners.splice(index, 1);\n
-};\n
-\n
-EventEmitter.removeAllListeners = function(eventName) {\n
-    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
-};\n
-\n
-exports.EventEmitter = EventEmitter;\n
-\n
-});\n
-\n
-define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-exports.inherits = (function() {\n
-    var tempCtor = function() {};\n
-    return function(ctor, superCtor) {\n
-        tempCtor.prototype = superCtor.prototype;\n
-        ctor.super_ = superCtor.prototype;\n
-        ctor.prototype = new tempCtor();\n
-        ctor.prototype.constructor = ctor;\n
-    };\n
-}());\n
-\n
-exports.mixin = function(obj, mixin) {\n
-    for (var key in mixin) {\n
-        obj[key] = mixin[key];\n
-    }\n
-    return obj;\n
-};\n
-\n
-exports.implement = function(proto, mixin) {\n
-    exports.mixin(proto, mixin);\n
-};\n
-\n
-});\n
+})(this);// https://github.com/kriskowal/es5-shim\n
 \n
 define(\'ace/lib/es5-shim\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
@@ -1101,6 +961,32 @@ oop.inherits(Worker, Mirror);\n
 }).call(Worker.prototype);\n
 \n
 });\n
+\n
+define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+exports.inherits = (function() {\n
+    var tempCtor = function() {};\n
+    return function(ctor, superCtor) {\n
+        tempCtor.prototype = superCtor.prototype;\n
+        ctor.super_ = superCtor.prototype;\n
+        ctor.prototype = new tempCtor();\n
+        ctor.prototype.constructor = ctor;\n
+    };\n
+}());\n
+\n
+exports.mixin = function(obj, mixin) {\n
+    for (var key in mixin) {\n
+        obj[key] = mixin[key];\n
+    }\n
+    return obj;\n
+};\n
+\n
+exports.implement = function(proto, mixin) {\n
+    exports.mixin(proto, mixin);\n
+};\n
+\n
+});\n
 define(\'ace/worker/mirror\', [\'require\', \'exports\', \'module\' , \'ace/document\', \'ace/lib/lang\'], function(require, exports, module) {\n
 \n
 \n
@@ -1230,7 +1116,7 @@ var Document = function(text) {\n
     };\n
     this.getTextRange = function(range) {\n
         if (range.start.row == range.end.row) {\n
-            return this.$lines[range.start.row]\n
+            return this.getLine(range.start.row)\n
                 .substring(range.start.column, range.end.column);\n
         }\n
         var lines = this.getLines(range.start.row, range.end.row);\n
@@ -1341,6 +1227,8 @@ var Document = function(text) {\n
         return end;\n
     };\n
     this.remove = function(range) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         range.start = this.$clipPosition(range.start);\n
         range.end = this.$clipPosition(range.end);\n
 \n
@@ -1424,6 +1312,8 @@ var Document = function(text) {\n
         this._emit("change", { data: delta });\n
     };\n
     this.replace = function(range, text) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         if (text.length == 0 && range.isEmpty())\n
             return range.start;\n
         if (text == this.getTextRange(range))\n
@@ -1496,6 +1386,132 @@ var Document = function(text) {\n
 exports.Document = Document;\n
 });\n
 \n
+define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+var EventEmitter = {};\n
+var stopPropagation = function() { this.propagationStopped = true; };\n
+var preventDefault = function() { this.defaultPrevented = true; };\n
+\n
+EventEmitter._emit =\n
+EventEmitter._dispatchEvent = function(eventName, e) {\n
+    this._eventRegistry || (this._eventRegistry = {});\n
+    this._defaultHandlers || (this._defaultHandlers = {});\n
+\n
+    var listeners = this._eventRegistry[eventName] || [];\n
+    var defaultHandler = this._defaultHandlers[eventName];\n
+    if (!listeners.length && !defaultHandler)\n
+        return;\n
+\n
+    if (typeof e != "object" || !e)\n
+        e = {};\n
+\n
+    if (!e.type)\n
+        e.type = eventName;\n
+    if (!e.stopPropagation)\n
+        e.stopPropagation = stopPropagation;\n
+    if (!e.preventDefault)\n
+        e.preventDefault = preventDefault;\n
+\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++) {\n
+        listeners[i](e, this);\n
+        if (e.propagationStopped)\n
+            break;\n
+    }\n
+    \n
+    if (defaultHandler && !e.defaultPrevented)\n
+        return defaultHandler(e, this);\n
+};\n
+\n
+\n
+EventEmitter._signal = function(eventName, e) {\n
+    var listeners = (this._eventRegistry || {})[eventName];\n
+    if (!listeners)\n
+        return;\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++)\n
+        listeners[i](e, this);\n
+};\n
+\n
+EventEmitter.once = function(eventName, callback) {\n
+    var _self = this;\n
+    callback && this.addEventListener(eventName, function newCallback() {\n
+        _self.removeEventListener(eventName, newCallback);\n
+        callback.apply(null, arguments);\n
+    });\n
+};\n
+\n
+\n
+EventEmitter.setDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        handlers = this._defaultHandlers = {_disabled_: {}};\n
+    \n
+    if (handlers[eventName]) {\n
+        var old = handlers[eventName];\n
+        var disabled = handlers._disabled_[eventName];\n
+        if (!disabled)\n
+            handlers._disabled_[eventName] = disabled = [];\n
+        disabled.push(old);\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1) \n
+            disabled.splice(i, 1);\n
+    }\n
+    handlers[eventName] = callback;\n
+};\n
+EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        return;\n
+    var disabled = handlers._disabled_[eventName];\n
+    \n
+    if (handlers[eventName] == callback) {\n
+        var old = handlers[eventName];\n
+        if (disabled)\n
+            this.setDefaultHandler(eventName, disabled.pop());\n
+    } else if (disabled) {\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1)\n
+            disabled.splice(i, 1);\n
+    }\n
+};\n
+\n
+EventEmitter.on =\n
+EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        listeners = this._eventRegistry[eventName] = [];\n
+\n
+    if (listeners.indexOf(callback) == -1)\n
+        listeners[capturing ? "unshift" : "push"](callback);\n
+    return callback;\n
+};\n
+\n
+EventEmitter.off =\n
+EventEmitter.removeListener =\n
+EventEmitter.removeEventListener = function(eventName, callback) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        return;\n
+\n
+    var index = listeners.indexOf(callback);\n
+    if (index !== -1)\n
+        listeners.splice(index, 1);\n
+};\n
+\n
+EventEmitter.removeAllListeners = function(eventName) {\n
+    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
+};\n
+\n
+exports.EventEmitter = EventEmitter;\n
+\n
+});\n
+\n
 define(\'ace/range\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 var comparePoints = function(p1, p2) {\n
@@ -1742,29 +1758,25 @@ var oop = require("./lib/oop");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 \n
 var Anchor = exports.Anchor = function(doc, row, column) {\n
-    this.document = doc;\n
-\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.attach(doc);\n
+    \n
     if (typeof column == "undefined")\n
         this.setPosition(row.row, row.column);\n
     else\n
         this.setPosition(row, column);\n
-\n
-    this.$onChange = this.onChange.bind(this);\n
-    doc.on("change", this.$onChange);\n
 };\n
 \n
 (function() {\n
 \n
     oop.implement(this, EventEmitter);\n
-\n
     this.getPosition = function() {\n
         return this.$clipPositionToDocument(this.row, this.column);\n
     };\n
-\n
     this.getDocument = function() {\n
         return this.document;\n
     };\n
-\n
+    this.$insertRight = false;\n
     this.onChange = function(e) {\n
         var delta = e.data;\n
         var range = delta.range;\n
@@ -1785,7 +1797,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         if (delta.action === "insertText") {\n
             if (start.row === row && start.column <= column) {\n
-                if (start.row === end.row) {\n
+                if (start.column === column && this.$insertRight) {\n
+                } else if (start.row === end.row) {\n
                     column += end.column - start.column;\n
                 } else {\n
                     column -= start.column;\n
@@ -1826,7 +1839,6 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         this.setPosition(row, column, true);\n
     };\n
-\n
     this.setPosition = function(row, column, noClip) {\n
         var pos;\n
         if (noClip) {\n
@@ -1853,10 +1865,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
             value: pos\n
         });\n
     };\n
-\n
     this.detach = function() {\n
         this.document.removeEventListener("change", this.$onChange);\n
     };\n
+    this.attach = function(doc) {\n
+        this.document = doc || this.document;\n
+        this.document.on("change", this.$onChange);\n
+    };\n
     this.$clipPositionToDocument = function(row, column) {\n
         var pos = {};\n
 \n
@@ -2095,12 +2110,12 @@ define(\'ace/mode/coffee/coffee-script\', [\'require\', \'exports\', \'module\'
 \n
 define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/mode/coffee/rewriter\', \'ace/mode/coffee/helpers\'], function(require, exports, module) {\n
 \n
-  var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, invertLiterate, key, last, locationDataToString, starts, throwSyntaxError, _ref, _ref1,\n
+  var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, invertLiterate, key, last, locationDataToString, repeat, starts, throwSyntaxError, _ref, _ref1,\n
     __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n
 \n
   _ref = require(\'./rewriter\'), Rewriter = _ref.Rewriter, INVERSES = _ref.INVERSES;\n
 \n
-  _ref1 = require(\'./helpers\'), count = _ref1.count, starts = _ref1.starts, compact = _ref1.compact, last = _ref1.last, invertLiterate = _ref1.invertLiterate, locationDataToString = _ref1.locationDataToString, throwSyntaxError = _ref1.throwSyntaxError;\n
+  _ref1 = require(\'./helpers\'), count = _ref1.count, starts = _ref1.starts, compact = _ref1.compact, last = _ref1.last, repeat = _ref1.repeat, invertLiterate = _ref1.invertLiterate, locationDataToString = _ref1.locationDataToString, throwSyntaxError = _ref1.throwSyntaxError;\n
 \n
   exports.Lexer = Lexer = (function() {\n
     function Lexer() {}\n
@@ -2112,6 +2127,7 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
       }\n
       this.literate = opts.literate;\n
       this.indent = 0;\n
+      this.baseIndent = 0;\n
       this.indebt = 0;\n
       this.outdebt = 0;\n
       this.indents = [];\n
@@ -2250,10 +2266,10 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
       }\n
       lexedLength = number.length;\n
       if (octalLiteral = /^0o([0-7]+)/.exec(number)) {\n
-        number = \'0x\' + (parseInt(octalLiteral[1], 8)).toString(16);\n
+        number = \'0x\' + parseInt(octalLiteral[1], 8).toString(16);\n
       }\n
       if (binaryLiteral = /^0b([01]+)/.exec(number)) {\n
-        number = \'0x\' + (parseInt(binaryLiteral[1], 2)).toString(16);\n
+        number = \'0x\' + parseInt(binaryLiteral[1], 2).toString(16);\n
       }\n
       this.token(\'NUMBER\', number, 0, lexedLength);\n
       return lexedLength;\n
@@ -2323,7 +2339,7 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
       if (here) {\n
         this.token(\'HERECOMMENT\', this.sanitizeHeredoc(here, {\n
           herecomment: true,\n
-          indent: Array(this.indent + 1).join(\' \')\n
+          indent: repeat(\' \', this.indent)\n
         }), 0, comment.length);\n
       }\n
       return comment.length;\n
@@ -2441,11 +2457,17 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
           this.suppressNewlines();\n
           return indent.length;\n
         }\n
+        if (!this.tokens.length) {\n
+          this.baseIndent = this.indent = size;\n
+          return indent.length;\n
+        }\n
         diff = size - this.indent + this.outdebt;\n
         this.token(\'INDENT\', diff, indent.length - size, size);\n
         this.indents.push(diff);\n
         this.ends.push(\'OUTDENT\');\n
         this.outdebt = this.indebt = 0;\n
+      } else if (size < this.baseIndent) {\n
+        this.error(\'missing indentation\', indent.length);\n
       } else {\n
         this.indebt = 0;\n
         this.outdentToken(this.indent - size, noNewlines, indent.length);\n
@@ -2521,7 +2543,30 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
 \n
     Lexer.prototype.literalToken = function() {\n
       var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5;\n
-      if (match = OPERATOR.exec(this.chunk)) {\n
+      if (match = OPERATOR.exec(t
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+his.chunk)) {\n
         value = match[0];\n
         if (CODE.test(value)) {\n
           this.tagParameters();\n
@@ -2805,7 +2850,7 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
       column = this.chunkColumn;\n
       if (lineCount > 0) {\n
         lines = string.split(\'\\n\');\n
-        column = (last(lines)).length;\n
+        column = last(lines).length;\n
       } else {\n
         column += string.length;\n
       }\n
@@ -2869,10 +2914,15 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
       return quote + this.escapeLines(body, heredoc) + quote;\n
     };\n
 \n
-    Lexer.prototype.error = function(message) {\n
+    Lexer.prototype.error = function(message, offset) {\n
+      var first_column, first_line, _ref2;\n
+      if (offset == null) {\n
+        offset = 0;\n
+      }\n
+      _ref2 = this.getLineAndColumnFromChunk(offset), first_line = _ref2[0], first_column = _ref2[1];\n
       return throwSyntaxError(message, {\n
-        first_line: this.chunkLine,\n
-        first_column: this.chunkColumn\n
+        first_line: first_line,\n
+        first_column: first_column\n
       });\n
     };\n
 \n
@@ -2971,9 +3021,9 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
 \n
   BOOL = [\'TRUE\', \'FALSE\'];\n
 \n
-  NOT_REGEX = [\'NUMBER\', \'REGEX\', \'BOOL\', \'NULL\', \'UNDEFINED\', \'++\', \'--\', \']\'];\n
+  NOT_REGEX = [\'NUMBER\', \'REGEX\', \'BOOL\', \'NULL\', \'UNDEFINED\', \'++\', \'--\'];\n
 \n
-  NOT_SPACED_REGEX = NOT_REGEX.concat(\')\', \'}\', \'THIS\', \'IDENTIFIER\', \'STRING\');\n
+  NOT_SPACED_REGEX = NOT_REGEX.concat(\')\', \'}\', \'THIS\', \'IDENTIFIER\', \'STRING\', \']\');\n
 \n
   CALLABLE = [\'IDENTIFIER\', \'STRING\', \'REGEX\', \')\', \']\', \'}\', \'?\', \'::\', \'@\', \'THIS\', \'SUPER\'];\n
 \n
@@ -2986,7 +3036,7 @@ define(\'ace/mode/coffee/lexer\', [\'require\', \'exports\', \'module\' , \'ace/
 \n
 define(\'ace/mode/coffee/rewriter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
-  var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, generate, left, rite, _i, _len, _ref,\n
+  var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, generate, left, rite, _i, _len, _ref,\n
     __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n
     __slice = [].slice;\n
 \n
@@ -3259,7 +3309,7 @@ define(\'ace/mode/coffee/rewriter\', [\'require\', \'exports\', \'module\' ], fu
           startImplicitCall(i + 1);\n
           return forward(2);\n
         }\n
-        if (this.matchTags(i, IMPLICIT_FUNC, \'INDENT\', null, \':\') && !this.findTagsBackwards(i, [\'CLASS\', \'EXTENDS\', \'IF\', \'CATCH\', \'SWITCH\', \'LEADING_WHEN\', \'FOR\', \'WHILE\', \'UNTIL\'])) {\n
+        if (__indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.matchTags(i + 1, \'INDENT\', null, \':\') && !this.findTagsBackwards(i, [\'CLASS\', \'EXTENDS\', \'IF\', \'CATCH\', \'SWITCH\', \'LEADING_WHEN\', \'FOR\', \'WHILE\', \'UNTIL\'])) {\n
           startImplicitCall(i + 1);\n
           stack.push([\'INDENT\', i + 2]);\n
           return forward(3);\n
@@ -3344,8 +3394,8 @@ define(\'ace/mode/coffee/rewriter\', [\'require\', \'exports\', \'module\' ], fu
       var action, condition, indent, outdent, starter;\n
       starter = indent = outdent = null;\n
       condition = function(token, i) {\n
-        var _ref;\n
-        return token[1] !== \';\' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === \'ELSE\' && (starter !== \'IF\' && starter !== \'THEN\'));\n
+        var _ref, _ref1;\n
+        return token[1] !== \';\' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === \'ELSE\' && starter !== \'THEN\') && !(((_ref1 = token[0]) === \'CATCH\' || _ref1 === \'FINALLY\') && (starter === \'->\' || starter === \'=>\'));\n
       };\n
       action = function(token, i) {\n
         return this.tokens.splice((this.tag(i - 1) === \',\' ? i - 1 : i), 0, outdent);\n
@@ -3459,8 +3509,6 @@ define(\'ace/mode/coffee/rewriter\', [\'require\', \'exports\', \'module\' ], fu
   IMPLICIT_CALL = [\'IDENTIFIER\', \'NUMBER\', \'STRING\', \'JS\', \'REGEX\', \'NEW\', \'PARAM_START\', \'CLASS\', \'IF\', \'TRY\', \'SWITCH\', \'THIS\', \'BOOL\', \'NULL\', \'UNDEFINED\', \'UNARY\', \'SUPER\', \'THROW\', \'@\', \'->\', \'=>\', \'[\', \'(\', \'{\', \'--\', \'++\'];\n
 \n
   IMPLICIT_UNSPACED_CALL = [\'+\', \'-\'];\n
-\n
-  IMPLICIT_BLOCK = [\'->\', \'=>\', \'{\', \'[\', \',\'];\n
 \n
   IMPLICIT_END = [\'POST_IF\', \'FOR\', \'WHILE\', \'UNTIL\', \'WHEN\', \'BY\', \'LOOP\', \'TERMINATOR\'];\n
 \n
@@ -3475,7 +3523,7 @@ define(\'ace/mode/coffee/rewriter\', [\'require\', \'exports\', \'module\' ], fu
 \n
 define(\'ace/mode/coffee/helpers\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
-  var buildLocationData, extend, flatten, last, repeat, _ref;\n
+  var buildLocationData, extend, flatten, last, repeat, syntaxErrorToString, _ref;\n
 \n
   exports.starts = function(string, literal, start) {\n
     return literal === string.substr(start, literal.length);\n
@@ -3662,37 +3710,57 @@ define(\'ace/mode/coffee/helpers\', [\'require\', \'exports\', \'module\' ], fun
   };\n
 \n
   exports.throwSyntaxError = function(message, location) {\n
-    var error, _ref1, _ref2;\n
-    if ((_ref1 = location.last_line) == null) {\n
+    var error;\n
+    if (location.last_line == null) {\n
       location.last_line = location.first_line;\n
     }\n
-    if ((_ref2 = location.last_column) == null) {\n
+    if (location.last_column == null) {\n
       location.last_column = location.first_column;\n
     }\n
     error = new SyntaxError(message);\n
     error.location = location;\n
+    error.toString = syntaxErrorToString;\n
+    error.stack = error.toString();\n
     throw error;\n
   };\n
 \n
-  exports.prettyErrorMessage = function(error, fileName, code, useColors) {\n
-    var codeLine, colorize, end, first_column, first_line, last_column, last_line, marker, message, start, _ref1;\n
-    if (!error.location) {\n
-      return error.stack || ("" + error);\n
+  exports.updateSyntaxError = function(error, code, filename) {\n
+    if (error.toString === syntaxErrorToString) {\n
+      error.code || (error.code = code);\n
+      error.filename || (error.filename = filename);\n
+      error.stack = error.toString();\n
+    }\n
+    return error;\n
+  };\n
+\n
+  syntaxErrorToString = function() {\n
+    var codeLine, colorize, colorsEnabled, end, filename, first_column, first_line, last_column, last_line, marker, start, _ref1, _ref2;\n
+    if (!(this.code && this.location)) {\n
+      return Error.prototype.toString.call(this);\n
     }\n
-    _ref1 = error.location, first_line = _ref1.first_line, first_column = _ref1.first_column, last_line = _ref1.last_line, last_column = _ref1.last_column;\n
-    codeLine = code.split(\'\\n\')[first_line];\n
+    _ref1 = this.location, first_line = _ref1.first_line, first_column = _ref1.first_column, last_line = _ref1.last_line, last_column = _ref1.last_column;\n
+    if (last_line == null) {\n
+      last_line = first_line;\n
+    }\n
+    if (last_column == null) {\n
+      last_column = first_column;\n
+    }\n
+    filename = this.filename || \'[stdin]\';\n
+    codeLine = this.code.split(\'\\n\')[first_line];\n
     start = first_column;\n
     end = first_line === last_line ? last_column + 1 : codeLine.length;\n
     marker = repeat(\' \', start) + repeat(\'^\', end - start);\n
-    if (useColors) {\n
+    if (typeof process !== "undefined" && process !== null) {\n
+      colorsEnabled = process.stdout.isTTY && !process.env.NODE_DISABLE_COLORS;\n
+    }\n
+    if ((_ref2 = this.colorful) != null ? _ref2 : colorsEnabled) {\n
       colorize = function(str) {\n
         return "\\x1B[1;31m" + str + "\\x1B[0m";\n
       };\n
       codeLine = codeLine.slice(0, start) + colorize(codeLine.slice(start, end)) + codeLine.slice(end);\n
       marker = colorize(marker);\n
     }\n
-    message = "" + fileName + ":" + (first_line + 1) + ":" + (first_column + 1) + ": error: " + error.message + "\\n" + codeLine + "\\n" + marker;\n
-    return message;\n
+    return "" + filename + ":" + (first_line + 1) + ":" + (first_column + 1) + ": error: " + this.message + "\\n" + codeLine + "\\n" + marker;\n
   };\n
 \n
 \n
@@ -3702,10 +3770,10 @@ define(\'ace/mode/coffee/parser\', [\'require\', \'exports\', \'module\' ], func
 \n
 var parser = {trace: function trace() { },\n
 yy: {},\n
-symbols_: {"error":2,"Root":3,"Body":4,"Block":5,"TERMINATOR":6,"Line":7,"Expression":8,"Statement":9,"Return":10,"Comment":11,"STATEMENT":12,"Value":13,"Invocation":14,"Code":15,"Operation":16,"Assign":17,"If":18,"Try":19,"While":20,"For":21,"Switch":22,"Class":23,"Throw":24,"INDENT":25,"OUTDENT":26,"Identifier":27,"IDENTIFIER":28,"AlphaNumeric":29,"NUMBER":30,"STRING":31,"Literal":32,"JS":33,"REGEX":34,"DEBUGGER":35,"UNDEFINED":36,"NULL":37,"BOOL":38,"Assignable":39,"=":40,"AssignObj":41,"ObjAssignable":42,":":43,"ThisProperty":44,"RETURN":45,"HERECOMMENT":46,"PARAM_START":47,"ParamList":48,"PARAM_END":49,"FuncGlyph":50,"->":51,"=>":52,"OptComma":53,",":54,"Param":55,"ParamVar":56,"...":57,"Array":58,"Object":59,"Splat":60,"SimpleAssignable":61,"Accessor":62,"Parenthetical":63,"Range":64,"This":65,".":66,"?.":67,"::":68,"?::":69,"Index":70,"INDEX_START":71,"IndexValue":72,"INDEX_END":73,"INDEX_SOAK":74,"Slice":75,"{":76,"AssignList":77,"}":78,"CLASS":79,"EXTENDS":80,"OptFuncExist":81,"Arguments":82,"SUPER":83,"FUNC_EXIST":84,"CALL_START":85,"CALL_END":86,"ArgList":87,"THIS":88,"@":89,"[":90,"]":91,"RangeDots":92,"..":93,"Arg":94,"SimpleArgs":95,"TRY":96,"Catch":97,"FINALLY":98,"CATCH":99,"THROW":100,"(":101,")":102,"WhileSource":103,"WHILE":104,"WHEN":105,"UNTIL":106,"Loop":107,"LOOP":108,"ForBody":109,"FOR":110,"ForStart":111,"ForSource":112,"ForVariables":113,"OWN":114,"ForValue":115,"FORIN":116,"FOROF":117,"BY":118,"SWITCH":119,"Whens":120,"ELSE":121,"When":122,"LEADING_WHEN":123,"IfBlock":124,"IF":125,"POST_IF":126,"UNARY":127,"-":128,"+":129,"--":130,"++":131,"?":132,"MATH":133,"SHIFT":134,"COMPARE":135,"LOGIC":136,"RELATION":137,"COMPOUND_ASSIGN":138,"$accept":0,"$end":1},\n
-terminals_: {2:"error",6:"TERMINATOR",12:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"DEBUGGER",36:"UNDEFINED",37:"NULL",38:"BOOL",40:"=",43:":",45:"RETURN",46:"HERECOMMENT",47:"PARAM_START",49:"PARAM_END",51:"->",52:"=>",54:",",57:"...",66:".",67:"?.",68:"::",69:"?::",71:"INDEX_START",73:"INDEX_END",74:"INDEX_SOAK",76:"{",78:"}",79:"CLASS",80:"EXTENDS",83:"SUPER",84:"FUNC_EXIST",85:"CALL_START",86:"CALL_END",88:"THIS",89:"@",90:"[",91:"]",93:"..",96:"TRY",98:"FINALLY",99:"CATCH",100:"THROW",101:"(",102:")",104:"WHILE",105:"WHEN",106:"UNTIL",108:"LOOP",110:"FOR",114:"OWN",116:"FORIN",117:"FOROF",118:"BY",119:"SWITCH",121:"ELSE",123:"LEADING_WHEN",125:"IF",126:"POST_IF",127:"UNARY",128:"-",129:"+",130:"--",131:"++",132:"?",133:"MATH",134:"SHIFT",135:"COMPARE",136:"LOGIC",137:"RELATION",138:"COMPOUND_ASSIGN"},\n
-productions_: [0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[41,1],[41,3],[41,5],[41,1],[42,1],[42,1],[42,1],[10,2],[10,1],[11,1],[15,5],[15,2],[50,1],[50,1],[53,0],[53,1],[48,0],[48,1],[48,3],[48,4],[48,6],[55,1],[55,2],[55,3],[56,1],[56,1],[56,1],[56,1],[60,2],[61,1],[61,2],[61,2],[61,1],[39,1],[39,1],[39,1],[13,1],[13,1],[13,1],[13,1],[13,1],[62,2],[62,2],[62,2],[62,2],[62,1],[62,1],[70,3],[70,2],[72,1],[72,1],[59,4],[77,0],[77,1],[77,3],[77,4],[77,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[81,0],[81,1],[82,2],[82,4],[65,1],[65,1],[44,2],[58,2],[58,4],[92,1],[92,1],[64,5],[75,3],[75,2],[75,2],[75,1],[87,1],[87,3],[87,4],[87,4],[87,6],[94,1],[94,1],[95,1],[95,3],[19,2],[19,3],[19,4],[19,5],[97,3],[97,3],[97,2],[24,2],[63,3],[63,5],[103,2],[103,4],[103,2],[103,4],[20,2],[20,2],[20,2],[20,1],[107,2],[107,2],[21,2],[21,2],[21,2],[109,2],[109,2],[111,2],[111,3],[115,1],[115,1],[115,1],[115,1],[113,1],[113,3],[112,2],[112,2],[112,4],[112,4],[112,4],[112,6],[112,6],[22,5],[22,7],[22,4],[22,6],[120,1],[120,2],[122,3],[122,4],[124,3],[124,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,4],[16,3]],\n
-performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {\n
+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,"Literal":32,"JS":33,"REGEX":34,"DEBUGGER":35,"UNDEFINED":36,"NULL":37,"BOOL":38,"Assignable":39,"=":40,"AssignObj":41,"ObjAssignable":42,":":43,"ThisProperty":44,"RETURN":45,"HERECOMMENT":46,"PARAM_START":47,"ParamList":48,"PARAM_END":49,"FuncGlyph":50,"->":51,"=>":52,"OptComma":53,",":54,"Param":55,"ParamVar":56,"...":57,"Array":58,"Object":59,"Splat":60,"SimpleAssignable":61,"Accessor":62,"Parenthetical":63,"Range":64,"This":65,".":66,"?.":67,"::":68,"?::":69,"Index":70,"INDEX_START":71,"IndexValue":72,"INDEX_END":73,"INDEX_SOAK":74,"Slice":75,"{":76,"AssignList":77,"}":78,"CLASS":79,"EXTENDS":80,"OptFuncExist":81,"Arguments":82,"SUPER":83,"FUNC_EXIST":84,"CALL_START":85,"CALL_END":86,"ArgList":87,"THIS":88,"@":89,"[":90,"]":91,"RangeDots":92,"..":93,"Arg":94,"SimpleArgs":95,"TRY":96,"Catch":97,"FINALLY":98,"CATCH":99,"THROW":100,"(":101,")":102,"WhileSource":103,"WHILE":104,"WHEN":105,"UNTIL":106,"Loop":107,"LOOP":108,"ForBody":109,"FOR":110,"ForStart":111,"ForSource":112,"ForVariables":113,"OWN":114,"ForValue":115,"FORIN":116,"FOROF":117,"BY":118,"SWITCH":119,"Whens":120,"ELSE":121,"When":122,"LEADING_WHEN":123,"IfBlock":124,"IF":125,"POST_IF":126,"UNARY":127,"-":128,"+":129,"--":130,"++":131,"?":132,"MATH":133,"SHIFT":134,"COMPARE":135,"LOGIC":136,"RELATION":137,"COMPOUND_ASSIGN":138,"$accept":0,"$end":1},\n
+terminals_: {2:"error",6:"TERMINATOR",11:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"DEBUGGER",36:"UNDEFINED",37:"NULL",38:"BOOL",40:"=",43:":",45:"RETURN",46:"HERECOMMENT",47:"PARAM_START",49:"PARAM_END",51:"->",52:"=>",54:",",57:"...",66:".",67:"?.",68:"::",69:"?::",71:"INDEX_START",73:"INDEX_END",74:"INDEX_SOAK",76:"{",78:"}",79:"CLASS",80:"EXTENDS",83:"SUPER",84:"FUNC_EXIST",85:"CALL_START",86:"CALL_END",88:"THIS",89:"@",90:"[",91:"]",93:"..",96:"TRY",98:"FINALLY",99:"CATCH",100:"THROW",101:"(",102:")",104:"WHILE",105:"WHEN",106:"UNTIL",108:"LOOP",110:"FOR",114:"OWN",116:"FORIN",117:"FOROF",118:"BY",119:"SWITCH",121:"ELSE",123:"LEADING_WHEN",125:"IF",126:"POST_IF",127:"UNARY",128:"-",129:"+",130:"--",131:"++",132:"?",133:"MATH",134:"SHIFT",135:"COMPARE",136:"LOGIC",137:"RELATION",138:"COMPOUND_ASSIGN"},\n
+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],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[16,3],[16,4],[16,5],[41,1],[41,3],[41,5],[41,1],[42,1],[42,1],[42,1],[9,2],[9,1],[10,1],[14,5],[14,2],[50,1],[50,1],[53,0],[53,1],[48,0],[48,1],[48,3],[48,4],[48,6],[55,1],[55,2],[55,3],[56,1],[56,1],[56,1],[56,1],[60,2],[61,1],[61,2],[61,2],[61,1],[39,1],[39,1],[39,1],[12,1],[12,1],[12,1],[12,1],[12,1],[62,2],[62,2],[62,2],[62,2],[62,1],[62,1],[70,3],[70,2],[72,1],[72,1],[59,4],[77,0],[77,1],[77,3],[77,4],[77,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],[81,0],[81,1],[82,2],[82,4],[65,1],[65,1],[44,2],[58,2],[58,4],[92,1],[92,1],[64,5],[75,3],[75,2],[75,2],[75,1],[87,1],[87,3],[87,4],[87,4],[87,6],[94,1],[94,1],[95,1],[95,3],[18,2],[18,3],[18,4],[18,5],[97,3],[97,3],[97,2],[23,2],[63,3],[63,5],[103,2],[103,4],[103,2],[103,4],[19,2],[19,2],[19,2],[19,1],[107,2],[107,2],[20,2],[20,2],[20,2],[109,2],[109,2],[111,2],[111,3],[115,1],[115,1],[115,1],[115,1],[113,1],[113,3],[112,2],[112,2],[112,4],[112,4],[112,4],[112,6],[112,6],[21,5],[21,7],[21,4],[21,6],[120,1],[120,2],[122,3],[122,4],[124,3],[124,5],[17,1],[17,3],[17,3],[17,3],[15,2],[15,2],[15,2],[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,5],[15,4],[15,3]],\n
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n
 \n
 var $0 = $$.length - 1;\n
 switch (yystate) {\n
@@ -3713,13 +3781,13 @@ case 1:return this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Block);\n
 break;\n
 case 2:return this.$ = $$[$0];\n
 break;\n
-case 3:return this.$ = $$[$0-1];\n
+case 3:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(yy.Block.wrap([$$[$0]]));\n
 break;\n
-case 4:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(yy.Block.wrap([$$[$0]]));\n
+case 4:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].push($$[$0]));\n
 break;\n
-case 5:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].push($$[$0]));\n
+case 5:this.$ = $$[$0-1];\n
 break;\n
-case 6:this.$ = $$[$0-1];\n
+case 6:this.$ = $$[$0];\n
 break;\n
 case 7:this.$ = $$[$0];\n
 break;\n
@@ -3727,9 +3795,9 @@ case 8:this.$ = $$[$0];\n
 break;\n
 case 9:this.$ = $$[$0];\n
 break;\n
-case 10:this.$ = $$[$0];\n
+case 10:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
 break;\n
-case 11:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
+case 11:this.$ = $$[$0];\n
 break;\n
 case 12:this.$ = $$[$0];\n
 break;\n
@@ -3753,43 +3821,43 @@ case 21:this.$ = $$[$0];\n
 break;\n
 case 22:this.$ = $$[$0];\n
 break;\n
-case 23:this.$ = $$[$0];\n
+case 23:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Block);\n
 break;\n
-case 24:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Block);\n
+case 24:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]);\n
 break;\n
-case 25:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]);\n
+case 25:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
 break;\n
 case 26:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
 break;\n
 case 27:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
 break;\n
-case 28:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
+case 28:this.$ = $$[$0];\n
 break;\n
-case 29:this.$ = $$[$0];\n
+case 29:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
 break;\n
 case 30:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
 break;\n
 case 31:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
 break;\n
-case 32:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\n
+case 32:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Undefined);\n
 break;\n
-case 33:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Undefined);\n
+case 33:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Null);\n
 break;\n
-case 34:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Null);\n
+case 34:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Bool($$[$0]));\n
 break;\n
-case 35:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Bool($$[$0]));\n
+case 35:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0]));\n
 break;\n
-case 36:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0]));\n
+case 36:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0]));\n
 break;\n
-case 37:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0]));\n
+case 37:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1]));\n
 break;\n
-case 38:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1]));\n
+case 38:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
-case 39:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
+case 39:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], \'object\'));\n
 break;\n
-case 40:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], \'object\'));\n
+case 40:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], \'object\'));\n
 break;\n
-case 41:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], \'object\'));\n
+case 41:this.$ = $$[$0];\n
 break;\n
 case 42:this.$ = $$[$0];\n
 break;\n
@@ -3797,41 +3865,41 @@ case 43:this.$ = $$[$0];\n
 break;\n
 case 44:this.$ = $$[$0];\n
 break;\n
-case 45:this.$ = $$[$0];\n
+case 45:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Return($$[$0]));\n
 break;\n
-case 46:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Return($$[$0]));\n
+case 46:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Return);\n
 break;\n
-case 47:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Return);\n
+case 47:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Comment($$[$0]));\n
 break;\n
-case 48:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Comment($$[$0]));\n
+case 48:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Code($$[$0-3], $$[$0], $$[$0-1]));\n
 break;\n
-case 49:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Code($$[$0-3], $$[$0], $$[$0-1]));\n
+case 49:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Code([], $$[$0], $$[$0-1]));\n
 break;\n
-case 50:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Code([], $$[$0], $$[$0-1]));\n
+case 50:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(\'func\');\n
 break;\n
-case 51:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(\'func\');\n
+case 51:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(\'boundfunc\');\n
 break;\n
-case 52:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(\'boundfunc\');\n
+case 52:this.$ = $$[$0];\n
 break;\n
 case 53:this.$ = $$[$0];\n
 break;\n
-case 54:this.$ = $$[$0];\n
+case 54:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]);\n
 break;\n
-case 55:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]);\n
+case 55:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\n
 break;\n
-case 56:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\n
+case 56:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\n
 break;\n
-case 57:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\n
+case 57:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\n
 break;\n
-case 58:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\n
+case 58:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\n
 break;\n
-case 59:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\n
+case 59:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Param($$[$0]));\n
 break;\n
-case 60:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Param($$[$0]));\n
+case 60:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Param($$[$0-1], null, true));\n
 break;\n
-case 61:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Param($$[$0-1], null, true));\n
+case 61:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Param($$[$0-2], $$[$0]));\n
 break;\n
-case 62:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Param($$[$0-2], $$[$0]));\n
+case 62:this.$ = $$[$0];\n
 break;\n
 case 63:this.$ = $$[$0];\n
 break;\n
@@ -3839,319 +3907,319 @@ case 64:this.$ = $$[$0];\n
 break;\n
 case 65:this.$ = $$[$0];\n
 break;\n
-case 66:this.$ = $$[$0];\n
+case 66:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Splat($$[$0-1]));\n
 break;\n
-case 67:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Splat($$[$0-1]));\n
+case 67:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
-case 68:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
+case 68:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].add($$[$0]));\n
 break;\n
-case 69:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].add($$[$0]));\n
+case 69:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value($$[$0-1], [].concat($$[$0])));\n
 break;\n
-case 70:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value($$[$0-1], [].concat($$[$0])));\n
+case 70:this.$ = $$[$0];\n
 break;\n
 case 71:this.$ = $$[$0];\n
 break;\n
-case 72:this.$ = $$[$0];\n
+case 72:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
 case 73:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
-case 74:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
+case 74:this.$ = $$[$0];\n
 break;\n
-case 75:this.$ = $$[$0];\n
+case 75:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
 case 76:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
 case 77:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
-case 78:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
-break;\n
-case 79:this.$ = $$[$0];\n
+case 78:this.$ = $$[$0];\n
 break;\n
-case 80:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0]));\n
+case 79:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0]));\n
 break;\n
-case 81:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0], \'soak\'));\n
+case 80:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0], \'soak\'));\n
 break;\n
-case 82:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.Literal(\'prototype\'))), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]);\n
+case 81:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.Literal(\'prototype\'))), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]);\n
 break;\n
-case 83:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.Literal(\'prototype\'), \'soak\')), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]);\n
+case 82:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.Literal(\'prototype\'), \'soak\')), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]);\n
 break;\n
-case 84:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Access(new yy.Literal(\'prototype\')));\n
+case 83:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Access(new yy.Literal(\'prototype\')));\n
 break;\n
-case 85:this.$ = $$[$0];\n
+case 84:this.$ = $$[$0];\n
 break;\n
-case 86:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]);\n
+case 85:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]);\n
 break;\n
-case 87:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(yy.extend($$[$0], {\n
+case 86:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(yy.extend($$[$0], {\n
           soak: true\n
         }));\n
 break;\n
-case 88:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Index($$[$0]));\n
+case 87:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Index($$[$0]));\n
 break;\n
-case 89:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Slice($$[$0]));\n
+case 88:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Slice($$[$0]));\n
 break;\n
-case 90:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Obj($$[$0-2], $$[$0-3].generated));\n
+case 89:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Obj($$[$0-2], $$[$0-3].generated));\n
 break;\n
-case 91:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]);\n
+case 90:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]);\n
 break;\n
-case 92:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\n
+case 91:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\n
 break;\n
-case 93:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\n
+case 92:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\n
 break;\n
-case 94:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\n
+case 93:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\n
 break;\n
-case 95:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\n
+case 94:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\n
 break;\n
-case 96:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Class);\n
+case 95:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Class);\n
 break;\n
-case 97:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class(null, null, $$[$0]));\n
+case 96:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class(null, null, $$[$0]));\n
 break;\n
-case 98:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class(null, $$[$0]));\n
+case 97:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class(null, $$[$0]));\n
 break;\n
-case 99:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class(null, $$[$0-1], $$[$0]));\n
+case 98:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class(null, $$[$0-1], $$[$0]));\n
 break;\n
-case 100:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class($$[$0]));\n
+case 99:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class($$[$0]));\n
 break;\n
-case 101:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class($$[$0-1], null, $$[$0]));\n
+case 100:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class($$[$0-1], null, $$[$0]));\n
 break;\n
-case 102:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class($$[$0-2], $$[$0]));\n
+case 101:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class($$[$0-2], $$[$0]));\n
 break;\n
-case 103:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Class($$[$0-3], $$[$0-1], $$[$0]));\n
+case 102:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Class($$[$0-3], $$[$0-1], $$[$0]));\n
+break;\n
+case 103:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Call($$[$0-2], $$[$0], $$[$0-1]));\n
 break;\n
 case 104:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Call($$[$0-2], $$[$0], $$[$0-1]));\n
 break;\n
-case 105:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Call($$[$0-2], $$[$0], $$[$0-1]));\n
+case 105:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Call(\'super\', [new yy.Splat(new yy.Literal(\'arguments\'))]));\n
 break;\n
-case 106:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Call(\'super\', [new yy.Splat(new yy.Literal(\'arguments\'))]));\n
+case 106:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Call(\'super\', $$[$0]));\n
 break;\n
-case 107:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Call(\'super\', $$[$0]));\n
+case 107:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(false);\n
 break;\n
-case 108:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(false);\n
+case 108:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(true);\n
 break;\n
-case 109:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(true);\n
+case 109:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([]);\n
 break;\n
-case 110:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([]);\n
+case 110:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]);\n
 break;\n
-case 111:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]);\n
+case 111:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value(new yy.Literal(\'this\')));\n
 break;\n
 case 112:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value(new yy.Literal(\'this\')));\n
 break;\n
-case 113:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value(new yy.Literal(\'this\')));\n
+case 113:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value(yy.addLocationDataFn(_$[$0-1])(new yy.Literal(\'this\')), [yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))], \'this\'));\n
 break;\n
-case 114:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value(yy.addLocationDataFn(_$[$0-1])(new yy.Literal(\'this\')), [yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))], \'this\'));\n
+case 114:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Arr([]));\n
 break;\n
-case 115:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Arr([]));\n
+case 115:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Arr($$[$0-2]));\n
 break;\n
-case 116:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Arr($$[$0-2]));\n
+case 116:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(\'inclusive\');\n
 break;\n
-case 117:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(\'inclusive\');\n
+case 117:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(\'exclusive\');\n
 break;\n
-case 118:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(\'exclusive\');\n
+case 118:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Range($$[$0-3], $$[$0-1], $$[$0-2]));\n
 break;\n
-case 119:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Range($$[$0-3], $$[$0-1], $$[$0-2]));\n
+case 119:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Range($$[$0-2], $$[$0], $$[$0-1]));\n
 break;\n
-case 120:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Range($$[$0-2], $$[$0], $$[$0-1]));\n
+case 120:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range($$[$0-1], null, $$[$0]));\n
 break;\n
-case 121:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range($$[$0-1], null, $$[$0]));\n
+case 121:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range(null, $$[$0], $$[$0-1]));\n
 break;\n
-case 122:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range(null, $$[$0], $$[$0-1]));\n
+case 122:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Range(null, null, $$[$0]));\n
 break;\n
-case 123:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Range(null, null, $$[$0]));\n
+case 123:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\n
 break;\n
-case 124:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\n
+case 124:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\n
 break;\n
-case 125:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\n
+case 125:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\n
 break;\n
-case 126:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\n
+case 126:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]);\n
 break;\n
-case 127:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]);\n
+case 127:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\n
 break;\n
-case 128:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\n
+case 128:this.$ = $$[$0];\n
 break;\n
 case 129:this.$ = $$[$0];\n
 break;\n
 case 130:this.$ = $$[$0];\n
 break;\n
-case 131:this.$ = $$[$0];\n
-break;\n
-case 132:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([].concat($$[$0-2], $$[$0]));\n
+case 131:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([].concat($$[$0-2], $$[$0]));\n
 break;\n
-case 133:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Try($$[$0]));\n
+case 132:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Try($$[$0]));\n
 break;\n
-case 134:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Try($$[$0-1], $$[$0][0], $$[$0][1]));\n
+case 133:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Try($$[$0-1], $$[$0][0], $$[$0][1]));\n
 break;\n
-case 135:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Try($$[$0-2], null, null, $$[$0]));\n
+case 134:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Try($$[$0-2], null, null, $$[$0]));\n
 break;\n
-case 136:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0]));\n
+case 135:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0]));\n
 break;\n
-case 137:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-1], $$[$0]]);\n
+case 136:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-1], $$[$0]]);\n
 break;\n
-case 138:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Value($$[$0-1])), $$[$0]]);\n
+case 137:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Value($$[$0-1])), $$[$0]]);\n
 break;\n
-case 139:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([null, $$[$0]]);\n
+case 138:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([null, $$[$0]]);\n
 break;\n
-case 140:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Throw($$[$0]));\n
+case 139:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Throw($$[$0]));\n
 break;\n
-case 141:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Parens($$[$0-1]));\n
+case 140:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Parens($$[$0-1]));\n
 break;\n
-case 142:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Parens($$[$0-2]));\n
+case 141:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Parens($$[$0-2]));\n
 break;\n
-case 143:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0]));\n
+case 142:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0]));\n
 break;\n
-case 144:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {\n
+case 143:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {\n
           guard: $$[$0]\n
         }));\n
 break;\n
-case 145:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0], {\n
+case 144:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0], {\n
           invert: true\n
         }));\n
 break;\n
-case 146:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {\n
+case 145:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {\n
           invert: true,\n
           guard: $$[$0]\n
         }));\n
 break;\n
-case 147:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].addBody($$[$0]));\n
+case 146:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].addBody($$[$0]));\n
+break;\n
+case 147:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]]))));\n
 break;\n
 case 148:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]]))));\n
 break;\n
-case 149:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]]))));\n
+case 149:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])($$[$0]);\n
 break;\n
-case 150:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])($$[$0]);\n
+case 150:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal(\'true\'))).addBody($$[$0]));\n
 break;\n
-case 151:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal(\'true\'))).addBody($$[$0]));\n
+case 151:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal(\'true\'))).addBody(yy.addLocationDataFn(_$[$0])(yy.Block.wrap([$$[$0]]))));\n
 break;\n
-case 152:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal(\'true\'))).addBody(yy.addLocationDataFn(_$[$0])(yy.Block.wrap([$$[$0]]))));\n
+case 152:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0]));\n
 break;\n
 case 153:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0]));\n
 break;\n
-case 154:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0]));\n
+case 154:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0], $$[$0-1]));\n
 break;\n
-case 155:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0], $$[$0-1]));\n
-break;\n
-case 156:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n
+case 155:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n
           source: yy.addLocationDataFn(_$[$0])(new yy.Value($$[$0]))\n
         });\n
 break;\n
-case 157:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])((function () {\n
+case 156:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])((function () {\n
         $$[$0].own = $$[$0-1].own;\n
         $$[$0].name = $$[$0-1][0];\n
         $$[$0].index = $$[$0-1][1];\n
         return $$[$0];\n
       }()));\n
 break;\n
-case 158:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0]);\n
+case 157:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0]);\n
 break;\n
-case 159:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {\n
+case 158:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {\n
         $$[$0].own = true;\n
         return $$[$0];\n
       }()));\n
 break;\n
+case 159:this.$ = $$[$0];\n
+break;\n
 case 160:this.$ = $$[$0];\n
 break;\n
-case 161:this.$ = $$[$0];\n
+case 161:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
 case 162:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
 break;\n
-case 163:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\n
+case 163:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\n
 break;\n
-case 164:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\n
+case 164:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-2], $$[$0]]);\n
 break;\n
-case 165:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-2], $$[$0]]);\n
-break;\n
-case 166:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n
+case 165:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n
           source: $$[$0]\n
         });\n
 break;\n
-case 167:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n
+case 166:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n
           source: $$[$0],\n
           object: true\n
         });\n
 break;\n
-case 168:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n
+case 167:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n
           source: $$[$0-2],\n
           guard: $$[$0]\n
         });\n
 break;\n
-case 169:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n
+case 168:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n
           source: $$[$0-2],\n
           guard: $$[$0],\n
           object: true\n
         });\n
 break;\n
-case 170:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n
+case 169:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n
           source: $$[$0-2],\n
           step: $$[$0]\n
         });\n
 break;\n
-case 171:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({\n
+case 170:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({\n
           source: $$[$0-4],\n
           guard: $$[$0-2],\n
           step: $$[$0]\n
         });\n
 break;\n
-case 172:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({\n
+case 171:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({\n
           source: $$[$0-4],\n
           step: $$[$0-2],\n
           guard: $$[$0]\n
         });\n
 break;\n
-case 173:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Switch($$[$0-3], $$[$0-1]));\n
+case 172:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Switch($$[$0-3], $$[$0-1]));\n
 break;\n
-case 174:this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]));\n
+case 173:this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]));\n
 break;\n
-case 175:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Switch(null, $$[$0-1]));\n
+case 174:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Switch(null, $$[$0-1]));\n
 break;\n
-case 176:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.Switch(null, $$[$0-3], $$[$0-1]));\n
+case 175:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.Switch(null, $$[$0-3], $$[$0-1]));\n
 break;\n
-case 177:this.$ = $$[$0];\n
+case 176:this.$ = $$[$0];\n
 break;\n
-case 178:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].concat($$[$0]));\n
+case 177:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].concat($$[$0]));\n
 break;\n
-case 179:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([[$$[$0-1], $$[$0]]]);\n
+case 178:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([[$$[$0-1], $$[$0]]]);\n
 break;\n
-case 180:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])([[$$[$0-2], $$[$0-1]]]);\n
+case 179:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])([[$$[$0-2], $$[$0-1]]]);\n
 break;\n
-case 181:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], {\n
+case 180:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], {\n
           type: $$[$0-2]\n
         }));\n
 break;\n
-case 182:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], {\n
+case 181:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], {\n
           type: $$[$0-2]\n
-        })));\n
+        }))));\n
 break;\n
-case 183:this.$ = $$[$0];\n
+case 182:this.$ = $$[$0];\n
 break;\n
-case 184:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].addElse($$[$0]));\n
+case 183:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].addElse($$[$0]));\n
 break;\n
-case 185:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {\n
+case 184:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {\n
           type: $$[$0-1],\n
           statement: true\n
         }));\n
 break;\n
-case 186:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {\n
+case 185:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {\n
           type: $$[$0-1],\n
           statement: true\n
         }));\n
 break;\n
-case 187:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op($$[$0-1], $$[$0]));\n
+case 186:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op($$[$0-1], $$[$0]));\n
+break;\n
+case 187:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'-\', $$[$0]));\n
 break;\n
-case 188:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'-\', $$[$0]));\n
+case 188:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'+\', $$[$0]));\n
 break;\n
-case 189:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'+\', $$[$0]));\n
+case 189:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'--\', $$[$0]));\n
 break;\n
-case 190:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'--\', $$[$0]));\n
+case 190:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'++\', $$[$0]));\n
 break;\n
-case 191:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'++\', $$[$0]));\n
+case 191:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'--\', $$[$0-1], null, true));\n
 break;\n
-case 192:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'--\', $$[$0-1], null, true));\n
+case 192:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'++\', $$[$0-1], null, true));\n
 break;\n
-case 193:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op(\'++\', $$[$0-1], null, true));\n
+case 193:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Existence($$[$0-1]));\n
 break;\n
-case 194:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Existence($$[$0-1]));\n
+case 194:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op(\'+\', $$[$0-2], $$[$0]));\n
 break;\n
-case 195:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op(\'+\', $$[$0-2], $$[$0]));\n
+case 195:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op(\'-\', $$[$0-2], $$[$0]));\n
 break;\n
-case 196:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op(\'-\', $$[$0-2], $$[$0]));\n
+case 196:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));\n
 break;\n
 case 197:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));\n
 break;\n
@@ -4159,9 +4227,7 @@ case 198:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[
 break;\n
 case 199:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));\n
 break;\n
-case 200:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));\n
-break;\n
-case 201:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {\n
+case 200:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {\n
         if ($$[$0-1].charAt(0) === \'!\') {\n
           return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert();\n
         } else {\n
@@ -4169,36 +4235,86 @@ case 201:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {\n
         }\n
       }()));\n
 break;\n
-case 202:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0], $$[$0-1]));\n
+case 201:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0], $$[$0-1]));\n
 break;\n
-case 203:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]));\n
+case 202:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]));\n
 break;\n
-case 204:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0], $$[$0-2]));\n
+case 203:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0], $$[$0-2]));\n
 break;\n
-case 205:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Extends($$[$0-2], $$[$0]));\n
+case 204:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Extends($$[$0-2], $$[$0]));\n
 break;\n
 }\n
 },\n
-table: [{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[3]},{1:[2,2],6:[1,74]},{6:[1,75]},{1:[2,4],6:[2,4],26:[2,4],102:[2,4]},{4:77,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,76],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,7],6:[2,7],26:[2,7],102:[2,7],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,8],6:[2,8],26:[2,8],102:[2,8],103:90,104:[1,65],106:[1,66],109:91,110:[1,68],111:69,126:[1,89]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],49:[2,12],54:[2,12],57:[2,12],62:93,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],73:[2,12],74:[1,101],78:[2,12],81:92,84:[1,94],85:[2,108],86:[2,12],91:[2,12],93:[2,12],102:[2,12],104:[2,12],105:[2,12],106:[2,12],110:[2,12],118:[2,12],126:[2,12],128:[2,12],129:[2,12],132:[2,12],133:[2,12],134:[2,12],135:[2,12],136:[2,12],137:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],49:[2,13],54:[2,13],57:[2,13],62:103,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],73:[2,13],74:[1,101],78:[2,13],81:102,84:[1,94],85:[2,108],86:[2,13],91:[2,13],93:[2,13],102:[2,13],104:[2,13],105:[2,13],106:[2,13],110:[2,13],118:[2,13],126:[2,13],128:[2,13],129:[2,13],132:[2,13],133:[2,13],134:[2,13],135:[2,13],136:[2,13],137:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],49:[2,14],54:[2,14],57:[2,14],73:[2,14],78:[2,14],86:[2,14],91:[2,14],93:[2,14],102:[2,14],104:[2,14],105:[2,14],106:[2,14],110:[2,14],118:[2,14],126:[2,14],128:[2,14],129:[2,14],132:[2,14],133:[2,14],134:[2,14],135:[2,14],136:[2,14],137:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],49:[2,15],54:[2,15],57:[2,15],73:[2,15],78:[2,15],86:[2,15],91:[2,15],93:[2,15],102:[2,15],104:[2,15],105:[2,15],106:[2,15],110:[2,15],118:[2,15],126:[2,15],128:[2,15],129:[2,15],132:[2,15],133:[2,15],134:[2,15],135:[2,15],136:[2,15],137:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],49:[2,16],54:[2,16],57:[2,16],73:[2,16],78:[2,16],86:[2,16],91:[2,16],93:[2,16],102:[2,16],104:[2,16],105:[2,16],106:[2,16],110:[2,16],118:[2,16],126:[2,16],128:[2,16],129:[2,16],132:[2,16],133:[2,16],134:[2,16],135:[2,16],136:[2,16],137:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],49:[2,17],54:[2,17],57:[2,17],73:[2,17],78:[2,17],86:[2,17],91:[2,17],93:[2,17],102:[2,17],104:[2,17],105:[2,17],106:[2,17],110:[2,17],118:[2,17],126:[2,17],128:[2,17],129:[2,17],132:[2,17],133:[2,17],134:[2,17],135:[2,17],136:[2,17],137:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],49:[2,18],54:[2,18],57:[2,18],73:[2,18],78:[2,18],86:[2,18],91:[2,18],93:[2,18],102:[2,18],104:[2,18],105:[2,18],106:[2,18],110:[2,18],118:[2,18],126:[2,18],128:[2,18],129:[2,18],132:[2,18],133:[2,18],134:[2,18],135:[2,18],136:[2,18],137:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],49:[2,19],54:[2,19],57:[2,19],73:[2,19],78:[2,19],86:[2,19],91:[2,19],93:[2,19],102:[2,19],104:[2,19],105:[2,19],106:[2,19],110:[2,19],118:[2,19],126:[2,19],128:[2,19],129:[2,19],132:[2,19],133:[2,19],134:[2,19],135:[2,19],136:[2,19],137:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],49:[2,20],54:[2,20],57:[2,20],73:[2,20],78:[2,20],86:[2,20],91:[2,20],93:[2,20],102:[2,20],104:[2,20],105:[2,20],106:[2,20],110:[2,20],118:[2,20],126:[2,20],128:[2,20],129:[2,20],132:[2,20],133:[2,20],134:[2,20],135:[2,20],136:[2,20],137:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],49:[2,21],54:[2,21],57:[2,21],73:[2,21],78:[2,21],86:[2,21],91:[2,21],93:[2,21],102:[2,21],104:[2,21],105:[2,21],106:[2,21],110:[2,21],118:[2,21],126:[2,21],128:[2,21],129:[2,21],132:[2,21],133:[2,21],134:[2,21],135:[2,21],136:[2,21],137:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],49:[2,22],54:[2,22],57:[2,22],73:[2,22],78:[2,22],86:[2,22],91:[2,22],93:[2,22],102:[2,22],104:[2,22],105:[2,22],106:[2,22],110:[2,22],118:[2,22],126:[2,22],128:[2,22],129:[2,22],132:[2,22],133:[2,22],134:[2,22],135:[2,22],136:[2,22],137:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],49:[2,23],54:[2,23],57:[2,23],73:[2,23],78:[2,23],86:[2,23],91:[2,23],93:[2,23],102:[2,23],104:[2,23],105:[2,23],106:[2,23],110:[2,23],118:[2,23],126:[2,23],128:[2,23],129:[2,23],132:[2,23],133:[2,23],134:[2,23],135:[2,23],136:[2,23],137:[2,23]},{1:[2,9],6:[2,9],26:[2,9],102:[2,9],104:[2,9],106:[2,9],110:[2,9],126:[2,9]},{1:[2,10],6:[2,10],26:[2,10],102:[2,10],104:[2,10],106:[2,10],110:[2,10],126:[2,10]},{1:[2,11],6:[2,11],26:[2,11],102:[2,11],104:[2,11],106:[2,11],110:[2,11],126:[2,11]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],40:[1,104],49:[2,75],54:[2,75],57:[2,75],66:[2,75],67:[2,75],68:[2,75],69:[2,75],71:[2,75],73:[2,75],74:[2,75],78:[2,75],84:[2,75],85:[2,75],86:[2,75],91:[2,75],93:[2,75],102:[2,75],104:[2,75],105:[2,75],106:[2,75],110:[2,75],118:[2,75],126:[2,75],128:[2,75],129:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75],136:[2,75],137:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],49:[2,76],54:[2,76],57:[2,76],66:[2,76],67:[2,76],68:[2,76],69:[2,76],71:[2,76],73:[2,76],74:[2,76],78:[2,76],84:[2,76],85:[2,76],86:[2,76],91:[2,76],93:[2,76],102:[2,76],104:[2,76],105:[2,76],106:[2,76],110:[2,76],118:[2,76],126:[2,76],128:[2,76],129:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76],136:[2,76],137:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],49:[2,77],54:[2,77],57:[2,77],66:[2,77],67:[2,77],68:[2,77],69:[2,77],71:[2,77],73:[2,77],74:[2,77],78:[2,77],84:[2,77],85:[2,77],86:[2,77],91:[2,77],93:[2,77],102:[2,77],104:[2,77],105:[2,77],106:[2,77],110:[2,77],118:[2,77],126:[2,77],128:[2,77],129:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77],136:[2,77],137:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],49:[2,78],54:[2,78],57:[2,78],66:[2,78],67:[2,78],68:[2,78],69:[2,78],71:[2,78],73:[2,78],74:[2,78],78:[2,78],84:[2,78],85:[2,78],86:[2,78],91:[2,78],93:[2,78],102:[2,78],104:[2,78],105:[2,78],106:[2,78],110:[2,78],118:[2,78],126:[2,78],128:[2,78],129:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78],136:[2,78],137:[2,78]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],49:[2,79],54:[2,79],57:[2,79],66:[2,79],67:[2,79],68:[2,79],69:[2,79],71:[2,79],73:[2,79],74:[2,79],78:[2,79],84:[2,79],85:[2,79],86:[2,79],91:[2,79],93:[2,79],102:[2,79],104:[2,79],105:[2,79],106:[2,79],110:[2,79],118:[2,79],126:[2,79],128:[2,79],129:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79],136:[2,79],137:[2,79]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],49:[2,106],54:[2,106],57:[2,106],66:[2,106],67:[2,106],68:[2,106],69:[2,106],71:[2,106],73:[2,106],74:[2,106],78:[2,106],82:105,84:[2,106],85:[1,106],86:[2,106],91:[2,106],93:[2,106],102:[2,106],104:[2,106],105:[2,106],106:[2,106],110:[2,106],118:[2,106],126:[2,106],128:[2,106],129:[2,106],132:[2,106],133:[2,106],134:[2,106],135:[2,106],136:[2,106],137:[2,106]},{6:[2,55],25:[2,55],27:110,28:[1,73],44:111,48:107,49:[2,55],54:[2,55],55:108,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{5:116,25:[1,5]},{8:117,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:119,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:120,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{13:122,14:123,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,58:47,59:48,61:121,63:25,64:26,65:27,76:[1,70],83:[1,28],88:[1,58],89:[1,59],90:[1,57],101:[1,56]},{13:122,14:123,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,58:47,59:48,61:125,63:25,64:26,65:27,76:[1,70],83:[1,28],88:[1,58],89:[1,59],90:[1,57],101:[1,56]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],40:[2,72],49:[2,72],54:[2,72],57:[2,72],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,72],74:[2,72],78:[2,72],80:[1,129],84:[2,72],85:[2,72],86:[2,72],91:[2,72],93:[2,72],102:[2,72],104:[2,72],105:[2,72],106:[2,72],110:[2,72],118:[2,72],126:[2,72],128:[2,72],129:[2,72],130:[1,126],131:[1,127],132:[2,72],133:[2,72],134:[2,72],135:[2,72],136:[2,72],137:[2,72],138:[1,128]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],49:[2,183],54:[2,183],57:[2,183],73:[2,183],78:[2,183],86:[2,183],91:[2,183],93:[2,183],102:[2,183],104:[2,183],105:[2,183],106:[2,183],110:[2,183],118:[2,183],121:[1,130],126:[2,183],128:[2,183],129:[2,183],132:[2,183],133:[2,183],134:[2,183],135:[2,183],136:[2,183],137:[2,183]},{5:131,25:[1,5]},{5:132,25:[1,5]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],49:[2,150],54:[2,150],57:[2,150],73:[2,150],78:[2,150],86:[2,150],91:[2,150],93:[2,150],102:[2,150],104:[2,150],105:[2,150],106:[2,150],110:[2,150],118:[2,150],126:[2,150],128:[2,150],129:[2,150],132:[2,150],133:[2,150],134:[2,150],135:[2,150],136:[2,150],137:[2,150]},{5:133,25:[1,5]},{8:134,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,135],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,96],5:136,6:[2,96],13:122,14:123,25:[1,5],26:[2,96],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,49:[2,96],54:[2,96],57:[2,96],58:47,59:48,61:138,63:25,64:26,65:27,73:[2,96],76:[1,70],78:[2,96],80:[1,137],83:[1,28],86:[2,96],88:[1,58],89:[1,59],90:[1,57],91:[2,96],93:[2,96],101:[1,56],102:[2,96],104:[2,96],105:[2,96],106:[2,96],110:[2,96],118:[2,96],126:[2,96],128:[2,96],129:[2,96],132:[2,96],133:[2,96],134:[2,96],135:[2,96],136:[2,96],137:[2,96]},{8:139,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,47],6:[2,47],8:140,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,47],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],102:[2,47],103:39,104:[2,47],106:[2,47],107:40,108:[1,67],109:41,110:[2,47],111:69,119:[1,42],124:37,125:[1,64],126:[2,47],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],54:[2,48],78:[2,48],102:[2,48],104:[2,48],106:[2,48],110:[2,48],126:[2,48]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],40:[2,73],49:[2,73],54:[2,73],57:[2,73],66:[2,73],67:[2,73],68:[2,73],69:[2,73],71:[2,73],73:[2,73],74:[2,73],78:[2,73],84:[2,73],85:[2,73],86:[2,73],91:[2,73],93:[2,73],102:[2,73],104:[2,73],105:[2,73],106:[2,73],110:[2,73],118:[2,73],126:[2,73],128:[2,73],129:[2,73],132:[2,73],133:[2,73],134:[2,73],135:[2,73],136:[2,73],137:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],40:[2,74],49:[2,74],54:[2,74],57:[2,74],66:[2,74],67:[2,74],68:[2,74],69:[2,74],71:[2,74],73:[2,74],74:[2,74],78:[2,74],84:[2,74],85:[2,74],86:[2,74],91:[2,74],93:[2,74],102:[2,74],104:[2,74],105:[2,74],106:[2,74],110:[2,74],118:[2,74],126:[2,74],128:[2,74],129:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74],136:[2,74],137:[2,74]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],49:[2,29],54:[2,29],57:[2,29],66:[2,29],67:[2,29],68:[2,29],69:[2,29],71:[2,29],73:[2,29],74:[2,29],78:[2,29],84:[2,29],85:[2,29],86:[2,29],91:[2,29],93:[2,29],102:[2,29],104:[2,29],105:[2,29],106:[2,29],110:[2,29],118:[2,29],126:[2,29],128:[2,29],129:[2,29],132:[2,29],133:[2,29],134:[2,29],135:[2,29],136:[2,29],137:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],49:[2,30],54:[2,30],57:[2,30],66:[2,30],67:[2,30],68:[2,30],69:[2,30],71:[2,30],73:[2,30],74:[2,30],78:[2,30],84:[2,30],85:[2,30],86:[2,30],91:[2,30],93:[2,30],102:[2,30],104:[2,30],105:[2,30],106:[2,30],110:[2,30],118:[2,30],126:[2,30],128:[2,30],129:[2,30],132:[2,30],133:[2,30],134:[2,30],135:[2,30],136:[2,30],137:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],49:[2,31],54:[2,31],57:[2,31],66:[2,31],67:[2,31],68:[2,31],69:[2,31],71:[2,31],73:[2,31],74:[2,31],78:[2,31],84:[2,31],85:[2,31],86:[2,31],91:[2,31],93:[2,31],102:[2,31],104:[2,31],105:[2,31],106:[2,31],110:[2,31],118:[2,31],126:[2,31],128:[2,31],129:[2,31],132:[2,31],133:[2,31],134:[2,31],135:[2,31],136:[2,31],137:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],49:[2,32],54:[2,32],57:[2,32],66:[2,32],67:[2,32],68:[2,32],69:[2,32],71:[2,32],73:[2,32],74:[2,32],78:[2,32],84:[2,32],85:[2,32],86:[2,32],91:[2,32],93:[2,32],102:[2,32],104:[2,32],105:[2,32],106:[2,32],110:[2,32],118:[2,32],126:[2,32],128:[2,32],129:[2,32],132:[2,32],133:[2,32],134:[2,32],135:[2,32],136:[2,32],137:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],49:[2,33],54:[2,33],57:[2,33],66:[2,33],67:[2,33],68:[2,33],69:[2,33],71:[2,33],73:[2,33],74:[2,33],78:[2,33],84:[2,33],85:[2,33],86:[2,33],91:[2,33],93:[2,33],102:[2,33],104:[2,33],105:[2,33],106:[2,33],110:[2,33],118:[2,33],126:[2,33],128:[2,33],129:[2,33],132:[2,33],133:[2,33],134:[2,33],135:[2,33],136:[2,33],137:[2,33]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],49:[2,34],54:[2,34],57:[2,34],66:[2,34],67:[2,34],68:[2,34],69:[2,34],71:[2,34],73:[2,34],74:[2,34],78:[2,34],84:[2,34],85:[2,34],86:[2,34],91:[2,34],93:[2,34],102:[2,34],104:[2,34],105:[2,34],106:[2,34],110:[2,34],118:[2,34],126:[2,34],128:[2,34],129:[2,34],132:[2,34],133:[2,34],134:[2,34],135:[2,34],136:[2,34],137:[2,34]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],49:[2,35],54:[2,35],57:[2,35],66:[2,35],67:[2,35],68:[2,35],69:[2,35],71:[2,35],73:[2,35],74:[2,35],78:[2,35],84:[2,35],85:[2,35],86:[2,35],91:[2,35],93:[2,35],102:[2,35],104:[2,35],105:[2,35],106:[2,35],110:[2,35],118:[2,35],126:[2,35],128:[2,35],129:[2,35],132:[2,35],133:[2,35],134:[2,35],135:[2,35],136:[2,35],137:[2,35]},{4:141,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,142],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:143,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:145,88:[1,58],89:[1,59],90:[1,57],91:[1,144],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,112],6:[2,112],25:[2,112],26:[2,112],49:[2,112],54:[2,112],57:[2,112],66:[2,112],67:[2,112],68:[2,112],69:[2,112],71:[2,112],73:[2,112],74:[2,112],78:[2,112],84:[2,112],85:[2,112],86:[2,112],91:[2,112],93:[2,112],102:[2,112],104:[2,112],105:[2,112],106:[2,112],110:[2,112],118:[2,112],126:[2,112],128:[2,112],129:[2,112],132:[2,112],133:[2,112],134:[2,112],135:[2,112],136:[2,112],137:[2,112]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],27:149,28:[1,73],49:[2,113],54:[2,113],57:[2,113],66:[2,113],67:[2,113],68:[2,113],69:[2,113],71:[2,113],73:[2,113],74:[2,113],78:[2,113],84:[2,113],85:[2,113],86:[2,113],91:[2,113],93:[2,113],102:[2,113],104:[2,113],105:[2,113],106:[2,113],110:[2,113],118:[2,113],126:[2,113],128:[2,113],129:[2,113],132:[2,113],133:[2,113],134:[2,113],135:[2,113],136:[2,113],137:[2,113]},{25:[2,51]},{25:[2,52]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],40:[2,68],49:[2,68],54:[2,68],57:[2,68],66:[2,68],67:[2,68],68:[2,68],69:[2,68],71:[2,68],73:[2,68],74:[2,68],78:[2,68],80:[2,68],84:[2,68],85:[2,68],86:[2,68],91:[2,68],93:[2,68],102:[2,68],104:[2,68],105:[2,68],106:[2,68],110:[2,68],118:[2,68],126:[2,68],128:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[2,68],136:[2,68],137:[2,68],138:[2,68]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],40:[2,71],49:[2,71],54:[2,71],57:[2,71],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,71],74:[2,71],78:[2,71],80:[2,71],84:[2,71],85:[2,71],86:[2,71],91:[2,71],93:[2,71],102:[2,71],104:[2,71],105:[2,71],106:[2,71],110:[2,71],118:[2,71],126:[2,71],128:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71],135:[2,71],136:[2,71],137:[2,71],138:[2,71]},{8:150,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:151,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:152,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{5:153,8:154,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{27:159,28:[1,73],44:160,58:161,59:162,64:155,76:[1,70],89:[1,114],90:[1,57],113:156,114:[1,157],115:158},{112:163,116:[1,164],117:[1,165]},{6:[2,91],11:169,25:[2,91],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:167,42:168,44:172,46:[1,46],54:[2,91],77:166,78:[2,91],89:[1,114]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],43:[2,27],49:[2,27],54:[2,27],57:[2,27],66:[2,27],67:[2,27],68:[2,27],69:[2,27],71:[2,27],73:[2,27],74:[2,27],78:[2,27],84:[2,27],85:[2,27],86:[2,27],91:[2,27],93:[2,27],102:[2,27],104:[2,27],105:[2,27],106:[2,27],110:[2,27],118:[2,27],126:[2,27],128:[2,27],129:[2,27],132:[2,27],133:[2,27],134:[2,27],135:[2,27],136:[2,27],137:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],43:[2,28],49:[2,28],54:[2,28],57:[2,28],66:[2,28],67:[2,28],68:[2,28],69:[2,28],71:[2,28],73:[2,28],74:[2,28],78:[2,28],84:[2,28],85:[2,28],86:[2,28],91:[2,28],93:[2,28],102:[2,28],104:[2,28],105:[2,28],106:[2,28],110:[2,28],118:[2,28],126:[2,28],128:[2,28],129:[2,28],132:[2,28],133:[2,28],134:[2,28],135:[2,28],136:[2,28],137:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],40:[2,26],43:[2,26],49:[2,26],54:[2,26],57:[2,26],66:[2,26],67:[2,26],68:[2,26],69:[2,26],71:[2,26],73:[2,26],74:[2,26],78:[2,26],80:[2,26],84:[2,26],85:[2,26],86:[2,26],91:[2,26],93:[2,26],102:[2,26],104:[2,26],105:[2,26],106:[2,26],110:[2,26],116:[2,26],117:[2,26],118:[2,26],126:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26],136:[2,26],137:[2,26],138:[2,26]},{1:[2,6],6:[2,6],7:173,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],102:[2,6],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],49:[2,24],54:[2,24],57:[2,24],73:[2,24],78:[2,24],86:[2,24],91:[2,24],93:[2,24],98:[2,24],99:[2,24],102:[2,24],104:[2,24],105:[2,24],106:[2,24],110:[2,24],118:[2,24],121:[2,24],123:[2,24],126:[2,24],128:[2,24],129:[2,24],132:[2,24],133:[2,24],134:[2,24],135:[2,24],136:[2,24],137:[2,24]},{6:[1,74],26:[1,174]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],49:[2,194],54:[2,194],57:[2,194],73:[2,194],78:[2,194],86:[2,194],91:[2,194],93:[2,194],102:[2,194],104:[2,194],105:[2,194],106:[2,194],110:[2,194],118:[2,194],126:[2,194],128:[2,194],129:[2,194],132:[2,194],133:[2,194],134:[2,194],135:[2,194],136:[2,194],137:[2,194]},{8:175,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:176,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:177,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:178,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:179,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:180,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:181,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:182,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],49:[2,149],54:[2,149],57:[2,149],73:[2,149],78:[2,149],86:[2,149],91:[2,149],93:[2,149],102:[2,149],104:[2,149],105:[2,149],106:[2,149],110:[2,149],118:[2,149],126:[2,149],128:[2,149],129:[2,149],132:[2,149],133:[2,149],134:[2,149],135:[2,149],136:[2,149],137:[2,149]},{1:[2,154],6:[2,154],25:[2,154],26:[2,154],49:[2,154],54:[2,154],57:[2,154],73:[2,154],78:[2,154],86:[2,154],91:[2,154],93:[2,154],102:[2,154],104:[2,154],105:[2,154],106:[2,154],110:[2,154],118:[2,154],126:[2,154],128:[2,154],129:[2,154],132:[2,154],133:[2,154],134:[2,154],135:[2,154],136:[2,154],137:[2,154]},{8:183,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],49:[2,148],54:[2,148],57:[2,148],73:[2,148],78:[2,148],86:[2,148],91:[2,148],93:[2,148],102:[2,148],104:[2,148],105:[2,148],106:[2,148],110:[2,148],118:[2,148],126:[2,148],128:[2,148],129:[2,148],132:[2,148],133:[2,148],134:[2,148],135:[2,148],136:[2,148],137:[2,148]},{1:[2,153],6:[2,153],25:[2,153],26:[2,153],49:[2,153],54:[2,153],57:[2,153],73:[2,153],78:[2,153],86:[2,153],91:[2,153],93:[2,153],102:[2,153],104:[2,153],105:[2,153],106:[2,153],110:[2,153],118:[2,153],126:[2,153],128:[2,153],129:[2,153],132:[2,153],133:[2,153],134:[2,153],135:[2,153],136:[2,153],137:[2,153]},{82:184,85:[1,106]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],40:[2,69],49:[2,69],54:[2,69],57:[2,69],66:[2,69],67:[2,69],68:[2,69],69:[2,69],71:[2,69],73:[2,69],74:[2,69],78:[2,69],80:[2,69],84:[2,69],85:[2,69],86:[2,69],91:[2,69],93:[2,69],102:[2,69],104:[2,69],105:[2,69],106:[2,69],110:[2,69],118:[2,69],126:[2,69],128:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69],135:[2,69],136:[2,69],137:[2,69],138:[2,69]},{85:[2,109]},{27:185,28:[1,73]},{27:186,28:[1,73]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],27:187,28:[1,73],40:[2,84],49:[2,84],54:[2,84],57:[2,84],66:[2,84],67:[2,84],68:[2,84],69:[2,84],71:[2,84],73:[2,84],74:[2,84],78:[2,84],80:[2,84],84:[2,84],85:[2,84],86:[2,84],91:[2,84],93:[2,84],102:[2,84],104:[2,84],105:[2,84],106:[2,84],110:[2,84],118:[2,84],126:[2,84],128:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84],135:[2,84],136:[2,84],137:[2,84],138:[2,84]},{27:188,28:[1,73]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],40:[2,85],49:[2,85],54:[2,85],57:[2,85],66:[2,85],67:[2,85],68:[2,85],69:[2,85],71:[2,85],73:[2,85],74:[2,85],78:[2,85],80:[2,85],84:[2,85],85:[2,85],86:[2,85],91:[2,85],93:[2,85],102:[2,85],104:[2,85],105:[2,85],106:[2,85],110:[2,85],118:[2,85],126:[2,85],128:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85],135:[2,85],136:[2,85],137:[2,85],138:[2,85]},{8:190,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],57:[1,194],58:47,59:48,61:36,63:25,64:26,65:27,72:189,75:191,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],92:192,93:[1,193],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{70:195,71:[1,100],74:[1,101]},{82:196,85:[1,106]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],40:[2,70],49:[2,70],54:[2,70],57:[2,70],66:[2,70],67:[2,70],68:[2,70],69:[2,70],71:[2,70],73:[2,70],74:[2,70],78:[2,70],80:[2,70],84:[2,70],85:[2,70],86:[2,70],91:[2,70],93:[2,70],102:[2,70],104:[2,70],105:[2,70],106:[2,70],110:[2,70],118:[2,70],126:[2,70],128:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70],135:[2,70],136:[2,70],137:[2,70],138:[2,70]},{6:[1,198],8:197,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,199],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],49:[2,107],54:[2,107],57:[2,107],66:[2,107],67:[2,107],68:[2,107],69:[2,107],71:[2,107],73:[2,107],74:[2,107],78:[2,107],84:[2,107],85:[2,107],86:[2,107],91:[2,107],93:[2,107],102:[2,107],104:[2,107],105:[2,107],106:[2,107],110:[2,107],118:[2,107],126:[2,107],128:[2,107],129:[2,107],132:[2,107],133:[2,107],134:[2,107],135:[2,107],136:[2,107],137:[2,107]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],86:[1,200],87:201,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],49:[1,203],53:205,54:[1,204]},{6:[2,56],25:[2,56],26:[2,56],49:[2,56],54:[2,56]},{6:[2,60],25:[2,60],26:[2,60],40:[1,207],49:[2,60],54:[2,60],57:[1,206]},{6:[2,63],25:[2,63],26:[2,63],40:[2,63],49:[2,63],54:[2,63],57:[2,63]},{6:[2,64],25:[2,64],26:[2,64],40:[2,64],49:[2,64],54:[2,64],57:[2,64]},{6:[2,65],25:[2,65],26:[2,65],40:[2,65],49:[2,65],54:[2,65],57:[2,65]},{6:[2,66],25:[2,66],26:[2,66],40:[2,66],49:[2,66],54:[2,66],57:[2,66]},{27:149,28:[1,73]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:145,88:[1,58],89:[1,59],90:[1,57],91:[1,144],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,50],6:[2,50],25:[2,50],26:[2,50],49:[2,50],54:[2,50],57:[2,50],73:[2,50],78:[2,50],86:[2,50],91:[2,50],93:[2,50],102:[2,50],104:[2,50],105:[2,50],106:[2,50],110:[2,50],118:[2,50],126:[2,50],128:[2,50],129:[2,50],132:[2,50],133:[2,50],134:[2,50],135:[2,50],136:[2,50],137:[2,50]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],49:[2,187],54:[2,187],57:[2,187],73:[2,187],78:[2,187],86:[2,187],91:[2,187],93:[2,187],102:[2,187],103:87,104:[2,187],105:[2,187],106:[2,187],109:88,110:[2,187],111:69,118:[2,187],126:[2,187],128:[2,187],129:[2,187],132:[1,78],133:[2,187],134:[2,187],135:[2,187],136:[2,187],137:[2,187]},{103:90,104:[1,65],106:[1,66],109:91,110:[1,68],111:69,126:[1,89]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],49:[2,188],54:[2,188],57:[2,188],73:[2,188],78:[2,188],86:[2,188],91:[2,188],93:[2,188],102:[2,188],103:87,104:[2,188],105:[2,188],106:[2,188],109:88,110:[2,188],111:69,118:[2,188],126:[2,188],128:[2,188],129:[2,188],132:[1,78],133:[2,188],134:[2,188],135:[2,188],136:[2,188],137:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],49:[2,189],54:[2,189],57:[2,189],73:[2,189],78:[2,189],86:[2,189],91:[2,189],93:[2,189],102:[2,189],103:87,104:[2,189],105:[2,189],106:[2,189],109:88,110:[2,189],111:69,118:[2,189],126:[2,189],128:[2,189],129:[2,189],132:[1,78],133:[2,189],134:[2,189],135:[2,189],136:[2,189],137:[2,189]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],49:[2,190],54:[2,190],57:[2,190],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,190],74:[2,72],78:[2,190],84:[2,72],85:[2,72],86:[2,190],91:[2,190],93:[2,190],102:[2,190],104:[2,190],105:[2,190],106:[2,190],110:[2,190],118:[2,190],126:[2,190],128:[2,190],129:[2,190],132:[2,190],133:[2,190],134:[2,190],135:[2,190],136:[2,190],137:[2,190]},{62:93,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],74:[1,101],81:92,84:[1,94],85:[2,108]},{62:103,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],74:[1,101],81:102,84:[1,94],85:[2,108]},{66:[2,75],67:[2,75],68:[2,75],69:[2,75],71:[2,75],74:[2,75],84:[2,75],85:[2,75]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],49:[2,191],54:[2,191],57:[2,191],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,191],74:[2,72],78:[2,191],84:[2,72],85:[2,72],86:[2,191],91:[2,191],93:[2,191],102:[2,191],104:[2,191],105:[2,191],106:[2,191],110:[2,191],118:[2,191],126:[2,191],128:[2,191],129:[2,191],132:[2,191],133:[2,191],134:[2,191],135:[2,191],136:[2,191],137:[2,191]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],49:[2,192],54:[2,192],57:[2,192],73:[2,192],78:[2,192],86:[2,192],91:[2,192],93:[2,192],102:[2,192],104:[2,192],105:[2,192],106:[2,192],110:[2,192],118:[2,192],126:[2,192],128:[2,192],129:[2,192],132:[2,192],133:[2,192],134:[2,192],135:[2,192],136:[2,192],137:[2,192]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],49:[2,193],54:[2,193],57:[2,193],73:[2,193],78:[2,193],86:[2,193],91:[2,193],93:[2,193],102:[2,193],104:[2,193],105:[2,193],106:[2,193],110:[2,193],118:[2,193],126:[2,193],128:[2,193],129:[2,193],132:[2,193],133:[2,193],134:[2,193],135:[2,193],136:[2,193],137:[2,193]},{6:[1,210],8:208,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,209],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:211,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{5:212,25:[1,5],125:[1,213]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],49:[2,133],54:[2,133],57:[2,133],73:[2,133],78:[2,133],86:[2,133],91:[2,133],93:[2,133],97:214,98:[1,215],99:[1,216],102:[2,133],104:[2,133],105:[2,133],106:[2,133],110:[2,133],118:[2,133],126:[2,133],128:[2,133],129:[2,133],132:[2,133],133:[2,133],134:[2,133],135:[2,133],136:[2,133],137:[2,133]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],49:[2,147],54:[2,147],57:[2,147],73:[2,147],78:[2,147],86:[2,147],91:[2,147],93:[2,147],102:[2,147],104:[2,147],105:[2,147],106:[2,147],110:[2,147],118:[2,147],126:[2,147],128:[2,147],129:[2,147],132:[2,147],133:[2,147],134:[2,147],135:[2,147],136:[2,147],137:[2,147]},{1:[2,155],6:[2,155],25:[2,155],26:[2,155],49:[2,155],54:[2,155],57:[2,155],73:[2,155],78:[2,155],86:[2,155],91:[2,155],93:[2,155],102:[2,155],104:[2,155],105:[2,155],106:[2,155],110:[2,155],118:[2,155],126:[2,155],128:[2,155],129:[2,155],132:[2,155],133:[2,155],134:[2,155],135:[2,155],136:[2,155],137:[2,155]},{25:[1,217],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{120:218,122:219,123:[1,220]},{1:[2,97],6:[2,97],25:[2,97],26:[2,97],49:[2,97],54:[2,97],57:[2,97],73:[2,97],78:[2,97],86:[2,97],91:[2,97],93:[2,97],102:[2,97],104:[2,97],105:[2,97],106:[2,97],110:[2,97],118:[2,97],126:[2,97],128:[2,97],129:[2,97],132:[2,97],133:[2,97],134:[2,97],135:[2,97],136:[2,97],137:[2,97]},{8:221,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,100],5:222,6:[2,100],25:[1,5],26:[2,100],49:[2,100],54:[2,100],57:[2,100],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,100],74:[2,72],78:[2,100],80:[1,223],84:[2,72],85:[2,72],86:[2,100],91:[2,100],93:[2,100],102:[2,100],104:[2,100],105:[2,100],106:[2,100],110:[2,100],118:[2,100],126:[2,100],128:[2,100],129:[2,100],132:[2,100],133:[2,100],134:[2,100],135:[2,100],136:[2,100],137:[2,100]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],49:[2,140],54:[2,140],57:[2,140],73:[2,140],78:[2,140],86:[2,140],91:[2,140],93:[2,140],102:[2,140],103:87,104:[2,140],105:[2,140],106:[2,140],109:88,110:[2,140],111:69,118:[2,140],126:[2,140],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,46],6:[2,46],26:[2,46],102:[2,46],103:87,104:[2,46],106:[2,46],109:88,110:[2,46],111:69,126:[2,46],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,74],102:[1,224]},{4:225,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,129],25:[2,129],54:[2,129],57:[1,227],91:[2,129],92:226,93:[1,193],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,115],6:[2,115],25:[2,115],26:[2,115],40:[2,115],49:[2,115],54:[2,115],57:[2,115],66:[2,115],67:[2,115],68:[2,115],69:[2,115],71:[2,115],73:[2,115],74:[2,115],78:[2,115],84:[2,115],85:[2,115],86:[2,115],91:[2,115],93:[2,115],102:[2,115],104:[2,115],105:[2,115],106:[2,115],110:[2,115],116:[2,115],117:[2,115],118:[2,115],126:[2,115],128:[2,115],129:[2,115],132:[2,115],133:[2,115],134:[2,115],135:[2,115],136:[2,115],137:[2,115]},{6:[2,53],25:[2,53],53:228,54:[1,229],91:[2,53]},{6:[2,124],25:[2,124],26:[2,124],54:[2,124],86:[2,124],91:[2,124]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:230,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,130],25:[2,130],26:[2,130],54:[2,130],86:[2,130],91:[2,130]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],40:[2,114],43:[2,114],49:[2,114],54:[2,114],57:[2,114],66:[2,114],67:[2,114],68:[2,114],69:[2,114],71:[2,114],73:[2,114],74:[2,114],78:[2,114],80:[2,114],84:[2,114],85:[2,114],86:[2,114],91:[2,114],93:[2,114],102:[2,114],104:[2,114],105:[2,114],106:[2,114],110:[2,114],116:[2,114],117:[2,114],118:[2,114],126:[2,114],128:[2,114],129:[2,114],130:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114],135:[2,114],136:[2,114],137:[2,114],138:[2,114]},{5:231,25:[1,5],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],49:[2,143],54:[2,143],57:[2,143],73:[2,143],78:[2,143],86:[2,143],91:[2,143],93:[2,143],102:[2,143],103:87,104:[1,65],105:[1,232],106:[1,66],109:88,110:[1,68],111:69,118:[2,143],126:[2,143],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],49:[2,145],54:[2,145],57:[2,145],73:[2,145],78:[2,145],86:[2,145],91:[2,145],93:[2,145],102:[2,145],103:87,104:[1,65],105:[1,233],106:[1,66],109:88,110:[1,68],111:69,118:[2,145],126:[2,145],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,151],6:[2,151],25:[2,151],26:[2,151],49:[2,151],54:[2,151],57:[2,151],73:[2,151],78:[2,151],86:[2,151],91:[2,151],93:[2,151],102:[2,151],104:[2,151],105:[2,151],106:[2,151],110:[2,151],118:[2,151],126:[2,151],128:[2,151],129:[2,151],132:[2,151],133:[2,151],134:[2,151],135:[2,151],136:[2,151],137:[2,151]},{1:[2,152],6:[2,152],25:[2,152],26:[2,152],49:[2,152],54:[2,152],57:[2,152],73:[2,152],78:[2,152],86:[2,152],91:[2,152],93:[2,152],102:[2,152],103:87,104:[1,65],105:[2,152],106:[1,66],109:88,110:[1,68],111:69,118:[2,152],126:[2,152],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,156],6:[2,156],25:[2,156],26:[2,156],49:[2,156],54:[2,156],57:[2,156],73:[2,156],78:[2,156],86:[2,156],91:[2,156],93:[2,156],102:[2,156],104:[2,156],105:[2,156],106:[2,156],110:[2,156],118:[2,156],126:[2,156],128:[2,156],129:[2,156],132:[2,156],133:[2,156],134:[2,156],135:[2,156],136:[2,156],137:[2,156]},{116:[2,158],117:[2,158]},{27:159,28:[1,73],44:160,58:161,59:162,76:[1,70],89:[1,114],90:[1,115],113:234,115:158},{54:[1,235],116:[2,164],117:[2,164]},{54:[2,160],116:[2,160],117:[2,160]},{54:[2,161],116:[2,161],117:[2,161]},{54:[2,162],116:[2,162],117:[2,162]},{54:[2,163],116:[2,163],117:[2,163]},{1:[2,157],6:[2,157],25:[2,157],26:[2,157],49:[2,157],54:[2,157],57:[2,157],73:[2,157],78:[2,157],86:[2,157],91:[2,157],93:[2,157],102:[2,157],104:[2,157],105:[2,157],106:[2,157],110:[2,157],118:[2,157],126:[2,157],128:[2,157],129:[2,157],132:[2,157],133:[2,157],134:[2,157],135:[2,157],136:[2,157],137:[2,157]},{8:236,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:237,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],53:238,54:[1,239],78:[2,53]},{6:[2,92],25:[2,92],26:[2,92],54:[2,92],78:[2,92]},{6:[2,39],25:[2,39],26:[2,39],43:[1,240],54:[2,39],78:[2,39]},{6:[2,42],25:[2,42],26:[2,42],54:[2,42],78:[2,42]},{6:[2,43],25:[2,43],26:[2,43],43:[2,43],54:[2,43],78:[2,43]},{6:[2,44],25:[2,44],26:[2,44],43:[2,44],54:[2,44],78:[2,44]},{6:[2,45],25:[2,45],26:[2,45],43:[2,45],54:[2,45],78:[2,45]},{1:[2,5],6:[2,5],26:[2,5],102:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],49:[2,25],54:[2,25],57:[2,25],73:[2,25],78:[2,25],86:[2,25],91:[2,25],93:[2,25],98:[2,25],99:[2,25],102:[2,25],104:[2,25],105:[2,25],106:[2,25],110:[2,25],118:[2,25],121:[2,25],123:[2,25],126:[2,25],128:[2,25],129:[2,25],132:[2,25],133:[2,25],134:[2,25],135:[2,25],136:[2,25],137:[2,25]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],49:[2,195],54:[2,195],57:[2,195],73:[2,195],78:[2,195],86:[2,195],91:[2,195],93:[2,195],102:[2,195],103:87,104:[2,195],105:[2,195],106:[2,195],109:88,110:[2,195],111:69,118:[2,195],126:[2,195],128:[2,195],129:[2,195],132:[1,78],133:[1,81],134:[2,195],135:[2,195],136:[2,195],137:[2,195]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],49:[2,196],54:[2,196],57:[2,196],73:[2,196],78:[2,196],86:[2,196],91:[2,196],93:[2,196],102:[2,196],103:87,104:[2,196],105:[2,196],106:[2,196],109:88,110:[2,196],111:69,118:[2,196],126:[2,196],128:[2,196],129:[2,196],132:[1,78],133:[1,81],134:[2,196],135:[2,196],136:[2,196],137:[2,196]},{1:[2,197],6:[2,197],25:[2,197],26:[2,197],49:[2,197],54:[2,197],57:[2,197],73:[2,197],78:[2,197],86:[2,197],91:[2,197],93:[2,197],102:[2,197],103:87,104:[2,197],105:[2,197],106:[2,197],109:88,110:[2,197],111:69,118:[2,197],126:[2,197],128:[2,197],129:[2,197],132:[1,78],133:[2,197],134:[2,197],135:[2,197],136:[2,197],137:[2,197]},{1:[2,198],6:[2,198],25:[2,198],26:[2,198],49:[2,198],54:[2,198],57:[2,198],73:[2,198],78:[2,198],86:[2,198],91:[2,198],93:[2,198],102:[2,198],103:87,104:[2,198],105:[2,198],106:[2,198],109:88,110:[2,198],111:69,118:[2,198],126:[2,198],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[2,198],135:[2,198],136:[2,198],137:[2,198]},{1:[2,199],6:[2,199],25:[2,199],26:[2,199],49:[2,199],54:[2,199],57:[2,199],73:[2,199],78:[2,199],86:[2,199],91:[2,199],93:[2,199],102:[2,199],103:87,104:[2,199],105:[2,199],106:[2,199],109:88,110:[2,199],111:69,118:[2,199],126:[2,199],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[2,199],136:[2,199],137:[1,85]},{1:[2,200],6:[2,200],25:[2,200],26:[2,200],49:[2,200],54:[2,200],57:[2,200],73:[2,200],78:[2,200],86:[2,200],91:[2,200],93:[2,200],102:[2,200],103:87,104:[2,200],105:[2,200],106:[2,200],109:88,110:[2,200],111:69,118:[2,200],126:[2,200],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[2,200],137:[1,85]},{1:[2,201],6:[2,201],25:[2,201],26:[2,201],49:[2,201],54:[2,201],57:[2,201],73:[2,201],78:[2,201],86:[2,201],91:[2,201],93:[2,201],102:[2,201],103:87,104:[2,201],105:[2,201],106:[2,201],109:88,110:[2,201],111:69,118:[2,201],126:[2,201],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[2,201],136:[2,201],137:[2,201]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],49:[2,186],54:[2,186],57:[2,186],73:[2,186],78:[2,186],86:[2,186],91:[2,186],93:[2,186],102:[2,186],103:87,104:[1,65],105:[2,186],106:[1,66],109:88,110:[1,68],111:69,118:[2,186],126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],49:[2,185],54:[2,185],57:[2,185],73:[2,185],78:[2,185],86:[2,185],91:[2,185],93:[2,185],102:[2,185],103:87,104:[1,65],105:[2,185],106:[1,66],109:88,110:[1,68],111:69,118:[2,185],126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],49:[2,104],54:[2,104],57:[2,104],66:[2,104],67:[2,104],68:[2,104],69:[2,104],71:[2,104],73:[2,104],74:[2,104],78:[2,104],84:[2,104],85:[2,104],86:[2,104],91:[2,104],93:[2,104],102:[2,104],104:[2,104],105:[2,104],106:[2,104],110:[2,104],118:[2,104],126:[2,104],128:[2,104],129:[2,104],132:[2,104],133:[2,104],134:[2,104],135:[2,104],136:[2,104],137:[2,104]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],40:[2,80],49:[2,80],54:[2,80],57:[2,80],66:[2,80],67:[2,80],68:[2,80],69:[2,80],71:[2,80],73:[2,80],74:[2,80],78:[2,80],80:[2,80],84:[2,80],85:[2,80],86:[2,80],91:[2,80],93:[2,80],102:[2,80],104:[2,80],105:[2,80],106:[2,80],110:[2,80],118:[2,80],126:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80],136:[2,80],137:[2,80],138:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],40:[2,81],49:[2,81],54:[2,81],57:[2,81],66:[2,81],67:[2,81],68:[2,81],69:[2,81],71:[2,81],73:[2,81],74:[2,81],78:[2,81],80:[2,81],84:[2,81],85:[2,81],86:[2,81],91:[2,81],93:[2,81],102:[2,81],104:[2,81],105:[2,81],106:[2,81],110:[2,81],118:[2,81],126:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81],136:[2,81],137:[2,81],138:[2,81]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],40:[2,82],49:[2,82],54:[2,82],57:[2,82],66:[2,82],67:[2,82],68:[2,82],69:[2,82],71:[2,82],73:[2,82],74:[2,82],78:[2,82],80:[2,82],84:[2,82],85:[2,82],86:[2,82],91:[2,82],93:[2,82],102:[2,82],104:[2,82],105:[2,82],106:[2,82],110:[2,82],118:[2,82],126:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82],136:[2,82],137:[2,82],138:[2,82]},{1:[2,83],6:[2,83],25:[2,83],26:[2,83],40:[2,83],49:[2,83],54:[2,83],57:[2,83],66:[2,83],67:[2,83],68:[2,83],69:[2,83],71:[2,83],73:[2,83],74:[2,83],78:[2,83],80:[2,83],84:[2,83],85:[2,83],86:[2,83],91:[2,83],93:[2,83],102:[2,83],104:[2,83],105:[2,83],106:[2,83],110:[2,83],118:[2,83],126:[2,83],128:[2,83],129:[2,83],130:[2,83],131:[2,83],132:[2,83],133:[2,83],134:[2,83],135:[2,83],136:[2,83],137:[2,83],138:[2,83]},{73:[1,241]},{57:[1,194],73:[2,88],92:242,93:[1,193],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{73:[2,89]},{8:243,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,73:[2,123],76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{12:[2,117],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],73:[2,117],76:[2,117],79:[2,117],83:[2,117],88:[2,117],89:[2,117],90:[2,117],96:[2,117],100:[2,117],101:[2,117],104:[2,117],106:[2,117],108:[2,117],110:[2,117],119:[2,117],125:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117],131:[2,117]},{12:[2,118],28:[2,118],30:[2,118],31:[2,118],33:[2,118],34:[2,118],35:[2,118],36:[2,118],37:[2,118],38:[2,118],45:[2,118],46:[2,118],47:[2,118],51:[2,118],52:[2,118],73:[2,118],76:[2,118],79:[2,118],83:[2,118],88:[2,118],89:[2,118],90:[2,118],96:[2,118],100:[2,118],101:[2,118],104:[2,118],106:[2,118],108:[2,118],110:[2,118],119:[2,118],125:[2,118],127:[2,118],128:[2,118],129:[2,118],130:[2,118],131:[2,118]},{1:[2,87],6:[2,87],25:[2,87],26:[2,87],40:[2,87],49:[2,87],54:[2,87],57:[2,87],66:[2,87],67:[2,87],68:[2,87],69:[2,87],71:[2,87],73:[2,87],74:[2,87],78:[2,87],80:[2,87],84:[2,87],85:[2,87],86:[2,87],91:[2,87],93:[2,87],102:[2,87],104:[2,87],105:[2,87],106:[2,87],110:[2,87],118:[2,87],126:[2,87],128:[2,87],129:[2,87],130:[2,87],131:[2,87],132:[2,87],133:[2,87],134:[2,87],135:[2,87],136:[2,87],137:[2,87],138:[2,87]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],49:[2,105],54:[2,105],57:[2,105],66:[2,105],67:[2,105],68:[2,105],69:[2,105],71:[2,105],73:[2,105],74:[2,105],78:[2,105],84:[2,105],85:[2,105],86:[2,105],91:[2,105],93:[2,105],102:[2,105],104:[2,105],105:[2,105],106:[2,105],110:[2,105],118:[2,105],126:[2,105],128:[2,105],129:[2,105],132:[2,105],133:[2,105],134:[2,105],135:[2,105],136:[2,105],137:[2,105]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],49:[2,36],54:[2,36],57:[2,36],73:[2,36],78:[2,36],86:[2,36],91:[2,36],93:[2,36],102:[2,36],103:87,104:[2,36],105:[2,36],106:[2,36],109:88,110:[2,36],111:69,118:[2,36],126:[2,36],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:244,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:245,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],49:[2,110],54:[2,110],57:[2,110],66:[2,110],67:[2,110],68:[2,110],69:[2,110],71:[2,110],73:[2,110],74:[2,110],78:[2,110],84:[2,110],85:[2,110],86:[2,110],91:[2,110],93:[2,110],102:[2,110],104:[2,110],105:[2,110],106:[2,110],110:[2,110],118:[2,110],126:[2,110],128:[2,110],129:[2,110],132:[2,110],133:[2,110],134:[2,110],135:[2,110],136:[2,110],137:[2,110]},{6:[2,53],25:[2,53],53:246,54:[1,229],86:[2,53]},{6:[2,129],25:[2,129],26:[2,129],54:[2,129],57:[1,247],86:[2,129],91:[2,129],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{50:248,51:[1,60],52:[1,61]},{6:[2,54],25:[2,54],26:[2,54],27:110,28:[1,73],44:111,55:249,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[1,250],25:[1,251]},{6:[2,61],25:[2,61],26:[2,61],49:[2,61],54:[2,61]},{8:252,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,202],6:[2,202],25:[2,202],26:[2,202],49:[2,202],54:[2,202],57:[2,202],73:[2,202],78:[2,202],86:[2,202],91:[2,202],93:[2,202],102:[2,202],103:87,104:[2,202],105:[2,202],106:[2,202],109:88,110:[2,202],111:69,118:[2,202],126:[2,202],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:253,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:254,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,205],6:[2,205],25:[2,205],26:[2,205],49:[2,205],54:[2,205],57:[2,205],73:[2,205],78:[2,205],86:[2,205],91:[2,205],93:[2,205],102:[2,205],103:87,104:[2,205],105:[2,205],106:[2,205],109:88,110:[2,205],111:69,118:[2,205],126:[2,205],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],49:[2,184],54:[2,184],57:[2,184],73:[2,184],78:[2,184],86:[2,184],91:[2,184],93:[2,184],102:[2,184],104:[2,184],105:[2,184],106:[2,184],110:[2,184],118:[2,184],126:[2,184],128:[2,184],129:[2,184],132:[2,184],133:[2,184],134:[2,184],135:[2,184],136:[2,184],137:[2,184]},{8:255,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],49:[2,134],54:[2,134],57:[2,134],73:[2,134],78:[2,134],86:[2,134],91:[2,134],93:[2,134],98:[1,256],102:[2,134],104:[2,134],105:[2,134],106:[2,134],110:[2,134],118:[2,134],126:[2,134],128:[2,134],129:[2,134],132:[2,134],133:[2,134],134:[2,134],135:[2,134],136:[2,134],137:[2,134]},{5:257,25:[1,5]},{5:260,25:[1,5],27:258,28:[1,73],59:259,76:[1,70]},{120:261,122:219,123:[1,220]},{26:[1,262],121:[1,263],122:264,123:[1,220]},{26:[2,177],121:[2,177],123:[2,177]},{8:266,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],95:265,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,98],5:267,6:[2,98],25:[1,5],26:[2,98],49:[2,98],54:[2,98],57:[2,98],73:[2,98],78:[2,98],86:[2,98],91:[2,98],93:[2,98],102:[2,98],103:87,104:[1,65],105:[2,98],106:[1,66],109:88,110:[1,68],111:69,118:[2,98],126:[2,98],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],49:[2,101],54:[2,101],57:[2,101],73:[2,101],78:[2,101],86:[2,101],91:[2,101],93:[2,101],102:[2,101],104:[2,101],105:[2,101],106:[2,101],110:[2,101],118:[2,101],126:[2,101],128:[2,101],129:[2,101],132:[2,101],133:[2,101],134:[2,101],135:[2,101],136:[2,101],137:[2,101]},{8:268,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],49:[2,141],54:[2,141],57:[2,141],66:[2,141],67:[2,141],68:[2,141],69:[2,141],71:[2,141],73:[2,141],74:[2,141],78:[2,141],84:[2,141],85:[2,141],86:[2,141],91:[2,141],93:[2,141],102:[2,141],104:[2,141],105:[2,141],106:[2,141],110:[2,141],118:[2,141],126:[2,141],128:[2,141],129:[2,141],132:[2,141],133:[2,141],134:[2,141],135:[2,141],136:[2,141],137:[2,141]},{6:[1,74],26:[1,269]},{8:270,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,67],12:[2,118],25:[2,67],28:[2,118],30:[2,118],31:[2,118],33:[2,118],34:[2,118],35:[2,118],36:[2,118],37:[2,118],38:[2,118],45:[2,118],46:[2,118],47:[2,118],51:[2,118],52:[2,118],54:[2,67],76:[2,118],79:[2,118],83:[2,118],88:[2,118],89:[2,118],90:[2,118],91:[2,67],96:[2,118],100:[2,118],101:[2,118],104:[2,118],106:[2,118],108:[2,118],110:[2,118],119:[2,118],125:[2,118],127:[2,118],128:[2,118],129:[2,118],130:[2,118],131:[2,118]},{6:[1,272],25:[1,273],91:[1,271]},{6:[2,54],8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,54],26:[2,54],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],86:[2,54],88:[1,58],89:[1,59],90:[1,57],91:[2,54],94:274,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],26:[2,53],53:275,54:[1,229]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],49:[2,181],54:[2,181],57:[2,181],73:[2,181],78:[2,181],86:[2,181],91:[2,181],93:[2,181],102:[2,181],104:[2,181],105:[2,181],106:[2,181],110:[2,181],118:[2,181],121:[2,181],126:[2,181],128:[2,181],129:[2,181],132:[2,181],133:[2,181],134:[2,181],135:[2,181],136:[2,181],137:[2,181]},{8:276,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:277,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{116:[2,159],117:[2,159]},{27:159,28:[1,73],44:160,58:161,59:162,76:[1,70],89:[1,114],90:[1,115],115:278},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],49:[2,166],54:[2,166],57:[2,166],73:[2,166],78:[2,166],86:[2,166],91:[2,166],93:[2,166],102:[2,166],103:87,104:[2,166],105:[1,279],106:[2,166],109:88,110:[2,166],111:69,118:[1,280],126:[2,166],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],49:[2,167],54:[2,167],57:[2,167],73:[2,167],78:[2,167],86:[2,167],91:[2,167],93:[2,167],102:[2,167],103:87,104:[2,167],105:[1,281],106:[2,167],109:88,110:[2,167],111:69,118:[2,167],126:[2,167],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,283],25:[1,284],78:[1,282]},{6:[2,54],11:169,25:[2,54],26:[2,54],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:285,42:168,44:172,46:[1,46],78:[2,54],89:[1,114]},{8:286,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,287],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,86],6:[2,86],25:[2,86],26:[2,86],40:[2,86],49:[2,86],54:[2,86],57:[2,86],66:[2,86],67:[2,86],68:[2,86],69:[2,86],71:[2,86],73:[2,86],74:[2,86],78:[2,86],80:[2,86],84:[2,86],85:[2,86],86:[2,86],91:[2,86],93:[2,86],102:[2,86],104:[2,86],105:[2,86],106:[2,86],110:[2,86],118:[2,86],126:[2,86],128:[2,86],129:[2,86],130:[2,86],131:[2,86],132:[2,86],133:[2,86],134:[2,86],135:[2,86],136:[2,86],137:[2,86],138:[2,86]},{8:288,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,73:[2,121],76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{73:[2,122],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,37],6:[2,37],25:[2,37],26:[2,37],49:[2,37],54:[2,37],57:[2,37],73:[2,37],78:[2,37],86:[2,37],91:[2,37],93:[2,37],102:[2,37],103:87,104:[2,37],105:[2,37],106:[2,37],109:88,110:[2,37],111:69,118:[2,37],126:[2,37],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{26:[1,289],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,272],25:[1,273],86:[1,290]},{6:[2,67],25:[2,67],26:[2,67],54:[2,67],86:[2,67],91:[2,67]},{5:291,25:[1,5]},{6:[2,57],25:[2,57],26:[2,57],49:[2,57],54:[2,57]},{27:110,28:[1,73],44:111,55:292,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[2,55],25:[2,55],26:[2,55],27:110,28:[1,73],44:111,48:293,54:[2,55],55:108,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[2,62],25:[2,62],26:[2,62],49:[2,62],54:[2,62],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{26:[1,294],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,204],6:[2,204],25:[2,204],26:[2,204],49:[2,204],54:[2,204],57:[2,204],73:[2,204],78:[2,204],86:[2,204],91:[2,204],93:[2,204],102:[2,204],103:87,104:[2,204],105:[2,204],106:[2,204],109:88,110:[2,204],111:69,118:[2,204],126:[2,204],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{5:295,25:[1,5],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{5:296,25:[1,5]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],49:[2,135],54:[2,135],57:[2,135],73:[2,135],78:[2,135],86:[2,135],91:[2,135],93:[2,135],102:[2,135],104:[2,135],105:[2,135],106:[2,135],110:[2,135],118:[2,135],126:[2,135],128:[2,135],129:[2,135],132:[2,135],133:[2,135],134:[2,135],135:[2,135],136:[2,135],137:[2,135]},{5:297,25:[1,5]},{5:298,25:[1,5]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],49:[2,139],54:[2,139],57:[2,139],73:[2,139],78:[2,139],86:[2,139],91:[2,139],93:[2,139],98:[2,139],102:[2,139],104:[2,139],105:[2,139],106:[2,139],110:[2,139],118:[2,139],126:[2,139],128:[2,139],129:[2,139],132:[2,139],133:[2,139],134:[2,139],135:[2,139],136:[2,139],137:[2,139]},{26:[1,299],121:[1,300],122:264,123:[1,220]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],49:[2,175],54:[2,175],57:[2,175],73:[2,175],78:[2,175],86:[2,175],91:[2,175],93:[2,175],102:[2,175],104:[2,175],105:[2,175],106:[2,175],110:[2,175],118:[2,175],126:[2,175],128:[2,175],129:[2,175],132:[2,175],133:[2,175],134:[2,175],135:[2,175],136:[2,175],137:[2,175]},{5:301,25:[1,5]},{26:[2,178],121:[2,178],123:[2,178]},{5:302,25:[1,5],54:[1,303]},{25:[2,131],54:[2,131],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],49:[2,99],54:[2,99],57:[2,99],73:[2,99],78:[2,99],86:[2,99],91:[2,99],93:[2,99],102:[2,99],104:[2,99],105:[2,99],106:[2,99],110:[2,99],118:[2,99],126:[2,99],128:[2,99],129:[2,99],132:[2,99],133:[2,99],134:[2,99],135:[2,99],136:[2,99],137:[2,99]},{1:[2,102],5:304,6:[2,102],25:[1,5],26:[2,102],49:[2,102],54:[2,102],57:[2,102],73:[2,102],78:[2,102],86:[2,102],91:[2,102],93:[2,102],102:[2,102],103:87,104:[1,65],105:[2,102],106:[1,66],109:88,110:[1,68],111:69,118:[2,102],126:[2,102],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{102:[1,305]},{91:[1,306],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,116],6:[2,116],25:[2,116],26:[2,116],40:[2,116],49:[2,116],54:[2,116],57:[2,116],66:[2,116],67:[2,116],68:[2,116],69:[2,116],71:[2,116],73:[2,116],74:[2,116],78:[2,116],84:[2,116],85:[2,116],86:[2,116],91:[2,116],93:[2,116],102:[2,116],104:[2,116],105:[2,116],106:[2,116],110:[2,116],116:[2,116],117:[2,116],118:[2,116],126:[2,116],128:[2,116],129:[2,116],132:[2,116],133:[2,116],134:[2,116],135:[2,116],136:[2,116],137:[2,116]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],94:307,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:308,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,125],25:[2,125],26:[2,125],54:[2,125],86:[2,125],91:[2,125]},{6:[1,272],25:[1,273],26:[1,309]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],49:[2,144],54:[2,144],57:[2,144],73:[2,144],78:[2,144],86:[2,144],91:[2,144],93:[2,144],102:[2,144],103:87,104:[1,65],105:[2,144],106:[1,66],109:88,110:[1,68],111:69,118:[2,144],126:[2,144],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],49:[2,146],54:[2,146],57:[2,146],73:[2,146],78:[2,146],86:[2,146],91:[2,146],93:[2,146],102:[2,146],103:87,104:[1,65],105:[2,146],106:[1,66],109:88,110:[1,68],111:69,118:[2,146],126:[2,146],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{116:[2,165],117:[2,165]},{8:310,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:311,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:312,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,90],6:[2,90],25:[2,90],26:[2,90],40:[2,90],49:[2,90],54:[2,90],57:[2,90],66:[2,90],67:[2,90],68:[2,90],69:[2,90],71:[2,90],73:[2,90],74:[2,90],78:[2,90],84:[2,90],85:[2,90],86:[2,90],91:[2,90],93:[2,90],102:[2,90],104:[2,90],105:[2,90],106:[2,90],110:[2,90],116:[2,90],117:[2,90],118:[2,90],126:[2,90],128:[2,90],129:[2,90],132:[2,90],133:[2,90],134:[2,90],135:[2,90],136:[2,90],137:[2,90]},{11:169,27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:313,42:168,44:172,46:[1,46],89:[1,114]},{6:[2,91],11:169,25:[2,91],26:[2,91],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:167,42:168,44:172,46:[1,46],54:[2,91],77:314,89:[1,114]},{6:[2,93],25:[2,93],26:[2,93],54:[2,93],78:[2,93]},{6:[2,40],25:[2,40],26:[2,40],54:[2,40],78:[2,40],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:315,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{73:[2,120],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,38],6:[2,38],25:[2,38],26:[2,38],49:[2,38],54:[2,38],57:[2,38],73:[2,38],78:[2,38],86:[2,38],91:[2,38],93:[2,38],102:[2,38],104:[2,38],105:[2,38],106:[2,38],110:[2,38],118:[2,38],126:[2,38],128:[2,38],129:[2,38],132:[2,38],133:[2,38],134:[2,38],135:[2,38],136:[2,38],137:[2,38]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],49:[2,111],54:[2,111],57:[2,111],66:[2,111],67:[2,111],68:[2,111],69:[2,111],71:[2,111],73:[2,111],74:[2,111],78:[2,111],84:[2,111],85:[2,111],86:[2,111],91:[2,111],93:[2,111],102:[2,111],104:[2,111],105:[2,111],106:[2,111],110:[2,111],118:[2,111],126:[2,111],128:[2,111],129:[2,111],132:[2,111],133:[2,111],134:[2,111],135:[2,111],136:[2,111],137:[2,111]},{1:[2,49],6:[2,49],25:[2,49],26:[2,49],49:[2,49],54:[2,49],57:[2,49],73:[2,49],78:[2,49],86:[2,49],91:[2,49],93:[2,49],102:[2,49],104:[2,49],105:[2,49],106:[2,49],110:[2,49],118:[2,49],126:[2,49],128:[2,49],129:[2,49],132:[2,49],133:[2,49],134:[2,49],135:[2,49],136:[2,49],137:[2,49]},{6:[2,58],25:[2,58],26:[2,58],49:[2,58],54:[2,58]},{6:[2,53],25:[2,53],26:[2,53],53:316,54:[1,204]},{1:[2,203],6:[2,203],25:[2,203],26:[2,203],49:[2,203],54:[2,203],57:[2,203],73:[2,203],78:[2,203],86:[2,203],91:[2,203],93:[2,203],102:[2,203],104:[2,203],105:[2,203],106:[2,203],110:[2,203],118:[2,203],126:[2,203],128:[2,203],129:[2,203],132:[2,203],133:[2,203],134:[2,203],135:[2,203],136:[2,203],137:[2,203]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],49:[2,182],54:[2,182],57:[2,182],73:[2,182],78:[2,182],86:[2,182],91:[2,182],93:[2,182],102:[2,182],104:[2,182],105:[2,182],106:[2,182],110:[2,182],118:[2,182],121:[2,182],126:[2,182],128:[2,182],129:[2,182],132:[2,182],133:[2,182],134:[2,182],135:[2,182],136:[2,182],137:[2,182]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],49:[2,136],54:[2,136],57:[2,136],73:[2,136],78:[2,136],86:[2,136],91:[2,136],93:[2,136],102:[2,136],104:[2,136],105:[2,136],106:[2,136],110:[2,136],118:[2,136],126:[2,136],128:[2,136],129:[2,136],132:[2,136],133:[2,136],134:[2,136],135:[2,136],136:[2,136],137:[2,136]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],49:[2,137],54:[2,137],57:[2,137],73:[2,137],78:[2,137],86:[2,137],91:[2,137],93:[2,137],98:[2,137],102:[2,137],104:[2,137],105:[2,137],106:[2,137],110:[2,137],118:[2,137],126:[2,137],128:[2,137],129:[2,137],132:[2,137],133:[2,137],134:[2,137],135:[2,137],136:[2,137],137:[2,137]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],49:[2,138],54:[2,138],57:[2,138],73:[2,138],78:[2,138],86:[2,138],91:[2,138],93:[2,138],98:[2,138],102:[2,138],104:[2,138],105:[2,138],106:[2,138],110:[2,138],118:[2,138],126:[2,138],128:[2,138],129:[2,138],132:[2,138],133:[2,138],134:[2,138],135:[2,138],136:[2,138],137:[2,138]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],49:[2,173],54:[2,173],57:[2,173],73:[2,173],78:[2,173],86:[2,173],91:[2,173],93:[2,173],102:[2,173],104:[2,173],105:[2,173],106:[2,173],110:[2,173],118:[2,173],126:[2,173],128:[2,173],129:[2,173],132:[2,173],133:[2,173],134:[2,173],135:[2,173],136:[2,173],137:[2,173]},{5:317,25:[1,5]},{26:[1,318]},{6:[1,319],26:[2,179],121:[2,179],123:[2,179]},{8:320,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,103],6:[2,103],25:[2,103],26:[2,103],49:[2,103],54:[2,103],57:[2,103],73:[2,103],78:[2,103],86:[2,103],91:[2,103],93:[2,103],102:[2,103],104:[2,103],105:[2,103],106:[2,103],110:[2,103],118:[2,103],126:[2,103],128:[2,103],129:[2,103],132:[2,103],133:[2,103],134:[2,103],135:[2,103],136:[2,103],137:[2,103]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],49:[2,142],54:[2,142],57:[2,142],66:[2,142],67:[2,142],68:[2,142],69:[2,142],71:[2,142],73:[2,142],74:[2,142],78:[2,142],84:[2,142],85:[2,142],86:[2,142],91:[2,142],93:[2,142],102:[2,142],104:[2,142],105:[2,142],106:[2,142],110:[2,142],118:[2,142],126:[2,142],128:[2,142],129:[2,142],132:[2,142],133:[2,142],134:[2,142],135:[2,142],136:[2,142],137:[2,142]},{1:[2,119],6:[2,119],25:[2,119],26:[2,119],49:[2,119],54:[2,119],57:[2,119],66:[2,119],67:[2,119],68:[2,119],69:[2,119],71:[2,119],73:[2,119],74:[2,119],78:[2,119],84:[2,119],85:[2,119],86:[2,119],91:[2,119],93:[2,119],102:[2,119],104:[2,119],105:[2,119],106:[2,119],110:[2,119],118:[2,119],126:[2,119],128:[2,119],129:[2,119],132:[2,119],133:[2,119],134:[2,119],135:[2,119],136:[2,119],137:[2,119]},{6:[2,126],25:[2,126],26:[2,126],54:[2,126],86:[2,126],91:[2,126]},{6:[2,53],25:[2,53],26:[2,53],53:321,54:[1,229]},{6:[2,127],25:[2,127],26:[2,127],54:[2,127],86:[2,127],91:[2,127]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],49:[2,168],54:[2,168],57:[2,168],73:[2,168],78:[2,168],86:[2,168],91:[2,168],93:[2,168],102:[2,168],103:87,104:[2,168],105:[2,168],106:[2,168],109:88,110:[2,168],111:69,118:[1,322],126:[2,168],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,170],6:[2,170],25:[2,170],26:[2,170],49:[2,170],54:[2,170],57:[2,170],73:[2,170],78:[2,170],86:[2,170],91:[2,170],93:[2,170],102:[2,170],103:87,104:[2,170],105:[1,323],106:[2,170],109:88,110:[2,170],111:69,118:[2,170],126:[2,170],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,169],6:[2,169],25:[2,169],26:[2,169],49:[2,169],54:[2,169],57:[2,169],73:[2,169],78:[2,169],86:[2,169],91:[2,169],93:[2,169],102:[2,169],103:87,104:[2,169],105:[2,169],106:[2,169],109:88,110:[2,169],111:69,118:[2,169],126:[2,169],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[2,94],25:[2,94],26:[2,94],54:[2,94],78:[2,94]},{6:[2,53],25:[2,53],26:[2,53],53:324,54:[1,239]},{26:[1,325],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,250],25:[1,251],26:[1,326]},{26:[1,327]},{1:[2,176],6:[2,176],25:[2,176],26:[2,176],49:[2,176],54:[2,176],57:[2,176],73:[2,176],78:[2,176],86:[2,176],91:[2,176],93:[2,176],102:[2,176],104:[2,176],105:[2,176],106:[2,176],110:[2,176],118:[2,176],126:[2,176],128:[2,176],129:[2,176],132:[2,176],133:[2,176],134:[2,176],135:[2,176],136:[2,176],137:[2,176]},{26:[2,180],121:[2,180],123:[2,180]},{25:[2,132],54:[2,132],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,272],25:[1,273],26:[1,328]},{8:329,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:330,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[1,283],25:[1,284],26:[1,331]},{6:[2,41],25:[2,41],26:[2,41],54:[2,41],78:[2,41]},{6:[2,59],25:[2,59],26:[2,59],49:[2,59],54:[2,59]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],49:[2,174],54:[2,174],57:[2,174],73:[2,174],78:[2,174],86:[2,174],91:[2,174],93:[2,174],102:[2,174],104:[2,174],105:[2,174],106:[2,174],110:[2,174],118:[2,174],126:[2,174],128:[2,174],129:[2,174],132:[2,174],133:[2,174],134:[2,174],135:[2,174],136:[2,174],137:[2,174]},{6:[2,128],25:[2,128],26:[2,128],54:[2,128],86:[2,128],91:[2,128]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],49:[2,171],54:[2,171],57:[2,171],73:[2,171],78:[2,171],86:[2,171],91:[2,171],93:[2,171],102:[2,171],103:87,104:[2,171],105:[2,171],106:[2,171],109:88,110:[2,171],111:69,118:[2,171],126:[2,171],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],49:[2,172],54:[2,172],57:[2,172],73:[2,172],78:[2,172],86:[2,172],91:[2,172],93:[2,172],102:[2,172],103:87,104:[2,172],105:[2,172],106:[2,172],109:88,110:[2,172],111:69,118:[2,172],126:[2,172],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[2,95],25:[2,95],26:[2,95],54:[2,95],78:[2,95]}],\n
-defaultActions: {60:[2,51],61:[2,52],75:[2,3],94:[2,109],191:[2,89]},\n
+table: [{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[3]},{1:[2,2],6:[1,72]},{1:[2,3],6:[2,3],26:[2,3],102:[2,3]},{1:[2,6],6:[2,6],26:[2,6],102:[2,6],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,7],6:[2,7],26:[2,7],102:[2,7],103:85,104:[1,63],106:[1,64],109:86,110:[1,66],111:67,126:[1,84]},{1:[2,11],6:[2,11],25:[2,11],26:[2,11],49:[2,11],54:[2,11],57:[2,11],62:88,66:[1,90],67:[1,91],68:[1,92],69:[1,93],70:94,71:[1,95],73:[2,11],74:[1,96],78:[2,11],81:87,84:[1,89],85:[2,107],86:[2,11],91:[2,11],93:[2,11],102:[2,11],104:[2,11],105:[2,11],106:[2,11],110:[2,11],118:[2,11],126:[2,11],128:[2,11],129:[2,11],132:[2,11],133:[2,11],134:[2,11],135:[2,11],136:[2,11],137:[2,11]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],49:[2,12],54:[2,12],57:[2,12],62:98,66:[1,90],67:[1,91],68:[1,92],69:[1,93],70:94,71:[1,95],73:[2,12],74:[1,96],78:[2,12],81:97,84:[1,89],85:[2,107],86:[2,12],91:[2,12],93:[2,12],102:[2,12],104:[2,12],105:[2,12],106:[2,12],110:[2,12],118:[2,12],126:[2,12],128:[2,12],129:[2,12],132:[2,12],133:[2,12],134:[2,12],135:[2,12],136:[2,12],137:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],49:[2,13],54:[2,13],57:[2,13],73:[2,13],78:[2,13],86:[2,13],91:[2,13],93:[2,13],102:[2,13],104:[2,13],105:[2,13],106:[2,13],110:[2,13],118:[2,13],126:[2,13],128:[2,13],129:[2,13],132:[2,13],133:[2,13],134:[2,13],135:[2,13],136:[2,13],137:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],49:[2,14],54:[2,14],57:[2,14],73:[2,14],78:[2,14],86:[2,14],91:[2,14],93:[2,14],102:[2,14],104:[2,14],105:[2,14],106:[2,14],110:[2,14],118:[2,14],126:[2,14],128:[2,14],129:[2,14],132:[2,14],133:[2,14],134:[2,14],135:[2,14],136:[2,14],137:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],49:[2,15],54:[2,15],57:[2,15],73:[2,15],78:[2,15],86:[2,15],91:[2,15],93:[2,15],102:[2,15],104:[2,15],105:[2,15],106:[2,15],110:[2,15],118:[2,15],126:[2,15],128:[2,15],129:[2,15],132:[2,15],133:[2,15],134:[2,15],135:[2,15],136:[2,15],137:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],49:[2,16],54:[2,16],57:[2,16],73:[2,16],78:[2,16],86:[2,16],91:[2,16],93:[2,16],102:[2,16],104:[2,16],105:[2,16],106:[2,16],110:[2,16],118:[2,16],126:[2,16],128:[2,16],129:[2,16],132:[2,16],133:[2,16],134:[2,16],135:[2,16],136:[2,16],137:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],49:[2,17],54:[2,17],57:[2,17],73:[2,17],78:[2,17],86:[2,17],91:[2,17],93:[2,17],102:[2,17],104:[2,17],105:[2,17],106:[2,17],110:[2,17],118:[2,17],126:[2,17],128:[2,17],129:[2,17],132:[2,17],133:[2,17],134:[2,17],
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>135:[2,17],136:[2,17],137:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],49:[2,18],54:[2,18],57:[2,18],73:[2,18],78:[2,18],86:[2,18],91:[2,18],93:[2,18],102:[2,18],104:[2,18],105:[2,18],106:[2,18],110:[2,18],118:[2,18],126:[2,18],128:[2,18],129:[2,18],132:[2,18],133:[2,18],134:[2,18],135:[2,18],136:[2,18],137:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],49:[2,19],54:[2,19],57:[2,19],73:[2,19],78:[2,19],86:[2,19],91:[2,19],93:[2,19],102:[2,19],104:[2,19],105:[2,19],106:[2,19],110:[2,19],118:[2,19],126:[2,19],128:[2,19],129:[2,19],132:[2,19],133:[2,19],134:[2,19],135:[2,19],136:[2,19],137:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],49:[2,20],54:[2,20],57:[2,20],73:[2,20],78:[2,20],86:[2,20],91:[2,20],93:[2,20],102:[2,20],104:[2,20],105:[2,20],106:[2,20],110:[2,20],118:[2,20],126:[2,20],128:[2,20],129:[2,20],132:[2,20],133:[2,20],134:[2,20],135:[2,20],136:[2,20],137:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],49:[2,21],54:[2,21],57:[2,21],73:[2,21],78:[2,21],86:[2,21],91:[2,21],93:[2,21],102:[2,21],104:[2,21],105:[2,21],106:[2,21],110:[2,21],118:[2,21],126:[2,21],128:[2,21],129:[2,21],132:[2,21],133:[2,21],134:[2,21],135:[2,21],136:[2,21],137:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],49:[2,22],54:[2,22],57:[2,22],73:[2,22],78:[2,22],86:[2,22],91:[2,22],93:[2,22],102:[2,22],104:[2,22],105:[2,22],106:[2,22],110:[2,22],118:[2,22],126:[2,22],128:[2,22],129:[2,22],132:[2,22],133:[2,22],134:[2,22],135:[2,22],136:[2,22],137:[2,22]},{1:[2,8],6:[2,8],26:[2,8],102:[2,8],104:[2,8],106:[2,8],110:[2,8],126:[2,8]},{1:[2,9],6:[2,9],26:[2,9],102:[2,9],104:[2,9],106:[2,9],110:[2,9],126:[2,9]},{1:[2,10],6:[2,10],26:[2,10],102:[2,10],104:[2,10],106:[2,10],110:[2,10],126:[2,10]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],40:[1,99],49:[2,74],54:[2,74],57:[2,74],66:[2,74],67:[2,74],68:[2,74],69:[2,74],71:[2,74],73:[2,74],74:[2,74],78:[2,74],84:[2,74],85:[2,74],86:[2,74],91:[2,74],93:[2,74],102:[2,74],104:[2,74],105:[2,74],106:[2,74],110:[2,74],118:[2,74],126:[2,74],128:[2,74],129:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74],136:[2,74],137:[2,74]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],49:[2,75],54:[2,75],57:[2,75],66:[2,75],67:[2,75],68:[2,75],69:[2,75],71:[2,75],73:[2,75],74:[2,75],78:[2,75],84:[2,75],85:[2,75],86:[2,75],91:[2,75],93:[2,75],102:[2,75],104:[2,75],105:[2,75],106:[2,75],110:[2,75],118:[2,75],126:[2,75],128:[2,75],129:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75],136:[2,75],137:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],49:[2,76],54:[2,76],57:[2,76],66:[2,76],67:[2,76],68:[2,76],69:[2,76],71:[2,76],73:[2,76],74:[2,76],78:[2,76],84:[2,76],85:[2,76],86:[2,76],91:[2,76],93:[2,76],102:[2,76],104:[2,76],105:[2,76],106:[2,76],110:[2,76],118:[2,76],126:[2,76],128:[2,76],129:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76],136:[2,76],137:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],49:[2,77],54:[2,77],57:[2,77],66:[2,77],67:[2,77],68:[2,77],69:[2,77],71:[2,77],73:[2,77],74:[2,77],78:[2,77],84:[2,77],85:[2,77],86:[2,77],91:[2,77],93:[2,77],102:[2,77],104:[2,77],105:[2,77],106:[2,77],110:[2,77],118:[2,77],126:[2,77],128:[2,77],129:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77],136:[2,77],137:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],49:[2,78],54:[2,78],57:[2,78],66:[2,78],67:[2,78],68:[2,78],69:[2,78],71:[2,78],73:[2,78],74:[2,78],78:[2,78],84:[2,78],85:[2,78],86:[2,78],91:[2,78],93:[2,78],102:[2,78],104:[2,78],105:[2,78],106:[2,78],110:[2,78],118:[2,78],126:[2,78],128:[2,78],129:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78],136:[2,78],137:[2,78]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],49:[2,105],54:[2,105],57:[2,105],66:[2,105],67:[2,105],68:[2,105],69:[2,105],71:[2,105],73:[2,105],74:[2,105],78:[2,105],82:100,84:[2,105],85:[1,101],86:[2,105],91:[2,105],93:[2,105],102:[2,105],104:[2,105],105:[2,105],106:[2,105],110:[2,105],118:[2,105],126:[2,105],128:[2,105],129:[2,105],132:[2,105],133:[2,105],134:[2,105],135:[2,105],136:[2,105],137:[2,105]},{6:[2,54],25:[2,54],27:105,28:[1,71],44:106,48:102,49:[2,54],54:[2,54],55:103,56:104,58:107,59:108,76:[1,68],89:[1,109],90:[1,110]},{24:111,25:[1,112]},{7:113,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:115,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:116,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{12:118,13:119,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:120,44:61,58:45,59:46,61:117,63:23,64:24,65:25,76:[1,68],83:[1,26],88:[1,56],89:[1,57],90:[1,55],101:[1,54]},{12:118,13:119,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:120,44:61,58:45,59:46,61:121,63:23,64:24,65:25,76:[1,68],83:[1,26],88:[1,56],89:[1,57],90:[1,55],101:[1,54]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],40:[2,71],49:[2,71],54:[2,71],57:[2,71],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,71],74:[2,71],78:[2,71],80:[1,125],84:[2,71],85:[2,71],86:[2,71],91:[2,71],93:[2,71],102:[2,71],104:[2,71],105:[2,71],106:[2,71],110:[2,71],118:[2,71],126:[2,71],128:[2,71],129:[2,71],130:[1,122],131:[1,123],132:[2,71],133:[2,71],134:[2,71],135:[2,71],136:[2,71],137:[2,71],138:[1,124]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],49:[2,182],54:[2,182],57:[2,182],73:[2,182],78:[2,182],86:[2,182],91:[2,182],93:[2,182],102:[2,182],104:[2,182],105:[2,182],106:[2,182],110:[2,182],118:[2,182],121:[1,126],126:[2,182],128:[2,182],129:[2,182],132:[2,182],133:[2,182],134:[2,182],135:[2,182],136:[2,182],137:[2,182]},{24:127,25:[1,112]},{24:128,25:[1,112]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],49:[2,149],54:[2,149],57:[2,149],73:[2,149],78:[2,149],86:[2,149],91:[2,149],93:[2,149],102:[2,149],104:[2,149],105:[2,149],106:[2,149],110:[2,149],118:[2,149],126:[2,149],128:[2,149],129:[2,149],132:[2,149],133:[2,149],134:[2,149],135:[2,149],136:[2,149],137:[2,149]},{24:129,25:[1,112]},{7:130,8:114,9:18,10:19,11:[1,20],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,131],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,95],6:[2,95],12:118,13:119,24:132,25:[1,112],26:[2,95],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:120,44:61,49:[2,95],54:[2,95],57:[2,95],58:45,59:46,61:134,63:23,64:24,65:25,73:[2,95],76:[1,68],78:[2,95],80:[1,133],83:[1,26],86:[2,95],88:[1,56],89:[1,57],90:[1,55],91:[2,95],93:[2,95],101:[1,54],102:[2,95],104:[2,95],105:[2,95],106:[2,95],110:[2,95],118:[2,95],126:[2,95],128:[2,95],129:[2,95],132:[2,95],133:[2,95],134:[2,95],135:[2,95],136:[2,95],137:[2,95]},{7:135,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,46],6:[2,46],7:136,8:114,9:18,10:19,11:[1,20],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:[2,46],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],102:[2,46],103:37,104:[2,46],106:[2,46],107:38,108:[1,65],109:39,110:[2,46],111:67,119:[1,40],124:35,125:[1,62],126:[2,46],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,47],6:[2,47],25:[2,47],26:[2,47],54:[2,47],78:[2,47],102:[2,47],104:[2,47],106:[2,47],110:[2,47],126:[2,47]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],40:[2,72],49:[2,72],54:[2,72],57:[2,72],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,72],74:[2,72],78:[2,72],84:[2,72],85:[2,72],86:[2,72],91:[2,72],93:[2,72],102:[2,72],104:[2,72],105:[2,72],106:[2,72],110:[2,72],118:[2,72],126:[2,72],128:[2,72],129:[2,72],132:[2,72],133:[2,72],134:[2,72],135:[2,72],136:[2,72],137:[2,72]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],40:[2,73],49:[2,73],54:[2,73],57:[2,73],66:[2,73],67:[2,73],68:[2,73],69:[2,73],71:[2,73],73:[2,73],74:[2,73],78:[2,73],84:[2,73],85:[2,73],86:[2,73],91:[2,73],93:[2,73],102:[2,73],104:[2,73],105:[2,73],106:[2,73],110:[2,73],118:[2,73],126:[2,73],128:[2,73],129:[2,73],132:[2,73],133:[2,73],134:[2,73],135:[2,73],136:[2,73],137:[2,73]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],49:[2,28],54:[2,28],57:[2,28],66:[2,28],67:[2,28],68:[2,28],69:[2,28],71:[2,28],73:[2,28],74:[2,28],78:[2,28],84:[2,28],85:[2,28],86:[2,28],91:[2,28],93:[2,28],102:[2,28],104:[2,28],105:[2,28],106:[2,28],110:[2,28],118:[2,28],126:[2,28],128:[2,28],129:[2,28],132:[2,28],133:[2,28],134:[2,28],135:[2,28],136:[2,28],137:[2,28]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],49:[2,29],54:[2,29],57:[2,29],66:[2,29],67:[2,29],68:[2,29],69:[2,29],71:[2,29],73:[2,29],74:[2,29],78:[2,29],84:[2,29],85:[2,29],86:[2,29],91:[2,29],93:[2,29],102:[2,29],104:[2,29],105:[2,29],106:[2,29],110:[2,29],118:[2,29],126:[2,29],128:[2,29],129:[2,29],132:[2,29],133:[2,29],134:[2,29],135:[2,29],136:[2,29],137:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],49:[2,30],54:[2,30],57:[2,30],66:[2,30],67:[2,30],68:[2,30],69:[2,30],71:[2,30],73:[2,30],74:[2,30],78:[2,30],84:[2,30],85:[2,30],86:[2,30],91:[2,30],93:[2,30],102:[2,30],104:[2,30],105:[2,30],106:[2,30],110:[2,30],118:[2,30],126:[2,30],128:[2,30],129:[2,30],132:[2,30],133:[2,30],134:[2,30],135:[2,30],136:[2,30],137:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],49:[2,31],54:[2,31],57:[2,31],66:[2,31],67:[2,31],68:[2,31],69:[2,31],71:[2,31],73:[2,31],74:[2,31],78:[2,31],84:[2,31],85:[2,31],86:[2,31],91:[2,31],93:[2,31],102:[2,31],104:[2,31],105:[2,31],106:[2,31],110:[2,31],118:[2,31],126:[2,31],128:[2,31],129:[2,31],132:[2,31],133:[2,31],134:[2,31],135:[2,31],136:[2,31],137:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],49:[2,32],54:[2,32],57:[2,32],66:[2,32],67:[2,32],68:[2,32],69:[2,32],71:[2,32],73:[2,32],74:[2,32],78:[2,32],84:[2,32],85:[2,32],86:[2,32],91:[2,32],93:[2,32],102:[2,32],104:[2,32],105:[2,32],106:[2,32],110:[2,32],118:[2,32],126:[2,32],128:[2,32],129:[2,32],132:[2,32],133:[2,32],134:[2,32],135:[2,32],136:[2,32],137:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],49:[2,33],54:[2,33],57:[2,33],66:[2,33],67:[2,33],68:[2,33],69:[2,33],71:[2,33],73:[2,33],74:[2,33],78:[2,33],84:[2,33],85:[2,33],86:[2,33],91:[2,33],93:[2,33],102:[2,33],104:[2,33],105:[2,33],106:[2,33],110:[2,33],118:[2,33],126:[2,33],128:[2,33],129:[2,33],132:[2,33],133:[2,33],134:[2,33],135:[2,33],136:[2,33],137:[2,33]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],49:[2,34],54:[2,34],57:[2,34],66:[2,34],67:[2,34],68:[2,34],69:[2,34],71:[2,34],73:[2,34],74:[2,34],78:[2,34],84:[2,34],85:[2,34],86:[2,34],91:[2,34],93:[2,34],102:[2,34],104:[2,34],105:[2,34],106:[2,34],110:[2,34],118:[2,34],126:[2,34],128:[2,34],129:[2,34],132:[2,34],133:[2,34],134:[2,34],135:[2,34],136:[2,34],137:[2,34]},{4:137,5:3,7:4,8:5,9:18,10:19,11:[1,20],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,138],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:139,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],87:141,88:[1,56],89:[1,57],90:[1,55],91:[1,140],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],49:[2,111],54:[2,111],57:[2,111],66:[2,111],67:[2,111],68:[2,111],69:[2,111],71:[2,111],73:[2,111],74:[2,111],78:[2,111],84:[2,111],85:[2,111],86:[2,111],91:[2,111],93:[2,111],102:[2,111],104:[2,111],105:[2,111],106:[2,111],110:[2,111],118:[2,111],126:[2,111],128:[2,111],129:[2,111],132:[2,111],133:[2,111],134:[2,111],135:[2,111],136:[2,111],137:[2,111]},{1:[2,112],6:[2,112],25:[2,112],26:[2,112],27:145,28:[1,71],49:[2,112],54:[2,112],57:[2,112],66:[2,112],67:[2,112],68:[2,112],69:[2,112],71:[2,112],73:[2,112],74:[2,112],78:[2,112],84:[2,112],85:[2,112],86:[2,112],91:[2,112],93:[2,112],102:[2,112],104:[2,112],105:[2,112],106:[2,112],110:[2,112],118:[2,112],126:[2,112],128:[2,112],129:[2,112],132:[2,112],133:[2,112],134:[2,112],135:[2,112],136:[2,112],137:[2,112]},{25:[2,50]},{25:[2,51]},{1:[2,67],6:[2,67],25:[2,67],26:[2,67],40:[2,67],49:[2,67],54:[2,67],57:[2,67],66:[2,67],67:[2,67],68:[2,67],69:[2,67],71:[2,67],73:[2,67],74:[2,67],78:[2,67],80:[2,67],84:[2,67],85:[2,67],86:[2,67],91:[2,67],93:[2,67],102:[2,67],104:[2,67],105:[2,67],106:[2,67],110:[2,67],118:[2,67],126:[2,67],128:[2,67],129:[2,67],130:[2,67],131:[2,67],132:[2,67],133:[2,67],134:[2,67],135:[2,67],136:[2,67],137:[2,67],138:[2,67]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],40:[2,70],49:[2,70],54:[2,70],57:[2,70],66:[2,70],67:[2,70],68:[2,70],69:[2,70],71:[2,70],73:[2,70],74:[2,70],78:[2,70],80:[2,70],84:[2,70],85:[2,70],86:[2,70],91:[2,70],93:[2,70],102:[2,70],104:[2,70],105:[2,70],106:[2,70],110:[2,70],118:[2,70],126:[2,70],128:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70],135:[2,70],136:[2,70],137:[2,70],138:[2,70]},{7:146,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:147,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:148,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:150,8:114,9:18,10:19,11:[1,20],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:149,25:[1,112],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{27:155,28:[1,71],44:156,58:157,59:158,64:151,76:[1,68],89:[1,109],90:[1,55],113:152,114:[1,153],115:154},{112:159,116:[1,160],117:[1,161]},{6:[2,90],10:165,25:[2,90],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],41:163,42:164,44:168,46:[1,44],54:[2,90],77:162,78:[2,90],89:[1,109]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],43:[2,26],49:[2,26],54:[2,26],57:[2,26],66:[2,26],67:[2,26],68:[2,26],69:[2,26],71:[2,26],73:[2,26],74:[2,26],78:[2,26],84:[2,26],85:[2,26],86:[2,26],91:[2,26],93:[2,26],102:[2,26],104:[2,26],105:[2,26],106:[2,26],110:[2,26],118:[2,26],126:[2,26],128:[2,26],129:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26],136:[2,26],137:[2,26]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],43:[2,27],49:[2,27],54:[2,27],57:[2,27],66:[2,27],67:[2,27],68:[2,27],69:[2,27],71:[2,27],73:[2,27],74:[2,27],78:[2,27],84:[2,27],85:[2,27],86:[2,27],91:[2,27],93:[2,27],102:[2,27],104:[2,27],105:[2,27],106:[2,27],110:[2,27],118:[2,27],126:[2,27],128:[2,27],129:[2,27],132:[2,27],133:[2,27],134:[2,27],135:[2,27],136:[2,27],137:[2,27]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],40:[2,25],43:[2,25],49:[2,25],54:[2,25],57:[2,25],66:[2,25],67:[2,25],68:[2,25],69:[2,25],71:[2,25],73:[2,25],74:[2,25],78:[2,25],80:[2,25],84:[2,25],85:[2,25],86:[2,25],91:[2,25],93:[2,25],102:[2,25],104:[2,25],105:[2,25],106:[2,25],110:[2,25],116:[2,25],117:[2,25],118:[2,25],126:[2,25],128:[2,25],129:[2,25],130:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25],135:[2,25],136:[2,25],137:[2,25],138:[2,25]},{1:[2,5],5:169,6:[2,5],7:4,8:5,9:18,10:19,11:[1,20],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:[2,5],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],102:[2,5],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],49:[2,193],54:[2,193],57:[2,193],73:[2,193],78:[2,193],86:[2,193],91:[2,193],93:[2,193],102:[2,193],104:[2,193],105:[2,193],106:[2,193],110:[2,193],118:[2,193],126:[2,193],128:[2,193],129:[2,193],132:[2,193],133:[2,193],134:[2,193],135:[2,193],136:[2,193],137:[2,193]},{7:170,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:171,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:172,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:173,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:174,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:175,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:176,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:177,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],49:[2,148],54:[2,148],57:[2,148],73:[2,148],78:[2,148],86:[2,148],91:[2,148],93:[2,148],102:[2,148],104:[2,148],105:[2,148],106:[2,148],110:[2,148],118:[2,148],126:[2,148],128:[2,148],129:[2,148],132:[2,148],133:[2,148],134:[2,148],135:[2,148],136:[2,148],137:[2,148]},{1:[2,153],6:[2,153],25:[2,153],26:[2,153],49:[2,153],54:[2,153],57:[2,153],73:[2,153],78:[2,153],86:[2,153],91:[2,153],93:[2,153],102:[2,153],104:[2,153],105:[2,153],106:[2,153],110:[2,153],118:[2,153],126:[2,153],128:[2,153],129:[2,153],132:[2,153],133:[2,153],134:[2,153],135:[2,153],136:[2,153],137:[2,153]},{7:178,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],49:[2,147],54:[2,147],57:[2,147],73:[2,147],78:[2,147],86:[2,147],91:[2,147],93:[2,147],102:[2,147],104:[2,147],105:[2,147],106:[2,147],110:[2,147],118:[2,147],126:[2,147],128:[2,147],129:[2,147],132:[2,147],133:[2,147],134:[2,147],135:[2,147],136:[2,147],137:[2,147]},{1:[2,152],6:[2,152],25:[2,152],26:[2,152],49:[2,152],54:[2,152],57:[2,152],73:[2,152],78:[2,152],86:[2,152],91:[2,152],93:[2,152],102:[2,152],104:[2,152],105:[2,152],106:[2,152],110:[2,152],118:[2,152],126:[2,152],128:[2,152],129:[2,152],132:[2,152],133:[2,152],134:[2,152],135:[2,152],136:[2,152],137:[2,152]},{82:179,85:[1,101]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],40:[2,68],49:[2,68],54:[2,68],57:[2,68],66:[2,68],67:[2,68],68:[2,68],69:[2,68],71:[2,68],73:[2,68],74:[2,68],78:[2,68],80:[2,68],84:[2,68],85:[2,68],86:[2,68],91:[2,68],93:[2,68],102:[2,68],104:[2,68],105:[2,68],106:[2,68],110:[2,68],118:[2,68],126:[2,68],128:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[2,68],136:[2,68],137:[2,68],138:[2,68]},{85:[2,108]},{27:180,28:[1,71]},{27:181,28:[1,71]},{1:[2,83],6:[2,83],25:[2,83],26:[2,83],27:182,28:[1,71],40:[2,83],49:[2,83],54:[2,83],57:[2,83],66:[2,83],67:[2,83],68:[2,83],69:[2,83],71:[2,83],73:[2,83],74:[2,83],78:[2,83],80:[2,83],84:[2,83],85:[2,83],86:[2,83],91:[2,83],93:[2,83],102:[2,83],104:[2,83],105:[2,83],106:[2,83],110:[2,83],118:[2,83],126:[2,83],128:[2,83],129:[2,83],130:[2,83],131:[2,83],132:[2,83],133:[2,83],134:[2,83],135:[2,83],136:[2,83],137:[2,83],138:[2,83]},{27:183,28:[1,71]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],40:[2,84],49:[2,84],54:[2,84],57:[2,84],66:[2,84],67:[2,84],68:[2,84],69:[2,84],71:[2,84],73:[2,84],74:[2,84],78:[2,84],80:[2,84],84:[2,84],85:[2,84],86:[2,84],91:[2,84],93:[2,84],102:[2,84],104:[2,84],105:[2,84],106:[2,84],110:[2,84],118:[2,84],126:[2,84],128:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84],135:[2,84],136:[2,84],137:[2,84],138:[2,84]},{7:185,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],57:[1,189],58:45,59:46,61:34,63:23,64:24,65:25,72:184,75:186,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],92:187,93:[1,188],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{70:190,71:[1,95],74:[1,96]},{82:191,85:[1,101]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],40:[2,69],49:[2,69],54:[2,69],57:[2,69],66:[2,69],67:[2,69],68:[2,69],69:[2,69],71:[2,69],73:[2,69],74:[2,69],78:[2,69],80:[2,69],84:[2,69],85:[2,69],86:[2,69],91:[2,69],93:[2,69],102:[2,69],104:[2,69],105:[2,69],106:[2,69],110:[2,69],118:[2,69],126:[2,69],128:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69],135:[2,69],136:[2,69],137:[2,69],138:[2,69]},{6:[1,193],7:192,8:114,9:18,10:19,11:[1,20],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,194],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],49:[2,106],54:[2,106],57:[2,106],66:[2,106],67:[2,106],68:[2,106],69:[2,106],71:[2,106],73:[2,106],74:[2,106],78:[2,106],84:[2,106],85:[2,106],86:[2,106],91:[2,106],93:[2,106],102:[2,106],104:[2,106],105:[2,106],106:[2,106],110:[2,106],118:[2,106],126:[2,106],128:[2,106],129:[2,106],132:[2,106],133:[2,106],134:[2,106],135:[2,106],136:[2,106],137:[2,106]},{7:197,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],86:[1,195],87:196,88:[1,56],89:[1,57],90:[1,55],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,52],25:[2,52],49:[1,198],53:200,54:[1,199]},{6:[2,55],25:[2,55],26:[2,55],49:[2,55],54:[2,55]},{6:[2,59],25:[2,59],26:[2,59],40:[1,202],49:[2,59],54:[2,59],57:[1,201]},{6:[2,62],25:[2,62],26:[2,62],40:[2,62],49:[2,62],54:[2,62],57:[2,62]},{6:[2,63],25:[2,63],26:[2,63],40:[2,63],49:[2,63],54:[2,63],57:[2,63]},{6:[2,64],25:[2,64],26:[2,64],40:[2,64],49:[2,64],54:[2,64],57:[2,64]},{6:[2,65],25:[2,65],26:[2,65],40:[2,65],49:[2,65],54:[2,65],57:[2,65]},{27:145,28:[1,71]},{7:197,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],87:141,88:[1,56],89:[1,57],90:[1,55],91:[1,140],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,49],6:[2,49],25:[2,49],26:[2,49],49:[2,49],54:[2,49],57:[2,49],73:[2,49],78:[2,49],86:[2,49],91:[2,49],93:[2,49],102:[2,49],104:[2,49],105:[2,49],106:[2,49],110:[2,49],118:[2,49],126:[2,49],128:[2,49],129:[2,49],132:[2,49],133:[2,49],134:[2,49],135:[2,49],136:[2,49],137:[2,49]},{4:204,5:3,7:4,8:5,9:18,10:19,11:[1,20],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,203],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],49:[2,186],54:[2,186],57:[2,186],73:[2,186],78:[2,186],86:[2,186],91:[2,186],93:[2,186],102:[2,186],103:82,104:[2,186],105:[2,186],106:[2,186],109:83,110:[2,186],111:67,118:[2,186],126:[2,186],128:[2,186],129:[2,186],132:[1,73],133:[2,186],134:[2,186],135:[2,186],136:[2,186],137:[2,186]},{103:85,104:[1,63],106:[1,64],109:86,110:[1,66],111:67,126:[1,84]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],49:[2,187],54:[2,187],57:[2,187],73:[2,187],78:[2,187],86:[2,187],91:[2,187],93:[2,187],102:[2,187],103:82,104:[2,187],105:[2,187],106:[2,187],109:83,110:[2,187],111:67,118:[2,187],126:[2,187],128:[2,187],129:[2,187],132:[1,73],133:[2,187],134:[2,187],135:[2,187],136:[2,187],137:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],49:[2,188],54:[2,188],57:[2,188],73:[2,188],78:[2,188],86:[2,188],91:[2,188],93:[2,188],102:[2,188],103:82,104:[2,188],105:[2,188],106:[2,188],109:83,110:[2,188],111:67,118:[2,188],126:[2,188],128:[2,188],129:[2,188],132:[1,73],133:[2,188],134:[2,188],135:[2,188],136:[2,188],137:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],49:[2,189],54:[2,189],57:[2,189],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,189],74:[2,71],78:[2,189],84:[2,71],85:[2,71],86:[2,189],91:[2,189],93:[2,189],102:[2,189],104:[2,189],105:[2,189],106:[2,189],110:[2,189],118:[2,189],126:[2,189],128:[2,189],129:[2,189],132:[2,189],133:[2,189],134:[2,189],135:[2,189],136:[2,189],137:[2,189]},{62:88,66:[1,90],67:[1,91],68:[1,92],69:[1,93],70:94,71:[1,95],74:[1,96],81:87,84:[1,89],85:[2,107]},{62:98,66:[1,90],67:[1,91],68:[1,92],69:[1,93],70:94,71:[1,95],74:[1,96],81:97,84:[1,89],85:[2,107]},{66:[2,74],67:[2,74],68:[2,74],69:[2,74],71:[2,74],74:[2,74],84:[2,74],85:[2,74]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],49:[2,190],54:[2,190],57:[2,190],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,190],74:[2,71],78:[2,190],84:[2,71],85:[2,71],86:[2,190],91:[2,190],93:[2,190],102:[2,190],104:[2,190],105:[2,190],106:[2,190],110:[2,190],118:[2,190],126:[2,190],128:[2,190],129:[2,190],132:[2,190],133:[2,190],134:[2,190],135:[2,190],136:[2,190],137:[2,190]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],49:[2,191],54:[2,191],57:[2,191],73:[2,191],78:[2,191],86:[2,191],91:[2,191],93:[2,191],102:[2,191],104:[2,191],105:[2,191],106:[2,191],110:[2,191],118:[2,191],126:[2,191],128:[2,191],129:[2,191],132:[2,191],133:[2,191],134:[2,191],135:[2,191],136:[2,191],137:[2,191]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],49:[2,192],54:[2,192],57:[2,192],73:[2,192],78:[2,192],86:[2,192],91:[2,192],93:[2,192],102:[2,192],104:[2,192],105:[2,192],106:[2,192],110:[2,192],118:[2,192],126:[2,192],128:[2,192],129:[2,192],132:[2,192],133:[2,192],134:[2,192],135:[2,192],136:[2,192],137:[2,192]},{6:[1,207],7:205,8:114,9:18,10:19,11:[1,20],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,206],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:208,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{24:209,25:[1,112],125:[1,210]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],49:[2,132],54:[2,132],57:[2,132],73:[2,132],78:[2,132],86:[2,132],91:[2,132],93:[2,132],97:211,98:[1,212],99:[1,213],102:[2,132],104:[2,132],105:[2,132],106:[2,132],110:[2,132],118:[2,132],126:[2,132],128:[2,132],129:[2,132],132:[2,132],133:[2,132],134:[2,132],135:[2,132],136:[2,132],137:[2,132]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],49:[2,146],54:[2,146],57:[2,146],73:[2,146],78:[2,146],86:[2,146],91:[2,146],93:[2,146],102:[2,146],104:[2,146],105:[2,146],106:[2,146],110:[2,146],118:[2,146],126:[2,146],128:[2,146],129:[2,146],132:[2,146],133:[2,146],134:[2,146],135:[2,146],136:[2,146],137:[2,146]},{1:[2,154],6:[2,154],25:[2,154],26:[2,154],49:[2,154],54:[2,154],57:[2,154],73:[2,154],78:[2,154],86:[2,154],91:[2,154],93:[2,154],102:[2,154],104:[2,154],105:[2,154],106:[2,154],110:[2,154],118:[2,154],126:[2,154],128:[2,154],129:[2,154],132:[2,154],133:[2,154],134:[2,154],135:[2,154],136:[2,154],137:[2,154]},{25:[1,214],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{120:215,122:216,123:[1,217]},{1:[2,96],6:[2,96],25:[2,96],26:[2,96],49:[2,96],54:[2,96],57:[2,96],73:[2,96],78:[2,96],86:[2,96],91:[2,96],93:[2,96],102:[2,96],104:[2,96],105:[2,96],106:[2,96],110:[2,96],118:[2,96],126:[2,96],128:[2,96],129:[2,96],132:[2,96],133:[2,96],134:[2,96],135:[2,96],136:[2,96],137:[2,96]},{7:218,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,99],6:[2,99],24:219,25:[1,112],26:[2,99],49:[2,99],54:[2,99],57:[2,99],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,99],74:[2,71],78:[2,99],80:[1,220],84:[2,71],85:[2,71],86:[2,99],91:[2,99],93:[2,99],102:[2,99],104:[2,99],105:[2,99],106:[2,99],110:[2,99],118:[2,99],126:[2,99],128:[2,99],129:[2,99],132:[2,99],133:[2,99],134:[2,99],135:[2,99],136:[2,99],137:[2,99]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],49:[2,139],54:[2,139],57:[2,139],73:[2,139],78:[2,139],86:[2,139],91:[2,139],93:[2,139],102:[2,139],103:82,104:[2,139],105:[2,139],106:[2,139],109:83,110:[2,139],111:67,118:[2,139],126:[2,139],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,45],6:[2,45],26:[2,45],102:[2,45],103:82,104:[2,45],106:[2,45],109:83,110:[2,45],111:67,126:[2,45],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,72],102:[1,221]},{4:222,5:3,7:4,8:5,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,128],25:[2,128],54:[2,128],57:[1,224],91:[2,128],92:223,93:[1,188],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],40:[2,114],49:[2,114],54:[2,114],57:[2,114],66:[2,114],67:[2,114],68:[2,114],69:[2,114],71:[2,114],73:[2,114],74:[2,114],78:[2,114],84:[2,114],85:[2,114],86:[2,114],91:[2,114],93:[2,114],102:[2,114],104:[2,114],105:[2,114],106:[2,114],110:[2,114],116:[2,114],117:[2,114],118:[2,114],126:[2,114],128:[2,114],129:[2,114],132:[2,114],133:[2,114],134:[2,114],135:[2,114],136:[2,114],137:[2,114]},{6:[2,52],25:[2,52],53:225,54:[1,226],91:[2,52]},{6:[2,123],25:[2,123],26:[2,123],54:[2,123],86:[2,123],91:[2,123]},{7:197,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],87:227,88:[1,56],89:[1,57],90:[1,55],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,129],25:[2,129],26:[2,129],54:[2,129],86:[2,129],91:[2,129]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],40:[2,113],43:[2,113],49:[2,113],54:[2,113],57:[2,113],66:[2,113],67:[2,113],68:[2,113],69:[2,113],71:[2,113],73:[2,113],74:[2,113],78:[2,113],80:[2,113],84:[2,113],85:[2,113],86:[2,113],91:[2,113],93:[2,113],102:[2,113],104:[2,113],105:[2,113],106:[2,113],110:[2,113],116:[2,113],117:[2,113],118:[2,113],126:[2,113],128:[2,113],129:[2,113],130:[2,113],131:[2,113],132:[2,113],133:[2,113],134:[2,113],135:[2,113],136:[2,113],137:[2,113],138:[2,113]},{24:228,25:[1,112],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],49:[2,142],54:[2,142],57:[2,142],73:[2,142],78:[2,142],86:[2,142],91:[2,142],93:[2,142],102:[2,142],103:82,104:[1,63],105:[1,229],106:[1,64],109:83,110:[1,66],111:67,118:[2,142],126:[2,142],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],49:[2,144],54:[2,144],57:[2,144],73:[2,144],78:[2,144],86:[2,144],91:[2,144],93:[2,144],102:[2,144],103:82,104:[1,63],105:[1,230],106:[1,64],109:83,110:[1,66],111:67,118:[2,144],126:[2,144],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],49:[2,150],54:[2,150],57:[2,150],73:[2,150],78:[2,150],86:[2,150],91:[2,150],93:[2,150],102:[2,150],104:[2,150],105:[2,150],106:[2,150],110:[2,150],118:[2,150],126:[2,150],128:[2,150],129:[2,150],132:[2,150],133:[2,150],134:[2,150],135:[2,150],136:[2,150],137:[2,150]},{1:[2,151],6:[2,151],25:[2,151],26:[2,151],49:[2,151],54:[2,151],57:[2,151],73:[2,151],78:[2,151],86:[2,151],91:[2,151],93:[2,151],102:[2,151],103:82,104:[1,63],105:[2,151],106:[1,64],109:83,110:[1,66],111:67,118:[2,151],126:[2,151],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,155],6:[2,155],25:[2,155],26:[2,155],49:[2,155],54:[2,155],57:[2,155],73:[2,155],78:[2,155],86:[2,155],91:[2,155],93:[2,155],102:[2,155],104:[2,155],105:[2,155],106:[2,155],110:[2,155],118:[2,155],126:[2,155],128:[2,155],129:[2,155],132:[2,155],133:[2,155],134:[2,155],135:[2,155],136:[2,155],137:[2,155]},{116:[2,157],117:[2,157]},{27:155,28:[1,71],44:156,58:157,59:158,76:[1,68],89:[1,109],90:[1,110],113:231,115:154},{54:[1,232],116:[2,163],117:[2,163]},{54:[2,159],116:[2,159],117:[2,159]},{54:[2,160],116:[2,160],117:[2,160]},{54:[2,161],116:[2,161],117:[2,161]},{54:[2,162],116:[2,162],117:[2,162]},{1:[2,156],6:[2,156],25:[2,156],26:[2,156],49:[2,156],54:[2,156],57:[2,156],73:[2,156],78:[2,156],86:[2,156],91:[2,156],93:[2,156],102:[2,156],104:[2,156],105:[2,156],106:[2,156],110:[2,156],118:[2,156],126:[2,156],128:[2,156],129:[2,156],132:[2,156],133:[2,156],134:[2,156],135:[2,156],136:[2,156],137:[2,156]},{7:233,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:234,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,52],25:[2,52],53:235,54:[1,236],78:[2,52]},{6:[2,91],25:[2,91],26:[2,91],54:[2,91],78:[2,91]},{6:[2,38],25:[2,38],26:[2,38],43:[1,237],54:[2,38],78:[2,38]},{6:[2,41],25:[2,41],26:[2,41],54:[2,41],78:[2,41]},{6:[2,42],25:[2,42],26:[2,42],43:[2,42],54:[2,42],78:[2,42]},{6:[2,43],25:[2,43],26:[2,43],43:[2,43],54:[2,43],78:[2,43]},{6:[2,44],25:[2,44],26:[2,44],43:[2,44],54:[2,44],78:[2,44]},{1:[2,4],6:[2,4],26:[2,4],102:[2,4]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],49:[2,194],54:[2,194],57:[2,194],73:[2,194],78:[2,194],86:[2,194],91:[2,194],93:[2,194],102:[2,194],103:82,104:[2,194],105:[2,194],106:[2,194],109:83,110:[2,194],111:67,118:[2,194],126:[2,194],128:[2,194],129:[2,194],132:[1,73],133:[1,76],134:[2,194],135:[2,194],136:[2,194],137:[2,194]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],49:[2,195],54:[2,195],57:[2,195],73:[2,195],78:[2,195],86:[2,195],91:[2,195],93:[2,195],102:[2,195],103:82,104:[2,195],105:[2,195],106:[2,195],109:83,110:[2,195],111:67,118:[2,195],126:[2,195],128:[2,195],129:[2,195],132:[1,73],133:[1,76],134:[2,195],135:[2,195],136:[2,195],137:[2,195]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],49:[2,196],54:[2,196],57:[2,196],73:[2,196],78:[2,196],86:[2,196],91:[2,196],93:[2,196],102:[2,196],103:82,104:[2,196],105:[2,196],106:[2,196],109:83,110:[2,196],111:67,118:[2,196],126:[2,196],128:[2,196],129:[2,196],132:[1,73],133:[2,196],134:[2,196],135:[2,196],136:[2,196],137:[2,196]},{1:[2,197],6:[2,197],25:[2,197],26:[2,197],49:[2,197],54:[2,197],57:[2,197],73:[2,197],78:[2,197],86:[2,197],91:[2,197],93:[2,197],102:[2,197],103:82,104:[2,197],105:[2,197],106:[2,197],109:83,110:[2,197],111:67,118:[2,197],126:[2,197],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[2,197],135:[2,197],136:[2,197],137:[2,197]},{1:[2,198],6:[2,198],25:[2,198],26:[2,198],49:[2,198],54:[2,198],57:[2,198],73:[2,198],78:[2,198],86:[2,198],91:[2,198],93:[2,198],102:[2,198],103:82,104:[2,198],105:[2,198],106:[2,198],109:83,110:[2,198],111:67,118:[2,198],126:[2,198],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[2,198],136:[2,198],137:[1,80]},{1:[2,199],6:[2,199],25:[2,199],26:[2,199],49:[2,199],54:[2,199],57:[2,199],73:[2,199],78:[2,199],86:[2,199],91:[2,199],93:[2,199],102:[2,199],103:82,104:[2,199],105:[2,199],106:[2,199],109:83,110:[2,199],111:67,118:[2,199],126:[2,199],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[2,199],137:[1,80]},{1:[2,200],6:[2,200],25:[2,200],26:[2,200],49:[2,200],54:[2,200],57:[2,200],73:[2,200],78:[2,200],86:[2,200],91:[2,200],93:[2,200],102:[2,200],103:82,104:[2,200],105:[2,200],106:[2,200],109:83,110:[2,200],111:67,118:[2,200],126:[2,200],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[2,200],136:[2,200],137:[2,200]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],49:[2,185],54:[2,185],57:[2,185],73:[2,185],78:[2,185],86:[2,185],91:[2,185],93:[2,185],102:[2,185],103:82,104:[1,63],105:[2,185],106:[1,64],109:83,110:[1,66],111:67,118:[2,185],126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],49:[2,184],54:[2,184],57:[2,184],73:[2,184],78:[2,184],86:[2,184],91:[2,184],93:[2,184],102:[2,184],103:82,104:[1,63],105:[2,184],106:[1,64],109:83,110:[1,66],111:67,118:[2,184],126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,103],6:[2,103],25:[2,103],26:[2,103],49:[2,103],54:[2,103],57:[2,103],66:[2,103],67:[2,103],68:[2,103],69:[2,103],71:[2,103],73:[2,103],74:[2,103],78:[2,103],84:[2,103],85:[2,103],86:[2,103],91:[2,103],93:[2,103],102:[2,103],104:[2,103],105:[2,103],106:[2,103],110:[2,103],118:[2,103],126:[2,103],128:[2,103],129:[2,103],132:[2,103],133:[2,103],134:[2,103],135:[2,103],136:[2,103],137:[2,103]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],40:[2,79],49:[2,79],54:[2,79],57:[2,79],66:[2,79],67:[2,79],68:[2,79],69:[2,79],71:[2,79],73:[2,79],74:[2,79],78:[2,79],80:[2,79],84:[2,79],85:[2,79],86:[2,79],91:[2,79],93:[2,79],102:[2,79],104:[2,79],105:[2,79],106:[2,79],110:[2,79],118:[2,79],126:[2,79],128:[2,79],129:[2,79],130:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79],136:[2,79],137:[2,79],138:[2,79]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],40:[2,80],49:[2,80],54:[2,80],57:[2,80],66:[2,80],67:[2,80],68:[2,80],69:[2,80],71:[2,80],73:[2,80],74:[2,80],78:[2,80],80:[2,80],84:[2,80],85:[2,80],86:[2,80],91:[2,80],93:[2,80],102:[2,80],104:[2,80],105:[2,80],106:[2,80],110:[2,80],118:[2,80],126:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80],136:[2,80],137:[2,80],138:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],40:[2,81],49:[2,81],54:[2,81],57:[2,81],66:[2,81],67:[2,81],68:[2,81],69:[2,81],71:[2,81],73:[2,81],74:[2,81],78:[2,81],80:[2,81],84:[2,81],85:[2,81],86:[2,81],91:[2,81],93:[2,81],102:[2,81],104:[2,81],105:[2,81],106:[2,81],110:[2,81],118:[2,81],126:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81],136:[2,81],137:[2,81],138:[2,81]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],40:[2,82],49:[2,82],54:[2,82],57:[2,82],66:[2,82],67:[2,82],68:[2,82],69:[2,82],71:[2,82],73:[2,82],74:[2,82],78:[2,82],80:[2,82],84:[2,82],85:[2,82],86:[2,82],91:[2,82],93:[2,82],102:[2,82],104:[2,82],105:[2,82],106:[2,82],110:[2,82],118:[2,82],126:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82],136:[2,82],137:[2,82],138:[2,82]},{73:[1,238]},{57:[1,189],73:[2,87],92:239,93:[1,188],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{73:[2,88]},{7:240,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,73:[2,122],76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{11:[2,116],28:[2,116],30:[2,116],31:[2,116],33:[2,116],34:[2,116],35:[2,116],36:[2,116],37:[2,116],38:[2,116],45:[2,116],46:[2,116],47:[2,116],51:[2,116],52:[2,116],73:[2,116],76:[2,116],79:[2,116],83:[2,116],88:[2,116],89:[2,116],90:[2,116],96:[2,116],100:[2,116],101:[2,116],104:[2,116],106:[2,116],108:[2,116],110:[2,116],119:[2,116],125:[2,116],127:[2,116],128:[2,116],129:[2,116],130:[2,116],131:[2,116]},{11:[2,117],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],73:[2,117],76:[2,117],79:[2,117],83:[2,117],88:[2,117],89:[2,117],90:[2,117],96:[2,117],100:[2,117],101:[2,117],104:[2,117],106:[2,117],108:[2,117],110:[2,117],119:[2,117],125:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117],131:[2,117]},{1:[2,86],6:[2,86],25:[2,86],26:[2,86],40:[2,86],49:[2,86],54:[2,86],57:[2,86],66:[2,86],67:[2,86],68:[2,86],69:[2,86],71:[2,86],73:[2,86],74:[2,86],78:[2,86],80:[2,86],84:[2,86],85:[2,86],86:[2,86],91:[2,86],93:[2,86],102:[2,86],104:[2,86],105:[2,86],106:[2,86],110:[2,86],118:[2,86],126:[2,86],128:[2,86],129:[2,86],130:[2,86],131:[2,86],132:[2,86],133:[2,86],134:[2,86],135:[2,86],136:[2,86],137:[2,86],138:[2,86]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],49:[2,104],54:[2,104],57:[2,104],66:[2,104],67:[2,104],68:[2,104],69:[2,104],71:[2,104],73:[2,104],74:[2,104],78:[2,104],84:[2,104],85:[2,104],86:[2,104],91:[2,104],93:[2,104],102:[2,104],104:[2,104],105:[2,104],106:[2,104],110:[2,104],118:[2,104],126:[2,104],128:[2,104],129:[2,104],132:[2,104],133:[2,104],134:[2,104],135:[2,104],136:[2,104],137:[2,104]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],49:[2,35],54:[2,35],57:[2,35],73:[2,35],78:[2,35],86:[2,35],91:[2,35],93:[2,35],102:[2,35],103:82,104:[2,35],105:[2,35],106:[2,35],109:83,110:[2,35],111:67,118:[2,35],126:[2,35],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{7:241,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:242,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],49:[2,109],54:[2,109],57:[2,109],66:[2,109],67:[2,109],68:[2,109],69:[2,109],71:[2,109],73:[2,109],74:[2,109],78:[2,109],84:[2,109],85:[2,109],86:[2,109],91:[2,109],93:[2,109],102:[2,109],104:[2,109],105:[2,109],106:[2,109],110:[2,109],118:[2,109],126:[2,109],128:[2,109],129:[2,109],132:[2,109],133:[2,109],134:[2,109],135:[2,109],136:[2,109],137:[2,109]},{6:[2,52],25:[2,52],53:243,54:[1,226],86:[2,52]},{6:[2,128],25:[2,128],26:[2,128],54:[2,128],57:[1,244],86:[2,128],91:[2,128],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{50:245,51:[1,58],52:[1,59]},{6:[2,53],25:[2,53],26:[2,53],27:105,28:[1,71],44:106,55:246,56:104,58:107,59:108,76:[1,68],89:[1,109],90:[1,110]},{6:[1,247],25:[1,248]},{6:[2,60],25:[2,60],26:[2,60],49:[2,60],54:[2,60]},{7:249,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],49:[2,23],54:[2,23],57:[2,23],73:[2,23],78:[2,23],86:[2,23],91:[2,23],93:[2,23],98:[2,23],99:[2,23],102:[2,23],104:[2,23],105:[2,23],106:[2,23],110:[2,23],118:[2,23],121:[2,23],123:[2,23],126:[2,23],128:[2,23],129:[2,23],132:[2,23],133:[2,23],134:[2,23],135:[2,23],136:[2,23],137:[2,23]},{6:[1,72],26:[1,250]},{1:[2,201],6:[2,201],25:[2,201],26:[2,201],49:[2,201],54:[2,201],57:[2,201],73:[2,201],78:[2,201],86:[2,201],91:[2,201],93:[2,201],102:[2,201],103:82,104:[2,201],105:[2,201],106:[2,201],109:83,110:[2,201],111:67,118:[2,201],126:[2,201],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{7:251,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:252,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,204],6:[2,204],25:[2,204],26:[2,204],49:[2,204],54:[2,204],57:[2,204],73:[2,204],78:[2,204],86:[2,204],91:[2,204],93:[2,204],102:[2,204],103:82,104:[2,204],105:[2,204],106:[2,204],109:83,110:[2,204],111:67,118:[2,204],126:[2,204],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],49:[2,183],54:[2,183],57:[2,183],73:[2,183],78:[2,183],86:[2,183],91:[2,183],93:[2,183],102:[2,183],104:[2,183],105:[2,183],106:[2,183],110:[2,183],118:[2,183],126:[2,183],128:[2,183],129:[2,183],132:[2,183],133:[2,183],134:[2,183],135:[2,183],136:[2,183],137:[2,183]},{7:253,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],49:[2,133],54:[2,133],57:[2,133],73:[2,133],78:[2,133],86:[2,133],91:[2,133],93:[2,133],98:[1,254],102:[2,133],104:[2,133],105:[2,133],106:[2,133],110:[2,133],118:[2,133],126:[2,133],128:[2,133],129:[2,133],132:[2,133],133:[2,133],134:[2,133],135:[2,133],136:[2,133],137:[2,133]},{24:255,25:[1,112]},{24:258,25:[1,112],27:256,28:[1,71],59:257,76:[1,68]},{120:259,122:216,123:[1,217]},{26:[1,260],121:[1,261],122:262,123:[1,217]},{26:[2,176],121:[2,176],123:[2,176]},{7:264,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],95:263,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,97],6:[2,97],24:265,25:[1,112],26:[2,97],49:[2,97],54:[2,97],57:[2,97],73:[2,97],78:[2,97],86:[2,97],91:[2,97],93:[2,97],102:[2,97],103:82,104:[1,63],105:[2,97],106:[1,64],109:83,110:[1,66],111:67,118:[2,97],126:[2,97],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],49:[2,100],54:[2,100],57:[2,100],73:[2,100],78:[2,100],86:[2,100],91:[2,100],93:[2,100],102:[2,100],104:[2,100],105:[2,100],106:[2,100],110:[2,100],118:[2,100],126:[2,100],128:[2,100],129:[2,100],132:[2,100],133:[2,100],134:[2,100],135:[2,100],136:[2,100],137:[2,100]},{7:266,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],49:[2,140],54:[2,140],57:[2,140],66:[2,140],67:[2,140],68:[2,140],69:[2,140],71:[2,140],73:[2,140],74:[2,140],78:[2,140],84:[2,140],85:[2,140],86:[2,140],91:[2,140],93:[2,140],102:[2,140],104:[2,140],105:[2,140],106:[2,140],110:[2,140],118:[2,140],126:[2,140],128:[2,140],129:[2,140],132:[2,140],133:[2,140],134:[2,140],135:[2,140],136:[2,140],137:[2,140]},{6:[1,72],26:[1,267]},{7:268,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,66],11:[2,117],25:[2,66],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],54:[2,66],76:[2,117],79:[2,117],83:[2,117],88:[2,117],89:[2,117],90:[2,117],91:[2,66],96:[2,117],100:[2,117],101:[2,117],104:[2,117],106:[2,117],108:[2,117],110:[2,117],119:[2,117],125:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117],131:[2,117]},{6:[1,270],25:[1,271],91:[1,269]},{6:[2,53],7:197,8:114,9:18,10:19,11:[1,20],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:[2,53],26:[2,53],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],86:[2,53],88:[1,56],89:[1,57],90:[1,55],91:[2,53],94:272,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,52],25:[2,52],26:[2,52],53:273,54:[1,226]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],49:[2,180],54:[2,180],57:[2,180],73:[2,180],78:[2,180],86:[2,180],91:[2,180],93:[2,180],102:[2,180],104:[2,180],105:[2,180],106:[2,180],110:[2,180],118:[2,180],121:[2,180],126:[2,180],128:[2,180],129:[2,180],132:[2,180],133:[2,180],134:[2,180],135:[2,180],136:[2,180],137:[2,180]},{7:274,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:275,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{116:[2,158],117:[2,158]},{27:155,28:[1,71],44:156,58:157,59:158,76:[1,68],89:[1,109],90:[1,110],115:276},{1:[2,165],6:[2,165],25:[2,165],26:[2,165]</string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+,49:[2,165],54:[2,165],57:[2,165],73:[2,165],78:[2,165],86:[2,165],91:[2,165],93:[2,165],102:[2,165],103:82,104:[2,165],105:[1,277],106:[2,165],109:83,110:[2,165],111:67,118:[1,278],126:[2,165],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],49:[2,166],54:[2,166],57:[2,166],73:[2,166],78:[2,166],86:[2,166],91:[2,166],93:[2,166],102:[2,166],103:82,104:[2,166],105:[1,279],106:[2,166],109:83,110:[2,166],111:67,118:[2,166],126:[2,166],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,281],25:[1,282],78:[1,280]},{6:[2,53],10:165,25:[2,53],26:[2,53],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],41:283,42:164,44:168,46:[1,44],78:[2,53],89:[1,109]},{7:284,8:114,9:18,10:19,11:[1,20],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,285],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],40:[2,85],49:[2,85],54:[2,85],57:[2,85],66:[2,85],67:[2,85],68:[2,85],69:[2,85],71:[2,85],73:[2,85],74:[2,85],78:[2,85],80:[2,85],84:[2,85],85:[2,85],86:[2,85],91:[2,85],93:[2,85],102:[2,85],104:[2,85],105:[2,85],106:[2,85],110:[2,85],118:[2,85],126:[2,85],128:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85],135:[2,85],136:[2,85],137:[2,85],138:[2,85]},{7:286,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,73:[2,120],76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{73:[2,121],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],49:[2,36],54:[2,36],57:[2,36],73:[2,36],78:[2,36],86:[2,36],91:[2,36],93:[2,36],102:[2,36],103:82,104:[2,36],105:[2,36],106:[2,36],109:83,110:[2,36],111:67,118:[2,36],126:[2,36],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{26:[1,287],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,270],25:[1,271],86:[1,288]},{6:[2,66],25:[2,66],26:[2,66],54:[2,66],86:[2,66],91:[2,66]},{24:289,25:[1,112]},{6:[2,56],25:[2,56],26:[2,56],49:[2,56],54:[2,56]},{27:105,28:[1,71],44:106,55:290,56:104,58:107,59:108,76:[1,68],89:[1,109],90:[1,110]},{6:[2,54],25:[2,54],26:[2,54],27:105,28:[1,71],44:106,48:291,54:[2,54],55:103,56:104,58:107,59:108,76:[1,68],89:[1,109],90:[1,110]},{6:[2,61],25:[2,61],26:[2,61],49:[2,61],54:[2,61],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],49:[2,24],54:[2,24],57:[2,24],73:[2,24],78:[2,24],86:[2,24],91:[2,24],93:[2,24],98:[2,24],99:[2,24],102:[2,24],104:[2,24],105:[2,24],106:[2,24],110:[2,24],118:[2,24],121:[2,24],123:[2,24],126:[2,24],128:[2,24],129:[2,24],132:[2,24],133:[2,24],134:[2,24],135:[2,24],136:[2,24],137:[2,24]},{26:[1,292],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,203],6:[2,203],25:[2,203],26:[2,203],49:[2,203],54:[2,203],57:[2,203],73:[2,203],78:[2,203],86:[2,203],91:[2,203],93:[2,203],102:[2,203],103:82,104:[2,203],105:[2,203],106:[2,203],109:83,110:[2,203],111:67,118:[2,203],126:[2,203],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{24:293,25:[1,112],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{24:294,25:[1,112]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],49:[2,134],54:[2,134],57:[2,134],73:[2,134],78:[2,134],86:[2,134],91:[2,134],93:[2,134],102:[2,134],104:[2,134],105:[2,134],106:[2,134],110:[2,134],118:[2,134],126:[2,134],128:[2,134],129:[2,134],132:[2,134],133:[2,134],134:[2,134],135:[2,134],136:[2,134],137:[2,134]},{24:295,25:[1,112]},{24:296,25:[1,112]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],49:[2,138],54:[2,138],57:[2,138],73:[2,138],78:[2,138],86:[2,138],91:[2,138],93:[2,138],98:[2,138],102:[2,138],104:[2,138],105:[2,138],106:[2,138],110:[2,138],118:[2,138],126:[2,138],128:[2,138],129:[2,138],132:[2,138],133:[2,138],134:[2,138],135:[2,138],136:[2,138],137:[2,138]},{26:[1,297],121:[1,298],122:262,123:[1,217]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],49:[2,174],54:[2,174],57:[2,174],73:[2,174],78:[2,174],86:[2,174],91:[2,174],93:[2,174],102:[2,174],104:[2,174],105:[2,174],106:[2,174],110:[2,174],118:[2,174],126:[2,174],128:[2,174],129:[2,174],132:[2,174],133:[2,174],134:[2,174],135:[2,174],136:[2,174],137:[2,174]},{24:299,25:[1,112]},{26:[2,177],121:[2,177],123:[2,177]},{24:300,25:[1,112],54:[1,301]},{25:[2,130],54:[2,130],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],49:[2,98],54:[2,98],57:[2,98],73:[2,98],78:[2,98],86:[2,98],91:[2,98],93:[2,98],102:[2,98],104:[2,98],105:[2,98],106:[2,98],110:[2,98],118:[2,98],126:[2,98],128:[2,98],129:[2,98],132:[2,98],133:[2,98],134:[2,98],135:[2,98],136:[2,98],137:[2,98]},{1:[2,101],6:[2,101],24:302,25:[1,112],26:[2,101],49:[2,101],54:[2,101],57:[2,101],73:[2,101],78:[2,101],86:[2,101],91:[2,101],93:[2,101],102:[2,101],103:82,104:[1,63],105:[2,101],106:[1,64],109:83,110:[1,66],111:67,118:[2,101],126:[2,101],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{102:[1,303]},{91:[1,304],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,115],6:[2,115],25:[2,115],26:[2,115],40:[2,115],49:[2,115],54:[2,115],57:[2,115],66:[2,115],67:[2,115],68:[2,115],69:[2,115],71:[2,115],73:[2,115],74:[2,115],78:[2,115],84:[2,115],85:[2,115],86:[2,115],91:[2,115],93:[2,115],102:[2,115],104:[2,115],105:[2,115],106:[2,115],110:[2,115],116:[2,115],117:[2,115],118:[2,115],126:[2,115],128:[2,115],129:[2,115],132:[2,115],133:[2,115],134:[2,115],135:[2,115],136:[2,115],137:[2,115]},{7:197,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],94:305,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:197,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],87:306,88:[1,56],89:[1,57],90:[1,55],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,124],25:[2,124],26:[2,124],54:[2,124],86:[2,124],91:[2,124]},{6:[1,270],25:[1,271],26:[1,307]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],49:[2,143],54:[2,143],57:[2,143],73:[2,143],78:[2,143],86:[2,143],91:[2,143],93:[2,143],102:[2,143],103:82,104:[1,63],105:[2,143],106:[1,64],109:83,110:[1,66],111:67,118:[2,143],126:[2,143],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],49:[2,145],54:[2,145],57:[2,145],73:[2,145],78:[2,145],86:[2,145],91:[2,145],93:[2,145],102:[2,145],103:82,104:[1,63],105:[2,145],106:[1,64],109:83,110:[1,66],111:67,118:[2,145],126:[2,145],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{116:[2,164],117:[2,164]},{7:308,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:309,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:310,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,89],6:[2,89],25:[2,89],26:[2,89],40:[2,89],49:[2,89],54:[2,89],57:[2,89],66:[2,89],67:[2,89],68:[2,89],69:[2,89],71:[2,89],73:[2,89],74:[2,89],78:[2,89],84:[2,89],85:[2,89],86:[2,89],91:[2,89],93:[2,89],102:[2,89],104:[2,89],105:[2,89],106:[2,89],110:[2,89],116:[2,89],117:[2,89],118:[2,89],126:[2,89],128:[2,89],129:[2,89],132:[2,89],133:[2,89],134:[2,89],135:[2,89],136:[2,89],137:[2,89]},{10:165,27:166,28:[1,71],29:167,30:[1,69],31:[1,70],41:311,42:164,44:168,46:[1,44],89:[1,109]},{6:[2,90],10:165,25:[2,90],26:[2,90],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],41:163,42:164,44:168,46:[1,44],54:[2,90],77:312,89:[1,109]},{6:[2,92],25:[2,92],26:[2,92],54:[2,92],78:[2,92]},{6:[2,39],25:[2,39],26:[2,39],54:[2,39],78:[2,39],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{7:313,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{73:[2,119],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,37],6:[2,37],25:[2,37],26:[2,37],49:[2,37],54:[2,37],57:[2,37],73:[2,37],78:[2,37],86:[2,37],91:[2,37],93:[2,37],102:[2,37],104:[2,37],105:[2,37],106:[2,37],110:[2,37],118:[2,37],126:[2,37],128:[2,37],129:[2,37],132:[2,37],133:[2,37],134:[2,37],135:[2,37],136:[2,37],137:[2,37]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],49:[2,110],54:[2,110],57:[2,110],66:[2,110],67:[2,110],68:[2,110],69:[2,110],71:[2,110],73:[2,110],74:[2,110],78:[2,110],84:[2,110],85:[2,110],86:[2,110],91:[2,110],93:[2,110],102:[2,110],104:[2,110],105:[2,110],106:[2,110],110:[2,110],118:[2,110],126:[2,110],128:[2,110],129:[2,110],132:[2,110],133:[2,110],134:[2,110],135:[2,110],136:[2,110],137:[2,110]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],49:[2,48],54:[2,48],57:[2,48],73:[2,48],78:[2,48],86:[2,48],91:[2,48],93:[2,48],102:[2,48],104:[2,48],105:[2,48],106:[2,48],110:[2,48],118:[2,48],126:[2,48],128:[2,48],129:[2,48],132:[2,48],133:[2,48],134:[2,48],135:[2,48],136:[2,48],137:[2,48]},{6:[2,57],25:[2,57],26:[2,57],49:[2,57],54:[2,57]},{6:[2,52],25:[2,52],26:[2,52],53:314,54:[1,199]},{1:[2,202],6:[2,202],25:[2,202],26:[2,202],49:[2,202],54:[2,202],57:[2,202],73:[2,202],78:[2,202],86:[2,202],91:[2,202],93:[2,202],102:[2,202],104:[2,202],105:[2,202],106:[2,202],110:[2,202],118:[2,202],126:[2,202],128:[2,202],129:[2,202],132:[2,202],133:[2,202],134:[2,202],135:[2,202],136:[2,202],137:[2,202]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],49:[2,181],54:[2,181],57:[2,181],73:[2,181],78:[2,181],86:[2,181],91:[2,181],93:[2,181],102:[2,181],104:[2,181],105:[2,181],106:[2,181],110:[2,181],118:[2,181],121:[2,181],126:[2,181],128:[2,181],129:[2,181],132:[2,181],133:[2,181],134:[2,181],135:[2,181],136:[2,181],137:[2,181]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],49:[2,135],54:[2,135],57:[2,135],73:[2,135],78:[2,135],86:[2,135],91:[2,135],93:[2,135],102:[2,135],104:[2,135],105:[2,135],106:[2,135],110:[2,135],118:[2,135],126:[2,135],128:[2,135],129:[2,135],132:[2,135],133:[2,135],134:[2,135],135:[2,135],136:[2,135],137:[2,135]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],49:[2,136],54:[2,136],57:[2,136],73:[2,136],78:[2,136],86:[2,136],91:[2,136],93:[2,136],98:[2,136],102:[2,136],104:[2,136],105:[2,136],106:[2,136],110:[2,136],118:[2,136],126:[2,136],128:[2,136],129:[2,136],132:[2,136],133:[2,136],134:[2,136],135:[2,136],136:[2,136],137:[2,136]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],49:[2,137],54:[2,137],57:[2,137],73:[2,137],78:[2,137],86:[2,137],91:[2,137],93:[2,137],98:[2,137],102:[2,137],104:[2,137],105:[2,137],106:[2,137],110:[2,137],118:[2,137],126:[2,137],128:[2,137],129:[2,137],132:[2,137],133:[2,137],134:[2,137],135:[2,137],136:[2,137],137:[2,137]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],49:[2,172],54:[2,172],57:[2,172],73:[2,172],78:[2,172],86:[2,172],91:[2,172],93:[2,172],102:[2,172],104:[2,172],105:[2,172],106:[2,172],110:[2,172],118:[2,172],126:[2,172],128:[2,172],129:[2,172],132:[2,172],133:[2,172],134:[2,172],135:[2,172],136:[2,172],137:[2,172]},{24:315,25:[1,112]},{26:[1,316]},{6:[1,317],26:[2,178],121:[2,178],123:[2,178]},{7:318,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,102],6:[2,102],25:[2,102],26:[2,102],49:[2,102],54:[2,102],57:[2,102],73:[2,102],78:[2,102],86:[2,102],91:[2,102],93:[2,102],102:[2,102],104:[2,102],105:[2,102],106:[2,102],110:[2,102],118:[2,102],126:[2,102],128:[2,102],129:[2,102],132:[2,102],133:[2,102],134:[2,102],135:[2,102],136:[2,102],137:[2,102]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],49:[2,141],54:[2,141],57:[2,141],66:[2,141],67:[2,141],68:[2,141],69:[2,141],71:[2,141],73:[2,141],74:[2,141],78:[2,141],84:[2,141],85:[2,141],86:[2,141],91:[2,141],93:[2,141],102:[2,141],104:[2,141],105:[2,141],106:[2,141],110:[2,141],118:[2,141],126:[2,141],128:[2,141],129:[2,141],132:[2,141],133:[2,141],134:[2,141],135:[2,141],136:[2,141],137:[2,141]},{1:[2,118],6:[2,118],25:[2,118],26:[2,118],49:[2,118],54:[2,118],57:[2,118],66:[2,118],67:[2,118],68:[2,118],69:[2,118],71:[2,118],73:[2,118],74:[2,118],78:[2,118],84:[2,118],85:[2,118],86:[2,118],91:[2,118],93:[2,118],102:[2,118],104:[2,118],105:[2,118],106:[2,118],110:[2,118],118:[2,118],126:[2,118],128:[2,118],129:[2,118],132:[2,118],133:[2,118],134:[2,118],135:[2,118],136:[2,118],137:[2,118]},{6:[2,125],25:[2,125],26:[2,125],54:[2,125],86:[2,125],91:[2,125]},{6:[2,52],25:[2,52],26:[2,52],53:319,54:[1,226]},{6:[2,126],25:[2,126],26:[2,126],54:[2,126],86:[2,126],91:[2,126]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],49:[2,167],54:[2,167],57:[2,167],73:[2,167],78:[2,167],86:[2,167],91:[2,167],93:[2,167],102:[2,167],103:82,104:[2,167],105:[2,167],106:[2,167],109:83,110:[2,167],111:67,118:[1,320],126:[2,167],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,169],6:[2,169],25:[2,169],26:[2,169],49:[2,169],54:[2,169],57:[2,169],73:[2,169],78:[2,169],86:[2,169],91:[2,169],93:[2,169],102:[2,169],103:82,104:[2,169],105:[1,321],106:[2,169],109:83,110:[2,169],111:67,118:[2,169],126:[2,169],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],49:[2,168],54:[2,168],57:[2,168],73:[2,168],78:[2,168],86:[2,168],91:[2,168],93:[2,168],102:[2,168],103:82,104:[2,168],105:[2,168],106:[2,168],109:83,110:[2,168],111:67,118:[2,168],126:[2,168],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[2,93],25:[2,93],26:[2,93],54:[2,93],78:[2,93]},{6:[2,52],25:[2,52],26:[2,52],53:322,54:[1,236]},{26:[1,323],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,247],25:[1,248],26:[1,324]},{26:[1,325]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],49:[2,175],54:[2,175],57:[2,175],73:[2,175],78:[2,175],86:[2,175],91:[2,175],93:[2,175],102:[2,175],104:[2,175],105:[2,175],106:[2,175],110:[2,175],118:[2,175],126:[2,175],128:[2,175],129:[2,175],132:[2,175],133:[2,175],134:[2,175],135:[2,175],136:[2,175],137:[2,175]},{26:[2,179],121:[2,179],123:[2,179]},{25:[2,131],54:[2,131],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,270],25:[1,271],26:[1,326]},{7:327,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:328,8:114,9:18,10:19,11:[1,20],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:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[1,281],25:[1,282],26:[1,329]},{6:[2,40],25:[2,40],26:[2,40],54:[2,40],78:[2,40]},{6:[2,58],25:[2,58],26:[2,58],49:[2,58],54:[2,58]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],49:[2,173],54:[2,173],57:[2,173],73:[2,173],78:[2,173],86:[2,173],91:[2,173],93:[2,173],102:[2,173],104:[2,173],105:[2,173],106:[2,173],110:[2,173],118:[2,173],126:[2,173],128:[2,173],129:[2,173],132:[2,173],133:[2,173],134:[2,173],135:[2,173],136:[2,173],137:[2,173]},{6:[2,127],25:[2,127],26:[2,127],54:[2,127],86:[2,127],91:[2,127]},{1:[2,170],6:[2,170],25:[2,170],26:[2,170],49:[2,170],54:[2,170],57:[2,170],73:[2,170],78:[2,170],86:[2,170],91:[2,170],93:[2,170],102:[2,170],103:82,104:[2,170],105:[2,170],106:[2,170],109:83,110:[2,170],111:67,118:[2,170],126:[2,170],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],49:[2,171],54:[2,171],57:[2,171],73:[2,171],78:[2,171],86:[2,171],91:[2,171],93:[2,171],102:[2,171],103:82,104:[2,171],105:[2,171],106:[2,171],109:83,110:[2,171],111:67,118:[2,171],126:[2,171],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[2,94],25:[2,94],26:[2,94],54:[2,94],78:[2,94]}],\n
+defaultActions: {58:[2,50],59:[2,51],89:[2,108],186:[2,88]},\n
 parseError: function parseError(str, hash) {\n
-    var e = new Error(str)\n
-    e.location = hash.loc\n
-    throw e;\n
+    if (hash.recoverable) {\n
+        this.trace(str);\n
+    } else {\n
+        var e = new Error(str)\n
+        e.location = hash.loc\n
+        throw e;\n
+    }\n
 },\n
 parse: function parse(input) {\n
-    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n
+    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = \'\', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n
     this.lexer.setInput(input);\n
     this.lexer.yy = this.yy;\n
     this.yy.lexer = this.lexer;\n
     this.yy.parser = this;\n
-    if (typeof this.lexer.yylloc == "undefined")\n
+    if (typeof this.lexer.yylloc == \'undefined\') {\n
         this.lexer.yylloc = {};\n
+    }\n
     var yyloc = this.lexer.yylloc;\n
     lstack.push(yyloc);\n
     var ranges = this.lexer.options && this.lexer.options.ranges;\n
-    if (typeof this.yy.parseError === "function")\n
+    if (typeof this.yy.parseError === \'function\') {\n
         this.parseError = this.yy.parseError;\n
+    } else {\n
+        this.parseError = Object.getPrototypeOf(this).parseError;\n
+    }\n
     function popStack(n) {\n
         stack.length = stack.length - 2 * n;\n
         vstack.length = vstack.length - n;\n
@@ -4206,8 +4322,8 @@ parse: function parse(input) {\n
     }\n
     function lex() {\n
         var token;\n
-        token = self.lexer.lex() || 1;\n
-        if (typeof token !== "number") {\n
+        token = self.lexer.lex() || EOF;\n
+        if (typeof token !== \'number\') {\n
             token = self.symbols_[token] || token;\n
         }\n
         return token;\n
@@ -4218,29 +4334,35 @@ parse: function parse(input) {\n
         if (this.defaultActions[state]) {\n
             action = this.defaultActions[state];\n
         } else {\n
-            if (symbol === null || typeof symbol == "undefined") {\n
+            if (symbol === null || typeof symbol == \'undefined\') {\n
                 symbol = lex();\n
             }\n
             action = table[state] && table[state][symbol];\n
         }\n
-        if (typeof action === "undefined" || !action.length || !action[0]) {\n
-            var errStr = "";\n
-            if (!recovering) {\n
+                    if (typeof action === \'undefined\' || !action.length || !action[0]) {\n
+                var errStr = \'\';\n
                 expected = [];\n
-                for (p in table[state])\n
-                    if (this.terminals_[p] && p > 2) {\n
-                        expected.push("\'" + this.terminals_[p] + "\'");\n
+                for (p in table[state]) {\n
+                    if (this.terminals_[p] && p > TERROR) {\n
+                        expected.push(\'\\\'\' + this.terminals_[p] + \'\\\'\');\n
                     }\n
+                }\n
                 if (this.lexer.showPosition) {\n
-                    errStr = this.lexer.showPosition() + "\\nExpecting " + expected.join(", ") + ", got \'" + (this.terminals_[symbol] || symbol) + "\'";\n
+                    errStr = \'Expecting \' + expected.join(\', \') + \', got \\\'\' + (this.terminals_[symbol] || symbol) + \'\\\'\';\n
                 } else {\n
-                    errStr = "Unexpected " + (symbol == 1?"end of input":"\'" + (this.terminals_[symbol] || symbol) + "\'");\n
+                    errStr = \'Unexpected \' + (symbol == EOF ? \'end of input\' : \'\\\'\' + (this.terminals_[symbol] || symbol) + \'\\\'\');\n
                 }\n
-                this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});\n
+                if (this.lexer.yylloc.first_line !== yyloc.first_line) yyloc = this.lexer.yylloc;\n
+                this.parseError(errStr, {\n
+                    text: this.lexer.match,\n
+                    token: this.terminals_[symbol] || symbol,\n
+                    line: this.lexer.yylineno,\n
+                    loc: yyloc,\n
+                    expected: expected\n
+                });\n
             }\n
-        }\n
         if (action[0] instanceof Array && action.length > 1) {\n
-            throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);\n
+            throw new Error(\'Parse Error: multiple actions possible at state: \' + state + \', token: \' + symbol);\n
         }\n
         switch (action[0]) {\n
         case 1:\n
@@ -4254,8 +4376,9 @@ parse: function parse(input) {\n
                 yytext = this.lexer.yytext;\n
                 yylineno = this.lexer.yylineno;\n
                 yyloc = this.lexer.yylloc;\n
-                if (recovering > 0)\n
+                if (recovering > 0) {\n
                     recovering--;\n
+                }\n
             } else {\n
                 symbol = preErrorSymbol;\n
                 preErrorSymbol = null;\n
@@ -4264,12 +4387,20 @@ parse: function parse(input) {\n
         case 2:\n
             len = this.productions_[action[1]][1];\n
             yyval.$ = vstack[vstack.length - len];\n
-            yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};\n
+            yyval._$ = {\n
+                first_line: lstack[lstack.length - (len || 1)].first_line,\n
+                last_line: lstack[lstack.length - 1].last_line,\n
+                first_column: lstack[lstack.length - (len || 1)].first_column,\n
+                last_column: lstack[lstack.length - 1].last_column\n
+            };\n
             if (ranges) {\n
-                yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];\n
+                yyval._$.range = [\n
+                    lstack[lstack.length - (len || 1)].range[0],\n
+                    lstack[lstack.length - 1].range[1]\n
+                ];\n
             }\n
             r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n
-            if (typeof r !== "undefined") {\n
+            if (typeof r !== \'undefined\') {\n
                 return r;\n
             }\n
             if (len) {\n
@@ -4288,10 +4419,12 @@ parse: function parse(input) {\n
         }\n
     }\n
     return true;\n
-}\n
-};\n
+}};\n
 undefined\n
-function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;\n
+function Parser () {\n
+  this.yy = {};\n
+}\n
+Parser.prototype = parser;parser.Parser = Parser;\n
 \n
 module.exports = new Parser;\n
 \n
@@ -4344,7 +4477,7 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
     }\n
 \n
     CodeFragment.prototype.toString = function() {\n
-      return "" + this.code + [this.locationData ? ": " + locationDataToString(this.locationData) : void 0];\n
+      return "" + this.code + (this.locationData ? ": " + locationDataToString(this.locationData) : \'\');\n
     };\n
 \n
     return CodeFragment;\n
@@ -4529,7 +4662,10 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
     Base.prototype.assigns = NO;\n
 \n
     Base.prototype.updateLocationDataIfMissing = function(locationData) {\n
-      this.locationData || (this.locationData = locationData);\n
+      if (this.locationData) {\n
+        return this;\n
+      }\n
+      this.locationData = locationData;\n
       return this.eachChild(function(child) {\n
         return child.updateLocationDataIfMissing(locationData);\n
       });\n
@@ -4776,6 +4912,8 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
             fragments.push(this.makeCode(scope.assignedVariables().join(",\\n" + (this.tab + TAB))));\n
           }\n
           fragments.push(this.makeCode(";\\n" + (this.spaced ? \'\\n\' : \'\')));\n
+        } else if (fragments.length && post.length) {\n
+          fragments.push(this.makeCode("\\n"));\n
         }\n
       }\n
       return fragments.concat(post);\n
@@ -4935,7 +5073,7 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
     Return.prototype.compileNode = function(o) {\n
       var answer;\n
       answer = [];\n
-      answer.push(this.makeCode(this.tab + ("return" + [this.expression ? " " : void 0])));\n
+      answer.push(this.makeCode(this.tab + ("return" + (this.expression ? " " : ""))));\n
       if (this.expression) {\n
         answer = answer.concat(this.expression.compileToFragments(o, LEVEL_PAREN));\n
       }\n
@@ -5074,17 +5212,16 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
     };\n
 \n
     Value.prototype.unfoldSoak = function(o) {\n
-      var _ref4,\n
-        _this = this;\n
-      return (_ref4 = this.unfoldedSoak) != null ? _ref4 : this.unfoldedSoak = (function() {\n
-        var fst, i, ifn, prop, ref, snd, _i, _len, _ref5, _ref6;\n
+      var _this = this;\n
+      return this.unfoldedSoak != null ? this.unfoldedSoak : this.unfoldedSoak = (function() {\n
+        var fst, i, ifn, prop, ref, snd, _i, _len, _ref4, _ref5;\n
         if (ifn = _this.base.unfoldSoak(o)) {\n
-          (_ref5 = ifn.body.properties).push.apply(_ref5, _this.properties);\n
+          (_ref4 = ifn.body.properties).push.apply(_ref4, _this.properties);\n
           return ifn;\n
         }\n
-        _ref6 = _this.properties;\n
-        for (i = _i = 0, _len = _ref6.length; _i < _len; i = ++_i) {\n
-          prop = _ref6[i];\n
+        _ref5 = _this.properties;\n
+        for (i = _i = 0, _len = _ref5.length; _i < _len; i = ++_i) {\n
+          prop = _ref5[i];\n
           if (!prop.soak) {\n
             continue;\n
           }\n
@@ -5121,11 +5258,11 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
 \n
     Comment.prototype.compileNode = function(o, level) {\n
       var code;\n
-      code = "/*" + (multident(this.comment, this.tab)) + (__indexOf.call(this.comment, \'\\n\') >= 0 ? "\\n" + this.tab : \'\') + "*/\\n";\n
+      code = "/*" + (multident(this.comment, this.tab)) + (__indexOf.call(this.comment, \'\\n\') >= 0 ? "\\n" + this.tab : \'\') + "*/";\n
       if ((level || o.level) === LEVEL_TOP) {\n
         code = o.indent + code;\n
       }\n
-      return [this.makeCode(code)];\n
+      return [this.makeCode("\\n"), this.makeCode(code)];\n
     };\n
 \n
     return Comment;\n
@@ -5525,7 +5662,30 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
       answer = [];\n
       for (i = _j = 0, _len1 = props.length; _j < _len1; i = ++_j) {\n
         prop = props[i];\n
-        join = i === props.length - 1 ? \'\' : prop === lastNoncom || prop instanceof Comment ? \'\\n\' : \',\\n\';\n
+        join = i === props.length - 1 ? \'\' : prop === lastNoncom || prop instanceof Comment ? \'\\n\' : \',\\
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="6" aka="AAAAAAAAAAY=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+n\';\n
         indent = prop instanceof Comment ? \'\' : idt;\n
         if (prop instanceof Assign && prop.variable instanceof Value && prop.variable.hasProperties()) {\n
           prop.variable.error(\'Invalid object key\');\n
@@ -5609,7 +5769,7 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
         }\n
         answer.push.apply(answer, fragments);\n
       }\n
-      if ((fragmentsToText(answer)).indexOf(\'\\n\') >= 0) {\n
+      if (fragmentsToText(answer).indexOf(\'\\n\') >= 0) {\n
         answer.unshift(this.makeCode("[\\n" + o.indent));\n
         answer.push(this.makeCode("\\n" + this.tab + "]"));\n
       } else {\n
@@ -6607,7 +6767,7 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
 \n
     Op.prototype.compileExistence = function(o) {\n
       var fst, ref;\n
-      if (this.first.isComplex()) {\n
+      if (!o.isExistentialEquals && this.first.isComplex()) {\n
         ref = new Literal(o.scope.freeVariable(\'ref\'));\n
         fst = new Parens(new Assign(ref, this.first));\n
       } else {\n
@@ -6711,7 +6871,7 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
       var fragments, ref, sub, _ref4;\n
       _ref4 = this.object.cache(o, LEVEL_LIST), sub = _ref4[0], ref = _ref4[1];\n
       fragments = [].concat(this.makeCode(utility(\'indexOf\') + ".call("), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), ref, this.makeCode(") " + (this.negated ? \'< 0\' : \'>= 0\')));\n
-      if ((fragmentsToText(sub)) === (fragmentsToText(ref))) {\n
+      if (fragmentsToText(sub) === fragmentsToText(ref)) {\n
         return fragments;\n
       }\n
       fragments = sub.concat(this.makeCode(\', \'), fragments);\n
@@ -6883,6 +7043,9 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
       if (this.range && this.pattern) {\n
         this.name.error(\'cannot pattern match over range loops\');\n
       }\n
+      if (this.own && !this.object) {\n
+        this.index.error(\'cannot use own with for-in\');\n
+      }\n
       this.returns = false;\n
     }\n
 \n
@@ -7148,6 +7311,7 @@ define(\'ace/mode/coffee/nodes\', [\'require\', \'exports\', \'module\' , \'ace/
       } else {\n
         this.isChain = elseBody instanceof If;\n
         this.elseBody = this.ensureBlock(elseBody);\n
+        this.elseBody.updateLocationDataIfMissing(elseBody.locationData);\n
       }\n
       return this;\n
     };\n
@@ -7494,6 +7658,12 @@ define(\'ace/mode/coffee/scope\', [\'require\', \'exports\', \'module\' , \'ace/
 
 ]]></string> </value>
         </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
       </dictionary>
     </pickle>
   </record>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-css.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-css.js.xml
index a451dbea6d..5afefcd14e 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-css.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-css.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155570.13</string> </value>
+            <value> <string>ts83646621.72</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>285838</int> </value>
+            <value> <int>286897</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -55,31 +55,30 @@ if (typeof window.window != "undefined" && window.document) {\n
     return;\n
 }\n
 \n
-window.console = {\n
-    log: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    },\n
-    error: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    }\n
+window.console = function() {\n
+    var msgs = Array.prototype.slice.call(arguments, 0);\n
+    postMessage({type: "log", data: msgs});\n
 };\n
+window.console.error =\n
+window.console.warn = \n
+window.console.log =\n
+window.console.trace = window.console;\n
+\n
 window.window = window;\n
 window.ace = window;\n
 \n
 window.normalizeModule = function(parentId, moduleName) {\n
     if (moduleName.indexOf("!") !== -1) {\n
         var chunks = moduleName.split("!");\n
-        return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);\n
+        return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);\n
     }\n
     if (moduleName.charAt(0) == ".") {\n
         var base = parentId.split("/").slice(0, -1).join("/");\n
-        moduleName = base + "/" + moduleName;\n
+        moduleName = (base ? base + "/" : "") + moduleName;\n
         \n
         while(moduleName.indexOf(".") !== -1 && previous != moduleName) {\n
             var previous = moduleName;\n
-            moduleName = moduleName.replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
+            moduleName = moduleName.replace(/^\\.\\//, "").replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
         }\n
     }\n
     \n
@@ -94,9 +93,9 @@ window.require = function(parentId, id) {\n
     if (!id.charAt)\n
         throw new Error("worker.js require() accepts only (parentId, id) as arguments");\n
 \n
-    id = normalizeModule(parentId, id);\n
+    id = window.normalizeModule(parentId, id);\n
 \n
-    var module = require.modules[id];\n
+    var module = window.require.modules[id];\n
     if (module) {\n
         if (!module.initialized) {\n
             module.initialized = true;\n
@@ -106,48 +105,60 @@ window.require = function(parentId, id) {\n
     }\n
     \n
     var chunks = id.split("/");\n
-    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n
+    if (!window.require.tlns)\n
+        return console.log("unable to load " + id);\n
+    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n
     var path = chunks.join("/") + ".js";\n
     \n
-    require.id = id;\n
+    window.require.id = id;\n
     importScripts(path);\n
-    return require(parentId, id);\n
+    return window.require(parentId, id);\n
 };\n
-\n
-require.modules = {};\n
-require.tlns = {};\n
+window.require.modules = {};\n
+window.require.tlns = {};\n
 \n
 window.define = function(id, deps, factory) {\n
     if (arguments.length == 2) {\n
         factory = deps;\n
         if (typeof id != "string") {\n
             deps = id;\n
-            id = require.id;\n
+            id = window.require.id;\n
         }\n
     } else if (arguments.length == 1) {\n
         factory = id;\n
-        id = require.id;\n
+        deps = []\n
+        id = window.require.id;\n
     }\n
+\n
+    if (!deps.length)\n
+        deps = [\'require\', \'exports\', \'module\']\n
 \n
     if (id.indexOf("text!") === 0) \n
         return;\n
     \n
-    var req = function(deps, factory) {\n
-        return require(id, deps, factory);\n
+    var req = function(childId) {\n
+        return window.require(id, childId);\n
     };\n
 \n
-    require.modules[id] = {\n
+    window.require.modules[id] = {\n
+        exports: {},\n
         factory: function() {\n
-            var module = {\n
-                exports: {}\n
-            };\n
-            var returnExports = factory(req, module.exports, module);\n
+            var module = this;\n
+            var returnExports = factory.apply(this, deps.map(function(dep) {\n
+              switch(dep) {\n
+                  case \'require\': return req\n
+                  case \'exports\': return module.exports\n
+                  case \'module\':  return module\n
+                  default:        return req(dep)\n
+              }\n
+            }));\n
             if (returnExports)\n
                 module.exports = returnExports;\n
             return module;\n
         }\n
     };\n
 };\n
+window.define.amd = {}\n
 \n
 window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
     require.tlns = topLevelNamespaces;\n
@@ -155,8 +166,8 @@ window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
 \n
 window.initSender = function initSender() {\n
 \n
-    var EventEmitter = require("ace/lib/event_emitter").EventEmitter;\n
-    var oop = require("ace/lib/oop");\n
+    var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;\n
+    var oop = window.require("ace/lib/oop");\n
     \n
     var Sender = function() {};\n
     \n
@@ -207,158 +218,7 @@ window.onmessage = function(e) {\n
         sender._emit(msg.event, msg.data);\n
     }\n
 };\n
-})(this);\n
-\n
-define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-var EventEmitter = {};\n
-var stopPropagation = function() { this.propagationStopped = true; };\n
-var preventDefault = function() { this.defaultPrevented = true; };\n
-\n
-EventEmitter._emit =\n
-EventEmitter._dispatchEvent = function(eventName, e) {\n
-    this._eventRegistry || (this._eventRegistry = {});\n
-    this._defaultHandlers || (this._defaultHandlers = {});\n
-\n
-    var listeners = this._eventRegistry[eventName] || [];\n
-    var defaultHandler = this._defaultHandlers[eventName];\n
-    if (!listeners.length && !defaultHandler)\n
-        return;\n
-\n
-    if (typeof e != "object" || !e)\n
-        e = {};\n
-\n
-    if (!e.type)\n
-        e.type = eventName;\n
-    if (!e.stopPropagation)\n
-        e.stopPropagation = stopPropagation;\n
-    if (!e.preventDefault)\n
-        e.preventDefault = preventDefault;\n
-\n
-    for (var i=0; i<listeners.length; i++) {\n
-        listeners[i](e, this);\n
-        if (e.propagationStopped)\n
-            break;\n
-    }\n
-    \n
-    if (defaultHandler && !e.defaultPrevented)\n
-        return defaultHandler(e, this);\n
-};\n
-\n
-\n
-EventEmitter._signal = function(eventName, e) {\n
-    var listeners = (this._eventRegistry || {})[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    for (var i=0; i<listeners.length; i++)\n
-        listeners[i](e, this);\n
-};\n
-\n
-EventEmitter.once = function(eventName, callback) {\n
-    var _self = this;\n
-    callback && this.addEventListener(eventName, function newCallback() {\n
-        _self.removeEventListener(eventName, newCallback);\n
-        callback.apply(null, arguments);\n
-    });\n
-};\n
-\n
-\n
-EventEmitter.setDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        handlers = this._defaultHandlers = {_disabled_: {}};\n
-    \n
-    if (handlers[eventName]) {\n
-        var old = handlers[eventName];\n
-        var disabled = handlers._disabled_[eventName];\n
-        if (!disabled)\n
-            handlers._disabled_[eventName] = disabled = [];\n
-        disabled.push(old);\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1) \n
-            disabled.splice(i, 1);\n
-    }\n
-    handlers[eventName] = callback;\n
-};\n
-EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        return;\n
-    var disabled = handlers._disabled_[eventName];\n
-    \n
-    if (handlers[eventName] == callback) {\n
-        var old = handlers[eventName];\n
-        if (disabled)\n
-            this.setDefaultHandler(eventName, disabled.pop());\n
-    } else if (disabled) {\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1)\n
-            disabled.splice(i, 1);\n
-    }\n
-};\n
-\n
-EventEmitter.on =\n
-EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        listeners = this._eventRegistry[eventName] = [];\n
-\n
-    if (listeners.indexOf(callback) == -1)\n
-        listeners[capturing ? "unshift" : "push"](callback);\n
-    return callback;\n
-};\n
-\n
-EventEmitter.off =\n
-EventEmitter.removeListener =\n
-EventEmitter.removeEventListener = function(eventName, callback) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    var index = listeners.indexOf(callback);\n
-    if (index !== -1)\n
-        listeners.splice(index, 1);\n
-};\n
-\n
-EventEmitter.removeAllListeners = function(eventName) {\n
-    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
-};\n
-\n
-exports.EventEmitter = EventEmitter;\n
-\n
-});\n
-\n
-define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-exports.inherits = (function() {\n
-    var tempCtor = function() {};\n
-    return function(ctor, superCtor) {\n
-        tempCtor.prototype = superCtor.prototype;\n
-        ctor.super_ = superCtor.prototype;\n
-        ctor.prototype = new tempCtor();\n
-        ctor.prototype.constructor = ctor;\n
-    };\n
-}());\n
-\n
-exports.mixin = function(obj, mixin) {\n
-    for (var key in mixin) {\n
-        obj[key] = mixin[key];\n
-    }\n
-    return obj;\n
-};\n
-\n
-exports.implement = function(proto, mixin) {\n
-    exports.mixin(proto, mixin);\n
-};\n
-\n
-});\n
+})(this);// https://github.com/kriskowal/es5-shim\n
 \n
 define(\'ace/lib/es5-shim\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
@@ -1113,7 +973,8 @@ oop.inherits(Worker, Mirror);\n
                 row: msg.line - 1,\n
                 column: msg.col - 1,\n
                 text: msg.message,\n
-                type: infoRules[msg.rule.id] ? "info" : msg.type\n
+                type: infoRules[msg.rule.id] ? "info" : msg.type,\n
+                rule: msg.rule.name\n
             }\n
         }));\n
     };\n
@@ -1122,6 +983,32 @@ oop.inherits(Worker, Mirror);\n
 \n
 });\n
 \n
+define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+exports.inherits = (function() {\n
+    var tempCtor = function() {};\n
+    return function(ctor, superCtor) {\n
+        tempCtor.prototype = superCtor.prototype;\n
+        ctor.super_ = superCtor.prototype;\n
+        ctor.prototype = new tempCtor();\n
+        ctor.prototype.constructor = ctor;\n
+    };\n
+}());\n
+\n
+exports.mixin = function(obj, mixin) {\n
+    for (var key in mixin) {\n
+        obj[key] = mixin[key];\n
+    }\n
+    return obj;\n
+};\n
+\n
+exports.implement = function(proto, mixin) {\n
+    exports.mixin(proto, mixin);\n
+};\n
+\n
+});\n
+\n
 define(\'ace/lib/lang\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 \n
@@ -1427,7 +1314,7 @@ var Document = function(text) {\n
     };\n
     this.getTextRange = function(range) {\n
         if (range.start.row == range.end.row) {\n
-            return this.$lines[range.start.row]\n
+            return this.getLine(range.start.row)\n
                 .substring(range.start.column, range.end.column);\n
         }\n
         var lines = this.getLines(range.start.row, range.end.row);\n
@@ -1538,6 +1425,8 @@ var Document = function(text) {\n
         return end;\n
     };\n
     this.remove = function(range) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         range.start = this.$clipPosition(range.start);\n
         range.end = this.$clipPosition(range.end);\n
 \n
@@ -1621,6 +1510,8 @@ var Document = function(text) {\n
         this._emit("change", { data: delta });\n
     };\n
     this.replace = function(range, text) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         if (text.length == 0 && range.isEmpty())\n
             return range.start;\n
         if (text == this.getTextRange(range))\n
@@ -1693,6 +1584,132 @@ var Document = function(text) {\n
 exports.Document = Document;\n
 });\n
 \n
+define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+var EventEmitter = {};\n
+var stopPropagation = function() { this.propagationStopped = true; };\n
+var preventDefault = function() { this.defaultPrevented = true; };\n
+\n
+EventEmitter._emit =\n
+EventEmitter._dispatchEvent = function(eventName, e) {\n
+    this._eventRegistry || (this._eventRegistry = {});\n
+    this._defaultHandlers || (this._defaultHandlers = {});\n
+\n
+    var listeners = this._eventRegistry[eventName] || [];\n
+    var defaultHandler = this._defaultHandlers[eventName];\n
+    if (!listeners.length && !defaultHandler)\n
+        return;\n
+\n
+    if (typeof e != "object" || !e)\n
+        e = {};\n
+\n
+    if (!e.type)\n
+        e.type = eventName;\n
+    if (!e.stopPropagation)\n
+        e.stopPropagation = stopPropagation;\n
+    if (!e.preventDefault)\n
+        e.preventDefault = preventDefault;\n
+\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++) {\n
+        listeners[i](e, this);\n
+        if (e.propagationStopped)\n
+            break;\n
+    }\n
+    \n
+    if (defaultHandler && !e.defaultPrevented)\n
+        return defaultHandler(e, this);\n
+};\n
+\n
+\n
+EventEmitter._signal = function(eventName, e) {\n
+    var listeners = (this._eventRegistry || {})[eventName];\n
+    if (!listeners)\n
+        return;\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++)\n
+        listeners[i](e, this);\n
+};\n
+\n
+EventEmitter.once = function(eventName, callback) {\n
+    var _self = this;\n
+    callback && this.addEventListener(eventName, function newCallback() {\n
+        _self.removeEventListener(eventName, newCallback);\n
+        callback.apply(null, arguments);\n
+    });\n
+};\n
+\n
+\n
+EventEmitter.setDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        handlers = this._defaultHandlers = {_disabled_: {}};\n
+    \n
+    if (handlers[eventName]) {\n
+        var old = handlers[eventName];\n
+        var disabled = handlers._disabled_[eventName];\n
+        if (!disabled)\n
+            handlers._disabled_[eventName] = disabled = [];\n
+        disabled.push(old);\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1) \n
+            disabled.splice(i, 1);\n
+    }\n
+    handlers[eventName] = callback;\n
+};\n
+EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        return;\n
+    var disabled = handlers._disabled_[eventName];\n
+    \n
+    if (handlers[eventName] == callback) {\n
+        var old = handlers[eventName];\n
+        if (disabled)\n
+            this.setDefaultHandler(eventName, disabled.pop());\n
+    } else if (disabled) {\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1)\n
+            disabled.splice(i, 1);\n
+    }\n
+};\n
+\n
+EventEmitter.on =\n
+EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        listeners = this._eventRegistry[eventName] = [];\n
+\n
+    if (listeners.indexOf(callback) == -1)\n
+        listeners[capturing ? "unshift" : "push"](callback);\n
+    return callback;\n
+};\n
+\n
+EventEmitter.off =\n
+EventEmitter.removeListener =\n
+EventEmitter.removeEventListener = function(eventName, callback) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        return;\n
+\n
+    var index = listeners.indexOf(callback);\n
+    if (index !== -1)\n
+        listeners.splice(index, 1);\n
+};\n
+\n
+EventEmitter.removeAllListeners = function(eventName) {\n
+    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
+};\n
+\n
+exports.EventEmitter = EventEmitter;\n
+\n
+});\n
+\n
 define(\'ace/range\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 var comparePoints = function(p1, p2) {\n
@@ -1939,29 +1956,25 @@ var oop = require("./lib/oop");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 \n
 var Anchor = exports.Anchor = function(doc, row, column) {\n
-    this.document = doc;\n
-\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.attach(doc);\n
+    \n
     if (typeof column == "undefined")\n
         this.setPosition(row.row, row.column);\n
     else\n
         this.setPosition(row, column);\n
-\n
-    this.$onChange = this.onChange.bind(this);\n
-    doc.on("change", this.$onChange);\n
 };\n
 \n
 (function() {\n
 \n
     oop.implement(this, EventEmitter);\n
-\n
     this.getPosition = function() {\n
         return this.$clipPositionToDocument(this.row, this.column);\n
     };\n
-\n
     this.getDocument = function() {\n
         return this.document;\n
     };\n
-\n
+    this.$insertRight = false;\n
     this.onChange = function(e) {\n
         var delta = e.data;\n
         var range = delta.range;\n
@@ -1982,7 +1995,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         if (delta.action === "insertText") {\n
             if (start.row === row && start.column <= column) {\n
-                if (start.row === end.row) {\n
+                if (start.column === column && this.$insertRight) {\n
+                } else if (start.row === end.row) {\n
                     column += end.column - start.column;\n
                 } else {\n
                     column -= start.column;\n
@@ -2023,7 +2037,6 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         this.setPosition(row, column, true);\n
     };\n
-\n
     this.setPosition = function(row, column, noClip) {\n
         var pos;\n
         if (noClip) {\n
@@ -2050,10 +2063,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
             value: pos\n
         });\n
     };\n
-\n
     this.detach = function() {\n
         this.document.removeEventListener("change", this.$onChange);\n
     };\n
+    this.attach = function(doc) {\n
+        this.document = doc || this.document;\n
+        this.document.on("change", this.$onChange);\n
+    };\n
     this.$clipPositionToDocument = function(row, column) {\n
         var pos = {};\n
 \n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-javascript.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-javascript.js.xml
index ed5abf0688..84809ba443 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-javascript.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-javascript.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155570.31</string> </value>
+            <value> <string>ts83646620.53</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>163954</int> </value>
+            <value> <int>262743</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -55,31 +55,30 @@ if (typeof window.window != "undefined" && window.document) {\n
     return;\n
 }\n
 \n
-window.console = {\n
-    log: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    },\n
-    error: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    }\n
+window.console = function() {\n
+    var msgs = Array.prototype.slice.call(arguments, 0);\n
+    postMessage({type: "log", data: msgs});\n
 };\n
+window.console.error =\n
+window.console.warn = \n
+window.console.log =\n
+window.console.trace = window.console;\n
+\n
 window.window = window;\n
 window.ace = window;\n
 \n
 window.normalizeModule = function(parentId, moduleName) {\n
     if (moduleName.indexOf("!") !== -1) {\n
         var chunks = moduleName.split("!");\n
-        return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);\n
+        return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);\n
     }\n
     if (moduleName.charAt(0) == ".") {\n
         var base = parentId.split("/").slice(0, -1).join("/");\n
-        moduleName = base + "/" + moduleName;\n
+        moduleName = (base ? base + "/" : "") + moduleName;\n
         \n
         while(moduleName.indexOf(".") !== -1 && previous != moduleName) {\n
             var previous = moduleName;\n
-            moduleName = moduleName.replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
+            moduleName = moduleName.replace(/^\\.\\//, "").replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
         }\n
     }\n
     \n
@@ -94,9 +93,9 @@ window.require = function(parentId, id) {\n
     if (!id.charAt)\n
         throw new Error("worker.js require() accepts only (parentId, id) as arguments");\n
 \n
-    id = normalizeModule(parentId, id);\n
+    id = window.normalizeModule(parentId, id);\n
 \n
-    var module = require.modules[id];\n
+    var module = window.require.modules[id];\n
     if (module) {\n
         if (!module.initialized) {\n
             module.initialized = true;\n
@@ -106,48 +105,60 @@ window.require = function(parentId, id) {\n
     }\n
     \n
     var chunks = id.split("/");\n
-    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n
+    if (!window.require.tlns)\n
+        return console.log("unable to load " + id);\n
+    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n
     var path = chunks.join("/") + ".js";\n
     \n
-    require.id = id;\n
+    window.require.id = id;\n
     importScripts(path);\n
-    return require(parentId, id);\n
+    return window.require(parentId, id);\n
 };\n
-\n
-require.modules = {};\n
-require.tlns = {};\n
+window.require.modules = {};\n
+window.require.tlns = {};\n
 \n
 window.define = function(id, deps, factory) {\n
     if (arguments.length == 2) {\n
         factory = deps;\n
         if (typeof id != "string") {\n
             deps = id;\n
-            id = require.id;\n
+            id = window.require.id;\n
         }\n
     } else if (arguments.length == 1) {\n
         factory = id;\n
-        id = require.id;\n
+        deps = []\n
+        id = window.require.id;\n
     }\n
+\n
+    if (!deps.length)\n
+        deps = [\'require\', \'exports\', \'module\']\n
 \n
     if (id.indexOf("text!") === 0) \n
         return;\n
     \n
-    var req = function(deps, factory) {\n
-        return require(id, deps, factory);\n
+    var req = function(childId) {\n
+        return window.require(id, childId);\n
     };\n
 \n
-    require.modules[id] = {\n
+    window.require.modules[id] = {\n
+        exports: {},\n
         factory: function() {\n
-            var module = {\n
-                exports: {}\n
-            };\n
-            var returnExports = factory(req, module.exports, module);\n
+            var module = this;\n
+            var returnExports = factory.apply(this, deps.map(function(dep) {\n
+              switch(dep) {\n
+                  case \'require\': return req\n
+                  case \'exports\': return module.exports\n
+                  case \'module\':  return module\n
+                  default:        return req(dep)\n
+              }\n
+            }));\n
             if (returnExports)\n
                 module.exports = returnExports;\n
             return module;\n
         }\n
     };\n
 };\n
+window.define.amd = {}\n
 \n
 window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
     require.tlns = topLevelNamespaces;\n
@@ -155,8 +166,8 @@ window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
 \n
 window.initSender = function initSender() {\n
 \n
-    var EventEmitter = require("ace/lib/event_emitter").EventEmitter;\n
-    var oop = require("ace/lib/oop");\n
+    var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;\n
+    var oop = window.require("ace/lib/oop");\n
     \n
     var Sender = function() {};\n
     \n
@@ -207,158 +218,7 @@ window.onmessage = function(e) {\n
         sender._emit(msg.event, msg.data);\n
     }\n
 };\n
-})(this);\n
-\n
-define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-var EventEmitter = {};\n
-var stopPropagation = function() { this.propagationStopped = true; };\n
-var preventDefault = function() { this.defaultPrevented = true; };\n
-\n
-EventEmitter._emit =\n
-EventEmitter._dispatchEvent = function(eventName, e) {\n
-    this._eventRegistry || (this._eventRegistry = {});\n
-    this._defaultHandlers || (this._defaultHandlers = {});\n
-\n
-    var listeners = this._eventRegistry[eventName] || [];\n
-    var defaultHandler = this._defaultHandlers[eventName];\n
-    if (!listeners.length && !defaultHandler)\n
-        return;\n
-\n
-    if (typeof e != "object" || !e)\n
-        e = {};\n
-\n
-    if (!e.type)\n
-        e.type = eventName;\n
-    if (!e.stopPropagation)\n
-        e.stopPropagation = stopPropagation;\n
-    if (!e.preventDefault)\n
-        e.preventDefault = preventDefault;\n
-\n
-    for (var i=0; i<listeners.length; i++) {\n
-        listeners[i](e, this);\n
-        if (e.propagationStopped)\n
-            break;\n
-    }\n
-    \n
-    if (defaultHandler && !e.defaultPrevented)\n
-        return defaultHandler(e, this);\n
-};\n
-\n
-\n
-EventEmitter._signal = function(eventName, e) {\n
-    var listeners = (this._eventRegistry || {})[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    for (var i=0; i<listeners.length; i++)\n
-        listeners[i](e, this);\n
-};\n
-\n
-EventEmitter.once = function(eventName, callback) {\n
-    var _self = this;\n
-    callback && this.addEventListener(eventName, function newCallback() {\n
-        _self.removeEventListener(eventName, newCallback);\n
-        callback.apply(null, arguments);\n
-    });\n
-};\n
-\n
-\n
-EventEmitter.setDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        handlers = this._defaultHandlers = {_disabled_: {}};\n
-    \n
-    if (handlers[eventName]) {\n
-        var old = handlers[eventName];\n
-        var disabled = handlers._disabled_[eventName];\n
-        if (!disabled)\n
-            handlers._disabled_[eventName] = disabled = [];\n
-        disabled.push(old);\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1) \n
-            disabled.splice(i, 1);\n
-    }\n
-    handlers[eventName] = callback;\n
-};\n
-EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        return;\n
-    var disabled = handlers._disabled_[eventName];\n
-    \n
-    if (handlers[eventName] == callback) {\n
-        var old = handlers[eventName];\n
-        if (disabled)\n
-            this.setDefaultHandler(eventName, disabled.pop());\n
-    } else if (disabled) {\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1)\n
-            disabled.splice(i, 1);\n
-    }\n
-};\n
-\n
-EventEmitter.on =\n
-EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        listeners = this._eventRegistry[eventName] = [];\n
-\n
-    if (listeners.indexOf(callback) == -1)\n
-        listeners[capturing ? "unshift" : "push"](callback);\n
-    return callback;\n
-};\n
-\n
-EventEmitter.off =\n
-EventEmitter.removeListener =\n
-EventEmitter.removeEventListener = function(eventName, callback) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    var index = listeners.indexOf(callback);\n
-    if (index !== -1)\n
-        listeners.splice(index, 1);\n
-};\n
-\n
-EventEmitter.removeAllListeners = function(eventName) {\n
-    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
-};\n
-\n
-exports.EventEmitter = EventEmitter;\n
-\n
-});\n
-\n
-define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-exports.inherits = (function() {\n
-    var tempCtor = function() {};\n
-    return function(ctor, superCtor) {\n
-        tempCtor.prototype = superCtor.prototype;\n
-        ctor.super_ = superCtor.prototype;\n
-        ctor.prototype = new tempCtor();\n
-        ctor.prototype.constructor = ctor;\n
-    };\n
-}());\n
-\n
-exports.mixin = function(obj, mixin) {\n
-    for (var key in mixin) {\n
-        obj[key] = mixin[key];\n
-    }\n
-    return obj;\n
-};\n
-\n
-exports.implement = function(proto, mixin) {\n
-    exports.mixin(proto, mixin);\n
-};\n
-\n
-});\n
+})(this);// https://github.com/kriskowal/es5-shim\n
 \n
 define(\'ace/lib/es5-shim\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
@@ -1106,8 +966,8 @@ oop.inherits(JavaScriptWorker, Mirror);\n
 (function() {\n
     this.setOptions = function(options) {\n
         this.options = options || {\n
-            es5: true,\n
             esnext: true,\n
+            moz: true,\n
             devel: true,\n
             browser: true,\n
             node: true,\n
@@ -1204,6 +1064,32 @@ oop.inherits(JavaScriptWorker, Mirror);\n
 }).call(JavaScriptWorker.prototype);\n
 \n
 });\n
+\n
+define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+exports.inherits = (function() {\n
+    var tempCtor = function() {};\n
+    return function(ctor, superCtor) {\n
+        tempCtor.prototype = superCtor.prototype;\n
+        ctor.super_ = superCtor.prototype;\n
+        ctor.prototype = new tempCtor();\n
+        ctor.prototype.constructor = ctor;\n
+    };\n
+}());\n
+\n
+exports.mixin = function(obj, mixin) {\n
+    for (var key in mixin) {\n
+        obj[key] = mixin[key];\n
+    }\n
+    return obj;\n
+};\n
+\n
+exports.implement = function(proto, mixin) {\n
+    exports.mixin(proto, mixin);\n
+};\n
+\n
+});\n
 define(\'ace/worker/mirror\', [\'require\', \'exports\', \'module\' , \'ace/document\', \'ace/lib/lang\'], function(require, exports, module) {\n
 \n
 \n
@@ -1333,7 +1219,7 @@ var Document = function(text) {\n
     };\n
     this.getTextRange = function(range) {\n
         if (range.start.row == range.end.row) {\n
-            return this.$lines[range.start.row]\n
+            return this.getLine(range.start.row)\n
                 .substring(range.start.column, range.end.column);\n
         }\n
         var lines = this.getLines(range.start.row, range.end.row);\n
@@ -1444,6 +1330,8 @@ var Document = function(text) {\n
         return end;\n
     };\n
     this.remove = function(range) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         range.start = this.$clipPosition(range.start);\n
         range.end = this.$clipPosition(range.end);\n
 \n
@@ -1527,6 +1415,8 @@ var Document = function(text) {\n
         this._emit("change", { data: delta });\n
     };\n
     this.replace = function(range, text) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         if (text.length == 0 && range.isEmpty())\n
             return range.start;\n
         if (text == this.getTextRange(range))\n
@@ -1599,45 +1489,171 @@ var Document = function(text) {\n
 exports.Document = Document;\n
 });\n
 \n
-define(\'ace/range\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
-var comparePoints = function(p1, p2) {\n
-    return p1.row - p2.row || p1.column - p2.column;\n
-};\n
-var Range = function(startRow, startColumn, endRow, endColumn) {\n
-    this.start = {\n
-        row: startRow,\n
-        column: startColumn\n
-    };\n
 \n
-    this.end = {\n
-        row: endRow,\n
-        column: endColumn\n
-    };\n
+var EventEmitter = {};\n
+var stopPropagation = function() { this.propagationStopped = true; };\n
+var preventDefault = function() { this.defaultPrevented = true; };\n
+\n
+EventEmitter._emit =\n
+EventEmitter._dispatchEvent = function(eventName, e) {\n
+    this._eventRegistry || (this._eventRegistry = {});\n
+    this._defaultHandlers || (this._defaultHandlers = {});\n
+\n
+    var listeners = this._eventRegistry[eventName] || [];\n
+    var defaultHandler = this._defaultHandlers[eventName];\n
+    if (!listeners.length && !defaultHandler)\n
+        return;\n
+\n
+    if (typeof e != "object" || !e)\n
+        e = {};\n
+\n
+    if (!e.type)\n
+        e.type = eventName;\n
+    if (!e.stopPropagation)\n
+        e.stopPropagation = stopPropagation;\n
+    if (!e.preventDefault)\n
+        e.preventDefault = preventDefault;\n
+\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++) {\n
+        listeners[i](e, this);\n
+        if (e.propagationStopped)\n
+            break;\n
+    }\n
+    \n
+    if (defaultHandler && !e.defaultPrevented)\n
+        return defaultHandler(e, this);\n
 };\n
 \n
-(function() {\n
-    this.isEqual = function(range) {\n
-        return this.start.row === range.start.row &&\n
-            this.end.row === range.end.row &&\n
-            this.start.column === range.start.column &&\n
-            this.end.column === range.end.column;\n
-    };\n
-    this.toString = function() {\n
-        return ("Range: [" + this.start.row + "/" + this.start.column +\n
-            "] -> [" + this.end.row + "/" + this.end.column + "]");\n
-    };\n
 \n
-    this.contains = function(row, column) {\n
-        return this.compare(row, column) == 0;\n
-    };\n
-    this.compareRange = function(range) {\n
-        var cmp,\n
-            end = range.end,\n
-            start = range.start;\n
+EventEmitter._signal = function(eventName, e) {\n
+    var listeners = (this._eventRegistry || {})[eventName];\n
+    if (!listeners)\n
+        return;\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++)\n
+        listeners[i](e, this);\n
+};\n
 \n
-        cmp = this.compare(end.row, end.column);\n
-        if (cmp == 1) {\n
+EventEmitter.once = function(eventName, callback) {\n
+    var _self = this;\n
+    callback && this.addEventListener(eventName, function newCallback() {\n
+        _self.removeEventListener(eventName, newCallback);\n
+        callback.apply(null, arguments);\n
+    });\n
+};\n
+\n
+\n
+EventEmitter.setDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        handlers = this._defaultHandlers = {_disabled_: {}};\n
+    \n
+    if (handlers[eventName]) {\n
+        var old = handlers[eventName];\n
+        var disabled = handlers._disabled_[eventName];\n
+        if (!disabled)\n
+            handlers._disabled_[eventName] = disabled = [];\n
+        disabled.push(old);\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1) \n
+            disabled.splice(i, 1);\n
+    }\n
+    handlers[eventName] = callback;\n
+};\n
+EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        return;\n
+    var disabled = handlers._disabled_[eventName];\n
+    \n
+    if (handlers[eventName] == callback) {\n
+        var old = handlers[eventName];\n
+        if (disabled)\n
+            this.setDefaultHandler(eventName, disabled.pop());\n
+    } else if (disabled) {\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1)\n
+            disabled.splice(i, 1);\n
+    }\n
+};\n
+\n
+EventEmitter.on =\n
+EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        listeners = this._eventRegistry[eventName] = [];\n
+\n
+    if (listeners.indexOf(callback) == -1)\n
+        listeners[capturing ? "unshift" : "push"](callback);\n
+    return callback;\n
+};\n
+\n
+EventEmitter.off =\n
+EventEmitter.removeListener =\n
+EventEmitter.removeEventListener = function(eventName, callback) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        return;\n
+\n
+    var index = listeners.indexOf(callback);\n
+    if (index !== -1)\n
+        listeners.splice(index, 1);\n
+};\n
+\n
+EventEmitter.removeAllListeners = function(eventName) {\n
+    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
+};\n
+\n
+exports.EventEmitter = EventEmitter;\n
+\n
+});\n
+\n
+define(\'ace/range\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+var comparePoints = function(p1, p2) {\n
+    return p1.row - p2.row || p1.column - p2.column;\n
+};\n
+var Range = function(startRow, startColumn, endRow, endColumn) {\n
+    this.start = {\n
+        row: startRow,\n
+        column: startColumn\n
+    };\n
+\n
+    this.end = {\n
+        row: endRow,\n
+        column: endColumn\n
+    };\n
+};\n
+\n
+(function() {\n
+    this.isEqual = function(range) {\n
+        return this.start.row === range.start.row &&\n
+            this.end.row === range.end.row &&\n
+            this.start.column === range.start.column &&\n
+            this.end.column === range.end.column;\n
+    };\n
+    this.toString = function() {\n
+        return ("Range: [" + this.start.row + "/" + this.start.column +\n
+            "] -> [" + this.end.row + "/" + this.end.column + "]");\n
+    };\n
+\n
+    this.contains = function(row, column) {\n
+        return this.compare(row, column) == 0;\n
+    };\n
+    this.compareRange = function(range) {\n
+        var cmp,\n
+            end = range.end,\n
+            start = range.start;\n
+\n
+        cmp = this.compare(end.row, end.column);\n
+        if (cmp == 1) {\n
             cmp = this.compare(start.row, start.column);\n
             if (cmp == 1) {\n
                 return 2;\n
@@ -1845,29 +1861,25 @@ var oop = require("./lib/oop");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 \n
 var Anchor = exports.Anchor = function(doc, row, column) {\n
-    this.document = doc;\n
-\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.attach(doc);\n
+    \n
     if (typeof column == "undefined")\n
         this.setPosition(row.row, row.column);\n
     else\n
         this.setPosition(row, column);\n
-\n
-    this.$onChange = this.onChange.bind(this);\n
-    doc.on("change", this.$onChange);\n
 };\n
 \n
 (function() {\n
 \n
     oop.implement(this, EventEmitter);\n
-\n
     this.getPosition = function() {\n
         return this.$clipPositionToDocument(this.row, this.column);\n
     };\n
-\n
     this.getDocument = function() {\n
         return this.document;\n
     };\n
-\n
+    this.$insertRight = false;\n
     this.onChange = function(e) {\n
         var delta = e.data;\n
         var range = delta.range;\n
@@ -1888,7 +1900,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         if (delta.action === "insertText") {\n
             if (start.row === row && start.column <= column) {\n
-                if (start.row === end.row) {\n
+                if (start.column === column && this.$insertRight) {\n
+                } else if (start.row === end.row) {\n
                     column += end.column - start.column;\n
                 } else {\n
                     column -= start.column;\n
@@ -1929,7 +1942,6 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         this.setPosition(row, column, true);\n
     };\n
-\n
     this.setPosition = function(row, column, noClip) {\n
         var pos;\n
         if (noClip) {\n
@@ -1956,10 +1968,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
             value: pos\n
         });\n
     };\n
-\n
     this.detach = function() {\n
         this.document.removeEventListener("change", this.$onChange);\n
     };\n
+    this.attach = function(doc) {\n
+        this.document = doc || this.document;\n
+        this.document.on("change", this.$onChange);\n
+    };\n
     this.$clipPositionToDocument = function(row, column) {\n
         var pos = {};\n
 \n
@@ -2163,645 +2178,1900 @@ exports.delayedCall = function(fcn, defaultTimeout) {\n
 };\n
 });\n
 define(\'ace/mode/javascript/jshint\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+require = null;\n
+require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module \'"+o+"\'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({\n
+9:[function (req,module,exports){\n
+        ["log", "info", "warn", "error", \n
+        "time","timeEnd", "trace", "dir", "assert"\n
+        ].forEach(function(x) {exports[x] = nop;});\n
+        function nop() {}\n
+    },{}],\n
+1:[function(req,module,exports){\n
 \n
-var JSHINT = (function () {\n
-\t\n
-\n
-\tvar anonname,\t\t// The guessed name for anonymous functions.\n
-\n
-\t\tbang = {\n
-\t\t\t"<"  : true,\n
-\t\t\t"<=" : true,\n
-\t\t\t"==" : true,\n
-\t\t\t"===": true,\n
-\t\t\t"!==": true,\n
-\t\t\t"!=" : true,\n
-\t\t\t">"  : true,\n
-\t\t\t">=" : true,\n
-\t\t\t"+"  : true,\n
-\t\t\t"-"  : true,\n
-\t\t\t"*"  : true,\n
-\t\t\t"/"  : true,\n
-\t\t\t"%"  : true\n
-\t\t},\n
-\t\tboolOptions = {\n
-\t\t\tasi\t\t\t: true, // if automatic semicolon insertion should be tolerated\n
-\t\t\tbitwise\t\t: true, // if bitwise operators should not be allowed\n
-\t\t\tboss\t\t: true, // if advanced usage of assignments should be allowed\n
-\t\t\tbrowser\t\t: true, // if the standard browser globals should be predefined\n
-\t\t\tcamelcase\t: true, // if identifiers should be required in camel case\n
-\t\t\tcouch\t\t: true, // if CouchDB globals should be predefined\n
-\t\t\tcurly\t\t: true, // if curly braces around all blocks should be required\n
-\t\t\tdebug\t\t: true, // if debugger statements should be allowed\n
-\t\t\tdevel\t\t: true, // if logging globals should be predefined (console,\n
-\t\t\tdojo\t\t: true, // if Dojo Toolkit globals should be predefined\n
-\t\t\teqeqeq\t\t: true, // if === should be required\n
-\t\t\teqnull\t\t: true, // if == null comparisons should be tolerated\n
-\t\t\tes5\t\t\t: true, // if ES5 syntax should be allowed\n
-\t\t\tesnext\t\t: true, // if es.next specific syntax should be allowed\n
-\t\t\tevil\t\t: true, // if eval should be allowed\n
-\t\t\texpr\t\t: true, // if ExpressionStatement should be allowed as Programs\n
-\t\t\tforin\t\t: true, // if for in statements must filter\n
-\t\t\tfuncscope\t: true, // if only function scope should be used for scope tests\n
-\t\t\tglobalstrict: true, // if global  should be allowed (also\n
-\t\t\timmed\t\t: true, // if immediate invocations must be wrapped in parens\n
-\t\t\titerator\t: true, // if the `__iterator__` property should be allowed\n
-\t\t\tjquery\t\t: true, // if jQuery globals should be predefined\n
-\t\t\tlastsemic\t: true, // if semicolons may be ommitted for the trailing\n
-\t\t\tlatedef\t\t: true, // if the use before definition should not be tolerated\n
-\t\t\tlaxbreak\t: true, // if line breaks should not be checked\n
-\t\t\tlaxcomma\t: true, // if line breaks should not be checked around commas\n
-\t\t\tloopfunc\t: true, // if functions should be allowed to be defined within\n
-\t\t\tmootools\t: true, // if MooTools globals should be predefined\n
-\t\t\tmultistr\t: true, // allow multiline strings\n
-\t\t\tnewcap\t\t: true, // if constructor names must be capitalized\n
-\t\t\tnoarg\t\t: true, // if arguments.caller and arguments.callee should be\n
-\t\t\tnode\t\t: true, // if the Node.js environment globals should be\n
-\t\t\tnoempty\t\t: true, // if empty blocks should be disallowed\n
-\t\t\tnonew\t\t: true, // if using `new` for side-effects should be disallowed\n
-\t\t\tnonstandard : true, // if non-standard (but widely adopted) globals should\n
-\t\t\tnomen\t\t: true, // if names should be checked\n
-\t\t\tonevar\t\t: true, // if only one var statement per function should be\n
-\t\t\tonecase\t\t: true, // if one case switch statements should be allowed\n
-\t\t\tpassfail\t: true, // if the scan should stop on first error\n
-\t\t\tplusplus\t: true, // if increment/decrement should not be allowed\n
-\t\t\tproto\t\t: true, // if the `__proto__` property should be allowed\n
-\t\t\tprototypejs : true, // if Prototype and Scriptaculous globals should be\n
-\t\t\tregexdash\t: true, // if unescaped first/last dash (-) inside brackets\n
-\t\t\tregexp\t\t: true, // if the . should not be allowed in regexp literals\n
-\t\t\trhino\t\t: true, // if the Rhino environment globals should be predefined\n
-\t\t\tundef\t\t: true, // if variables should be declared before used\n
-\t\t\tunused\t\t: true, // if variables should be always used\n
-\t\t\tscripturl\t: true, // if script-targeted URLs should be tolerated\n
-\t\t\tshadow\t\t: true, // if variable shadowing should be tolerated\n
-\t\t\tsmarttabs\t: true, // if smarttabs should be tolerated\n
-\t\t\tstrict\t\t: true, // require the  pragma\n
-\t\t\tsub\t\t\t: true, // if all forms of subscript notation are tolerated\n
-\t\t\tsupernew\t: true, // if `new function () { ... };` and `new Object;`\n
-\t\t\ttrailing\t: true, // if trailing whitespace rules apply\n
-\t\t\tvalidthis\t: true, // if \'this\' inside a non-constructor function is valid.\n
-\t\t\twithstmt\t: true, // if with statements should be allowed\n
-\t\t\twhite\t\t: true, // if strict whitespace rules apply\n
-\t\t\tworker\t\t: true, // if Web Worker script symbols should be allowed\n
-\t\t\twsh\t\t\t: true, // if the Windows Scripting Host environment globals\n
-\t\t\tyui\t\t\t: true\t// YUI variables should be predefined\n
-\t\t},\n
-\t\tvalOptions = {\n
-\t\t\tmaxlen\t\t : false,\n
-\t\t\tindent\t\t : false,\n
-\t\t\tmaxerr\t\t : false,\n
-\t\t\tpredef\t\t : false,\n
-\t\t\tquotmark\t : false, //\'single\'|\'double\'|true\n
-\t\t\tscope\t\t : false,\n
-\t\t\tmaxstatements: false, // {int} max statements per function\n
-\t\t\tmaxdepth\t : false, // {int} max nested block depth per function\n
-\t\t\tmaxparams\t : false, // {int} max params per function\n
-\t\t\tmaxcomplexity: false  // {int} max cyclomatic complexity per function\n
-\t\t},\n
-\t\tinvertedOptions = {\n
-\t\t\tbitwise\t\t: true,\n
-\t\t\tforin\t\t: true,\n
-\t\t\tnewcap\t\t: true,\n
-\t\t\tnomen\t\t: true,\n
-\t\t\tplusplus\t: true,\n
-\t\t\tregexp\t\t: true,\n
-\t\t\tundef\t\t: true,\n
-\t\t\twhite\t\t: true,\n
-\t\t\teqeqeq\t\t: true,\n
-\t\t\tonevar\t\t: true\n
-\t\t},\n
-\t\trenamedOptions = {\n
-\t\t\teqeq\t\t: "eqeqeq",\n
-\t\t\tvars\t\t: "onevar",\n
-\t\t\twindows\t\t: "wsh"\n
-\t\t},\n
-\t\tbrowser = {\n
-\t\t\tArrayBuffer\t\t\t\t :\tfalse,\n
-\t\t\tArrayBufferView\t\t\t :\tfalse,\n
-\t\t\tAudio\t\t\t\t\t :\tfalse,\n
-\t\t\tBlob\t\t\t\t\t :\tfalse,\n
-\t\t\taddEventListener\t\t :\tfalse,\n
-\t\t\tapplicationCache\t\t :\tfalse,\n
-\t\t\tatob\t\t\t\t\t :\tfalse,\n
-\t\t\tblur\t\t\t\t\t :\tfalse,\n
-\t\t\tbtoa\t\t\t\t\t :\tfalse,\n
-\t\t\tclearInterval\t\t\t :\tfalse,\n
-\t\t\tclearTimeout\t\t\t :\tfalse,\n
-\t\t\tclose\t\t\t\t\t :\tfalse,\n
-\t\t\tclosed\t\t\t\t\t :\tfalse,\n
-\t\t\tDataView\t\t\t\t :\tfalse,\n
-\t\t\tDOMParser\t\t\t\t :\tfalse,\n
-\t\t\tdefaultStatus\t\t\t :\tfalse,\n
-\t\t\tdocument\t\t\t\t :\tfalse,\n
-\t\t\tevent\t\t\t\t\t :\tfalse,\n
-\t\t\tFileReader\t\t\t\t :\tfalse,\n
-\t\t\tFloat32Array\t\t\t :\tfalse,\n
-\t\t\tFloat64Array\t\t\t :\tfalse,\n
-\t\t\tFormData\t\t\t\t :\tfalse,\n
-\t\t\tfocus\t\t\t\t\t :\tfalse,\n
-\t\t\tframes\t\t\t\t\t :\tfalse,\n
-\t\t\tgetComputedStyle\t\t :\tfalse,\n
-\t\t\tHTMLElement\t\t\t\t :\tfalse,\n
-\t\t\tHTMLAnchorElement\t\t :\tfalse,\n
-\t\t\tHTMLBaseElement\t\t\t :\tfalse,\n
-\t\t\tHTMLBlockquoteElement\t :\tfalse,\n
-\t\t\tHTMLBodyElement\t\t\t :\tfalse,\n
-\t\t\tHTMLBRElement\t\t\t :\tfalse,\n
-\t\t\tHTMLButtonElement\t\t :\tfalse,\n
-\t\t\tHTMLCanvasElement\t\t :\tfalse,\n
-\t\t\tHTMLDirectoryElement\t :\tfalse,\n
-\t\t\tHTMLDivElement\t\t\t :\tfalse,\n
-\t\t\tHTMLDListElement\t\t :\tfalse,\n
-\t\t\tHTMLFieldSetElement\t\t :\tfalse,\n
-\t\t\tHTMLFontElement\t\t\t :\tfalse,\n
-\t\t\tHTMLFormElement\t\t\t :\tfalse,\n
-\t\t\tHTMLFrameElement\t\t :\tfalse,\n
-\t\t\tHTMLFrameSetElement\t\t :\tfalse,\n
-\t\t\tHTMLHeadElement\t\t\t :\tfalse,\n
-\t\t\tHTMLHeadingElement\t\t :\tfalse,\n
-\t\t\tHTMLHRElement\t\t\t :\tfalse,\n
-\t\t\tHTMLHtmlElement\t\t\t :\tfalse,\n
-\t\t\tHTMLIFrameElement\t\t :\tfalse,\n
-\t\t\tHTMLImageElement\t\t :\tfalse,\n
-\t\t\tHTMLInputElement\t\t :\tfalse,\n
-\t\t\tHTMLIsIndexElement\t\t :\tfalse,\n
-\t\t\tHTMLLabelElement\t\t :\tfalse,\n
-\t\t\tHTMLLayerElement\t\t :\tfalse,\n
-\t\t\tHTMLLegendElement\t\t :\tfalse,\n
-\t\t\tHTMLLIElement\t\t\t :\tfalse,\n
-\t\t\tHTMLLinkElement\t\t\t :\tfalse,\n
-\t\t\tHTMLMapElement\t\t\t :\tfalse,\n
-\t\t\tHTMLMenuElement\t\t\t :\tfalse,\n
-\t\t\tHTMLMetaElement\t\t\t :\tfalse,\n
-\t\t\tHTMLModElement\t\t\t :\tfalse,\n
-\t\t\tHTMLObjectElement\t\t :\tfalse,\n
-\t\t\tHTMLOListElement\t\t :\tfalse,\n
-\t\t\tHTMLOptGroupElement\t\t :\tfalse,\n
-\t\t\tHTMLOptionElement\t\t :\tfalse,\n
-\t\t\tHTMLParagraphElement\t :\tfalse,\n
-\t\t\tHTMLParamElement\t\t :\tfalse,\n
-\t\t\tHTMLPreElement\t\t\t :\tfalse,\n
-\t\t\tHTMLQuoteElement\t\t :\tfalse,\n
-\t\t\tHTMLScriptElement\t\t :\tfalse,\n
-\t\t\tHTMLSelectElement\t\t :\tfalse,\n
-\t\t\tHTMLStyleElement\t\t :\tfalse,\n
-\t\t\tHTMLTableCaptionElement  :\tfalse,\n
-\t\t\tHTMLTableCellElement\t :\tfalse,\n
-\t\t\tHTMLTableColElement\t\t :\tfalse,\n
-\t\t\tHTMLTableElement\t\t :\tfalse,\n
-\t\t\tHTMLTableRowElement\t\t :\tfalse,\n
-\t\t\tHTMLTableSectionElement  :\tfalse,\n
-\t\t\tHTMLTextAreaElement\t\t :\tfalse,\n
-\t\t\tHTMLTitleElement\t\t :\tfalse,\n
-\t\t\tHTMLUListElement\t\t :\tfalse,\n
-\t\t\tHTMLVideoElement\t\t :\tfalse,\n
-\t\t\thistory\t\t\t\t\t :\tfalse,\n
-\t\t\tInt16Array\t\t\t\t :\tfalse,\n
-\t\t\tInt32Array\t\t\t\t :\tfalse,\n
-\t\t\tInt8Array\t\t\t\t :\tfalse,\n
-\t\t\tImage\t\t\t\t\t :\tfalse,\n
-\t\t\tlength\t\t\t\t\t :\tfalse,\n
-\t\t\tlocalStorage\t\t\t :\tfalse,\n
-\t\t\tlocation\t\t\t\t :\tfalse,\n
-\t\t\tMessageChannel\t\t\t :\tfalse,\n
-\t\t\tMessageEvent\t\t\t :\tfalse,\n
-\t\t\tMessagePort\t\t\t\t :\tfalse,\n
-\t\t\tmoveBy\t\t\t\t\t :\tfalse,\n
-\t\t\tmoveTo\t\t\t\t\t :\tfalse,\n
-\t\t\tMutationObserver\t\t :\tfalse,\n
-\t\t\tname\t\t\t\t\t :\tfalse,\n
-\t\t\tNode\t\t\t\t\t :\tfalse,\n
-\t\t\tNodeFilter\t\t\t\t :\tfalse,\n
-\t\t\tnavigator\t\t\t\t :\tfalse,\n
-\t\t\tonbeforeunload\t\t\t :\ttrue,\n
-\t\t\tonblur\t\t\t\t\t :\ttrue,\n
-\t\t\tonerror\t\t\t\t\t :\ttrue,\n
-\t\t\tonfocus\t\t\t\t\t :\ttrue,\n
-\t\t\tonload\t\t\t\t\t :\ttrue,\n
-\t\t\tonresize\t\t\t\t :\ttrue,\n
-\t\t\tonunload\t\t\t\t :\ttrue,\n
-\t\t\topen\t\t\t\t\t :\tfalse,\n
-\t\t\topenDatabase\t\t\t :\tfalse,\n
-\t\t\topener\t\t\t\t\t :\tfalse,\n
-\t\t\tOption\t\t\t\t\t :\tfalse,\n
-\t\t\tparent\t\t\t\t\t :\tfalse,\n
-\t\t\tprint\t\t\t\t\t :\tfalse,\n
-\t\t\tremoveEventListener\t\t :\tfalse,\n
-\t\t\tresizeBy\t\t\t\t :\tfalse,\n
-\t\t\tresizeTo\t\t\t\t :\tfalse,\n
-\t\t\tscreen\t\t\t\t\t :\tfalse,\n
-\t\t\tscroll\t\t\t\t\t :\tfalse,\n
-\t\t\tscrollBy\t\t\t\t :\tfalse,\n
-\t\t\tscrollTo\t\t\t\t :\tfalse,\n
-\t\t\tsessionStorage\t\t\t :\tfalse,\n
-\t\t\tsetInterval\t\t\t\t :\tfalse,\n
-\t\t\tsetTimeout\t\t\t\t :\tfalse,\n
-\t\t\tSharedWorker\t\t\t :\tfalse,\n
-\t\t\tstatus\t\t\t\t\t :\tfalse,\n
-\t\t\ttop\t\t\t\t\t\t :\tfalse,\n
-\t\t\tUint16Array\t\t\t\t :\tfalse,\n
-\t\t\tUint32Array\t\t\t\t :\tfalse,\n
-\t\t\tUint8Array\t\t\t\t :\tfalse,\n
-\t\t\tWebSocket\t\t\t\t :\tfalse,\n
-\t\t\twindow\t\t\t\t\t :\tfalse,\n
-\t\t\tWorker\t\t\t\t\t :\tfalse,\n
-\t\t\tXMLHttpRequest\t\t\t :\tfalse,\n
-\t\t\tXMLSerializer\t\t\t :\tfalse,\n
-\t\t\tXPathEvaluator\t\t\t :\tfalse,\n
-\t\t\tXPathException\t\t\t :\tfalse,\n
-\t\t\tXPathExpression\t\t\t :\tfalse,\n
-\t\t\tXPathNamespace\t\t\t :\tfalse,\n
-\t\t\tXPathNSResolver\t\t\t :\tfalse,\n
-\t\t\tXPathResult\t\t\t\t :\tfalse\n
-\t\t},\n
-\n
-\t\tcouch = {\n
-\t\t\t"require" : false,\n
-\t\t\trespond   : false,\n
-\t\t\tgetRow\t  : false,\n
-\t\t\temit\t  : false,\n
-\t\t\tsend\t  : false,\n
-\t\t\tstart\t  : false,\n
-\t\t\tsum\t\t  : false,\n
-\t\t\tlog\t\t  : false,\n
-\t\t\texports   : false,\n
-\t\t\tmodule\t  : false,\n
-\t\t\tprovides  : false\n
-\t\t},\n
-\n
-\t\tdeclared, // Globals that were declared using /*global ... */ syntax.\n
-\n
-\t\tdevel = {\n
-\t\t\talert\t: false,\n
-\t\t\tconfirm : false,\n
-\t\t\tconsole : false,\n
-\t\t\tDebug\t: false,\n
-\t\t\topera\t: false,\n
-\t\t\tprompt\t: false\n
-\t\t},\n
-\n
-\t\tdojo = {\n
-\t\t\tdojo\t  : false,\n
-\t\t\tdijit\t  : false,\n
-\t\t\tdojox\t  : false,\n
-\t\t\tdefine\t  : false,\n
-\t\t\t"require" : false\n
-\t\t},\n
-\n
-\t\tfunct,\t\t\t// The current function\n
-\n
-\t\tfunctionicity = [\n
-\t\t\t"closure", "exception", "global", "label",\n
-\t\t\t"outer", "unused", "var"\n
-\t\t],\n
-\n
-\t\tfunctions,\t\t// All of the functions\n
-\n
-\t\tglobal,\t\t\t// The global scope\n
-\t\timplied,\t\t// Implied globals\n
-\t\tinblock,\n
-\t\tindent,\n
-\t\tjsonmode,\n
-\n
-\t\tjquery = {\n
-\t\t\t"$"    : false,\n
-\t\t\tjQuery : false\n
-\t\t},\n
-\n
-\t\tlines,\n
-\t\tlookahead,\n
-\t\tmember,\n
-\t\tmembersOnly,\n
-\n
-\t\tmootools = {\n
-\t\t\t"$"\t\t\t\t: false,\n
-\t\t\t"$$"\t\t\t: false,\n
-\t\t\tAsset\t\t\t: false,\n
-\t\t\tBrowser\t\t\t: false,\n
-\t\t\tChain\t\t\t: false,\n
-\t\t\tClass\t\t\t: false,\n
-\t\t\tColor\t\t\t: false,\n
-\t\t\tCookie\t\t\t: false,\n
-\t\t\tCore\t\t\t: false,\n
-\t\t\tDocument\t\t: false,\n
-\t\t\tDomReady\t\t: false,\n
-\t\t\tDOMEvent\t\t: false,\n
-\t\t\tDOMReady\t\t: false,\n
-\t\t\tDrag\t\t\t: false,\n
-\t\t\tElement\t\t\t: false,\n
-\t\t\tElements\t\t: false,\n
-\t\t\tEvent\t\t\t: false,\n
-\t\t\tEvents\t\t\t: false,\n
-\t\t\tFx\t\t\t\t: false,\n
-\t\t\tGroup\t\t\t: false,\n
-\t\t\tHash\t\t\t: false,\n
-\t\t\tHtmlTable\t\t: false,\n
-\t\t\tIframe\t\t\t: false,\n
-\t\t\tIframeShim\t\t: false,\n
-\t\t\tInputValidator\t: false,\n
-\t\t\tinstanceOf\t\t: false,\n
-\t\t\tKeyboard\t\t: false,\n
-\t\t\tLocale\t\t\t: false,\n
-\t\t\tMask\t\t\t: false,\n
-\t\t\tMooTools\t\t: false,\n
-\t\t\tNative\t\t\t: false,\n
-\t\t\tOptions\t\t\t: false,\n
-\t\t\tOverText\t\t: false,\n
-\t\t\tRequest\t\t\t: false,\n
-\t\t\tScroller\t\t: false,\n
-\t\t\tSlick\t\t\t: false,\n
-\t\t\tSlider\t\t\t: false,\n
-\t\t\tSortables\t\t: false,\n
-\t\t\tSpinner\t\t\t: false,\n
-\t\t\tSwiff\t\t\t: false,\n
-\t\t\tTips\t\t\t: false,\n
-\t\t\tType\t\t\t: false,\n
-\t\t\ttypeOf\t\t\t: false,\n
-\t\t\tURI\t\t\t\t: false,\n
-\t\t\tWindow\t\t\t: false\n
-\t\t},\n
+(function() {\n
+  var root = this;\n
+  var previousUnderscore = root._;\n
+  var breaker = {};\n
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n
+  var push             = ArrayProto.push,\n
+      slice            = ArrayProto.slice,\n
+      concat           = ArrayProto.concat,\n
+      toString         = ObjProto.toString,\n
+      hasOwnProperty   = ObjProto.hasOwnProperty;\n
+  var\n
+    nativeForEach      = ArrayProto.forEach,\n
+    nativeMap          = ArrayProto.map,\n
+    nativeReduce       = ArrayProto.reduce,\n
+    nativeReduceRight  = ArrayProto.reduceRight,\n
+    nativeFilter       = ArrayProto.filter,\n
+    nativeEvery        = ArrayProto.every,\n
+    nativeSome         = ArrayProto.some,\n
+    nativeIndexOf      = ArrayProto.indexOf,\n
+    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n
+    nativeIsArray      = Array.isArray,\n
+    nativeKeys         = Object.keys,\n
+    nativeBind         = FuncProto.bind;\n
+  var _ = function(obj) {\n
+    if (obj instanceof _) return obj;\n
+    if (!(this instanceof _)) return new _(obj);\n
+    this._wrapped = obj;\n
+  };\n
+  if (typeof exports !== \'undefined\') {\n
+    if (typeof module !== \'undefined\' && module.exports) {\n
+      exports = module.exports = _;\n
+    }\n
+    exports._ = _;\n
+  } else {\n
+    root._ = _;\n
+  }\n
+  _.VERSION = \'1.4.4\';\n
+  var each = _.each = _.forEach = function(obj, iterator, context) {\n
+    if (obj == null) return;\n
+    if (nativeForEach && obj.forEach === nativeForEach) {\n
+      obj.forEach(iterator, context);\n
+    } else if (obj.length === +obj.length) {\n
+      for (var i = 0, l = obj.length; i < l; i++) {\n
+        if (iterator.call(context, obj[i], i, obj) === breaker) return;\n
+      }\n
+    } else {\n
+      for (var key in obj) {\n
+        if (_.has(obj, key)) {\n
+          if
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+ (iterator.call(context, obj[key], key, obj) === breaker) return;\n
+        }\n
+      }\n
+    }\n
+  };\n
+  _.map = _.collect = function(obj, iterator, context) {\n
+    var results = [];\n
+    if (obj == null) return results;\n
+    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n
+    each(obj, function(value, index, list) {\n
+      results[results.length] = iterator.call(context, value, index, list);\n
+    });\n
+    return results;\n
+  };\n
+\n
+  var reduceError = \'Reduce of empty array with no initial value\';\n
+  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n
+    var initial = arguments.length > 2;\n
+    if (obj == null) obj = [];\n
+    if (nativeReduce && obj.reduce === nativeReduce) {\n
+      if (context) iterator = _.bind(iterator, context);\n
+      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n
+    }\n
+    each(obj, function(value, index, list) {\n
+      if (!initial) {\n
+        memo = value;\n
+        initial = true;\n
+      } else {\n
+        memo = iterator.call(context, memo, value, index, list);\n
+      }\n
+    });\n
+    if (!initial) throw new TypeError(reduceError);\n
+    return memo;\n
+  };\n
+  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n
+    var initial = arguments.length > 2;\n
+    if (obj == null) obj = [];\n
+    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n
+      if (context) iterator = _.bind(iterator, context);\n
+      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n
+    }\n
+    var length = obj.length;\n
+    if (length !== +length) {\n
+      var keys = _.keys(obj);\n
+      length = keys.length;\n
+    }\n
+    each(obj, function(value, index, list) {\n
+      index = keys ? keys[--length] : --length;\n
+      if (!initial) {\n
+        memo = obj[index];\n
+        initial = true;\n
+      } else {\n
+        memo = iterator.call(context, memo, obj[index], index, list);\n
+      }\n
+    });\n
+    if (!initial) throw new TypeError(reduceError);\n
+    return memo;\n
+  };\n
+  _.find = _.detect = function(obj, iterator, context) {\n
+    var result;\n
+    any(obj, function(value, index, list) {\n
+      if (iterator.call(context, value, index, list)) {\n
+        result = value;\n
+        return true;\n
+      }\n
+    });\n
+    return result;\n
+  };\n
+  _.filter = _.select = function(obj, iterator, context) {\n
+    var results = [];\n
+    if (obj == null) return results;\n
+    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n
+    each(obj, function(value, index, list) {\n
+      if (iterator.call(context, value, index, list)) results[results.length] = value;\n
+    });\n
+    return results;\n
+  };\n
+  _.reject = function(obj, iterator, context) {\n
+    return _.filter(obj, function(value, index, list) {\n
+      return !iterator.call(context, value, index, list);\n
+    }, context);\n
+  };\n
+  _.every = _.all = function(obj, iterator, context) {\n
+    iterator || (iterator = _.identity);\n
+    var result = true;\n
+    if (obj == null) return result;\n
+    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n
+    each(obj, function(value, index, list) {\n
+      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n
+    });\n
+    return !!result;\n
+  };\n
+  var any = _.some = _.any = function(obj, iterator, context) {\n
+    iterator || (iterator = _.identity);\n
+    var result = false;\n
+    if (obj == null) return result;\n
+    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n
+    each(obj, function(value, index, list) {\n
+      if (result || (result = iterator.call(context, value, index, list))) return breaker;\n
+    });\n
+    return !!result;\n
+  };\n
+  _.contains = _.include = function(obj, target) {\n
+    if (obj == null) return false;\n
+    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n
+    return any(obj, function(value) {\n
+      return value === target;\n
+    });\n
+  };\n
+  _.invoke = function(obj, method) {\n
+    var args = slice.call(arguments, 2);\n
+    var isFunc = _.isFunction(method);\n
+    return _.map(obj, function(value) {\n
+      return (isFunc ? method : value[method]).apply(value, args);\n
+    });\n
+  };\n
+  _.pluck = function(obj, key) {\n
+    return _.map(obj, function(value){ return value[key]; });\n
+  };\n
+  _.where = function(obj, attrs, first) {\n
+    if (_.isEmpty(attrs)) return first ? null : [];\n
+    return _[first ? \'find\' : \'filter\'](obj, function(value) {\n
+      for (var key in attrs) {\n
+        if (attrs[key] !== value[key]) return false;\n
+      }\n
+      return true;\n
+    });\n
+  };\n
+  _.findWhere = function(obj, attrs) {\n
+    return _.where(obj, attrs, true);\n
+  };\n
+  _.max = function(obj, iterator, context) {\n
+    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n
+      return Math.max.apply(Math, obj);\n
+    }\n
+    if (!iterator && _.isEmpty(obj)) return -Infinity;\n
+    var result = {computed : -Infinity, value: -Infinity};\n
+    each(obj, function(value, index, list) {\n
+      var computed = iterator ? iterator.call(context, value, index, list) : value;\n
+      computed >= result.computed && (result = {value : value, computed : computed});\n
+    });\n
+    return result.value;\n
+  };\n
+  _.min = function(obj, iterator, context) {\n
+    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n
+      return Math.min.apply(Math, obj);\n
+    }\n
+    if (!iterator && _.isEmpty(obj)) return Infinity;\n
+    var result = {computed : Infinity, value: Infinity};\n
+    each(obj, function(value, index, list) {\n
+      var computed = iterator ? iterator.call(context, value, index, list) : value;\n
+      computed < result.computed && (result = {value : value, computed : computed});\n
+    });\n
+    return result.value;\n
+  };\n
+  _.shuffle = function(obj) {\n
+    var rand;\n
+    var index = 0;\n
+    var shuffled = [];\n
+    each(obj, function(value) {\n
+      rand = _.random(index++);\n
+      shuffled[index - 1] = shuffled[rand];\n
+      shuffled[rand] = value;\n
+    });\n
+    return shuffled;\n
+  };\n
+  var lookupIterator = function(value) {\n
+    return _.isFunction(value) ? value : function(obj){ return obj[value]; };\n
+  };\n
+  _.sortBy = function(obj, value, context) {\n
+    var iterator = lookupIterator(value);\n
+    return _.pluck(_.map(obj, function(value, index, list) {\n
+      return {\n
+        value : value,\n
+        index : index,\n
+        criteria : iterator.call(context, value, index, list)\n
+      };\n
+    }).sort(function(left, right) {\n
+      var a = left.criteria;\n
+      var b = right.criteria;\n
+      if (a !== b) {\n
+        if (a > b || a === void 0) return 1;\n
+        if (a < b || b === void 0) return -1;\n
+      }\n
+      return left.index < right.index ? -1 : 1;\n
+    }), \'value\');\n
+  };\n
+  var group = function(obj, value, context, behavior) {\n
+    var result = {};\n
+    var iterator = lookupIterator(value || _.identity);\n
+    each(obj, function(value, index) {\n
+      var key = iterator.call(context, value, index, obj);\n
+      behavior(result, key, value);\n
+    });\n
+    return result;\n
+  };\n
+  _.groupBy = function(obj, value, context) {\n
+    return group(obj, value, context, function(result, key, value) {\n
+      (_.has(result, key) ? result[key] : (result[key] = [])).push(value);\n
+    });\n
+  };\n
+  _.countBy = function(obj, value, context) {\n
+    return group(obj, value, context, function(result, key) {\n
+      if (!_.has(result, key)) result[key] = 0;\n
+      result[key]++;\n
+    });\n
+  };\n
+  _.sortedIndex = function(array, obj, iterator, context) {\n
+    iterator = iterator == null ? _.identity : lookupIterator(iterator);\n
+    var value = iterator.call(context, obj);\n
+    var low = 0, high = array.length;\n
+    while (low < high) {\n
+      var mid = (low + high) >>> 1;\n
+      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;\n
+    }\n
+    return low;\n
+  };\n
+  _.toArray = function(obj) {\n
+    if (!obj) return [];\n
+    if (_.isArray(obj)) return slice.call(obj);\n
+    if (obj.length === +obj.length) return _.map(obj, _.identity);\n
+    return _.values(obj);\n
+  };\n
+  _.size = function(obj) {\n
+    if (obj == null) return 0;\n
+    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;\n
+  };\n
+  _.first = _.head = _.take = function(array, n, guard) {\n
+    if (array == null) return void 0;\n
+    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\n
+  };\n
+  _.initial = function(array, n, guard) {\n
+    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n
+  };\n
+  _.last = function(array, n, guard) {\n
+    if (array == null) return void 0;\n
+    if ((n != null) && !guard) {\n
+      return slice.call(array, Math.max(array.length - n, 0));\n
+    } else {\n
+      return array[array.length - 1];\n
+    }\n
+  };\n
+  _.rest = _.tail = _.drop = function(array, n, guard) {\n
+    return slice.call(array, (n == null) || guard ? 1 : n);\n
+  };\n
+  _.compact = function(array) {\n
+    return _.filter(array, _.identity);\n
+  };\n
+  var flatten = function(input, shallow, output) {\n
+    each(input, function(value) {\n
+      if (_.isArray(value)) {\n
+        shallow ? push.apply(output, value) : flatten(value, shallow, output);\n
+      } else {\n
+        output.push(value);\n
+      }\n
+    });\n
+    return output;\n
+  };\n
+  _.flatten = function(array, shallow) {\n
+    return flatten(array, shallow, []);\n
+  };\n
+  _.without = function(array) {\n
+    return _.difference(array, slice.call(arguments, 1));\n
+  };\n
+  _.uniq = _.unique = function(array, isSorted, iterator, context) {\n
+    if (_.isFunction(isSorted)) {\n
+      context = iterator;\n
+      iterator = isSorted;\n
+      isSorted = false;\n
+    }\n
+    var initial = iterator ? _.map(array, iterator, context) : array;\n
+    var results = [];\n
+    var seen = [];\n
+    each(initial, function(value, index) {\n
+      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {\n
+        seen.push(value);\n
+        results.push(array[index]);\n
+      }\n
+    });\n
+    return results;\n
+  };\n
+  _.union = function() {\n
+    return _.uniq(concat.apply(ArrayProto, arguments));\n
+  };\n
+  _.intersection = function(array) {\n
+    var rest = slice.call(arguments, 1);\n
+    return _.filter(_.uniq(array), function(item) {\n
+      return _.every(rest, function(other) {\n
+        return _.indexOf(other, item) >= 0;\n
+      });\n
+    });\n
+  };\n
+  _.difference = function(array) {\n
+    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));\n
+    return _.filter(array, function(value){ return !_.contains(rest, value); });\n
+  };\n
+  _.zip = function() {\n
+    var args = slice.call(arguments);\n
+    var length = _.max(_.pluck(args, \'length\'));\n
+    var results = new Array(length);\n
+    for (var i = 0; i < length; i++) {\n
+      results[i] = _.pluck(args, "" + i);\n
+    }\n
+    return results;\n
+  };\n
+  _.object = function(list, values) {\n
+    if (list == null) return {};\n
+    var result = {};\n
+    for (var i = 0, l = list.length; i < l; i++) {\n
+      if (values) {\n
+        result[list[i]] = values[i];\n
+      } else {\n
+        result[list[i][0]] = list[i][1];\n
+      }\n
+    }\n
+    return result;\n
+  };\n
+  _.indexOf = function(array, item, isSorted) {\n
+    if (array == null) return -1;\n
+    var i = 0, l = array.length;\n
+    if (isSorted) {\n
+      if (typeof isSorted == \'number\') {\n
+        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n
+      } else {\n
+        i = _.sortedIndex(array, item);\n
+        return array[i] === item ? i : -1;\n
+      }\n
+    }\n
+    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);\n
+    for (; i < l; i++) if (array[i] === item) return i;\n
+    return -1;\n
+  };\n
+  _.lastIndexOf = function(array, item, from) {\n
+    if (array == null) return -1;\n
+    var hasIndex = from != null;\n
+    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {\n
+      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);\n
+    }\n
+    var i = (hasIndex ? from : array.length);\n
+    while (i--) if (array[i] === item) return i;\n
+    return -1;\n
+  };\n
+  _.range = function(start, stop, step) {\n
+    if (arguments.length <= 1) {\n
+      stop = start || 0;\n
+      start = 0;\n
+    }\n
+    step = arguments[2] || 1;\n
 \n
-\t\tnexttoken,\n
-\n
-\t\tnode = {\n
-\t\t\t__filename\t  : false,\n
-\t\t\t__dirname\t  : false,\n
-\t\t\tBuffer\t\t  : false,\n
-\t\t\tconsole\t\t  : false,\n
-\t\t\texports\t\t  : true,  // In Node it is ok to exports = module.exports = foo();\n
-\t\t\tGLOBAL\t\t  : false,\n
-\t\t\tglobal\t\t  : false,\n
-\t\t\tmodule\t\t  : false,\n
-\t\t\tprocess\t\t  : false,\n
-\t\t\trequire\t\t  : false,\n
-\t\t\tsetTimeout\t  : false,\n
-\t\t\tclearTimeout  : false,\n
-\t\t\tsetInterval   : false,\n
-\t\t\tclearInterval : false\n
-\t\t},\n
+    var len = Math.max(Math.ceil((stop - start) / step), 0);\n
+    var idx = 0;\n
+    var range = new Array(len);\n
 \n
-\t\tnoreach,\n
-\t\toption,\n
-\t\tpredefined,\t\t// Global variables defined by option\n
-\t\tprereg,\n
-\t\tprevtoken,\n
-\n
-\t\tprototypejs = {\n
-\t\t\t"$"\t\t\t\t  : false,\n
-\t\t\t"$$"\t\t\t  : false,\n
-\t\t\t"$A"\t\t\t  : false,\n
-\t\t\t"$F"\t\t\t  : false,\n
-\t\t\t"$H"\t\t\t  : false,\n
-\t\t\t"$R"\t\t\t  : false,\n
-\t\t\t"$break"\t\t  : false,\n
-\t\t\t"$continue"\t\t  : false,\n
-\t\t\t"$w"\t\t\t  : false,\n
-\t\t\tAbstract\t\t  : false,\n
-\t\t\tAjax\t\t\t  : false,\n
-\t\t\tClass\t\t\t  : false,\n
-\t\t\tEnumerable\t\t  : false,\n
-\t\t\tElement\t\t\t  : false,\n
-\t\t\tEvent\t\t\t  : false,\n
-\t\t\tField\t\t\t  : false,\n
-\t\t\tForm\t\t\t  : false,\n
-\t\t\tHash\t\t\t  : false,\n
-\t\t\tInsertion\t\t  : false,\n
-\t\t\tObjectRange\t\t  : false,\n
-\t\t\tPeriodicalExecuter: false,\n
-\t\t\tPosition\t\t  : false,\n
-\t\t\tPrototype\t\t  : false,\n
-\t\t\tSelector\t\t  : false,\n
-\t\t\tTemplate\t\t  : false,\n
-\t\t\tToggle\t\t\t  : false,\n
-\t\t\tTry\t\t\t\t  : false,\n
-\t\t\tAutocompleter\t  : false,\n
-\t\t\tBuilder\t\t\t  : false,\n
-\t\t\tControl\t\t\t  : false,\n
-\t\t\tDraggable\t\t  : false,\n
-\t\t\tDraggables\t\t  : false,\n
-\t\t\tDroppables\t\t  : false,\n
-\t\t\tEffect\t\t\t  : false,\n
-\t\t\tSortable\t\t  : false,\n
-\t\t\tSortableObserver  : false,\n
-\t\t\tSound\t\t\t  : false,\n
-\t\t\tScriptaculous\t  : false\n
-\t\t},\n
+    while(idx < len) {\n
+      range[idx++] = start;\n
+      start += step;\n
+    }\n
 \n
-\t\tquotmark,\n
-\n
-\t\trhino = {\n
-\t\t\tdefineClass  : false,\n
-\t\t\tdeserialize  : false,\n
-\t\t\tgc\t\t\t : false,\n
-\t\t\thelp\t\t : false,\n
-\t\t\timportPackage: false,\n
-\t\t\t"java"\t\t : false,\n
-\t\t\tload\t\t : false,\n
-\t\t\tloadClass\t : false,\n
-\t\t\tprint\t\t : false,\n
-\t\t\tquit\t\t : false,\n
-\t\t\treadFile\t : false,\n
-\t\t\treadUrl\t\t : false,\n
-\t\t\trunCommand\t : false,\n
-\t\t\tseal\t\t : false,\n
-\t\t\tserialize\t : false,\n
-\t\t\tspawn\t\t : false,\n
-\t\t\tsync\t\t : false,\n
-\t\t\ttoint32\t\t : false,\n
-\t\t\tversion\t\t : false\n
-\t\t},\n
+    return range;\n
+  };\n
+  _.bind = function(func, context) {\n
+    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n
+    var args = slice.call(arguments, 2);\n
+    return function() {\n
+      return func.apply(context, args.concat(slice.call(arguments)));\n
+    };\n
+  };\n
+  _.partial = function(func) {\n
+    var args = slice.call(arguments, 1);\n
+    return function() {\n
+      return func.apply(this, args.concat(slice.call(arguments)));\n
+    };\n
+  };\n
+  _.bindAll = function(obj) {\n
+    var funcs = slice.call(arguments, 1);\n
+    if (funcs.length === 0) funcs = _.functions(obj);\n
+    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n
+    return obj;\n
+  };\n
+  _.memoize = function(func, hasher) {\n
+    var memo = {};\n
+    hasher || (hasher = _.identity);\n
+    return function() {\n
+      var key = hasher.apply(this, arguments);\n
+      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n
+    };\n
+  };\n
+  _.delay = function(func, wait) {\n
+    var args = slice.call(arguments, 2);\n
+    return setTimeout(function(){ return func.apply(null, args); }, wait);\n
+  };\n
+  _.defer = function(func) {\n
+    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n
+  };\n
+  _.throttle = function(func, wait) {\n
+    var context, args, timeout, result;\n
+    var previous = 0;\n
+    var later = function() {\n
+      previous = new Date;\n
+      timeout = null;\n
+      result = func.apply(context, args);\n
+    };\n
+    return function() {\n
+      var now = new Date;\n
+      var remaining = wait - (now - previous);\n
+      context = this;\n
+      args = arguments;\n
+      if (remaining <= 0) {\n
+        clearTimeout(timeout);\n
+        timeout = null;\n
+        previous = now;\n
+        result = func.apply(context, args);\n
+      } else if (!timeout) {\n
+        timeout = setTimeout(later, remaining);\n
+      }\n
+      return result;\n
+    };\n
+  };\n
+  _.debounce = function(func, wait, immediate) {\n
+    var timeout, result;\n
+    return function() {\n
+      var context = this, args = arguments;\n
+      var later = function() {\n
+        timeout = null;\n
+        if (!immediate) result = func.apply(context, args);\n
+      };\n
+      var callNow = immediate && !timeout;\n
+      clearTimeout(timeout);\n
+      timeout = setTimeout(later, wait);\n
+      if (callNow) result = func.apply(context, args);\n
+      return result;\n
+    };\n
+  };\n
+  _.once = function(func) {\n
+    var ran = false, memo;\n
+    return function() {\n
+      if (ran) return memo;\n
+      ran = true;\n
+      memo = func.apply(this, arguments);\n
+      func = null;\n
+      return memo;\n
+    };\n
+  };\n
+  _.wrap = function(func, wrapper) {\n
+    return function() {\n
+      var args = [func];\n
+      push.apply(args, arguments);\n
+      return wrapper.apply(this, args);\n
+    };\n
+  };\n
+  _.compose = function() {\n
+    var funcs = arguments;\n
+    return function() {\n
+      var args = arguments;\n
+      for (var i = funcs.length - 1; i >= 0; i--) {\n
+        args = [funcs[i].apply(this, args)];\n
+      }\n
+      return args[0];\n
+    };\n
+  };\n
+  _.after = function(times, func) {\n
+    if (times <= 0) return func();\n
+    return function() {\n
+      if (--times < 1) {\n
+        return func.apply(this, arguments);\n
+      }\n
+    };\n
+  };\n
+  _.keys = nativeKeys || function(obj) {\n
+    if (obj !== Object(obj)) throw new TypeError(\'Invalid object\');\n
+    var keys = [];\n
+    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\n
+    return keys;\n
+  };\n
+  _.values = function(obj) {\n
+    var values = [];\n
+    for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);\n
+    return values;\n
+  };\n
+  _.pairs = function(obj) {\n
+    var pairs = [];\n
+    for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);\n
+    return pairs;\n
+  };\n
+  _.invert = function(obj) {\n
+    var result = {};\n
+    for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;\n
+    return result;\n
+  };\n
+  _.functions = _.methods = function(obj) {\n
+    var names = [];\n
+    for (var key in obj) {\n
+      if (_.isFunction(obj[key])) names.push(key);\n
+    }\n
+    return names.sort();\n
+  };\n
+  _.extend = function(obj) {\n
+    each(slice.call(arguments, 1), function(source) {\n
+      if (source) {\n
+        for (var prop in source) {\n
+          obj[prop] = source[prop];\n
+        }\n
+      }\n
+    });\n
+    return obj;\n
+  };\n
+  _.pick = function(obj) {\n
+    var copy = {};\n
+    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n
+    each(keys, function(key) {\n
+      if (key in obj) copy[key] = obj[key];\n
+    });\n
+    return copy;\n
+  };\n
+  _.omit = function(obj) {\n
+    var copy = {};\n
+    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n
+    for (var key in obj) {\n
+      if (!_.contains(keys, key)) copy[key] = obj[key];\n
+    }\n
+    return copy;\n
+  };\n
+  _.defaults = function(obj) {\n
+    each(slice.call(arguments, 1), function(source) {\n
+      if (source) {\n
+        for (var prop in source) {\n
+          if (obj[prop] == null) obj[prop] = source[prop];\n
+        }\n
+      }\n
+    });\n
+    return obj;\n
+  };\n
+  _.clone = function(obj) {\n
+    if (!_.isObject(obj)) return obj;\n
+    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n
+  };\n
+  _.tap = function(obj, interceptor) {\n
+    interceptor(obj);\n
+    return obj;\n
+  };\n
+  var eq = function(a, b, aStack, bStack) {\n
+    if (a === b) return a !== 0 || 1 / a == 1 / b;\n
+    if (a == null || b == null) return a === b;\n
+    if (a instanceof _) a = a._wrapped;\n
+    if (b instanceof _) b = b._wrapped;\n
+    var className = toString.call(a);\n
+    if (className != toString.call(b)) return false;\n
+    switch (className) {\n
+      case \'[object String]\':\n
+        return a == String(b);\n
+      case \'[object Number]\':\n
+        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n
+      case \'[object Date]\':\n
+      case \'[object Boolean]\':\n
+        return +a == +b;\n
+      case \'[object RegExp]\':\n
+        return a.source == b.source &&\n
+               a.global == b.global &&\n
+               a.multiline == b.multiline &&\n
+               a.ignoreCase == b.ignoreCase;\n
+    }\n
+    if (typeof a != \'object\' || typeof b != \'object\') return false;\n
+    var length = aStack.length;\n
+    while (length--) {\n
+      if (aStack[length] == a) return bStack[length] == b;\n
+    }\n
+    aStack.push(a);\n
+    bStack.push(b);\n
+    var size = 0, result = true;\n
+    if (className == \'[object Array]\') {\n
+      size = a.length;\n
+      result = size == b.length;\n
+      if (result) {\n
+        while (size--) {\n
+          if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n
+        }\n
+      }\n
+    } else {\n
+      var aCtor = a.constructor, bCtor = b.constructor;\n
+      if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&\n
+                               _.isFunction(bCtor) && (bCtor instanceof bCtor))) {\n
+        return false;\n
+      }\n
+      for (var key in a) {\n
+        if (_.has(a, key)) {\n
+          size++;\n
+          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n
+        }\n
+      }\n
+      if (result) {\n
+        for (key in b) {\n
+          if (_.has(b, key) && !(size--)) break;\n
+        }\n
+        result = !size;\n
+      }\n
+    }\n
+    aStack.pop();\n
+    bStack.pop();\n
+    return result;\n
+  };\n
+  _.isEqual = function(a, b) {\n
+    return eq(a, b, [], []);\n
+  };\n
+  _.isEmpty = function(obj) {\n
+    if (obj == null) return true;\n
+    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n
+    for (var key in obj) if (_.has(obj, key)) return false;\n
+    return true;\n
+  };\n
+  _.isElement = function(obj) {\n
+    return !!(obj && obj.nodeType === 1);\n
+  };\n
+  _.isArray = nativeIsArray || function(obj) {\n
+    return toString.call(obj) == \'[object Array]\';\n
+  };\n
+  _.isObject = function(obj) {\n
+    return obj === Object(obj);\n
+  };\n
+  each([\'Arguments\', \'Function\', \'String\', \'Number\', \'Date\', \'RegExp\'], function(name) {\n
+    _[\'is\' + name] = function(obj) {\n
+      return toString.call(obj) == \'[object \' + name + \']\';\n
+    };\n
+  });\n
+  if (!_.isArguments(arguments)) {\n
+    _.isArguments = function(obj) {\n
+      return !!(obj && _.has(obj, \'callee\'));\n
+    };\n
+  }\n
+  if (typeof (/./) !== \'function\') {\n
+    _.isFunction = function(obj) {\n
+      return typeof obj === \'function\';\n
+    };\n
+  }\n
+  _.isFinite = function(obj) {\n
+    return isFinite(obj) && !isNaN(parseFloat(obj));\n
+  };\n
+  _.isNaN = function(obj) {\n
+    return _.isNumber(obj) && obj != +obj;\n
+  };\n
+  _.isBoolean = function(obj) {\n
+    return obj === true || obj === false || toString.call(obj) == \'[object Boolean]\';\n
+  };\n
+  _.isNull = function(obj) {\n
+    return obj === null;\n
+  };\n
+  _.isUndefined = function(obj) {\n
+    return obj === void 0;\n
+  };\n
+  _.has = function(obj, key) {\n
+    return hasOwnProperty.call(obj, key);\n
+  };\n
+  _.noConflict = function() {\n
+    root._ = previousUnderscore;\n
+    return this;\n
+  };\n
+  _.identity = function(value) {\n
+    return value;\n
+  };\n
+  _.times = function(n, iterator, context) {\n
+    var accum = Array(n);\n
+    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);\n
+    return accum;\n
+  };\n
+  _.random = function(min, max) {\n
+    if (max == null) {\n
+      max = min;\n
+      min = 0;\n
+    }\n
+    return min + Math.floor(Math.random() * (max - min + 1));\n
+  };\n
+  var entityMap = {\n
+    escape: {\n
+      \'&\': \'&amp;\',\n
+      \'<\': \'&lt;\',\n
+      \'>\': \'&gt;\',\n
+      \'"\': \'&quot;\',\n
+      "\'": \'&#x27;\',\n
+      \'/\': \'&#x2F;\'\n
+    }\n
+  };\n
+  entityMap.unescape = _.invert(entityMap.escape);\n
+  var entityRegexes = {\n
+    escape:   new RegExp(\'[\' + _.keys(entityMap.escape).join(\'\') + \']\', \'g\'),\n
+    unescape: new RegExp(\'(\' + _.keys(entityMap.unescape).join(\'|\') + \')\', \'g\')\n
+  };\n
+  _.each([\'escape\', \'unescape\'], function(method) {\n
+    _[method] = function(string) {\n
+      if (string == null) return \'\';\n
+      return (\'\' + string).replace(entityRegexes[method], function(match) {\n
+        return entityMap[method][match];\n
+      });\n
+    };\n
+  });\n
+  _.result = function(object, property) {\n
+    if (object == null) return null;\n
+    var value = object[property];\n
+    return _.isFunction(value) ? value.call(object) : value;\n
+  };\n
+  _.mixin = function(obj) {\n
+    each(_.functions(obj), function(name){\n
+      var func = _[name] = obj[name];\n
+      _.prototype[name] = function() {\n
+        var args = [this._wrapped];\n
+        push.apply(args, arguments);\n
+        return result.call(this, func.apply(_, args));\n
+      };\n
+    });\n
+  };\n
+  var idCounter = 0;\n
+  _.uniqueId = function(prefix) {\n
+    var id = ++idCounter + \'\';\n
+    return prefix ? prefix + id : id;\n
+  };\n
+  _.templateSettings = {\n
+    evaluate    : /<%([\\s\\S]+?)%>/g,\n
+    interpolate : /<%=([\\s\\S]+?)%>/g,\n
+    escape      : /<%-([\\s\\S]+?)%>/g\n
+  };\n
+  var noMatch = /(.)^/;\n
+  var escapes = {\n
+    "\'":      "\'",\n
+    \'\\\\\':     \'\\\\\',\n
+    \'\\r\':     \'r\',\n
+    \'\\n\':     \'n\',\n
+    \'\\t\':     \'t\',\n
+    \'\\u2028\': \'u2028\',\n
+    \'\\u2029\': \'u2029\'\n
+  };\n
+\n
+  var escaper = /\\\\|\'|\\r|\\n|\\t|\\u2028|\\u2029/g;\n
+  _.template = function(text, data, settings) {\n
+    var render;\n
+    settings = _.defaults({}, settings, _.templateSettings);\n
+    var matcher = new RegExp([\n
+      (settings.escape || noMatch).source,\n
+      (settings.interpolate || noMatch).source,\n
+      (settings.evaluate || noMatch).source\n
+    ].join(\'|\') + \'|$\', \'g\');\n
+    var index = 0;\n
+    var source = "__p+=\'";\n
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n
+      source += text.slice(index, offset)\n
+        .replace(escaper, function(match) { return \'\\\\\' + escapes[match]; });\n
+\n
+      if (escape) {\n
+        source += "\'+\\n((__t=(" + escape + "))==null?\'\':_.escape(__t))+\\n\'";\n
+      }\n
+      if (interpolate) {\n
+        source += "\'+\\n((__t=(" + interpolate + "))==null?\'\':__t)+\\n\'";\n
+      }\n
+      if (evaluate) {\n
+        source += "\';\\n" + evaluate + "\\n__p+=\'";\n
+      }\n
+      index = offset + match.length;\n
+      return match;\n
+    });\n
+    source += "\';\\n";\n
+    if (!settings.variable) source = \'with(obj||{}){\\n\' + source + \'}\\n\';\n
 \n
-\t\tscope,\t\t// The current scope\n
-\t\tstack,\n
-\t\tstandard = {\n
-\t\t\tArray\t\t\t\t: false,\n
-\t\t\tBoolean\t\t\t\t: false,\n
-\t\t\tDate\t\t\t\t: false,\n
-\t\t\tdecodeURI\t\t\t: false,\n
-\t\t\tdecodeURIComponent\t: false,\n
-\t\t\tencodeURI\t\t\t: false,\n
-\t\t\tencodeURIComponent\t: false,\n
-\t\t\tError\t\t\t\t: false,\n
-\t\t\t"eval"\t\t\t\t: false,\n
-\t\t\tEvalError\t\t\t: false,\n
-\t\t\tFunction\t\t\t: false,\n
-\t\t\thasOwnProperty\t\t: false,\n
-\t\t\tisFinite\t\t\t: false,\n
-\t\t\tisNaN\t\t\t\t: false,\n
-\t\t\tJSON\t\t\t\t: false,\n
-\t\t\tMap\t\t\t\t\t: false,\n
-\t\t\tMath\t\t\t\t: false,\n
-\t\t\tNaN\t\t\t\t\t: false,\n
-\t\t\tNumber\t\t\t\t: false,\n
-\t\t\tObject\t\t\t\t: false,\n
-\t\t\tparseInt\t\t\t: false,\n
-\t\t\tparseFloat\t\t\t: false,\n
-\t\t\tRangeError\t\t\t: false,\n
-\t\t\tReferenceError\t\t: false,\n
-\t\t\tRegExp\t\t\t\t: false,\n
-\t\t\tSet\t\t\t\t\t: false,\n
-\t\t\tString\t\t\t\t: false,\n
-\t\t\tSyntaxError\t\t\t: false,\n
-\t\t\tTypeError\t\t\t: false,\n
-\t\t\tURIError\t\t\t: false,\n
-\t\t\tWeakMap\t\t\t\t: false\n
-\t\t},\n
-\t\tnonstandard = {\n
-\t\t\tescape\t\t\t\t: false,\n
-\t\t\tunescape\t\t\t: false\n
-\t\t},\n
+    source = "var __t,__p=\'\',__j=Array.prototype.join," +\n
+      "print=function(){__p+=__j.call(arguments,\'\');};\\n" +\n
+      source + "return __p;\\n";\n
 \n
-\t\tdirective,\n
-\t\tsyntax = {},\n
-\t\ttab,\n
-\t\ttoken,\n
-\t\tunuseds,\n
-\t\turls,\n
-\t\tuseESNextSyntax,\n
-\t\twarnings,\n
+    try {\n
+      render = new Function(settings.variable || \'obj\', \'_\', source);\n
+    } catch (e) {\n
+      e.source = source;\n
+      throw e;\n
+    }\n
 \n
-\t\tworker = {\n
-\t\t\timportScripts\t\t: true,\n
-\t\t\tpostMessage\t\t\t: true,\n
-\t\t\tself\t\t\t\t: true\n
-\t\t},\n
+    if (data) return render(data, _);\n
+    var template = function(data) {\n
+      return render.call(this, data, _);\n
+    };\n
+    template.source = \'function(\' + (settings.variable || \'obj\') + \'){\\n\' + source + \'}\';\n
+\n
+    return template;\n
+  };\n
+  _.chain = function(obj) {\n
+    return _(obj).chain();\n
+  };\n
+  var result = function(obj) {\n
+    return this._chain ? _(obj).chain() : obj;\n
+  };\n
+  _.mixin(_);\n
+  each([\'pop\', \'push\', \'reverse\', \'shift\', \'sort\', \'splice\', \'unshift\'], function(name) {\n
+    var method = ArrayProto[name];\n
+    _.prototype[name] = function() {\n
+      var obj = this._wrapped;\n
+      method.apply(obj, arguments);\n
+      if ((name == \'shift\' || name == \'splice\') && obj.length === 0) delete obj[0];\n
+      return result.call(this, obj);\n
+    };\n
+  });\n
+  each([\'concat\', \'join\', \'slice\'], function(name) {\n
+    var method = ArrayProto[name];\n
+    _.prototype[name] = function() {\n
+      return result.call(this, method.apply(this._wrapped, arguments));\n
+    };\n
+  });\n
 \n
-\t\twsh = {\n
-\t\t\tActiveXObject\t\t\t  : true,\n
-\t\t\tEnumerator\t\t\t\t  : true,\n
-\t\t\tGetObject\t\t\t\t  : true,\n
-\t\t\tScriptEngine\t\t\t  : true,\n
-\t\t\tScriptEngineBuildVersion  : true,\n
-\t\t\tScriptEngineMajorVersion  : true,\n
-\t\t\tScriptEngineMinorVersion  : true,\n
-\t\t\tVBArray\t\t\t\t\t  : true,\n
-\t\t\tWSH\t\t\t\t\t\t  : true,\n
-\t\t\tWScript\t\t\t\t\t  : true,\n
-\t\t\tXDomainRequest\t\t\t  : true\n
-\t\t},\n
+  _.extend(_.prototype, {\n
+    chain: function() {\n
+      this._chain = true;\n
+      return this;\n
+    },\n
+    value: function() {\n
+      return this._wrapped;\n
+    }\n
 \n
-\t\tyui = {\n
-\t\t\tYUI\t\t\t\t: false,\n
-\t\t\tY\t\t\t\t: false,\n
-\t\t\tYUI_config\t\t: false\n
-\t\t};\n
-\tvar ax, cx, tx, nx, nxg, lx, ix, jx, ft;\n
-\t(function () {\n
-\t\tax = /@cc|<\\/?|script|\\]\\s*\\]|<\\s*!|&lt/i;\n
-\t\tcx = /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/;\n
-\t\ttx = /^\\s*([(){}\\[.,:;\'"~\\?\\]#@]|==?=?|\\/=(?!(\\S*\\/[gim]?))|\\/(\\*(jshint|jslint|members?|global)?|\\/)?|\\*[\\/=]?|\\+(?:=|\\++)?|-(?:=|-+)?|%=?|&[&=]?|\\|[|=]?|>>?>?=?|<([\\/=!]|\\!(\\[|--)?|<=?)?|\\^=?|\\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\\.[0-9]*)?([eE][+\\-]?[0-9]+)?)/;\n
-\t\tnx = /[\\u0000-\\u001f&<"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/;\n
-\t\tnxg = /[\\u0000-\\u001f&<"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n
-\t\tlx = /\\*\\//;\n
-\t\tix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;\n
-\t\tjx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\\s*:/i;\n
-\t\tft = /^\\s*\\/\\*\\s*falls\\sthrough\\s*\\*\\/\\s*$/;\n
-\t}());\n
+  });\n
+\n
+}).call(this);\n
+\n
+},\n
+{}],\n
+2:[function(req,module,exports){\n
+\n
+\n
+var _ = req("underscore");\n
+\n
+var errors = {\n
+\tE001: "Bad option: \'{a}\'.",\n
+\tE002: "Bad option value.",\n
+\tE003: "Expected a JSON value.",\n
+\tE004: "Input is neither a string nor an array of strings.",\n
+\tE005: "Input is empty.",\n
+\tE006: "Unexpected early end of program.",\n
+\tE007: "Missing \\"use strict\\" statement.",\n
+\tE008: "Strict violation.",\n
+\tE009: "Option \'validthis\' can\'t be used in a global scope.",\n
+\tE010: "\'with\' is not allowed in strict mode.",\n
+\tE011: "const \'{a}\' has already been declared.",\n
+\tE012: "const \'{a}\' is initialized to \'undefined\'.",\n
+\tE013: "Attempting to override \'{a}\' which is a constant.",\n
+\tE014: "A regular expression literal can be confused with \'/=\'.",\n
+\tE015: "Unclosed regular expression.",\n
+\tE016: "Invalid regular expression.",\n
+\tE017: "Unclosed comment.",\n
+\tE018: "Unbegun comment.",\n
+\tE019: "Unmatched \'{a}\'.",\n
+\tE020: "Expected \'{a}\' to match \'{b}\' from line {c} and instead saw \'{d}\'.",\n
+\tE021: "Expected \'{a}\' and instead saw \'{b}\'.",\n
+\tE022: "Line breaking error \'{a}\'.",\n
+\tE023: "Missing \'{a}\'.",\n
+\tE024: "Unexpected \'{a}\'.",\n
+\tE025: "Missing \':\' on a case clause.",\n
+\tE026: "Missing \'}\' to match \'{\' from line {a}.",\n
+\tE027: "Missing \']\' to match \'[\' form line {a}.",\n
+\tE028: "Illegal comma.",\n
+\tE029: "Unclosed string.",\n
+\tE030: "Expected an identifier and instead saw \'{a}\'.",\n
+\tE031: "Bad assignment.", // FIXME: Rephrase\n
+\tE032: "Expected a small integer or \'false\' and instead saw \'{a}\'.",\n
+\tE033: "Expected an operator and instead saw \'{a}\'.",\n
+\tE034: "get/set are ES5 features.",\n
+\tE035: "Missing property name.",\n
+\tE036: "Expected to see a statement and instead saw a block.",\n
+\tE037: null, // Vacant\n
+\tE038: null, // Vacant\n
+\tE039: "Function declarations are not invocable. Wrap the whole function invocation in parens.",\n
+\tE040: "Each value should have its own case label.",\n
+\tE041: "Unrecoverable syntax error.",\n
+\tE042: "Stopping.",\n
+\tE043: "Too many errors.",\n
+\tE044: "\'{a}\' is already defined and can\'t be redefined.",\n
+\tE045: "Invalid for each loop.",\n
+\tE046: "A yield statement shall be within a generator function (with syntax: `function*`)",\n
+\tE047: "A generator function shall contain a yield statement.",\n
+\tE048: "Let declaration not directly within block.",\n
+\tE049: "A {a} cannot be named \'{b}\'.",\n
+\tE050: "Mozilla requires the yield expression to be parenthesized here.",\n
+\tE051: "Regular parameters cannot come after default parameters."\n
+};\n
 \n
-\tfunction F() {}\t\t// Used by Object.create\n
+var warnings = {\n
+\tW001: "\'hasOwnProperty\' is a really bad name.",\n
+\tW002: "Value of \'{a}\' may be overwritten in IE 8 and earlier.",\n
+\tW003: "\'{a}\' was used before it was defined.",\n
+\tW004: "\'{a}\' is already defined.",\n
+\tW005: "A dot following a number can be confused with a decimal point.",\n
+\tW006: "Confusing minuses.",\n
+\tW007: "Confusing pluses.",\n
+\tW008: "A leading decimal point can be confused with a dot: \'{a}\'.",\n
+\tW009: "The array literal notation [] is preferrable.",\n
+\tW010: "The object literal notation {} is preferrable.",\n
+\tW011: "Unexpected space after \'{a}\'.",\n
+\tW012: "Unexpected space before \'{a}\'.",\n
+\tW013: "Missing space after \'{a}\'.",\n
+\tW014: "Bad line breaking before \'{a}\'.",\n
+\tW015: "Expected \'{a}\' to have an indentation at {b} instead at {c}.",\n
+\tW016: "Unexpected use of \'{a}\'.",\n
+\tW017: "Bad operand.",\n
+\tW018: "Confusing use of \'{a}\'.",\n
+\tW019: "Use the isNaN function to compare with NaN.",\n
+\tW020: "Read only.",\n
+\tW021: "\'{a}\' is a function.",\n
+\tW022: "Do not assign to the exception parameter.",\n
+\tW023: "Expected an identifier in an assignment and instead saw a function invocation.",\n
+\tW024: "Expected an identifier and instead saw \'{a}\' (a reserved word).",\n
+\tW025: "Missing name in function declaration.",\n
+\tW026: "Inner functions should be listed at the top of the outer function.",\n
+\tW027: "Unreachable \'{a}\' after \'{b}\'.",\n
+\tW028: "Label \'{a}\' on {b} statement.",\n
+\tW030: "Expected an assignment or function call and instead saw an expression.",\n
+\tW031: "Do not use \'new\' for side effects.",\n
+\tW032: "Unnecessary semicolon.",\n
+\tW033: "Missing semicolon.",\n
+\tW034: "Unnecessary directive \\"{a}\\".",\n
+\tW035: "Empty block.",\n
+\tW036: "Unexpected /*member \'{a}\'.",\n
+\tW037: "\'{a}\' is a statement label.",\n
+\tW038: "\'{a}\' used out of scope.",\n
+\tW039: "\'{a}\' is not allowed.",\n
+\tW040: "Possible strict violation.",\n
+\tW041: "Use \'{a}\' to compare with \'{b}\'.",\n
+\tW042: "Avoid EOL escaping.",\n
+\tW043: "Bad escaping of EOL. Use option multistr if needed.",\n
+\tW044: "Bad or unnecessary escaping.",\n
+\tW045: "Bad number \'{a}\'.",\n
+\tW046: "Don\'t use extra leading zeros \'{a}\'.",\n
+\tW047: "A trailing decimal point can be confused with a dot: \'{a}\'.",\n
+\tW048: "Unexpected control character in regular expression.",\n
+\tW049: "Unexpected escaped character \'{a}\' in regular expression.",\n
+\tW050: "JavaScript URL.",\n
+\tW051: "Variables should not be deleted.",\n
+\tW052: "Unexpected \'{a}\'.",\n
+\tW053: "Do not use {a} as a constructor.",\n
+\tW054: "The Function constructor is a form of eval.",\n
+\tW055: "A constructor name should start with an uppercase letter.",\n
+\tW056: "Bad constructor.",\n
+\tW057: "Weird construction. Is \'new\' unnecessary?",\n
+\tW058: "Missing \'()\' invoking a constructor.",\n
+\tW059: "Avoid arguments.{a}.",\n
+\tW060: "document.write can be a form of eval.",\n
+\tW061: "eval can be harmful.",\n
+\tW062: "Wrap an immediate function invocation in parens " +\n
+\t\t"to assist the reader in understanding that the expression " +\n
+\t\t"is the result of a function, and not the function itself.",\n
+\tW063: "Math is not a function.",\n
+\tW064: "Missing \'new\' prefix when invoking a constructor.",\n
+\tW065: "Missing radix parameter.",\n
+\tW066: "Implied eval. Consider passing a function instead of a string.",\n
+\tW067: "Bad invocation.",\n
+\tW068: "Wrapping non-IIFE function literals in parens is unnecessary.",\n
+\tW069: "[\'{a}\'] is better written in dot notation.",\n
+\tW070: "Extra comma. (it breaks older versions of IE)",\n
+\tW071: "This function has too many statements. ({a})",\n
+\tW072: "This function has too many parameters. ({a})",\n
+\tW073: "Blocks are nested too deeply. ({a})",\n
+\tW074: "This function\'s cyclomatic complexity is too high. ({a})",\n
+\tW075: "Duplicate key \'{a}\'.",\n
+\tW076: "Unexpected parameter \'{a}\' in get {b} function.",\n
+\tW077: "Expected a single parameter in set {a} function.",\n
+\tW078: "Setter is defined without getter.",\n
+\tW079: "Redefinition of \'{a}\'.",\n
+\tW080: "It\'s not necessary to initialize \'{a}\' to \'undefined\'.",\n
+\tW081: "Too many var statements.",\n
+\tW082: "Function declarations should not be placed in blocks. " +\n
+\t\t"Use a function expression or move the statement to the top of " +\n
+\t\t"the outer function.",\n
+\tW083: "Don\'t make functions within a loop.",\n
+\tW084: "Assignment in conditional expression",\n
+\tW085: "Don\'t use \'with\'.",\n
+\tW086: "Expected a \'break\' statement before \'{a}\'.",\n
+\tW087: "Forgotten \'debugger\' statement?",\n
+\tW088: "Creating global \'for\' variable. Should be \'for (var {a} ...\'.",\n
+\tW089: "The body of a for in should be wrapped in an if statement to filter " +\n
+\t\t"unwanted properties from the prototype.",\n
+\tW090: "\'{a}\' is not a statement label.",\n
+\tW091: "\'{a}\' is out of scope.",\n
+\tW092: "Wrap the /regexp/ literal in parens to disambiguate the slash operator.",\n
+\tW093: "Did you mean to return a conditional instead of an assignment?",\n
+\tW094: "Unexpected comma.",\n
+\tW095: "Expected a string and instead saw {a}.",\n
+\tW096: "The \'{a}\' key may produce unexpected results.",\n
+\tW097: "Use the function form of \\"use strict\\".",\n
+\tW098: "\'{a}\' is defined but never used.",\n
+\tW099: "Mixed spaces and tabs.",\n
+\tW100: "This character may get silently deleted by one or more browsers.",\n
+\tW101: "Line is too long.",\n
+\tW102: "Trailing whitespace.",\n
+\tW103: "The \'{a}\' property is deprecated.",\n
+\tW104: "\'{a}\' is only available in JavaScript 1.7.",\n
+\tW105: "Unexpected {a} in \'{b}\'.",\n
+\tW106: "Identifier \'{a}\' is not in camel case.",\n
+\tW107: "Script URL.",\n
+\tW108: "Strings must use doublequote.",\n
+\tW109: "Strings must use singlequote.",\n
+\tW110: "Mixed double and single quotes.",\n
+\tW112: "Unclosed string.",\n
+\tW113: "Control character in string: {a}.",\n
+\tW114: "Avoid {a}.",\n
+\tW115: "Octal literals are not allowed in strict mode.",\n
+\tW116: "Expected \'{a}\' and instead saw \'{b}\'.",\n
+\tW117: "\'{a}\' is not defined.",\n
+\tW118: "\'{a}\' is only available in Mozilla JavaScript extensions (use moz option).",\n
+\tW119: "\'{a}\' is only available in ES6 (use esnext option).",\n
+\tW120: "You might be leaking a variable ({a}) here."\n
+};\n
 \n
-\tfunction is_own(object, name) {\n
-\t\treturn Object.prototype.hasOwnProperty.call(object, name);\n
-\t}\n
+var info = {\n
+\tI001: "Comma warnings can be turned off with \'laxcomma\'.",\n
+\tI002: "Reserved words as properties can be used under the \'es5\' option.",\n
+\tI003: "ES5 option is now set per default"\n
+};\n
 \n
-\tfunction checkOption(name, t) {\n
-\t\tif (valOptions[name] === undefined && boolOptions[name] === undefined) {\n
-\t\t\twarning("Bad option: \'" + name + "\'.", t);\n
-\t\t}\n
-\t}\n
+exports.errors = {};\n
+exports.warnings = {};\n
+exports.info = {};\n
 \n
-\tfunction isString(obj) {\n
-\t\treturn Object.prototype.toString.call(obj) === "[object String]";\n
-\t}\n
+_.each(errors, function (desc, code) {\n
+\texports.errors[code] = { code: code, desc: desc };\n
+});\n
 \n
-\tif (typeof Array.isArray !== "function") {\n
-\t\tArray.isArray = function (o) {\n
-\t\t\treturn Object.prototype.toString.apply(o) === "[object Array]";\n
-\t\t};\n
-\t}\n
+_.each(warnings, function (desc, code) {\n
+\texports.warnings[code] = { code: code, desc: desc };\n
+});\n
 \n
-\tif (!Array.prototype.forEach) {\n
-\t\tArray.prototype.forEach = function (fn, scope) {\n
-\t\t\tvar len = this.length;\n
+_.each(info, function (desc, code) {\n
+\texports.info[code] = { code: code, desc: desc };\n
+});\n
 \n
-\t\t\tfor (var i = 0; i < len; i++) {\n
-\t\t\t\tfn.call(scope || this, this[i], i, this);\n
-\t\t\t}\n
-\t\t};\n
-\t}\n
+},\n
+{"underscore":1}],\n
+3:[function(req,module,exports){\n
 \n
-\tif (!Array.prototype.indexOf) {\n
-\t\tArray.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\n
-\t\t\tif (this === null || this === undefined) {\n
-\t\t\t\tthrow new TypeError();\n
-\t\t\t}\n
+exports.reservedVars = {\n
+\targuments : false,\n
+\tNaN       : false\n
+};\n
 \n
-\t\t\tvar t = new Object(this);\n
-\t\t\tvar len = t.length >>> 0;\n
+exports.ecmaIdentifiers = {\n
+\tArray              : false,\n
+\tBoolean            : false,\n
+\tDate               : false,\n
+\tdecodeURI          : false,\n
+\tdecodeURIComponent : false,\n
+\tencodeURI          : false,\n
+\tencodeURIComponent : false,\n
+\tError              : false,\n
+\t"eval"             : false,\n
+\tEvalError          : false,\n
+\tFunction           : false,\n
+\thasOwnProperty     : false,\n
+\tisFinite           : false,\n
+\tisNaN              : false,\n
+\tJSON               : false,\n
+\tMath               : false,\n
+\tMap                : false,\n
+\tNumber             : false,\n
+\tObject             : false,\n
+\tparseInt           : false,\n
+\tparseFloat         : false,\n
+\tRangeError         : false,\n
+\tReferenceError     : false,\n
+\tRegExp             : false,\n
+\tSet                : false,\n
+\tString             : false,\n
+\tSyntaxError        : false,\n
+\tTypeError          : false,\n
+\tURIError           : false,\n
+\tWeakMap            : false\n
+};\n
 \n
-\t\t\tif (len === 0) {\n
-\t\t\t\treturn -1;\n
-\t\t\t}\n
+exports.browser = {\n
+\tArrayBuffer          : false,\n
+\tArrayBufferView      : false,\n
+\tAudio                : false,\n
+\tBlob                 : false,\n
+\taddEventListener     : false,\n
+\tapplicationCache     : false,\n
+\tatob                 : false,\n
+\tblur                 : false,\n
+\tbtoa                 : false,\n
+\tclearInterval        : false,\n
+\tclearTimeout         : false,\n
+\tclose                : false,\n
+\tclosed               : false,\n
+\tCustomEvent          : false,\n
+\tDataView             : false,\n
+\tDOMParser            : false,\n
+\tdefaultStatus        : false,\n
+\tdocument             : false,\n
+\tElement              : false,\n
+\tElementTimeControl   : false,\n
+\tevent                : false,\n
+\tFileReader           : false,\n
+\tFloat32Array         : false,\n
+\tFloat64Array         : false,\n
+\tFormData             : false,\n
+\tfocus                : false,\n
+\tframes               : false,\n
+\tgetComputedStyle     : false,\n
+\tHTMLElement          : false,\n
+\tHTMLAnchorElement    : false,\n
+\tHTMLBaseElement      : false,\n
+\tHTMLBlockquoteElement: false,\n
+\tHTMLBodyElement      : false,\n
+\tHTMLBRElement        : false,\n
+\tHTMLButtonElement    : false,\n
+\tHTMLCanvasElement    : false,\n
+\tHTMLDirectoryElement : false,\n
+\tHTMLDivElement       : false,\n
+\tHTMLDListElement     : false,\n
+\tHTMLFieldSetElement  : false,\n
+\tHTMLFontElement      : false,\n
+\tHTMLFormElement      : false,\n
+\tHTMLFrameElement     : false,\n
+\tHTMLFrameSetElement  : false,\n
+\tHTMLHeadElement      : false,\n
+\tHTMLHeadingElement   : false,\n
+\tHTMLHRElement        : false,\n
+\tHTMLHtmlElement      : false,\n
+\tHTMLIFrameElement    : false,\n
+\tHTMLImageElement     : false,\n
+\tHTMLInputElement     : false,\n
+\tHTMLIsIndexElement   : false,\n
+\tHTMLLabelElement     : false,\n
+\tHTMLLayerElement     : false,\n
+\tHTMLLegendElement    : false,\n
+\tHTMLLIElement        : false,\n
+\tHTMLLinkElement      : false,\n
+\tHTMLMapElement       : false,\n
+\tHTMLMenuElement      : false,\n
+\tHTMLMetaElement      : false,\n
+\tHTMLModElement       : false,\n
+\tHTMLObjectElement    : false,\n
+\tHTMLOListElement     : false,\n
+\tHTMLOptGroupElement  : false,\n
+\tHTMLOptionElement    : false,\n
+\tHTMLParagraphElement : false,\n
+\tHTMLParamElement     : false,\n
+\tHTMLPreElement       : false,\n
+\tHTMLQuoteElement     : false,\n
+\tHTMLScriptElement    : false,\n
+\tHTMLSelectElement    : false,\n
+\tHTMLStyleElement     : false,\n
+\tHTMLTableCaptionElement: false,\n
+\tHTMLTableCellElement : false,\n
+\tHTMLTableColElement  : false,\n
+\tHTMLTableElement     : false,\n
+\tHTMLTableRowElement  : false,\n
+\tHTMLTableSectionElement: false,\n
+\tHTMLTextAreaElement  : false,\n
+\tHTMLTitleElement     : false,\n
+\tHTMLUListElement     : false,\n
+\tHTMLVideoElement     : false,\n
+\thistory              : false,\n
+\tInt16Array           : false,\n
+\tInt32Array           : false,\n
+\tInt8Array            : false,\n
+\tImage                : false,\n
+\tlength               : false,\n
+\tlocalStorage         : false,\n
+\tlocation             : false,\n
+\tMessageChannel       : false,\n
+\tMessageEvent         : false,\n
+\tMessagePort          : false,\n
+\tMouseEvent           : false,\n
+\tmoveBy               : false,\n
+\tmoveTo               : false,\n
+\tMutationObserver     : false,\n
+\tname                 : false,\n
+\tNode                 : false,\n
+\tNodeFilter           : false,\n
+\tnavigator            : false,\n
+\tonbeforeunload       : true,\n
+\tonblur               : true,\n
+\tonerror              : true,\n
+\tonfocus              : true,\n
+\tonload               : true,\n
+\tonresize             : true,\n
+\tonunload             : true,\n
+\topen                 : false,\n
+\topenDatabase         : false,\n
+\topener               : false,\n
+\tOption               : false,\n
+\tparent               : false,\n
+\tprint                : false,\n
+\tremoveEventListener  : false,\n
+\tresizeBy             : false,\n
+\tresizeTo             : false,\n
+\tscreen               : false,\n
+\tscroll               : false,\n
+\tscrollBy             : false,\n
+\tscrollTo             : false,\n
+\tsessionStorage       : false,\n
+\tsetInterval          : false,\n
+\tsetTimeout           : false,\n
+\tSharedWorker         : false,\n
+\tstatus               : false,\n
+\tSVGAElement          : false,\n
+\tSVGAltGlyphDefElement: false,\n
+\tSVGAltGlyphElement   : false,\n
+\tSVGAltGlyphItemElement: false,\n
+\tSVGAngle             : false,\n
+\tSVGAnimateColorElement: false,\n
+\tSVGAnimateElement    : false,\n
+\tSVGAnimateMotionElement: false,\n
+\tSVGAnimateTransformElement: false,\n
+\tSVGAnimatedAngle     : false,\n
+\tSVGAnimatedBoolean   : false,\n
+\tSVGAnimatedEnumeration: false,\n
+\tSVGAnimatedInteger   : false,\n
+\tSVGAnimatedLength    : false,\n
+\tSVGAnimatedLengthList: false,\n
+\tSVGAnimatedNumber    : false,\n
+\tSVGAnimatedNumberList: false,\n
+\tSVGAnimatedPathData  : false,\n
+\tSVGAnimatedPoints    : false,\n
+\tSVGAnimatedPreserveAspectRatio: false,\n
+\tSVGAnimatedRect      : false,\n
+\tSVGAnimatedString    : false,\n
+\tSVGAnimatedTransformList: false,\n
+\tSVGAnimationElement  : false,\n
+\tSVGCSSRule           : false,\n
+\tSVGCircleElement     : false,\n
+\tSVGClipPathElement   : false,\n
+\tSVGColor             : false,\n
+\tSVGColorProfileElement: false,\n
+\tSVGColorProfileRule  : false,\n
+\tSVGComponentTransferFunctionElement: false,\n
+\tSVGCursorElement     : false,\n
+\tSVGDefsElement       : false,\n
+\tSVGDescElement       : false,\n
+\tSVGDocument          : false,\n
+\tSVGElement           : false,\n
+\tSVGElementInstance   : false,\n
+\tSVGElementInstanceList: false,\n
+\tSVGEllipseElement    : false,\n
+\tSVGExternalResourcesRequired: false,\n
+\tSVGFEBlendElement    : false,\n
+\tSVGFEColorMatrixElement: false,\n
+\tSVGFEComponentTransferElement: false,\n
+\tSVGFECompositeElement: false,\n
+\tSVGFEConvolveMatrixElement: false,\n
+\tSVGFEDiffuseLightingElement: false,\n
+\tSVGFEDisplacementMapElement: false,\n
+\tSVGFEDistantLightElement: false,\n
+\tSVGFEFloodElement    : false,\n
+\tSVGFEFuncAElement    : false,\n
+\tSVGFEFuncBElement    : false,\n
+\tSVGFEFuncGElement    : false,\n
+\tSVGFEFuncRElement    : false,\n
+\tSVGFEGaussianBlurElement: false,\n
+\tSVGFEImageElement    : false,\n
+\tSVGFEMergeElement    : false,\n
+\tSVGFEMergeNodeElement: false,\n
+\tSVGFEMorphologyElement: false,\n
+\tSVGFEOffsetElement   : false,\n
+\tSVGFEPointLightElement: false,\n
+\tSVGFESpecularLightingElement: false,\n
+\tSVGFESpotLightElement: false,\n
+\tSVGFETileElement     : false,\n
+\tSVGFETurbulenceElement: false,\n
+\tSVGFilterElement     : false,\n
+\tSVGFilterPrimitiveStandardAttributes: false,\n
+\tSVGFitToViewBox      : false,\n
+\tSVGFontElement       : false,\n
+\tSVGFontFaceElement   : false,\n
+\tSVGFontFaceFormatElement: false,\n
+\tSVGFontFaceNameElement: false,\n
+\tSVGFontFaceSrcElement: false,\n
+\tSVGFontFaceUriElement: false,\n
+\tSVGForeignObjectElement: false,\n
+\tSVGGElement          : false,\n
+\tSVGGlyphElement      : false,\n
+\tSVGGlyphRefElement   : false,\n
+\tSVGGradientElement   : false,\n
+\tSVGHKernElement      : false,\n
+\tSVGICCColor          : false,\n
+\tSVGImageElement      : false,\n
+\tSVGLangSpace         : false,\n
+\tSVGLength            : false,\n
+\tSVGLengthList        : false,\n
+\tSVGLineElement       : false,\n
+\tSVGLinearGradientElement: false,\n
+\tSVGLocatable         : false,\n
+\tSVGMPathElement      : false,\n
+\tSVGMarkerElement     : false,\n
+\tSVGMaskElement       : false,\n
+\tSVGMatrix            : false,\n
+\tSVGMetadataElement   : false,\n
+\tSVGMissingGlyphElement: false,\n
+\tSVGNumber            : false,\n
+\tSVGNumberList        : false,\n
+\tSVGPaint             : false,\n
+\tSVGPathElement       : false,\n
+\tSVGPathSeg           : false,\n
+\tSVGPathSegArcAbs     : false,\n
+\tSVGPathSegArcRel     : false,\n
+\tSVGPathSegClosePath  : false,\n
+\tSVGPathSegCurvetoCubicAbs: false,\n
+\tSVGPathSegCurvetoCubicRel: false,\n
+\tSVGPathSegCurvetoCubicSmoothAbs: false,\n
+\tSVGPathSegCurvetoCubicSmoothRel: false,\n
+\tSVGPathSegCurvetoQuadraticAbs: false,\n
+\tSVGPathSegCurvetoQuadraticRel: false,\n
+\tSVGPathSegCurvetoQuadraticSmoothAbs: false,\n
+\tSVGPathSegCurvetoQuadraticSmoothRel: false,\n
+\tSVGPathSegLinetoAbs  : false,\n
+\tSVGPathSegLinetoHorizontalAbs: false,\n
+\tSVGPathSegLinetoHorizontalRel: false,\n
+\tSVGPathSegLinetoRel  : false,\n
+\tSVGPathSegLinetoVerticalAbs: false,\n
+\tSVGPathSegLinetoVerticalRel: false,\n
+\tSVGPathSegList       : false,\n
+\tSVGPathSegMovetoAbs  : false,\n
+\tSVGPathSegMovetoRel  : false,\n
+\tSVGPatternElement    : false,\n
+\tSVGPoint             : false,\n
+\tSVGPointList         : false,\n
+\tSVGPolygonElement    : false,\n
+\tSVGPolylineElement   : false,\n
+\tSVGPreserveAspectRatio: false,\n
+\tSVGRadialGradientElement: false,\n
+\tSVGRect              : false,\n
+\tSVGRectElement       : false,\n
+\tSVGRenderingIntent   : false,\n
+\tSVGSVGElement        : false,\n
+\tSVGScriptElement     : false,\n
+\tSVGSetElement        : false,\n
+\tSVGStopElement       : false,\n
+\tSVGStringList        : false,\n
+\tSVGStylable          : false,\n
+\tSVGStyleElement      : false,\n
+\tSVGSwitchElement     : false,\n
+\tSVGSymbolElement     : false,\n
+\tSVGTRefElement       : false,\n
+\tSVGTSpanElement      : false,\n
+\tSVGTests             : false,\n
+\tSVGTextContentElement: false,\n
+\tSVGTextElement       : false,\n
+\tSVGTextPathElement   : false,\n
+\tSVGTextPositioningElement: false,\n
+\tSVGTitleElement      : false,\n
+\tSVGTransform         : false,\n
+\tSVGTransformList     : false,\n
+\tSVGTransformable     : false,\n
+\tSVGURIReference      : false,\n
+\tSVGUnitTypes         : false,\n
+\tSVGUseElement        : false,\n
+\tSVGVKernElement      : false,\n
+\tSVGViewElement       : false,\n
+\tSVGViewSpec          : false,\n
+\tSVGZoomAndPan        : false,\n
+\tTimeEvent            : false,\n
+\ttop                  : false,\n
+\tUint16Array          : false,\n
+\tUint32Array          : false,\n
+\tUint8Array           : false,\n
+\tUint8ClampedArray    : false,\n
+\tWebSocket            : false,\n
+\twindow               : false,\n
+\tWorker               : false,\n
+\tXMLHttpRequest       : false,\n
+\tXMLSerializer        : false,\n
+\tXPathEvaluator       : false,\n
+\tXPathException       : false,\n
+\tXPathExpression      : false,\n
+\tXPathNamespace       : false,\n
+\tXPathNSResolver      : false,\n
+\tXPathResult          : false\n
+};\n
 \n
-\t\t\tvar n = 0;\n
-\t\t\tif (arguments.length > 0) {\n
-\t\t\t\tn = Number(arguments[1]);\n
-\t\t\t\tif (n != n) { // shortcut for verifying if it\'s NaN\n
-\t\t\t\t\tn = 0;\n
-\t\t\t\t} else if (n !== 0 && n != Infinity && n != -Infinity) {\n
-\t\t\t\t\tn = (n > 0 || -1) * Math.floor(Math.abs(n));\n
-\t\t\t\t}\n
-\t\t\t}\n
+exports.devel = {\n
+\talert  : false,\n
+\tconfirm: false,\n
+\tconsole: false,\n
+\tDebug  : false,\n
+\topera  : false,\n
+\tprompt : false\n
+};\n
 \n
-\t\t\tif (n >= len) {\n
-\t\t\t\treturn -1;\n
-\t\t\t}\n
+exports.worker = {\n
+\timportScripts: true,\n
+\tpostMessage  : true,\n
+\tself         : true\n
+};\n
+exports.nonstandard = {\n
+\tescape  : false,\n
+\tunescape: false\n
+};\n
 \n
-\t\t\tvar k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n
-\t\t\tfor (; k < len; k++) {\n
-\t\t\t\tif (k in t && t[k] === searchElement) {\n
-\t\t\t\t\treturn k;\n
-\t\t\t\t}\n
-\t\t\t}\n
+exports.couch = {\n
+\t"require" : false,\n
+\trespond   : false,\n
+\tgetRow    : false,\n
+\temit      : false,\n
+\tsend      : false,\n
+\tstart     : false,\n
+\tsum       : false,\n
+\tlog       : false,\n
+\texports   : false,\n
+\tmodule    : false,\n
+\tprovides  : false\n
+};\n
 \n
-\t\t\treturn -1;\n
-\t\t};\n
-\t}\n
+exports.node = {\n
+\t__filename    : false,\n
+\t__dirname     : false,\n
+\tBuffer        : false,\n
+\tDataView      : false,\n
+\tconsole       : false,\n
+\texports       : true,  // In Node it is ok to exports = module.exports = foo();\n
+\tGLOBAL        : false,\n
+\tglobal        : false,\n
+\tmodule        : false,\n
+\tprocess       : false,\n
+\trequire       : false,\n
+\tsetTimeout    : false,\n
+\tclearTimeout  : false,\n
+\tsetInterval   : false,\n
+\tclearInterval : false,\n
+\tsetImmediate  : false, // v0.9.1+\n
+\tclearImmediate: false  // v0.9.1+\n
+};\n
 \n
-\tif (typeof Object.create !== "function") {\n
-\t\tObject.create = function (o) {\n
-\t\t\tF.prototype = o;\n
-\t\t\treturn new F();\n
-\t\t};\n
-\t}\n
+exports.phantom = {\n
+\tphantom      : true,\n
+\trequire      : true,\n
+\tWebPage      : true\n
+};\n
 \n
-\tif (typeof Object.keys !== "function") {\n
-\t\tObject.keys = function (o) {\n
-\t\t\tvar a = [], k;\n
-\t\t\tfor (k in o) {\n
-\t\t\t\tif (is_own(o, k)) {\n
-\t\t\t\t\ta.push(k);\n
-\t\t\t\t}\n
+exports.rhino = {\n
+\tdefineClass  : false,\n
+\tdeserialize  : false,\n
+\tgc           : false,\n
+\thelp         : false,\n
+\timportPackage: false,\n
+\t"java"       : false,\n
+\tload         : false,\n
+\tloadClass    : false,\n
+\tprint        : false,\n
+\tquit         : false,\n
+\treadFile     : false,\n
+\treadUrl      : false,\n
+\trunCommand   : false,\n
+\tseal         : false,\n
+\tserialize    : false,\n
+\tspawn        : false,\n
+\tsync         : false,\n
+\ttoint32      : false,\n
+\tversion      : false\n
+};\n
+\n
+exports.shelljs = {\n
+\ttarget       : false,\n
+\techo         : false,\n
+\texit         : false,\n
+\tcd           : false,\n
+\tpwd          : false,\n
+\tls           : false,\n
+\tfind         : false,\n
+\tcp           : false,\n
+\trm           : false,\n
+\tmv           : false,\n
+\tmkdir        : false,\n
+\ttest         : false,\n
+\tcat          : false,\n
+\tsed          : false,\n
+\tgrep         : false,\n
+\twhich        : false,\n
+\tdirs         : false,\n
+\tpushd        : false,\n
+\tpopd         : false,\n
+\tenv          : false,\n
+\texec         : false,\n
+\tchmod        : false,\n
+\tconfig       : false,\n
+\terror        : false,\n
+\ttempdir      : false\n
+};\n
+\n
+exports.wsh = {\n
+\tActiveXObject            : true,\n
+\tEnumerator               : true,\n
+\tGetObject                : true,\n
+\tScriptEngine             : true,\n
+\tScriptEngineBuildVersion : true,\n
+\tScriptEngineMajorVersion : true,\n
+\tScriptEngineMinorVersion : true,\n
+\tVBArray                  : true,\n
+\tWSH                      : true,\n
+\tWScript                  : true,\n
+\tXDomainRequest           : true\n
+};\n
+\n
+exports.dojo = {\n
+\tdojo     : false,\n
+\tdijit    : false,\n
+\tdojox    : false,\n
+\tdefine\t : false,\n
+\t"require": false\n
+};\n
+\n
+exports.jquery = {\n
+\t"$"    : false,\n
+\tjQuery : false\n
+};\n
+\n
+exports.mootools = {\n
+\t"$"           : false,\n
+\t"$$"          : false,\n
+\tAsset         : false,\n
+\tBrowser       : false,\n
+\tChain         : false,\n
+\tClass         : false,\n
+\tColor         : false,\n
+\tCookie        : false,\n
+\tCore          : false,\n
+\tDocument      : false,\n
+\tDomReady      : false,\n
+\tDOMEvent      : false,\n
+\tDOMReady      : false,\n
+\tDrag          : false,\n
+\tElement       : false,\n
+\tElements      : false,\n
+\tEvent         : false,\n
+\tEvents        : false,\n
+\tFx            : false,\n
+\tGroup         : false,\n
+\tHash          : false,\n
+\tHtmlTable     : false,\n
+\tIframe        : false,\n
+\tIframeShim    : false,\n
+\tInputValidator: false,\n
+\tinstanceOf    : false,\n
+\tKeyboard      : false,\n
+\tLocale        : false,\n
+\tMask          : false,\n
+\tMooTools      : false,\n
+\tNative        : false,\n
+\tOptions       : false,\n
+\tOverText      : false,\n
+\tRequest       : false,\n
+\tScroller      : false,\n
+\tSlick         : false,\n
+\tSlider        : false,\n
+\tSortables     : false,\n
+\tSpinner       : false,\n
+\tSwiff         : false,\n
+\tTips          : false,\n
+\tType          : false,\n
+\ttypeOf        : false,\n
+\tURI           : false,\n
+\tWindow        : false\n
+};\n
+\n
+exports.prototypejs = {\n
+\t"$"               : false,\n
+\t"$$"              : false,\n
+\t"$A"              : false,\n
+\t"$F"              : false,\n
+\t"$H"              : false,\n
+\t"$R"              : false,\n
+\t"$break"          : false,\n
+\t"$continue"       : false,\n
+\t"$w"              : false,\n
+\tAbstract          : false,\n
+\tAjax              : false,\n
+\tClass             : false,\n
+\tEnumerable        : false,\n
+\tElement           : false,\n
+\tEvent             : false,\n
+\tField             : false,\n
+\tForm              : false,\n
+\tHash              : false,\n
+\tInsertion         : false,\n
+\tObjectRange       : false,\n
+\tPeriodicalExecuter: false,\n
+\tPosition          : false,\n
+\tPrototype         : false,\n
+\tSelector          : false,\n
+\tTemplate          : false,\n
+\tToggle            : false,\n
+\tTry               : false,\n
+\tAutocompleter     : false,\n
+\tBuilder           : false,\n
+\tControl           : false,\n
+\tDraggable         : false,\n
+\tDraggables        : false,\n
+\tDroppables        : false,\n
+\tEffect            : false,\n
+\tSortable          : false,\n
+\tSortableObserver  : false,\n
+\tSound             : false,\n
+\tScriptaculous     : false\n
+};\n
+\n
+exports.yui = {\n
+\tYUI       : false,\n
+\tY         : false,\n
+\tYUI_config: false\n
+};\n
+\n
+\n
+},\n
+{}],\n
+"n4bKNg":[function(req,module,exports){\n
+\n
+var _        = req("underscore");\n
+var events   = req("events");\n
+var vars     = req("../shared/vars.js");\n
+var messages = req("../shared/messages.js");\n
+var Lexer    = req("./lex.js").Lexer;\n
+var reg      = req("./reg.js");\n
+var state    = req("./state.js").state;\n
+var style    = req("./style.js");\n
+var console = req("console-browserify");\n
+\n
+var JSHINT = (function () {\n
+\t\n
+\n
+\tvar anonname, // The guessed name for anonymous functions.\n
+\t\tapi, // Extension API\n
+\t\tbang = {\n
+\t\t\t"<"  : true,\n
+\t\t\t"<=" : true,\n
+\t\t\t"==" : true,\n
+\t\t\t"===": true,\n
+\t\t\t"!==": true,\n
+\t\t\t"!=" : true,\n
+\t\t\t">"  : true,\n
+\t\t\t">=" : true,\n
+\t\t\t"+"  : true,\n
+\t\t\t"-"  : true,\n
+\t\t\t"*"  : true,\n
+\t\t\t"/"  : true,\n
+\t\t\t"%"  : true\n
+\t\t},\n
+\t\tboolOptions = {\n
+\t\t\tasi         : true, // if automatic semicolon insertion should be tolerated\n
+\t\t\tbitwise     : true, // if bitwise operators should not be allowed\n
+\t\t\tboss        : true, // if advanced usage of assignments should be allowed\n
+\t\t\tbrowser     : true, // if the standard browser globals should be predefined\n
+\t\t\tcamelcase   : true, // if identifiers should be required in camel case\n
+\t\t\tcouch       : true, // if CouchDB globals should be predefined\n
+\t\t\tcurly       : true, // if curly braces around all blocks should be required\n
+\t\t\tdebug       : true, // if debugger statements should be allowed\n
+\t\t\tdevel       : true, // if logging globals should be predefined (console, alert, etc.)\n
+\t\t\tdojo        : true, // if Dojo Toolkit globals should be predefined\n
+\t\t\teqeqeq      : true, // if === should be required\n
+\t\t\teqnull      : true, // if == null comparisons should be tolerated\n
+\t\t\tes3         : true, // if ES3 syntax should be allowed\n
+\t\t\tes5         : true, // if ES5 syntax should be allowed (is now set per default)\n
+\t\t\tesnext      : true, // if es.next specific syntax should be allowed\n
+\t\t\tmoz         : true, // if mozilla specific syntax should be allowed\n
+\t\t\tevil        : true, // if eval should be allowed\n
+\t\t\texpr        : true, // if ExpressionStatement should be allowed as Programs\n
+\t\t\tforin       : true, // if for in statements must filter\n
+\t\t\tfuncscope   : true, // if only function scope should be used for scope tests\n
+\t\t\tgcl         : true, // if JSHint should be compatible with Google Closure Linter\n
+\t\t\tglobalstrict: true, // if global  should be allowed (also enables \'strict\')\n
+\t\t\timmed       : true, // if immediate invocations must be wrapped in parens\n
+\t\t\titerator    : true, // if the `__iterator__` property should be allowed\n
+\t\t\tjquery      : true, // if jQuery globals should be predefined\n
+\t\t\tlastsemic   : true, // if semicolons may be ommitted for the trailing\n
+\t\t\tlaxbreak    : true, // if line breaks should not be checked\n
+\t\t\tlaxcomma    : true, // if line breaks should not be checked around commas\n
+\t\t\tloopfunc    : true, // if functions should be allowed to be defined within\n
+\t\t\tmootools    : true, // if MooTools globals should be predefined\n
+\t\t\tmultistr    : true, // allow multiline strings\n
+\t\t\tnewcap      : true, // if constructor names must be capitalized\n
+\t\t\tnoarg       : true, // if arguments.caller and arguments.callee should be\n
+\t\t\tnode        : true, // if the Node.js environment globals should be\n
+\t\t\tnoempty     : true, // if empty blocks should be disallowed\n
+\t\t\tnonew       : true, // if using `new` for side-effects should be disallowed\n
+\t\t\tnonstandard : true, // if non-standard (but widely adopted) globals should\n
+\t\t\tnomen       : true, // if names should be checked\n
+\t\t\tonevar      : true, // if only one var statement per function should be\n
+\t\t\tpassfail    : true, // if the scan should stop on first error\n
+\t\t\tphantom     : true, // if PhantomJS symbols should be allowed\n
+\t\t\tplusplus    : true, // if increment/decrement should not be allowed\n
+\t\t\tproto       : true, // if the `__proto__` property should be allowed\n
+\t\t\tprototypejs : true, // if Prototype and Scriptaculous globals should be\n
+\t\t\trhino       : true, // if the Rhino environment globals should be predefined\n
+\t\t\tshelljs     : true, // if ShellJS globals should be predefined\n
+\t\t\tundef       : true, // if variables should be declared before used\n
+\t\t\tscripturl   : true, // if script-targeted URLs should be tolerated\n
+\t\t\tshadow      : true, // if variable shadowing should be tolerated\n
+\t\t\tsmarttabs   : true, // if smarttabs should be tolerated\n
+\t\t\tstrict      : true, // require the  pragma\n
+\t\t\tsub         : true, // if all forms of subscript notation are tolerated\n
+\t\t\tsupernew    : true, // if `new function () { ... };` and `new Object;`\n
+\t\t\ttrailing    : true, // if trailing whitespace rules apply\n
+\t\t\tvalidthis   : true, // if \'this\' inside a non-constructor function is valid.\n
+\t\t\twithstmt    : true, // if with statements should be allowed\n
+\t\t\twhite       : true, // if strict whitespace rules apply\n
+\t\t\tworker      : true, // if Web Worker script symbols should be allowed\n
+\t\t\twsh         : true, // if the Windows Scripting Host environment globals\n
+\t\t\tyui         : true, // YUI variables should be predefined\n
+\t\t\tonecase     : true, // if one case switch statements should be allowed\n
+\t\t\tregexp      : true, // if the . should not be allowed in regexp literals\n
+\t\t\tregexdash   : true  // if unescaped first/last dash (-) inside brackets\n
+\t\t},\n
+\t\tvalOptions = {\n
+\t\t\tmaxlen       : false,\n
+\t\t\tindent       : false,\n
+\t\t\tmaxerr       : false,\n
+\t\t\tpredef       : false,\n
+\t\t\tquotmark     : false, //\'single\'|\'double\'|true\n
+\t\t\tscope        : false,\n
+\t\t\tmaxstatements: false, // {int} max statements per function\n
+\t\t\tmaxdepth     : false, // {int} max nested block depth per function\n
+\t\t\tmaxparams    : false, // {int} max params per function\n
+\t\t\tmaxcomplexity: false, // {int} max cyclomatic complexity per function\n
+\t\t\tunused       : true,  // warn if variables are unused. Available options:\n
+\t\t\tlatedef      : false  // warn if the variable is used before its definition\n
+\t\t},\n
+\t\tinvertedOptions = {\n
+\t\t\tbitwise : true,\n
+\t\t\tforin   : true,\n
+\t\t\tnewcap  : true,\n
+\t\t\tnomen   : true,\n
+\t\t\tplusplus: true,\n
+\t\t\tregexp  : true,\n
+\t\t\tundef   : true,\n
+\t\t\twhite   : true,\n
+\t\t\teqeqeq  : true,\n
+\t\t\tonevar  : true,\n
+\t\t\tstrict  : true\n
+\t\t},\n
+\t\trenamedOptions = {\n
+\t\t\teqeq   : "eqeqeq",\n
+\t\t\tvars   : "onevar",\n
+\t\t\twindows: "wsh",\n
+\t\t\tsloppy : "strict"\n
+\t\t},\n
+\n
+\t\tdeclared, // Globals that were declared using /*global ... */ syntax.\n
+\t\texported, // Variables that are used outside of the current file.\n
+\n
+\t\tfunctionicity = [\n
+\t\t\t"closure", "exception", "global", "label",\n
+\t\t\t"outer", "unused", "var"\n
+\t\t],\n
+\n
+\t\tfunct, // The current function\n
+\t\tfunctions, // All of the functions\n
+\n
+\t\tglobal, // The global scope\n
+\t\timplied, // Implied globals\n
+\t\tinblock,\n
+\t\tindent,\n
+\t\tlookahead,\n
+\t\tlex,\n
+\t\tmember,\n
+\t\tmembersOnly,\n
+\t\tnoreach,\n
+\t\tpredefined,\t\t// Global variables defined by option\n
+\n
+\t\tscope,  // The current scope\n
+\t\tstack,\n
+\t\tunuseds,\n
+\t\turls,\n
+\t\twarnings,\n
+\n
+\t\textraModules = [],\n
+\t\temitter = new events.EventEmitter();\n
+\n
+\tfunction checkOption(name, t) {\n
+\t\tname = name.trim();\n
+\n
+\t\tif (/^[+-]W\\d{3}$/g.test(name)) {\n
+\t\t\treturn true;\n
+\t\t}\n
+\n
+\t\tif (valOptions[name] === undefined && boolOptions[name] === undefined) {\n
+\t\t\tif (t.type !== "jslint") {\n
+\t\t\t\terror("E001", t, name);\n
+\t\t\t\treturn false;\n
 \t\t\t}\n
-\t\t\treturn a;\n
-\t\t};\n
-\t}\n
+\t\t}\n
 \n
-\tfunction isAlpha(str) {\n
-\t\treturn (str >= "a" && str <= "z\\uffff") ||\n
-\t\t\t(str >= "A" && str <= "Z\\uffff");\n
+\t\treturn true;\n
 \t}\n
 \n
-\tfunction isDigit(str) {\n
-\t\treturn (str >= "0" && str <= "9");\n
+\tfunction isString(obj) {\n
+\t\treturn Object.prototype.toString.call(obj) === "[object String]";\n
 \t}\n
 \n
-\tfunction isIdentifier(token, value) {\n
-\t\tif (!token)\n
+\tfunction isIdentifier(tkn, value) {\n
+\t\tif (!tkn)\n
+\t\t\treturn false;\n
+\n
+\t\tif (!tkn.identifier || tkn.value !== value)\n
 \t\t\treturn false;\n
 \n
-\t\tif (!token.identifier || token.value !== value)\n
+\t\treturn true;\n
+\t}\n
+\n
+\tfunction isReserved(token) {\n
+\t\tif (!token.reserved) {\n
 \t\t\treturn false;\n
+\t\t}\n
+\t\tvar meta = token.meta;\n
+\n
+\t\tif (meta && meta.isFutureReservedWord && state.option.inES5()) {\n
+\t\t\tif (!meta.es5) {\n
+\t\t\t\treturn false;\n
+\t\t\t}\n
+\t\t\tif (meta.strictOnly) {\n
+\t\t\t\tif (!state.option.strict && !state.directive["use strict"]) {\n
+\t\t\t\t\treturn false;\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\tif (token.isProperty) {\n
+\t\t\t\treturn false;\n
+\t\t\t}\n
+\t\t}\n
 \n
 \t\treturn true;\n
 \t}\n
@@ -2816,7 +4086,7 @@ var JSHINT = (function () {\n
 \tfunction combine(t, o) {\n
 \t\tvar n;\n
 \t\tfor (n in o) {\n
-\t\t\tif (is_own(o, n) && !is_own(JSHINT.blacklist, n)) {\n
+\t\t\tif (_.has(o, n) && !_.has(JSHINT.blacklist, n)) {\n
 \t\t\t\tt[n] = o[n];\n
 \t\t\t}\n
 \t\t}\n
@@ -2829,95 +4099,135 @@ var JSHINT = (function () {\n
 \t}\n
 \n
 \tfunction assume() {\n
-\t\tif (option.couch) {\n
-\t\t\tcombine(predefined, couch);\n
+\t\tif (state.option.couch) {\n
+\t\t\tcombine(predefined, vars.couch);\n
 \t\t}\n
 \n
-\t\tif (option.rhino) {\n
-\t\t\tcombine(predefined, rhino);\n
+\t\tif (state.option.rhino) {\n
+\t\t\tcombine(predefined, vars.rhino);\n
 \t\t}\n
 \n
-\t\tif (option.prototypejs) {\n
-\t\t\tcombine(predefined, prototypejs);\n
+\t\tif (state.option.shelljs) {\n
+\t\t\tcombine(predefined, vars.shelljs);\n
+\t\t\tcombine(predefined, vars.node);\n
 \t\t}\n
 \n
-\t\tif (option.node) {\n
-\t\t\tcombine(predefined, node);\n
-\t\t\toption.globalstrict = true;\n
+\t\tif (state.option.phantom) {\n
+\t\t\tcombine(predefined, vars.phantom);\n
 \t\t}\n
 \n
-\t\tif (option.devel) {\n
-\t\t\tcombine(predefined, devel);\n
+\t\tif (state.option.prototypejs) {\n
+\t\t\tcombine(predefined, vars.prototypejs);\n
 \t\t}\n
 \n
-\t\tif (option.dojo) {\n
-\t\t\tcombine(predefined, dojo);\n
+\t\tif (state.option.node) {\n
+\t\t\tcombine(predefined, vars.node);\n
 \t\t}\n
 \n
-\t\tif (option.browser) {\n
-\t\t\tcombine(predefined, browser);\n
+\t\tif (state.option.devel) {\n
+\t\t\tcombine(predefined, vars.devel);\n
 \t\t}\n
 \n
-\t\tif (option.nonstandard) {\n
-\t\t\tcombine(predefined, nonstandard);\n
+\t\tif (state.option.dojo) {\n
+\t\t\tcombine(predefined, vars.dojo);\n
 \t\t}\n
 \n
-\t\tif (option.jquery) {\n
-\t\t\tcombine(predefined, jquery);\n
+\t\tif (state.option.browser) {\n
+\t\t\tcombine(predefined, vars.browser);\n
 \t\t}\n
 \n
-\t\tif (option.mootools) {\n
-\t\t\tcombine(predefined, mootools);\n
+\t\tif (state.option.nonstandard) {\n
+\t\t\tcombine(predefined, vars.nonstandard);\n
 \t\t}\n
 \n
-\t\tif (option.worker) {\n
-\t\t\tcombine(predefined, worker);\n
+\t\tif (state.option.jquery) {\n
+\t\t\tcombine(predefined, vars.jquery);\n
 \t\t}\n
 \n
-\t\tif (option.wsh) {\n
-\t\t\tcombine(predefined, wsh);\n
+\t\tif (state.option.mootools) {\n
+\t\t\tcombine(predefined, vars.mootools);\n
 \t\t}\n
 \n
-\t\tif (option.esnext) {\n
-\t\t\tuseESNextSyntax();\n
+\t\tif (state.option.worker) {\n
+\t\t\tcombine(predefined, vars.worker);\n
 \t\t}\n
 \n
-\t\tif (option.globalstrict && option.strict !== false) {\n
-\t\t\toption.strict = true;\n
+\t\tif (state.option.wsh) {\n
+\t\t\tcombine(predefined, vars.wsh);\n
 \t\t}\n
 \n
-\t\tif (option.yui) {\n
-\t\t\tcombine(predefined, yui);\n
+\t\tif (state.option.globalstrict && state.option.strict !== false) {\n
+\t\t\tstate.option.strict = true;\n
 \t\t}\n
+\n
+\t\tif (state.option.yui) {\n
+\t\t\tcombine(predefined, vars.yui);\n
+\t\t}\n
+\n
+\t\tstate.option.inMoz = function (strict) {\n
+\t\t\treturn state.option.moz;\n
+\t\t};\n
+\n
+\t\tstate.option.inESNext = function (strict) {\n
+\t\t\treturn state.option.moz || state.option.esnext;\n
+\t\t};\n
+\n
+\t\tstate.option.inES5 = function (/* strict */) {\n
+\t\t\treturn !state.option.es3;\n
+\t\t};\n
+\n
+\t\tstate.option.inES3 = function (strict) {\n
+\t\t\tif (strict) {\n
+\t\t\t\treturn !state.option.moz && !state.option.esnext && state.option.es3;\n
+\t\t\t}\n
+\t\t\treturn state.option.es3;\n
+\t\t};\n
 \t}\n
-\tfunction quit(message, line, chr) {\n
-\t\tvar percentage = Math.floor((line / lines.length) * 100);\n
+\tfunction quit(code, line, chr) {\n
+\t\tvar percentage = Math.floor((line / state.lines.length) * 100);\n
+\t\tvar message = messages.errors[code].desc;\n
 \n
 \t\tthrow {\n
 \t\t\tname: "JSHintError",\n
 \t\t\tline: line,\n
 \t\t\tcharacter: chr,\n
 \t\t\tmessage: message + " (" + percentage + "% scanned).",\n
-\t\t\traw: message\n
+\t\t\traw: message,\n
+\t\t\tcode: code\n
 \t\t};\n
 \t}\n
 \n
-\tfunction isundef(scope, m, t, a) {\n
-\t\treturn JSHINT.undefs.push([scope, m, t, a]);\n
+\tfunction isundef(scope, code, token, a) {\n
+\t\treturn JSHINT.undefs.push([scope, code, token, a]);\n
 \t}\n
 \n
-\tfunction warning(m, t, a, b, c, d) {\n
-\t\tvar ch, l, w;\n
-\t\tt = t || nexttoken;\n
+\tfunction warning(code, t, a, b, c, d) {\n
+\t\tvar ch, l, w, msg;\n
+\n
+\t\tif (/^W\\d{3}$/.test(code)) {\n
+\t\t\tif (state.ignored[code])\n
+\t\t\t\treturn;\n
+\n
+\t\t\tmsg = messages.warnings[code];\n
+\t\t} else if (/E\\d{3}/.test(code)) {\n
+\t\t\tmsg = messages.errors[code];\n
+\t\t} else if (/I\\d{3}/.test(code)) {\n
+\t\t\tmsg = messages.info[code];\n
+\t\t}\n
+\n
+\t\tt = t || state.tokens.next;\n
 \t\tif (t.id === "(end)") {  // `~\n
-\t\t\tt = token;\n
+\t\t\tt = state.tokens.curr;\n
 \t\t}\n
+\n
 \t\tl = t.line || 0;\n
 \t\tch = t.from || 0;\n
+\n
 \t\tw = {\n
 \t\t\tid: "(error)",\n
-\t\t\traw: m,\n
-\t\t\tevidence: lines[l - 1] || "",\n
+\t\t\traw: msg.desc,\n
+\t\t\tcode: msg.code,\n
+\t\t\tevidence: state.lines[l - 1] || "",\n
 \t\t\tline: l,\n
 \t\t\tcharacter: ch,\n
 \t\t\tscope: JSHINT.scope,\n
@@ -2926,15 +4236,19 @@ var JSHINT = (function () {\n
 \t\t\tc: c,\n
 \t\t\td: d\n
 \t\t};\n
-\t\tw.reason = supplant(m, w);\n
+\n
+\t\tw.reason = supplant(msg.desc, w);\n
 \t\tJSHINT.errors.push(w);\n
-\t\tif (option.passfail) {\n
-\t\t\tquit("Stopping. ", l, ch);\n
+\n
+\t\tif (state.option.passfail) {\n
+\t\t\tquit("E042", l, ch);\n
 \t\t}\n
+\n
 \t\twarnings += 1;\n
-\t\tif (warnings >= option.maxerr) {\n
-\t\t\tquit("Too many errors.", l, ch);\n
+\t\tif (warnings >= state.option.maxerr) {\n
+\t\t\tquit("E043", l, ch);\n
 \t\t}\n
+\n
 \t\treturn w;\n
 \t}\n
 \n
@@ -2966,666 +4280,230 @@ var JSHINT = (function () {\n
 \t\treturn i;\n
 \t}\n
 \n
-\tvar lex = (function lex() {\n
-\t\tvar character, from, line, s;\n
-\n
-\t\tfunction nextLine() {\n
-\t\t\tvar at,\n
-\t\t\t\tmatch,\n
-\t\t\t\ttw; // trailing whitespace check\n
-\n
-\t\t\tif (line >= lines.length)\n
-\t\t\t\treturn false;\n
+\tfunction addlabel(t, type, tkn, islet) {\n
+\t\tif (type === "exception") {\n
+\t\t\tif (_.has(funct["(context)"], t)) {\n
+\t\t\t\tif (funct[t] !== true && !state.option.node) {\n
+\t\t\t\t\twarning("W002", state.tokens.next, t);\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t}\n
 \n
-\t\t\tcharacter = 1;\n
-\t\t\ts = lines[line];\n
-\t\t\tline += 1;\n
-\t\t\tif (option.smarttabs) {\n
-\t\t\t\tmatch = s.match(/(\\/\\/)? \\t/);\n
-\t\t\t\tat = match && !match[1] ? 0 : -1;\n
+\t\tif (_.has(funct, t) && !funct["(global)"]) {\n
+\t\t\tif (funct[t] === true) {\n
+\t\t\t\tif (state.option.latedef) {\n
+\t\t\t\t\tif ((state.option.latedef === true && _.contains([funct[t], type], "unction")) ||\n
+\t\t\t\t\t\t\t!_.contains([funct[t], type], "unction")) {\n
+\t\t\t\t\t\twarning("W003", state.tokens.next, t);\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
 \t\t\t} else {\n
-\t\t\t\tat = s.search(/ \\t|\\t [^\\*]/);\n
+\t\t\t\tif (!state.option.shadow && type !== "exception" ||\n
+\t\t\t\t\t\t\t(funct["(blockscope)"].getlabel(t))) {\n
+\t\t\t\t\twarning("W004", state.tokens.next, t);\n
+\t\t\t\t}\n
 \t\t\t}\n
+\t\t}\n
+\t\tif (funct["(blockscope)"] && funct["(blockscope)"].current.has(t)) {\n
+\t\t\terror("E044", state.tokens.next, t);\n
+\t\t}\n
+\t\tif (islet) {\n
+\t\t\tfunct["(blockscope)"].current.add(t, type, state.tokens.curr);\n
+\t\t} else {\n
 \n
-\t\t\tif (at >= 0)\n
-\t\t\t\twarningAt("Mixed spaces and tabs.", line, at + 1);\n
+\t\t\tfunct[t] = type;\n
 \n
-\t\t\ts = s.replace(/\\t/g, tab);\n
-\t\t\tat = s.search(cx);\n
+\t\t\tif (tkn) {\n
+\t\t\t\tfunct["(tokens)"][t] = tkn;\n
+\t\t\t}\n
 \n
-\t\t\tif (at >= 0)\n
-\t\t\t\twarningAt("Unsafe character.", line, at);\n
+\t\t\tif (funct["(global)"]) {\n
+\t\t\t\tglobal[t] = funct;\n
+\t\t\t\tif (_.has(implied, t)) {\n
+\t\t\t\t\tif (state.option.latedef) {\n
+\t\t\t\t\t\tif ((state.option.latedef === true && _.contains([funct[t], type], "unction")) ||\n
+\t\t\t\t\t\t\t\t!_.contains([funct[t], type], "unction")) {\n
+\t\t\t\t\t\t\twarning("W003", state.tokens.next, t);\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t}\n
 \n
-\t\t\tif (option.maxlen && option.maxlen < s.length)\n
-\t\t\t\twarningAt("Line too long.", line, s.length);\n
-\t\t\ttw = option.trailing && s.match(/^(.*?)\\s+$/);\n
-\t\t\tif (tw && !/^\\s+$/.test(s)) {\n
-\t\t\t\twarningAt("Trailing whitespace.", line, tw[1].length + 1);\n
+\t\t\t\t\tdelete implied[t];\n
+\t\t\t\t}\n
+\t\t\t} else {\n
+\t\t\t\tscope[t] = funct;\n
 \t\t\t}\n
-\t\t\treturn true;\n
 \t\t}\n
+\t}\n
+\n
+\tfunction doOption() {\n
+\t\tvar nt = state.tokens.next;\n
+\t\tvar body = nt.body.match(/(-\\s+)?[^\\s,]+(?:\\s*:\\s*(-\\s+)?[^\\s,]+)?/g);\n
+\t\tvar predef = {};\n
 \n
-\t\tfunction it(type, value) {\n
-\t\t\tvar i, t;\n
+\t\tif (nt.type === "globals") {\n
+\t\t\tbody.forEach(function (g) {\n
+\t\t\t\tg = g.split(":");\n
+\t\t\t\tvar key = (g[0] || "").trim();\n
+\t\t\t\tvar val = (g[1] || "").trim();\n
 \n
-\t\t\tfunction checkName(name) {\n
-\t\t\t\tif (!option.proto && name === "__proto__") {\n
-\t\t\t\t\twarningAt("The \'{a}\' property is deprecated.", line, from, name);\n
-\t\t\t\t\treturn;\n
-\t\t\t\t}\n
+\t\t\t\tif (key.charAt(0) === "-") {\n
+\t\t\t\t\tkey = key.slice(1);\n
+\t\t\t\t\tval = false;\n
 \n
-\t\t\t\tif (!option.iterator && name === "__iterator__") {\n
-\t\t\t\t\twarningAt("\'{a}\' is only available in JavaScript 1.7.", line, from, name);\n
-\t\t\t\t\treturn;\n
+\t\t\t\t\tJSHINT.blacklist[key] = key;\n
+\t\t\t\t\tupdatePredefined();\n
+\t\t\t\t} else {\n
+\t\t\t\t\tpredef[key] = (val === "true");\n
 \t\t\t\t}\n
+\t\t\t});\n
 \n
-\t\t\t\tvar hasDangling = /^(_+.*|.*_+)$/.test(name);\n
+\t\t\tcombine(predefined, predef);\n
 \n
-\t\t\t\tif (option.nomen && hasDangling && name !== "_") {\n
-\t\t\t\t\tif (option.node && token.id !== "." && /^(__dirname|__filename)$/.test(name))\n
-\t\t\t\t\t\treturn;\n
-\n
-\t\t\t\t\twarningAt("Unexpected {a} in \'{b}\'.", line, from, "dangling \'_\'", name);\n
-\t\t\t\t\treturn;\n
-\t\t\t\t}\n
-\n
-\t\t\t\tif (option.camelcase) {\n
-\t\t\t\t\tif (name.replace(/^_+/, "").indexOf("_") > -1 && !name.match(/^[A-Z0-9_]*$/)) {\n
-\t\t\t\t\t\twarningAt("Identifier \'{a}\' is not in camel case.", line, from, value);\n
-\t\t\t\t\t}\n
+\t\t\tfor (var key in predef) {\n
+\t\t\t\tif (_.has(predef, key)) {\n
+\t\t\t\t\tdeclared[key] = nt;\n
 \t\t\t\t}\n
 \t\t\t}\n
+\t\t}\n
 \n
-\t\t\tif (type === "(color)" || type === "(range)") {\n
-\t\t\t\tt = {type: type};\n
-\t\t\t} else if (type === "(punctuator)" ||\n
-\t\t\t\t\t(type === "(identifier)" && is_own(syntax, value))) {\n
-\t\t\t\tt = syntax[value] || syntax["(error)"];\n
-\t\t\t} else {\n
-\t\t\t\tt = syntax[type];\n
-\t\t\t}\n
-\n
-\t\t\tt = Object.create(t);\n
+\t\tif (nt.type === "exported") {\n
+\t\t\tbody.forEach(function (e) {\n
+\t\t\t\texported[e] = true;\n
+\t\t\t});\n
+\t\t}\n
 \n
-\t\t\tif (type === "(string)" || type === "(range)") {\n
-\t\t\t\tif (!option.scripturl && jx.test(value)) {\n
-\t\t\t\t\twarningAt("Script URL.", line, from);\n
+\t\tif (nt.type === "members") {\n
+\t\t\tmembersOnly = membersOnly || {};\n
+\n
+\t\t\tbody.forEach(function (m) {\n
+\t\t\t\tvar ch1 = m.charAt(0);\n
+\t\t\t\tvar ch2 = m.charAt(m.length - 1);\n
+\n
+\t\t\t\tif (ch1 === ch2 && (ch1 === "\\"" || ch1 === "\'")) {\n
+\t\t\t\t\tm = m\n
+\t\t\t\t\t\t.substr(1, m.length - 2)\n
+\t\t\t\t\t\t.replace("\\\\b", "\\b")\n
+\t\t\t\t\t\t.replace("\\\\t", "\\t")\n
+\t\t\t\t\t\t.replace("\\\\n", "\\n")\n
+\t\t\t\t\t\t.replace("\\\\v", "\\v")\n
+\t\t\t\t\t\t.replace("\\\\f", "\\f")\n
+\t\t\t\t\t\t.replace("\\\\r", "\\r")\n
+\t\t\t\t\t\t.replace("\\\\\\\\", "\\\\")\n
+\t\t\t\t\t\t.replace("\\\\\\"", "\\"");\n
 \t\t\t\t}\n
-\t\t\t}\n
-\n
-\t\t\tif (type === "(identifier)") {\n
-\t\t\t\tt.identifier = true;\n
-\t\t\t\tcheckName(value);\n
-\t\t\t}\n
 \n
-\t\t\tt.value = value;\n
-\t\t\tt.line = line;\n
-\t\t\tt.character = character;\n
-\t\t\tt.from = from;\n
-\t\t\ti = t.id;\n
-\t\t\tif (i !== "(endline)") {\n
-\t\t\t\tprereg = i &&\n
-\t\t\t\t\t(("(,=:[!&|?{};".indexOf(i.charAt(i.length - 1)) >= 0) ||\n
-\t\t\t\t\ti === "return" ||\n
-\t\t\t\t\ti === "case");\n
-\t\t\t}\n
-\t\t\treturn t;\n
+\t\t\t\tmembersOnly[m] = false;\n
+\t\t\t});\n
 \t\t}\n
-\t\treturn {\n
-\t\t\tinit: function (source) {\n
-\t\t\t\tif (typeof source === "string") {\n
-\t\t\t\t\tlines = source\n
-\t\t\t\t\t\t.replace(/\\r\\n/g, "\\n")\n
-\t\t\t\t\t\t.replace(/\\r/g, "\\n")\n
-\t\t\t\t\t\t.split("\\n");\n
-\t\t\t\t} else {\n
-\t\t\t\t\tlines = source;\n
-\t\t\t\t}\n
-\t\t\t\tif (lines[0] && lines[0].substr(0, 2) === "#!")\n
-\t\t\t\t\tlines[0] = "";\n
 \n
-\t\t\t\tline = 0;\n
-\t\t\t\tnextLine();\n
-\t\t\t\tfrom = 1;\n
-\t\t\t},\n
+\t\tvar numvals = [\n
+\t\t\t"maxstatements",\n
+\t\t\t"maxparams",\n
+\t\t\t"maxdepth",\n
+\t\t\t"maxcomplexity",\n
+\t\t\t"maxerr",\n
+\t\t\t"maxlen",\n
+\t\t\t"indent"\n
+\t\t];\n
 \n
-\t\t\trange: function (begin, end) {\n
-\t\t\t\tvar c, value = "";\n
-\t\t\t\tfrom = character;\n
-\t\t\t\tif (s.charAt(0) !== begin) {\n
-\t\t\t\t\terrorAt("Expected \'{a}\' and instead saw \'{b}\'.",\n
-\t\t\t\t\t\t\tline, character, begin, s.charAt(0));\n
-\t\t\t\t}\n
-\t\t\t\tfor (;;) {\n
-\t\t\t\t\ts = s.slice(1);\n
-\t\t\t\t\tcharacter += 1;\n
-\t\t\t\t\tc = s.charAt(0);\n
-\t\t\t\t\tswitch (c) {\n
-\t\t\t\t\tcase "":\n
-\t\t\t\t\t\terrorAt("Missing \'{a}\'.", line, character, c);\n
-\t\t\t\t\t\tbreak;\n
-\t\t\t\t\tcase end:\n
-\t\t\t\t\t\ts = s.slice(1);\n
-\t\t\t\t\t\tcharacter += 1;\n
-\t\t\t\t\t\treturn it("(range)", value);\n
-\t\t\t\t\tcase "\\\\":\n
-\t\t\t\t\t\twarningAt("Unexpected \'{a}\'.", line, character, c);\n
-\t\t\t\t\t}\n
-\t\t\t\t\tvalue += c;\n
-\t\t\t\t}\n
+\t\tif (nt.type === "jshint" || nt.type === "jslint") {\n
+\t\t\tbody.forEach(function (g) {\n
+\t\t\t\tg = g.split(":");\n
+\t\t\t\tvar key = (g[0] || "").trim();\n
+\t\t\t\tvar val = (g[1] || "").trim();\n
 \n
-\t\t\t},\n
-\t\t\ttoken: function () {\n
-\t\t\t\tvar b, c, captures, d, depth, high, i, l, low, q, t, isLiteral, isInRange, n;\n
-\n
-\t\t\t\tfunction match(x) {\n
-\t\t\t\t\tvar r = x.exec(s), r1;\n
-\n
-\t\t\t\t\tif (r) {\n
-\t\t\t\t\t\tl = r[0].length;\n
-\t\t\t\t\t\tr1 = r[1];\n
-\t\t\t\t\t\tc = r1.charAt(0);\n
-\t\t\t\t\t\ts = s.substr(l);\n
-\t\t\t\t\t\tfrom = character + l - r1.length;\n
-\t\t\t\t\t\tcharacter += l;\n
-\t\t\t\t\t\treturn r1;\n
-\t\t\t\t\t}\n
+\t\t\t\tif (!checkOption(key, nt)) {\n
+\t\t\t\t\treturn;\n
 \t\t\t\t}\n
 \n
-\t\t\t\tfunction string(x) {\n
-\t\t\t\t\tvar c, j, r = "", allowNewLine = false;\n
-\n
-\t\t\t\t\tif (jsonmode && x !== "\\"") {\n
-\t\t\t\t\t\twarningAt("Strings must use doublequote.",\n
-\t\t\t\t\t\t\t\tline, character);\n
-\t\t\t\t\t}\n
+\t\t\t\tif (numvals.indexOf(key) >= 0) {\n
+\t\t\t\t\tif (val !== "false") {\n
+\t\t\t\t\t\tval = +val;\n
 \n
-\t\t\t\t\tif (option.quotmark) {\n
-\t\t\t\t\t\tif (option.quotmark === "single" && x !== "\'") {\n
-\t\t\t\t\t\t\twarningAt("Strings must use singlequote.",\n
-\t\t\t\t\t\t\t\t\tline, character);\n
-\t\t\t\t\t\t} else if (option.quotmark === "double" && x !== "\\"") {\n
-\t\t\t\t\t\t\twarningAt("Strings must use doublequote.",\n
-\t\t\t\t\t\t\t\t\tline, character);\n
-\t\t\t\t\t\t} else if (option.quotmark === true) {\n
-\t\t\t\t\t\t\tquotmark = quotmark || x;\n
-\t\t\t\t\t\t\tif (quotmark !== x) {\n
-\t\t\t\t\t\t\t\twarningAt("Mixed double and single quotes.",\n
-\t\t\t\t\t\t\t\t\t\tline, character);\n
-\t\t\t\t\t\t\t}\n
+\t\t\t\t\t\tif (typeof val !== "number" || !isFinite(val) || val <= 0 || Math.floor(val) !== val) {\n
+\t\t\t\t\t\t\terror("E032", nt, g[1].trim());\n
+\t\t\t\t\t\t\treturn;\n
 \t\t\t\t\t\t}\n
-\t\t\t\t\t}\n
 \n
-\t\t\t\t\tfunction esc(n) {\n
-\t\t\t\t\t\tvar i = parseInt(s.substr(j + 1, n), 16);\n
-\t\t\t\t\t\tj += n;\n
-\t\t\t\t\t\tif (i >= 32 && i <= 126 &&\n
-\t\t\t\t\t\t\t\ti !== 34 && i !== 92 && i !== 39) {\n
-\t\t\t\t\t\t\twarningAt("Unnecessary escapement.", line, character);\n
+\t\t\t\t\t\tif (key === "indent") {\n
+\t\t\t\t\t\t\tstate.option["(explicitIndent)"] = true;\n
 \t\t\t\t\t\t}\n
-\t\t\t\t\t\tcharacter += n;\n
-\t\t\t\t\t\tc = String.fromCharCode(i);\n
-\t\t\t\t\t}\n
-\n
-\t\t\t\t\tj = 0;\n
-\n
-unclosedString:\n
-\t\t\t\t\tfor (;;) {\n
-\t\t\t\t\t\twhile (j >= s.length) {\n
-\t\t\t\t\t\t\tj = 0;\n
-\n
-\t\t\t\t\t\t\tvar cl = line, cf = from;\n
-\t\t\t\t\t\t\tif (!nextLine()) {\n
-\t\t\t\t\t\t\t\terrorAt("Unclosed string.", cl, cf);\n
-\t\t\t\t\t\t\t\tbreak unclosedString;\n
-\t\t\t\t\t\t\t}\n
-\n
-\t\t\t\t\t\t\tif (allowNewLine) {\n
-\t\t\t\t\t\t\t\tallowNewLine = false;\n
-\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\twarningAt("Unclosed string.", cl, cf);\n
-\t\t\t\t\t\t\t}\n
+\t\t\t\t\t\tstate.option[key] = val;\n
+\t\t\t\t\t} else {\n
+\t\t\t\t\t\tif (key === "indent") {\n
+\t\t\t\t\t\t\tstate.option["(explicitIndent)"] = false;\n
+\t\t\t\t\t\t} else {\n
+\t\t\t\t\t\t\tstate.option[key] = false;\n
 \t\t\t\t\t\t}\n
+\t\t\t\t\t}\n
 \n
-\t\t\t\t\t\tc = s.charAt(j);\n
-\t\t\t\t\t\tif (c === x) {\n
-\t\t\t\t\t\t\tcharacter += 1;\n
-\t\t\t\t\t\t\ts = s.substr(j + 1);\n
-\t\t\t\t\t\t\treturn it("(string)", r, x);\n
-\t\t\t\t\t\t}\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
 \n
-\t\t\t\t\t\tif (c < " ") {\n
-\t\t\t\t\t\t\tif (c === "\\n" || c === "\\r") {\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\twarningAt("Control character in string: {a}.",\n
-\t\t\t\t\t\t\t\t\tline, character + j, s.slice(0, j));\n
-\t\t\t\t\t\t} else if (c === "\\\\") {\n
-\t\t\t\t\t\t\tj += 1;\n
-\t\t\t\t\t\t\tcharacter += 1;\n
-\t\t\t\t\t\t\tc = s.charAt(j);\n
-\t\t\t\t\t\t\tn = s.charAt(j + 1);\n
-\t\t\t\t\t\t\tswitch (c) {\n
-\t\t\t\t\t\t\tcase "\\\\":\n
-\t\t\t\t\t\t\tcase "\\"":\n
-\t\t\t\t\t\t\tcase "/":\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "\\\'":\n
-\t\t\t\t\t\t\t\tif (jsonmode) {\n
-\t\t\t\t\t\t\t\t\twarningAt("Avoid \\\\\'.", line, character);\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "b":\n
-\t\t\t\t\t\t\t\tc = "\\b";\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "f":\n
-\t\t\t\t\t\t\t\tc = "\\f";\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "n":\n
-\t\t\t\t\t\t\t\tc = "\\n";\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "r":\n
-\t\t\t\t\t\t\t\tc = "\\r";\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "t":\n
-\t\t\t\t\t\t\t\tc = "\\t";\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "0":\n
-\t\t\t\t\t\t\t\tc = "\\0";\n
-\t\t\t\t\t\t\t\tif (n >= 0 && n <= 7 && directive["use strict"]) {\n
-\t\t\t\t\t\t\t\t\twarningAt(\n
-\t\t\t\t\t\t\t\t\t"Octal literals are not allowed in strict mode.",\n
-\t\t\t\t\t\t\t\t\tline, character);\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "u":\n
-\t\t\t\t\t\t\t\tesc(4);\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "v":\n
-\t\t\t\t\t\t\t\tif (jsonmode) {\n
-\t\t\t\t\t\t\t\t\twarningAt("Avoid \\\\v.", line, character);\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\tc = "\\v";\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "x":\n
-\t\t\t\t\t\t\t\tif (jsonmode) {\n
-\t\t\t\t\t\t\t\t\twarningAt("Avoid \\\\x-.", line, character);\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\tesc(2);\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "":\n
-\t\t\t\t\t\t\t\tallowNewLine = true;\n
-\t\t\t\t\t\t\t\tif (option.multistr) {\n
-\t\t\t\t\t\t\t\t\tif (jsonmode) {\n
-\t\t\t\t\t\t\t\t\t\twarningAt("Avoid EOL escapement.", line, character);\n
-\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\tc = "";\n
-\t\t\t\t\t\t\t\t\tcharacter -= 1;\n
-\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\twarningAt("Bad escapement of EOL. Use option multistr if needed.",\n
-\t\t\t\t\t\t\t\t\tline, character);\n
-\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tcase "!":\n
-\t\t\t\t\t\t\t\tif (s.charAt(j - 2) === "<")\n
-\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\tdefault:\n
-\t\t\t\t\t\t\t\twarningAt("Bad escapement.", line, character);\n
-\t\t\t\t\t\t\t}\n
+\t\t\t\tif (key === "validthis") {\n
+\t\t\t\t\tif (funct["(global)"]) {\n
+\t\t\t\t\t\terror("E009");\n
+\t\t\t\t\t} else {\n
+\t\t\t\t\t\tif (val === "true" || val === "false") {\n
+\t\t\t\t\t\t\tstate.option.validthis = (val === "true");\n
+\t\t\t\t\t\t} else {\n
+\t\t\t\t\t\t\terror("E002", nt);\n
 \t\t\t\t\t\t}\n
-\t\t\t\t\t\tr += c;\n
-\t\t\t\t\t\tcharacter += 1;\n
-\t\t\t\t\t\tj += 1;\n
 \t\t\t\t\t}\n
+\t\t\t\t\treturn;\n
 \t\t\t\t}\n
 \n
-\t\t\t\tfor (;;) {\n
-\t\t\t\t\tif (!s) {\n
-\t\t\t\t\t\treturn it(nextLine() ? "(endline)" : "(end)", "");\n
+\t\t\t\tif (key === "quotmark") {\n
+\t\t\t\t\tswitch (val) {\n
+\t\t\t\t\tcase "true":\n
+\t\t\t\t\tcase "false":\n
+\t\t\t\t\t\tstate.option.quotmark = (val === "true");\n
+\t\t\t\t\t\tbreak;\n
+\t\t\t\t\tcase "double":\n
+\t\t\t\t\tcase "single":\n
+\t\t\t\t\t\tstate.option.quotmark = val;\n
+\t\t\t\t\t\tbreak;\n
+\t\t\t\t\tdefault:\n
+\t\t\t\t\t\terror("E002", nt);\n
 \t\t\t\t\t}\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
 \n
-\t\t\t\t\tt = match(tx);\n
-\n
-\t\t\t\t\tif (!t) {\n
-\t\t\t\t\t\tt = "";\n
-\t\t\t\t\t\tc = "";\n
-\t\t\t\t\t\twhile (s && s < "!") {\n
-\t\t\t\t\t\t\ts = s.substr(1);\n
-\t\t\t\t\t\t}\n
-\t\t\t\t\t\tif (s) {\n
-\t\t\t\t\t\t\terrorAt("Unexpected \'{a}\'.", line, character, s.substr(0, 1));\n
-\t\t\t\t\t\t\ts = "";\n
-\t\t\t\t\t\t}\n
-\t\t\t\t\t} else {\n
-\n
-\t\t\t\t\t\tif (isAlpha(c) || c === "_" || c === "$") {\n
-\t\t\t\t\t\t\treturn it("(identifier)", t);\n
-\t\t\t\t\t\t}\n
-\n
-\t\t\t\t\t\tif (isDigit(c)) {\n
-\t\t\t\t\t\t\tif (!isFinite(Number(t))) {\n
-\t\t\t\t\t\t\t\twarningAt("Bad number \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\tline, character, t);\n
-\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\tif (isAlpha(s.substr(0, 1))) {\n
-\t\t\t\t\t\t\t\twarningAt("Missing space after \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\tline, character, t);\n
-\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\tif (c === "0") {\n
-\t\t\t\t\t\t\t\td = t.substr(1, 1);\n
-\t\t\t\t\t\t\t\tif (isDigit(d)) {\n
-\t\t\t\t\t\t\t\t\tif (token.id !== ".") {\n
-\t\t\t\t\t\t\t\t\t\twarningAt("Don\'t use extra leading zeros \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\tline, character, t);\n
-\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t} else if (jsonmode && (d === "x" || d === "X")) {\n
-\t\t\t\t\t\t\t\t\twarningAt("Avoid 0x-. \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\tline, character, t);\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\tif (t.substr(t.length - 1) === ".") {\n
-\t\t\t\t\t\t\t\twarningAt(\n
-"A trailing decimal point can be confused with a dot \'{a}\'.", line, character, t);\n
-\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\treturn it("(number)", t);\n
-\t\t\t\t\t\t}\n
-\t\t\t\t\t\tswitch (t) {\n
-\n
-\t\t\t\t\t\tcase "\\"":\n
-\t\t\t\t\t\tcase "\'":\n
-\t\t\t\t\t\t\treturn string(t);\n
-\n
-\t\t\t\t\t\tcase "//":\n
-\t\t\t\t\t\t\ts = "";\n
-\t\t\t\t\t\t\ttoken.comment = true;\n
-\t\t\t\t\t\t\tbreak;\n
-\n
-\t\t\t\t\t\tcase "/*":\n
-\t\t\t\t\t\t\tfor (;;) {\n
-\t\t\t\t\t\t\t\ti = s.search(lx);\n
-\t\t\t\t\t\t\t\tif (i >= 0) {\n
-\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\tif (!nextLine()) {\n
-\t\t\t\t\t\t\t\t\terrorAt("Unclosed comment.", line, character);\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\ts = s.substr(i + 2);\n
-\t\t\t\t\t\t\ttoken.comment = true;\n
-\t\t\t\t\t\t\tbreak;\n
-\n
-\t\t\t\t\t\tcase "/*members":\n
-\t\t\t\t\t\tcase "/*member":\n
-\t\t\t\t\t\tcase "/*jshint":\n
-\t\t\t\t\t\tcase "/*jslint":\n
-\t\t\t\t\t\tcase "/*global":\n
-\t\t\t\t\t\tcase "*/":\n
-\t\t\t\t\t\t\treturn {\n
-\t\t\t\t\t\t\t\tvalue: t,\n
-\t\t\t\t\t\t\t\ttype: "special",\n
-\t\t\t\t\t\t\t\tline: line,\n
-\t\t\t\t\t\t\t\tcharacter: character,\n
-\t\t\t\t\t\t\t\tfrom: from\n
-\t\t\t\t\t\t\t};\n
-\n
-\t\t\t\t\t\tcase "":\n
-\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\tcase "/":\n
-\t\t\t\t\t\t\tif (s.charAt(0) === "=") {\n
-\t\t\t\t\t\t\t\terrorAt("A regular expression literal can be confused with \'/=\'.",\n
-\t\t\t\t\t\t\t\t\tline, from);\n
-\t\t\t\t\t\t\t}\n
+\t\t\t\tif (key === "unused") {\n
+\t\t\t\t\tswitch (val) {\n
+\t\t\t\t\tcase "true":\n
+\t\t\t\t\t\tstate.option.unused = true;\n
+\t\t\t\t\t\tbreak;\n
+\t\t\t\t\tcase "false":\n
+\t\t\t\t\t\tstate.option.unused = false;\n
+\t\t\t\t\t\tbreak;\n
+\t\t\t\t\tcase "vars":\n
+\t\t\t\t\tcase "strict":\n
+\t\t\t\t\t\tstate.option.unused = val;\n
+\t\t\t\t\t\tbreak;\n
+\t\t\t\t\tdefault:\n
+\t\t\t\t\t\terror("E002", nt);\n
+\t\t\t\t\t}\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
 \n
-\t\t\t\t\t\t\tif (prereg) {\n
-\t\t\t\t\t\t\t\tdepth = 0;\n
-\t\t\t\t\t\t\t\tcaptures = 0;\n
-\t\t\t\t\t\t\t\tl = 0;\n
-\t\t\t\t\t\t\t\tfor (;;) {\n
-\t\t\t\t\t\t\t\t\tb = true;\n
-\t\t\t\t\t\t\t\t\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\tswitch (c) {\n
-\t\t\t\t\t\t\t\t\tcase "":\n
-\t\t\t\t\t\t\t\t\t\terrorAt("Unclosed regular expression.", line, from);\n
-\t\t\t\t\t\t\t\t\t\treturn quit("Stopping.", line, from);\n
-\t\t\t\t\t\t\t\t\tcase "/":\n
-\t\t\t\t\t\t\t\t\t\tif (depth > 0) {\n
-\t\t\t\t\t\t\t\t\t\t\twarningAt("{a} unterminated regular expression " +\n
-\t\t\t\t\t\t\t\t\t\t\t\t"group(s).", line, from + l, depth);\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tc = s.substr(0, l - 1);\n
-\t\t\t\t\t\t\t\t\t\tq = {\n
-\t\t\t\t\t\t\t\t\t\t\tg: true,\n
-\t\t\t\t\t\t\t\t\t\t\ti: true,\n
-\t\t\t\t\t\t\t\t\t\t\tm: true\n
-\t\t\t\t\t\t\t\t\t\t};\n
-\t\t\t\t\t\t\t\t\t\twhile (q[s.charAt(l)] === true) {\n
-\t\t\t\t\t\t\t\t\t\t\tq[s.charAt(l)] = false;\n
-\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tcharacter += l;\n
-\t\t\t\t\t\t\t\t\t\ts = s.substr(l);\n
-\t\t\t\t\t\t\t\t\t\tq = s.charAt(0);\n
-\t\t\t\t\t\t\t\t\t\tif (q === "/" || q === "*") {\n
-\t\t\t\t\t\t\t\t\t\t\terrorAt("Confusing regular expression.",\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tline, from);\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\treturn it("(regexp)", c);\n
-\t\t\t\t\t\t\t\t\tcase "\\\\":\n
-\t\t\t\t\t\t\t\t\t\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\t\tif (c < " ") {\n
-\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"Unexpected control character in regular expression.", line, from + l);\n
-\t\t\t\t\t\t\t\t\t\t} else if (c === "<") {\n
-\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"Unexpected escaped character \'{a}\' in regular expression.", line, from + l, c);\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\tcase "(":\n
-\t\t\t\t\t\t\t\t\t\tdepth += 1;\n
-\t\t\t\t\t\t\t\t\t\tb = false;\n
-\t\t\t\t\t\t\t\t\t\tif (s.charAt(l) === "?") {\n
-\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\tswitch (s.charAt(l)) {\n
-\t\t\t\t\t\t\t\t\t\t\tcase ":":\n
-\t\t\t\t\t\t\t\t\t\t\tcase "=":\n
-\t\t\t\t\t\t\t\t\t\t\tcase "!":\n
-\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\t\tdefault:\n
-\t\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"Expected \'{a}\' and instead saw \'{b}\'.", line, from + l, ":", s.charAt(l));\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\tcaptures += 1;\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\tcase "|":\n
-\t\t\t\t\t\t\t\t\t\tb = false;\n
-\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\tcase ")":\n
-\t\t\t\t\t\t\t\t\t\tif (depth === 0) {\n
-\t\t\t\t\t\t\t\t\t\t\twarningAt("Unescaped \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tline, from + l, ")");\n
-\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\tdepth -= 1;\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\tcase " ":\n
-\t\t\t\t\t\t\t\t\t\tq = 1;\n
-\t\t\t\t\t\t\t\t\t\twhile (s.charAt(l) === " ") {\n
-\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\tq += 1;\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tif (q > 1) {\n
-\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"Spaces are hard to count. Use {{a}}.", line, from + l, q);\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\tcase "[":\n
-\t\t\t\t\t\t\t\t\t\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\t\tif (c === "^") {\n
-\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\tif (s.charAt(l) === "]") {\n
-\t\t\t\t\t\t\t\t\t\t\t\terrorAt("Unescaped \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tline, from + l, "^");\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tif (c === "]") {\n
-\t\t\t\t\t\t\t\t\t\t\twarningAt("Empty class.", line,\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tfrom + l - 1);\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tisLiteral = false;\n
-\t\t\t\t\t\t\t\t\t\tisInRange = false;\n
-klass:\n
-\t\t\t\t\t\t\t\t\t\tdo {\n
-\t\t\t\t\t\t\t\t\t\t\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\tswitch (c) {\n
-\t\t\t\t\t\t\t\t\t\t\tcase "[":\n
-\t\t\t\t\t\t\t\t\t\t\tcase "^":\n
-\t\t\t\t\t\t\t\t\t\t\t\twarningAt("Unescaped \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\tline, from + l, c);\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (isInRange) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisLiteral = true;\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\t\tcase "-":\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (isLiteral && !isInRange) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisLiteral = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = true;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else if (isInRange) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else if (s.charAt(l) === "]") {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = true;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tif (option.regexdash !== (l === 2 || (l === 3 &&\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\ts.charAt(1) === "^"))) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\twarningAt("Unescaped \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tline, from + l - 1, "-");\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisLiteral = true;\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\t\tcase "]":\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (isInRange && !option.regexdash) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\twarningAt("Unescaped \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tline, from + l - 1, "-");\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\tbreak klass;\n
-\t\t\t\t\t\t\t\t\t\t\tcase "\\\\":\n
-\t\t\t\t\t\t\t\t\t\t\t\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (c < " ") {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"Unexpected control character in regular expression.", line, from + l);\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else if (c === "<") {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"Unexpected escaped character \'{a}\' in regular expression.", line, from + l, c);\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (/[wsd]/i.test(c)) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tif (isInRange) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\twarningAt("Unescaped \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tline, from + l, "-");\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisLiteral = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else if (isInRange) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisLiteral = true;\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\t\tcase "/":\n
-\t\t\t\t\t\t\t\t\t\t\t\twarningAt("Unescaped \'{a}\'.",\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\tline, from + l - 1, "/");\n
-\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (isInRange) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisLiteral = true;\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\t\tcase "<":\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (isInRange) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisLiteral = true;\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\t\tdefault:\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (isInRange) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisInRange = false;\n
-\t\t\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tisLiteral = true;\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t} while (c);\n
-\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\tcase ".":\n
-\t\t\t\t\t\t\t\t\t\tif (option.regexp) {\n
-\t\t\t\t\t\t\t\t\t\t\twarningAt("Insecure \'{a}\'.", line,\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tfrom + l, c);\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\tcase "]":\n
-\t\t\t\t\t\t\t\t\tcase "?":\n
-\t\t\t\t\t\t\t\t\tcase "{":\n
-\t\t\t\t\t\t\t\t\tcase "}":\n
-\t\t\t\t\t\t\t\t\tcase "+":\n
-\t\t\t\t\t\t\t\t\tcase "*":\n
-\t\t\t\t\t\t\t\t\t\twarningAt("Unescaped \'{a}\'.", line,\n
-\t\t\t\t\t\t\t\t\t\t\t\tfrom + l, c);\n
-\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\tif (b) {\n
-\t\t\t\t\t\t\t\t\t\tswitch (s.charAt(l)) {\n
-\t\t\t\t\t\t\t\t\t\tcase "?":\n
-\t\t\t\t\t\t\t\t\t\tcase "+":\n
-\t\t\t\t\t\t\t\t\t\tcase "*":\n
-\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\tif (s.charAt(l) === "?") {\n
-\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\tcase "{":\n
-\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\t\t\tif (c < "0" || c > "9") {\n
-\t\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"Expected a number and instead saw \'{a}\'.", line, from + l, c);\n
-\t\t\t\t\t\t\t\t\t\t\t\tbreak; // No reason to continue checking numbers.\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\tlow = +c;\n
-\t\t\t\t\t\t\t\t\t\t\tfor (;;) {\n
-\t\t\t\t\t\t\t\t\t\t\t\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (c < "0" || c > "9") {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t\tlow = +c + (low * 10);\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\thigh = low;\n
-\t\t\t\t\t\t\t\t\t\t\tif (c === ",") {\n
-\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t\thigh = Infinity;\n
-\t\t\t\t\t\t\t\t\t\t\t
+\t\t\t\tif (key === "latedef") {\n
+\t\t\t\t\tswitch (val) {\n
+\t\t\t\t\tcase "true":\n
+\t\t\t\t\t\tstat
 
 ]]></string> </value>
         </item>
         <item>
             <key> <string>next</string> </key>
             <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
             </value>
         </item>
       </dictionary>
     </pickle>
   </record>
-  <record id="3" aka="AAAAAAAAAAM=">
+  <record id="4" aka="AAAAAAAAAAQ=">
     <pickle>
       <global name="Pdata" module="OFS.Image"/>
     </pickle>
@@ -3635,259 +4513,48 @@ klass:\n
             <key> <string>data</string> </key>
             <value> <string encoding="cdata"><![CDATA[
 
-\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\t\t\t\tif (c >= "0" && c <= "9") {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t\t\thigh = +c;\n
-\t\t\t\t\t\t\t\t\t\t\t\t\tfor (;;) {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\tc = s.charAt(l);\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (c < "0" || c > "9") {\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t\thigh = +c + (high * 10);\n
-\t\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\tif (s.charAt(l) !== "}") {\n
-\t\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"Expected \'{a}\' and instead saw \'{b}\'.", line, from + l, "}", c);\n
-\t\t\t\t\t\t\t\t\t\t\t} else {\n
-\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\tif (s.charAt(l) === "?") {\n
-\t\t\t\t\t\t\t\t\t\t\t\tl += 1;\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t\tif (low > high) {\n
-\t\t\t\t\t\t\t\t\t\t\t\twarningAt(\n
-"\'{a}\' should not be greater than \'{b}\'.", line, from + l, low, high);\n
-\t\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\t\tc = s.substr(0, l - 1);\n
-\t\t\t\t\t\t\t\tcharacter += l;\n
-\t\t\t\t\t\t\t\ts = s.substr(l);\n
-\t\t\t\t\t\t\t\treturn it("(regexp)", c);\n
-\t\t\t\t\t\t\t}\n
-\t\t\t\t\t\t\treturn it("(punctuator)", t);\n
-\n
-\t\t\t\t\t\tcase "#":\n
-\t\t\t\t\t\t\treturn it("(punctuator)", t);\n
-\t\t\t\t\t\tdefault:\n
-\t\t\t\t\t\t\treturn it("(punctuator)", t);\n
-\t\t\t\t\t\t}\n
-\t\t\t\t\t}\n
-\t\t\t\t}\n
-\t\t\t}\n
-\t\t};\n
-\t}());\n
-\n
-\n
-\tfunction addlabel(t, type, token) {\n
-\t\tif (t === "hasOwnProperty") {\n
-\t\t\twarning("\'hasOwnProperty\' is a really bad name.");\n
-\t\t}\n
-\t\tif (type === "exception") {\n
-\t\t\tif (is_own(funct["(context)"], t)) {\n
-\t\t\t\tif (funct[t] !== true && !option.node) {\n
-\t\t\t\t\twarning("Value of \'{a}\' may be overwritten in IE.", nexttoken, t);\n
-\t\t\t\t}\n
-\t\t\t}\n
-\t\t}\n
-\n
-\t\tif (is_own(funct, t) && !funct["(global)"]) {\n
-\t\t\tif (funct[t] === true) {\n
-\t\t\t\tif (option.latedef)\n
-\t\t\t\t\twarning("\'{a}\' was used before it was defined.", nexttoken, t);\n
-\t\t\t} else {\n
-\t\t\t\tif (!option.shadow && type !== "exception") {\n
-\t\t\t\t\twarning("\'{a}\' is already defined.", nexttoken, t);\n
-\t\t\t\t}\n
-\t\t\t}\n
-\t\t}\n
-\n
-\t\tfunct[t] = type;\n
-\n
-\t\tif (token) {\n
-\t\t\tfunct["(tokens)"][t] = token;\n
-\t\t}\n
-\n
-\t\tif (funct["(global)"]) {\n
-\t\t\tglobal[t] = funct;\n
-\t\t\tif (is_own(implied, t)) {\n
-\t\t\t\tif (option.latedef)\n
-\t\t\t\t\twarning("\'{a}\' was used before it was defined.", nexttoken, t);\n
-\t\t\t\tdelete implied[t];\n
-\t\t\t}\n
-\t\t} else {\n
-\t\t\tscope[t] = funct;\n
-\t\t}\n
-\t}\n
-\n
-\n
-\tfunction doOption() {\n
-\t\tvar nt = nexttoken;\n
-\t\tvar o  = nt.value;\n
-\t\tvar quotmarkValue = option.quotmark;\n
-\t\tvar predef = {};\n
-\t\tvar b, obj, filter, t, tn, v, minus;\n
-\n
-\t\tswitch (o) {\n
-\t\tcase "*/":\n
-\t\t\terror("Unbegun comment.");\n
-\t\t\tbreak;\n
-\t\tcase "/*members":\n
-\t\tcase "/*member":\n
-\t\t\to = "/*members";\n
-\t\t\tif (!membersOnly) {\n
-\t\t\t\tmembersOnly = {};\n
-\t\t\t}\n
-\t\t\tobj = membersOnly;\n
-\t\t\toption.quotmark = false;\n
-\t\t\tbreak;\n
-\t\tcase "/*jshint":\n
-\t\tcase "/*jslint":\n
-\t\t\tobj = option;\n
-\t\t\tfilter = boolOptions;\n
-\t\t\tbreak;\n
-\t\tcase "/*global":\n
-\t\t\tobj = predef;\n
-\t\t\tbreak;\n
-\t\tdefault:\n
-\t\t\terror("What?");\n
-\t\t}\n
-\n
-\t\tt = lex.token();\n
-\n
-\t\tfor (;;) {\n
-\t\t\tminus = false;\n
-\t\t\tvar breakOuterLoop;\n
-\t\t\tfor (;;) {\n
-\t\t\t\tif (t.type === "special" && t.value === "*/") {\n
-\t\t\t\t\tbreakOuterLoop = true;\n
-\t\t\t\t\tbreak;\n
-\t\t\t\t}\n
-\t\t\t\tif (t.id !== "(endline)" && t.id !== ",") {\n
-\t\t\t\t\tbreak;\n
-\t\t\t\t}\n
-\t\t\t\tt = lex.token();\n
-\t\t\t}\n
-\t\t\tif (breakOuterLoop)\n
-\t\t\t\tbreak;\n
-\n
-\t\t\tif (o === "/*global" && t.value === "-") {\n
-\t\t\t\tminus = true;\n
-\t\t\t\tt = lex.token();\n
-\t\t\t}\n
-\n
-\t\t\tif (t.type !== "(string)" && t.type !== "(identifier)" && o !== "/*members") {\n
-\t\t\t\terror("Bad option.", t);\n
-\t\t\t}\n
-\n
-\t\t\tv = lex.token();\n
-\t\t\tif (v.id === ":") {\n
-\t\t\t\tv = lex.token();\n
-\n
-\t\t\t\tif (obj === membersOnly) {\n
-\t\t\t\t\terror("Expected \'{a}\' and instead saw \'{b}\'.", t, "*/", ":");\n
-\t\t\t\t}\n
-\n
-\t\t\t\tif (o === "/*jshint") {\n
-\t\t\t\t\tcheckOption(t.value, t);\n
-\t\t\t\t}\n
-\n
-\t\t\t\tvar numericVals = [\n
-\t\t\t\t\t"maxstatements",\n
-\t\t\t\t\t"maxparams",\n
-\t\t\t\t\t"maxdepth",\n
-\t\t\t\t\t"maxcomplexity",\n
-\t\t\t\t\t"maxerr",\n
-\t\t\t\t\t"maxlen",\n
-\t\t\t\t\t"indent"\n
-\t\t\t\t];\n
-\n
-\t\t\t\tif (numericVals.indexOf(t.value) > -1 && (o === "/*jshint" || o === "/*jslint")) {\n
-\t\t\t\t\tb = +v.value;\n
-\n
-\t\t\t\t\tif (typeof b !== "number" || !isFinite(b) || b <= 0 || Math.floor(b) !== b) {\n
-\t\t\t\t\t\terror("Expected a small integer and instead saw \'{a}\'.", v, v.value);\n
-\t\t\t\t\t}\n
-\n
-\t\t\t\t\tif (t.value === "indent")\n
-\t\t\t\t\t\tobj.white = true;\n
-\n
-\t\t\t\t\tobj[t.value] = b;\n
-\t\t\t\t} else if (t.value === "validthis") {\n
-\t\t\t\t\tif (funct["(global)"]) {\n
-\t\t\t\t\t\terror("Option \'validthis\' can\'t be used in a global scope.");\n
-\t\t\t\t\t} else {\n
-\t\t\t\t\t\tif (v.value === "true" || v.value === "false")\n
-\t\t\t\t\t\t\tobj[t.value] = v.value === "true";\n
-\t\t\t\t\t\telse\n
-\t\t\t\t\t\t\terror("Bad option value.", v);\n
-\t\t\t\t\t}\n
-\t\t\t\t} else if (t.value === "quotmark" && (o === "/*jshint")) {\n
-\t\t\t\t\tswitch (v.value) {\n
-\t\t\t\t\tcase "true":\n
-\t\t\t\t\t\tobj.quotmark = true;\n
+e.option.latedef = true;\n
 \t\t\t\t\t\tbreak;\n
 \t\t\t\t\tcase "false":\n
-\t\t\t\t\t\tobj.quotmark = false;\n
+\t\t\t\t\t\tstate.option.latedef = false;\n
 \t\t\t\t\t\tbreak;\n
-\t\t\t\t\tcase "double":\n
-\t\t\t\t\tcase "single":\n
-\t\t\t\t\t\tobj.quotmark = v.value;\n
+\t\t\t\t\tcase "nofunc":\n
+\t\t\t\t\t\tstate.option.latedef = "nofunc";\n
 \t\t\t\t\t\tbreak;\n
 \t\t\t\t\tdefault:\n
-\t\t\t\t\t\terror("Bad option value.", v);\n
-\t\t\t\t\t}\n
-\t\t\t\t} else if (v.value === "true" || v.value === "false") {\n
-\t\t\t\t\tif (o === "/*jslint") {\n
-\t\t\t\t\t\ttn = renamedOptions[t.value] || t.value;\n
-\t\t\t\t\t\tobj[tn] = v.value === "true";\n
-\t\t\t\t\t\tif (invertedOptions[tn] !== undefined) {\n
-\t\t\t\t\t\t\tobj[tn] = !obj[tn];\n
-\t\t\t\t\t\t}\n
-\t\t\t\t\t} else {\n
-\t\t\t\t\t\tobj[t.value] = v.value === "true";\n
+\t\t\t\t\t\terror("E002", nt);\n
 \t\t\t\t\t}\n
-\n
-\t\t\t\t\tif (t.value === "newcap")\n
-\t\t\t\t\t\tobj["(explicitNewcap)"] = true;\n
-\t\t\t\t} else {\n
-\t\t\t\t\terror("Bad option value.", v);\n
-\t\t\t\t}\n
-\t\t\t\tt = lex.token();\n
-\t\t\t} else {\n
-\t\t\t\tif (o === "/*jshint" || o === "/*jslint") {\n
-\t\t\t\t\terror("Missing option value.", t);\n
+\t\t\t\t\treturn;\n
 \t\t\t\t}\n
 \n
-\t\t\t\tobj[t.value] = false;\n
-\n
-\t\t\t\tif (o === "/*global" && minus === true) {\n
-\t\t\t\t\tJSHINT.blacklist[t.value] = t.value;\n
-\t\t\t\t\tupdatePredefined();\n
+\t\t\t\tvar match = /^([+-])(W\\d{3})$/g.exec(key);\n
+\t\t\t\tif (match) {\n
+\t\t\t\t\tstate.ignored[match[2]] = (match[1] === "-");\n
+\t\t\t\t\treturn;\n
 \t\t\t\t}\n
 \n
-\t\t\t\tt = v;\n
-\t\t\t}\n
-\t\t}\n
+\t\t\t\tvar tn;\n
+\t\t\t\tif (val === "true" || val === "false") {\n
+\t\t\t\t\tif (nt.type === "jslint") {\n
+\t\t\t\t\t\ttn = renamedOptions[key] || key;\n
+\t\t\t\t\t\tstate.option[tn] = (val === "true");\n
 \n
-\t\tif (o === "/*members") {\n
-\t\t\toption.quotmark = quotmarkValue;\n
-\t\t}\n
+\t\t\t\t\t\tif (invertedOptions[tn] !== undefined) {\n
+\t\t\t\t\t\t\tstate.option[tn] = !state.option[tn];\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t} else {\n
+\t\t\t\t\t\tstate.option[key] = (val === "true");\n
+\t\t\t\t\t}\n
 \n
-\t\tcombine(predefined, predef);\n
+\t\t\t\t\tif (key === "newcap") {\n
+\t\t\t\t\t\tstate.option["(explicitNewcap)"] = true;\n
+\t\t\t\t\t}\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
 \n
-\t\tfor (var key in predef) {\n
-\t\t\tif (is_own(predef, key)) {\n
-\t\t\t\tdeclared[key] = nt;\n
-\t\t\t}\n
-\t\t}\n
+\t\t\t\terror("E002", nt);\n
+\t\t\t});\n
 \n
-\t\tif (filter) {\n
 \t\t\tassume();\n
 \t\t}\n
 \t}\n
@@ -3906,139 +4573,175 @@ klass:\n
 \t}\n
 \n
 \tfunction advance(id, t) {\n
-\t\tswitch (token.id) {\n
+\t\tswitch (state.tokens.curr.id) {\n
 \t\tcase "(number)":\n
-\t\t\tif (nexttoken.id === ".") {\n
-\t\t\t\twarning("A dot following a number can be confused with a decimal point.", token);\n
+\t\t\tif (state.tokens.next.id === ".") {\n
+\t\t\t\twarning("W005", state.tokens.curr);\n
 \t\t\t}\n
 \t\t\tbreak;\n
 \t\tcase "-":\n
-\t\t\tif (nexttoken.id === "-" || nexttoken.id === "--") {\n
-\t\t\t\twarning("Confusing minusses.");\n
+\t\t\tif (state.tokens.next.id === "-" || state.tokens.next.id === "--") {\n
+\t\t\t\twarning("W006");\n
 \t\t\t}\n
 \t\t\tbreak;\n
 \t\tcase "+":\n
-\t\t\tif (nexttoken.id === "+" || nexttoken.id === "++") {\n
-\t\t\t\twarning("Confusing plusses.");\n
+\t\t\tif (state.tokens.next.id === "+" || state.tokens.next.id === "++") {\n
+\t\t\t\twarning("W007");\n
 \t\t\t}\n
 \t\t\tbreak;\n
 \t\t}\n
 \n
-\t\tif (token.type === "(string)" || token.identifier) {\n
-\t\t\tanonname = token.value;\n
+\t\tif (state.tokens.curr.type === "(string)" || state.tokens.curr.identifier) {\n
+\t\t\tanonname = state.tokens.curr.value;\n
 \t\t}\n
 \n
-\t\tif (id && nexttoken.id !== id) {\n
+\t\tif (id && state.tokens.next.id !== id) {\n
 \t\t\tif (t) {\n
-\t\t\t\tif (nexttoken.id === "(end)") {\n
-\t\t\t\t\twarning("Unmatched \'{a}\'.", t, t.id);\n
+\t\t\t\tif (state.tokens.next.id === "(end)") {\n
+\t\t\t\t\terror("E019", t, t.id);\n
 \t\t\t\t} else {\n
-\t\t\t\t\twarning("Expected \'{a}\' to match \'{b}\' from line {c} and instead saw \'{d}\'.",\n
-\t\t\t\t\t\t\tnexttoken, id, t.id, t.line, nexttoken.value);\n
+\t\t\t\t\terror("E020", state.tokens.next, id, t.id, t.line, state.tokens.next.value);\n
 \t\t\t\t}\n
-\t\t\t} else if (nexttoken.type !== "(identifier)" ||\n
-\t\t\t\t\t\t\tnexttoken.value !== id) {\n
-\t\t\t\twarning("Expected \'{a}\' and instead saw \'{b}\'.",\n
-\t\t\t\t\t\tnexttoken, id, nexttoken.value);\n
+\t\t\t} else if (state.tokens.next.type !== "(identifier)" || state.tokens.next.value !== id) {\n
+\t\t\t\twarning("W116", state.tokens.next, id, state.tokens.next.value);\n
 \t\t\t}\n
 \t\t}\n
 \n
-\t\tprevtoken = token;\n
-\t\ttoken = nexttoken;\n
+\t\tstate.tokens.prev = state.tokens.curr;\n
+\t\tstate.tokens.curr = state.tokens.next;\n
 \t\tfor (;;) {\n
-\t\t\tnexttoken = lookahead.shift() || lex.token();\n
-\t\t\tif (nexttoken.id === "(end)" || nexttoken.id === "(error)") {\n
+\t\t\tstate.tokens.next = lookahead.shift() || lex.token();\n
+\n
+\t\t\tif (!state.tokens.next) { // No more tokens left, give up\n
+\t\t\t\tquit("E041", state.tokens.curr.line);\n
+\t\t\t}\n
+\n
+\t\t\tif (state.tokens.next.id === "(end)" || state.tokens.next.id === "(error)") {\n
 \t\t\t\treturn;\n
 \t\t\t}\n
-\t\t\tif (nexttoken.type === "special") {\n
+\n
+\t\t\tif (state.tokens.next.check) {\n
+\t\t\t\tstate.tokens.next.check();\n
+\t\t\t}\n
+\n
+\t\t\tif (state.tokens.next.isSpecial) {\n
 \t\t\t\tdoOption();\n
 \t\t\t} else {\n
-\t\t\t\tif (nexttoken.id !== "(endline)") {\n
+\t\t\t\tif (state.tokens.next.id !== "(endline)") {\n
 \t\t\t\t\tbreak;\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t}\n
 \t}\n
 \n
+\tfunction isInfix(token) {\n
+\t\treturn token.infix || (!token.identifier && !!token.led);\n
+\t}\n
+\n
+\tfunction isEndOfExpr() {\n
+\t\tvar curr = state.tokens.curr;\n
+\t\tvar next = state.tokens.next;\n
+\t\tif (next.id === ";" || next.id === "}" || next.id === ":") {\n
+\t\t\treturn true;\n
+\t\t}\n
+\t\tif (isInfix(next) === isInfix(curr) || (curr.id === "yield" && state.option.inMoz(true))) {\n
+\t\t\treturn curr.line !== next.line;\n
+\t\t}\n
+\t\treturn false;\n
+\t}\n
+\n
 \tfunction expression(rbp, initial) {\n
-\t\tvar left, isArray = false, isObject = false;\n
+\t\tvar left, isArray = false, isObject = false, isLetExpr = false;\n
+\t\tif (!initial && state.tokens.next.value === "let" && peek(0).value === "(") {\n
+\t\t\tif (!state.option.inMoz(true)) {\n
+\t\t\t\twarning("W118", state.tokens.next, "let expressions");\n
+\t\t\t}\n
+\t\t\tisLetExpr = true;\n
+\t\t\tfunct["(blockscope)"].stack();\n
+\t\t\tadvance("let");\n
+\t\t\tadvance("(");\n
+\t\t\tstate.syntax["let"].fud.call(state.syntax["let"].fud, false);\n
+\t\t\tadvance(")");\n
+\t\t}\n
 \n
-\t\tif (nexttoken.id === "(end)")\n
-\t\t\terror("Unexpected early end of program.", token);\n
+\t\tif (state.tokens.next.id === "(end)")\n
+\t\t\terror("E006", state.tokens.curr);\n
 \n
 \t\tadvance();\n
+\n
 \t\tif (initial) {\n
 \t\t\tanonname = "anonymous";\n
-\t\t\tfunct["(verb)"] = token.value;\n
+\t\t\tfunct["(verb)"] = state.tokens.curr.value;\n
 \t\t}\n
-\t\tif (initial === true && token.fud) {\n
-\t\t\tleft = token.fud();\n
+\n
+\t\tif (initial === true && state.tokens.curr.fud) {\n
+\t\t\tleft = state.tokens.curr.fud();\n
 \t\t} else {\n
-\t\t\tif (token.nud) {\n
-\t\t\t\tleft = token.nud();\n
+\t\t\tif (state.tokens.curr.nud) {\n
+\t\t\t\tleft = state.tokens.curr.nud();\n
 \t\t\t} else {\n
-\t\t\t\tif (nexttoken.type === "(number)" && token.id === ".") {\n
-\t\t\t\t\twarning("A leading decimal point can be confused with a dot: \'.{a}\'.",\n
-\t\t\t\t\t\t\ttoken, nexttoken.value);\n
-\t\t\t\t\tadvance();\n
-\t\t\t\t\treturn token;\n
-\t\t\t\t} else {\n
-\t\t\t\t\terror("Expected an identifier and instead saw \'{a}\'.",\n
-\t\t\t\t\t\t\ttoken, token.id);\n
-\t\t\t\t}\n
+\t\t\t\terror("E030", state.tokens.curr, state.tokens.curr.id);\n
 \t\t\t}\n
-\t\t\twhile (rbp < nexttoken.lbp) {\n
-\t\t\t\tisArray = token.value === "Array";\n
-\t\t\t\tisObject = token.value === "Object";\n
+\n
+\t\t\twhile (rbp < state.tokens.next.lbp && !isEndOfExpr()) {\n
+\t\t\t\tisArray = state.tokens.curr.value === "Array";\n
+\t\t\t\tisObject = state.tokens.curr.value === "Object";\n
 \t\t\t\tif (left && (left.value || (left.first && left.first.value))) {\n
 \t\t\t\t\tif (left.value !== "new" ||\n
 \t\t\t\t\t  (left.first && left.first.value && left.first.value === ".")) {\n
 \t\t\t\t\t\tisArray = false;\n
-\t\t\t\t\t\tif (left.value !== token.value) {\n
+\t\t\t\t\t\tif (left.value !== state.tokens.curr.value) {\n
 \t\t\t\t\t\t\tisObject = false;\n
 \t\t\t\t\t\t}\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
 \n
 \t\t\t\tadvance();\n
-\t\t\t\tif (isArray && token.id === "(" && nexttoken.id === ")")\n
-\t\t\t\t\twarning("Use the array literal notation [].", token);\n
-\t\t\t\tif (isObject && token.id === "(" && nexttoken.id === ")")\n
-\t\t\t\t\twarning("Use the object literal notation {}.", token);\n
-\t\t\t\tif (token.led) {\n
-\t\t\t\t\tleft = token.led(left);\n
+\n
+\t\t\t\tif (isArray && state.tokens.curr.id === "(" && state.tokens.next.id === ")") {\n
+\t\t\t\t\twarning("W009", state.tokens.curr);\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (isObject && state.tokens.curr.id === "(" && state.tokens.next.id === ")") {\n
+\t\t\t\t\twarning("W010", state.tokens.curr);\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (left && state.tokens.curr.led) {\n
+\t\t\t\t\tleft = state.tokens.curr.led(left);\n
 \t\t\t\t} else {\n
-\t\t\t\t\terror("Expected an operator and instead saw \'{a}\'.",\n
-\t\t\t\t\t\ttoken, token.id);\n
+\t\t\t\t\terror("E033", state.tokens.curr, state.tokens.curr.id);\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t}\n
+\t\tif (isLetExpr) {\n
+\t\t\tfunct["(blockscope)"].unstack();\n
+\t\t}\n
 \t\treturn left;\n
 \t}\n
 \n
 \tfunction adjacent(left, right) {\n
-\t\tleft = left || token;\n
-\t\tright = right || nexttoken;\n
-\t\tif (option.white) {\n
+\t\tleft = left || state.tokens.curr;\n
+\t\tright = right || state.tokens.next;\n
+\t\tif (state.option.white) {\n
 \t\t\tif (left.character !== right.from && left.line === right.line) {\n
 \t\t\t\tleft.from += (left.character - left.from);\n
-\t\t\t\twarning("Unexpected space after \'{a}\'.", left, left.value);\n
+\t\t\t\twarning("W011", left, left.value);\n
 \t\t\t}\n
 \t\t}\n
 \t}\n
 \n
 \tfunction nobreak(left, right) {\n
-\t\tleft = left || token;\n
-\t\tright = right || nexttoken;\n
-\t\tif (option.white && (left.character !== right.from || left.line !== right.line)) {\n
-\t\t\twarning("Unexpected space before \'{a}\'.", right, right.value);\n
+\t\tleft = left || state.tokens.curr;\n
+\t\tright = right || state.tokens.next;\n
+\t\tif (state.option.white && (left.character !== right.from || left.line !== right.line)) {\n
+\t\t\twarning("W012", right, right.value);\n
 \t\t}\n
 \t}\n
 \n
 \tfunction nospace(left, right) {\n
-\t\tleft = left || token;\n
-\t\tright = right || nexttoken;\n
-\t\tif (option.white && !left.comment) {\n
+\t\tleft = left || state.tokens.curr;\n
+\t\tright = right || state.tokens.next;\n
+\t\tif (state.option.white && !left.comment) {\n
 \t\t\tif (left.line === right.line) {\n
 \t\t\t\tadjacent(left, right);\n
 \t\t\t}\n
@@ -4046,77 +4749,134 @@ klass:\n
 \t}\n
 \n
 \tfunction nonadjacent(left, right) {\n
-\t\tif (option.white) {\n
-\t\t\tleft = left || token;\n
-\t\t\tright = right || nexttoken;\n
+\t\tif (state.option.white) {\n
+\t\t\tleft = left || state.tokens.curr;\n
+\t\t\tright = right || state.tokens.next;\n
+\n
 \t\t\tif (left.value === ";" && right.value === ";") {\n
 \t\t\t\treturn;\n
 \t\t\t}\n
+\n
 \t\t\tif (left.line === right.line && left.character === right.from) {\n
 \t\t\t\tleft.from += (left.character - left.from);\n
-\t\t\t\twarning("Missing space after \'{a}\'.",\n
-\t\t\t\t\t\tleft, left.value);\n
+\t\t\t\twarning("W013", left, left.value);\n
 \t\t\t}\n
 \t\t}\n
 \t}\n
 \n
 \tfunction nobreaknonadjacent(left, right) {\n
-\t\tleft = left || token;\n
-\t\tright = right || nexttoken;\n
-\t\tif (!option.laxbreak && left.line !== right.line) {\n
-\t\t\twarning("Bad line breaking before \'{a}\'.", right, right.id);\n
-\t\t} else if (option.white) {\n
-\t\t\tleft = left || token;\n
-\t\t\tright = right || nexttoken;\n
+\t\tleft = left || state.tokens.curr;\n
+\t\tright = right || state.tokens.next;\n
+\t\tif (!state.option.laxbreak && left.line !== right.line) {\n
+\t\t\twarning("W014", right, right.value);\n
+\t\t} else if (state.option.white) {\n
+\t\t\tleft = left || state.tokens.curr;\n
+\t\t\tright = right || state.tokens.next;\n
 \t\t\tif (left.character === right.from) {\n
 \t\t\t\tleft.from += (left.character - left.from);\n
-\t\t\t\twarning("Missing space after \'{a}\'.",\n
-\t\t\t\t\t\tleft, left.value);\n
+\t\t\t\twarning("W013", left, left.value);\n
 \t\t\t}\n
 \t\t}\n
 \t}\n
 \n
 \tfunction indentation(bias) {\n
-\t\tvar i;\n
-\t\tif (option.white && nexttoken.id !== "(end)") {\n
-\t\t\ti = indent + (bias || 0);\n
-\t\t\tif (nexttoken.from !== i) {\n
-\t\t\t\twarning(\n
-"Expected \'{a}\' to have an indentation at {b} instead at {c}.",\n
-\t\t\t\t\t\tnexttoken, nexttoken.value, i, nexttoken.from);\n
-\t\t\t}\n
+\t\tif (!state.option.white && !state.option["(explicitIndent)"]) {\n
+\t\t\treturn;\n
+\t\t}\n
+\n
+\t\tif (state.tokens.next.id === "(end)") {\n
+\t\t\treturn;\n
+\t\t}\n
+\n
+\t\tvar i = indent + (bias || 0);\n
+\t\tif (state.tokens.next.from !== i) {\n
+\t\t\twarning("W015", state.tokens.next, state.tokens.next.value, i, state.tokens.next.from);\n
 \t\t}\n
 \t}\n
 \n
 \tfunction nolinebreak(t) {\n
-\t\tt = t || token;\n
-\t\tif (t.line !== nexttoken.line) {\n
-\t\t\twarning("Line breaking error \'{a}\'.", t, t.value);\n
+\t\tt = t || state.tokens.curr;\n
+\t\tif (t.line !== state.tokens.next.line) {\n
+\t\t\twarning("E022", t, t.value);\n
 \t\t}\n
 \t}\n
 \n
-\n
-\tfunction comma() {\n
-\t\tif (token.line !== nexttoken.line) {\n
-\t\t\tif (!option.laxcomma) {\n
+\tfunction nobreakcomma(left, right) {\n
+\t\tif (left.line !== right.line) {\n
+\t\t\tif (!state.option.laxcomma) {\n
 \t\t\t\tif (comma.first) {\n
-\t\t\t\t\twarning("Comma warnings can be turned off with \'laxcomma\'");\n
+\t\t\t\t\twarning("I001");\n
 \t\t\t\t\tcomma.first = false;\n
 \t\t\t\t}\n
-\t\t\t\twarning("Bad line breaking before \'{a}\'.", token, nexttoken.id);\n
+\t\t\t\twarning("W014", left, right.value);\n
+\t\t\t}\n
+\t\t} else if (!left.comment && left.character !== right.from && state.option.white) {\n
+\t\t\tleft.from += (left.character - left.from);\n
+\t\t\twarning("W011", left, left.value);\n
+\t\t}\n
+\t}\n
+\n
+\tfunction comma(opts) {\n
+\t\topts = opts || {};\n
+\n
+\t\tif (!opts.peek) {\n
+\t\t\tnobreakcomma(state.tokens.curr, state.tokens.next);\n
+\t\t\tadvance(",");\n
+\t\t} else {\n
+\t\t\tnobreakcomma(state.tokens.prev, state.tokens.curr);\n
+\t\t}\n
+\n
+\t\tif (state.tokens.next.value !== "]" && state.tokens.next.value !== "}") {\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t}\n
+\n
+\t\tif (state.tokens.next.identifier && !(opts.property && state.option.inES5())) {\n
+\t\t\tswitch (state.tokens.next.value) {\n
+\t\t\tcase "break":\n
+\t\t\tcase "case":\n
+\t\t\tcase "catch":\n
+\t\t\tcase "continue":\n
+\t\t\tcase "default":\n
+\t\t\tcase "do":\n
+\t\t\tcase "else":\n
+\t\t\tcase "finally":\n
+\t\t\tcase "for":\n
+\t\t\tcase "if":\n
+\t\t\tcase "in":\n
+\t\t\tcase "instanceof":\n
+\t\t\tcase "return":\n
+\t\t\tcase "switch":\n
+\t\t\tcase "throw":\n
+\t\t\tcase "try":\n
+\t\t\tcase "var":\n
+\t\t\tcase "let":\n
+\t\t\tcase "while":\n
+\t\t\tcase "with":\n
+\t\t\t\terror("E024", state.tokens.next, state.tokens.next.value);\n
+\t\t\t\treturn false;\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tif (state.tokens.next.type === "(punctuator)") {\n
+\t\t\tswitch (state.tokens.next.value) {\n
+\t\t\tcase "}":\n
+\t\t\tcase "]":\n
+\t\t\tcase ",":\n
+\t\t\t\tif (opts.allowTrailing) {\n
+\t\t\t\t\treturn true;\n
+\t\t\t\t}\n
+\t\t\tcase ")":\n
+\t\t\t\terror("E024", state.tokens.next, state.tokens.next.value);\n
+\t\t\t\treturn false;\n
 \t\t\t}\n
-\t\t} else if (!token.comment && token.character !== nexttoken.from && option.white) {\n
-\t\t\ttoken.from += (token.character - token.from);\n
-\t\t\twarning("Unexpected space after \'{a}\'.", token, token.value);\n
 \t\t}\n
-\t\tadvance(",");\n
-\t\tnonadjacent(token, nexttoken);\n
+\t\treturn true;\n
 \t}\n
 \n
 \tfunction symbol(s, p) {\n
-\t\tvar x = syntax[s];\n
+\t\tvar x = state.syntax[s];\n
 \t\tif (!x || typeof x !== "object") {\n
-\t\t\tsyntax[s] = x = {\n
+\t\t\tstate.syntax[s] = x = {\n
 \t\t\t\tid: s,\n
 \t\t\t\tlbp: p,\n
 \t\t\t\tvalue: s\n
@@ -4125,12 +4885,10 @@ klass:\n
 \t\treturn x;\n
 \t}\n
 \n
-\n
 \tfunction delim(s) {\n
 \t\treturn symbol(s, 0);\n
 \t}\n
 \n
-\n
 \tfunction stmt(s, f) {\n
 \t\tvar x = delim(s);\n
 \t\tx.identifier = x.reserved = true;\n
@@ -4138,14 +4896,12 @@ klass:\n
 \t\treturn x;\n
 \t}\n
 \n
-\n
 \tfunction blockstmt(s, f) {\n
 \t\tvar x = stmt(s, f);\n
 \t\tx.block = true;\n
 \t\treturn x;\n
 \t}\n
 \n
-\n
 \tfunction reserveName(x) {\n
 \t\tvar c = x.id.charAt(0);\n
 \t\tif ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) {\n
@@ -4154,7 +4910,6 @@ klass:\n
 \t\treturn x;\n
 \t}\n
 \n
-\n
 \tfunction prefix(s, f) {\n
 \t\tvar x = symbol(s, 150);\n
 \t\treserveName(x);\n
@@ -4162,11 +4917,11 @@ klass:\n
 \t\t\tthis.right = expression(150);\n
 \t\t\tthis.arity = "unary";\n
 \t\t\tif (this.id === "++" || this.id === "--") {\n
-\t\t\t\tif (option.plusplus) {\n
-\t\t\t\t\twarning("Unexpected use of \'{a}\'.", this, this.id);\n
-\t\t\t\t} else if ((!this.right.identifier || this.right.reserved) &&\n
+\t\t\t\tif (state.option.plusplus) {\n
+\t\t\t\t\twarning("W016", this, this.id);\n
+\t\t\t\t} else if ((!this.right.identifier || isReserved(this.right)) &&\n
 \t\t\t\t\t\tthis.right.id !== "." && this.right.id !== "[") {\n
-\t\t\t\t\twarning("Bad operand.", this);\n
+\t\t\t\t\twarning("W017", this);\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t\treturn this;\n
@@ -4174,7 +4929,6 @@ klass:\n
 \t\treturn x;\n
 \t}\n
 \n
-\n
 \tfunction type(s, f) {\n
 \t\tvar x = delim(s);\n
 \t\tx.type = s;\n
@@ -4182,13 +4936,28 @@ klass:\n
 \t\treturn x;\n
 \t}\n
 \n
-\n
-\tfunction reserve(s, f) {\n
-\t\tvar x = type(s, f);\n
-\t\tx.identifier = x.reserved = true;\n
+\tfunction reserve(name, func) {\n
+\t\tvar x = type(name, func);\n
+\t\tx.identifier = true;\n
+\t\tx.reserved = true;\n
 \t\treturn x;\n
 \t}\n
 \n
+\tfunction FutureReservedWord(name, meta) {\n
+\t\tvar x = type(name, (meta && meta.nud) || function () {\n
+\t\t\treturn this;\n
+\t\t});\n
+\n
+\t\tmeta = meta || {};\n
+\t\tmeta.isFutureReservedWord = true;\n
+\n
+\t\tx.value = name;\n
+\t\tx.identifier = true;\n
+\t\tx.reserved = true;\n
+\t\tx.meta = meta;\n
+\n
+\t\treturn x;\n
+\t}\n
 \n
 \tfunction reservevar(s, v) {\n
 \t\treturn reserve(s, function () {\n
@@ -4199,17 +4968,17 @@ klass:\n
 \t\t});\n
 \t}\n
 \n
-\n
 \tfunction infix(s, f, p, w) {\n
 \t\tvar x = symbol(s, p);\n
 \t\treserveName(x);\n
+\t\tx.infix = true;\n
 \t\tx.led = function (left) {\n
 \t\t\tif (!w) {\n
-\t\t\t\tnobreaknonadjacent(prevtoken, token);\n
-\t\t\t\tnonadjacent(token, nexttoken);\n
+\t\t\t\tnobreaknonadjacent(state.tokens.prev, state.tokens.curr);\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\t}\n
 \t\t\tif (s === "in" && left.id === "!") {\n
-\t\t\t\twarning("Confusing use of \'{a}\'.", left, "!");\n
+\t\t\t\twarning("W018", left, "!");\n
 \t\t\t}\n
 \t\t\tif (typeof f === "function") {\n
 \t\t\t\treturn f(left, this);\n
@@ -4223,24 +4992,50 @@ klass:\n
 \t}\n
 \n
 \n
+\tfunction application(s) {\n
+\t\tvar x = symbol(s, 42);\n
+\n
+\t\tx.led = function (left) {\n
+\t\t\tif (!state.option.inESNext()) {\n
+\t\t\t\twarning("W104", state.tokens.curr, "arrow function syntax (=>)");\n
+\t\t\t}\n
+\n
+\t\t\tnobreaknonadjacent(state.tokens.prev, state.tokens.curr);\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\n
+\t\t\tthis.left = left;\n
+\t\t\tthis.right = doFunction(undefined, undefined, false, left);\n
+\t\t\treturn this;\n
+\t\t};\n
+\t\treturn x;\n
+\t}\n
+\n
 \tfunction relation(s, f) {\n
 \t\tvar x = symbol(s, 100);\n
+\n
 \t\tx.led = function (left) {\n
-\t\t\tnobreaknonadjacent(prevtoken, token);\n
-\t\t\tnonadjacent(token, nexttoken);\n
+\t\t\tnobreaknonadjacent(state.tokens.prev, state.tokens.curr);\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\tvar right = expression(100);\n
 \n
 \t\t\tif (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) {\n
-\t\t\t\twarning("Use the isNaN function to compare with NaN.", this);\n
+\t\t\t\twarning("W019", this);\n
 \t\t\t} else if (f) {\n
 \t\t\t\tf.apply(this, [left, right]);\n
 \t\t\t}\n
+\n
+\t\t\tif (!left || !right) {\n
+\t\t\t\tquit("E041", state.tokens.curr.line);\n
+\t\t\t}\n
+\n
 \t\t\tif (left.id === "!") {\n
-\t\t\t\twarning("Confusing use of \'{a}\'.", left, "!");\n
+\t\t\t\twarning("W018", left, "!");\n
 \t\t\t}\n
+\n
 \t\t\tif (right.id === "!") {\n
-\t\t\t\twarning("Confusing use of \'{a}\'.", right, "!");\n
+\t\t\t\twarning("W018", right, "!");\n
 \t\t\t}\n
+\n
 \t\t\tthis.left = left;\n
 \t\t\tthis.right = right;\n
 \t\t\treturn this;\n
@@ -4248,59 +5043,74 @@ klass:\n
 \t\treturn x;\n
 \t}\n
 \n
-\n
 \tfunction isPoorRelation(node) {\n
 \t\treturn node &&\n
 \t\t\t  ((node.type === "(number)" && +node.value === 0) ||\n
 \t\t\t   (node.type === "(string)" && node.value === "") ||\n
-\t\t\t   (node.type === "null" && !option.eqnull) ||\n
+\t\t\t   (node.type === "null" && !state.option.eqnull) ||\n
 \t\t\t\tnode.type === "true" ||\n
 \t\t\t\tnode.type === "false" ||\n
 \t\t\t\tnode.type === "undefined");\n
 \t}\n
 \n
-\n
-\tfunction assignop(s) {\n
-\t\tsymbol(s, 20).exps = true;\n
-\n
-\t\treturn infix(s, function (left, that) {\n
+\tfunction assignop(s, f, p) {\n
+\t\tvar x = infix(s, typeof f === "function" ? f : function (left, that) {\n
 \t\t\tthat.left = left;\n
 \n
-\t\t\tif (predefined[left.value] === false &&\n
-\t\t\t\t\tscope[left.value]["(global)"] === true) {\n
-\t\t\t\twarning("Read only.", left);\n
-\t\t\t} else if (left["function"]) {\n
-\t\t\t\twarning("\'{a}\' is a function.", left, left.value);\n
-\t\t\t}\n
-\n
 \t\t\tif (left) {\n
-\t\t\t\tif (option.esnext && funct[left.value] === "const") {\n
-\t\t\t\t\twarning("Attempting to override \'{a}\' which is a constant", left, left.value);\n
+\t\t\t\tif (predefined[left.value] === false &&\n
+\t\t\t\t\t\tscope[left.value]["(global)"] === true) {\n
+\t\t\t\t\twarning("W020", left);\n
+\t\t\t\t} else if (left["function"]) {\n
+\t\t\t\t\twarning("W021", left, left.value);\n
 \t\t\t\t}\n
 \n
-\t\t\t\tif (left.id === "." || left.id === "[") {\n
-\t\t\t\t\tif (!left.left || left.left.value === "arguments") {\n
-\t\t\t\t\t\twarning("Bad assignment.", that);\n
+\t\t\t\tif (funct[left.value] === "const") {\n
+\t\t\t\t\terror("E013", left, left.value);\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (left.id === ".") {\n
+\t\t\t\t\tif (!left.left) {\n
+\t\t\t\t\t\twarning("E031", that);\n
+\t\t\t\t\t} else if (left.left.value === "arguments" && !state.directive["use strict"]) {\n
+\t\t\t\t\t\twarning("E031", that);\n
+\t\t\t\t\t}\n
+\n
+\t\t\t\t\tthat.right = expression(10);\n
+\t\t\t\t\treturn that;\n
+\t\t\t\t} else if (left.id === "[") {\n
+\t\t\t\t\tif (state.tokens.curr.left.first) {\n
+\t\t\t\t\t\tstate.tokens.curr.left.first.forEach(function (t) {\n
+\t\t\t\t\t\t\tif (funct[t.value] === "const") {\n
+\t\t\t\t\t\t\t\terror("E013", t, t.value);\n
+\t\t\t\t\t\t\t}\n
+\t\t\t\t\t\t});\n
+\t\t\t\t\t} else if (!left.left) {\n
+\t\t\t\t\t\twarning("E031", that);\n
+\t\t\t\t\t} else if (left.left.value === "arguments" && !state.directive["use strict"]) {\n
+\t\t\t\t\t\twarning("E031", that);\n
 \t\t\t\t\t}\n
-\t\t\t\t\tthat.right = expression(19);\n
+\t\t\t\t\tthat.right = expression(10);\n
 \t\t\t\t\treturn that;\n
-\t\t\t\t} else if (left.identifier && !left.reserved) {\n
+\t\t\t\t} else if (left.identifier && !isReserved(left)) {\n
 \t\t\t\t\tif (funct[left.value] === "exception") {\n
-\t\t\t\t\t\twarning("Do not assign to the exception parameter.", left);\n
+\t\t\t\t\t\twarning("W022", left);\n
 \t\t\t\t\t}\n
-\t\t\t\t\tthat.right = expression(19);\n
+\t\t\t\t\tthat.right = expression(10);\n
 \t\t\t\t\treturn that;\n
 \t\t\t\t}\n
 \n
-\t\t\t\tif (left === syntax["function"]) {\n
-\t\t\t\t\twarning(\n
-"Expected an identifier in an assignment and instead saw a function invocation.",\n
-\t\t\t\t\t\t\t\ttoken);\n
+\t\t\t\tif (left === state.syntax["function"]) {\n
+\t\t\t\t\twarning("W023", state.tokens.curr);\n
 \t\t\t\t}\n
 \t\t\t}\n
 \n
-\t\t\terror("Bad assignment.", that);\n
-\t\t}, 20);\n
+\t\t\terror("E031", that);\n
+\t\t}, p);\n
+\n
+\t\tx.exps = true;\n
+\t\tx.assign = true;\n
+\t\treturn x;\n
 \t}\n
 \n
 \n
@@ -4308,8 +5118,8 @@ klass:\n
 \t\tvar x = symbol(s, p);\n
 \t\treserveName(x);\n
 \t\tx.led = (typeof f === "function") ? f : function (left) {\n
-\t\t\tif (option.bitwise) {\n
-\t\t\t\twarning("Unexpected use of \'{a}\'.", this, this.id);\n
+\t\t\tif (state.option.bitwise) {\n
+\t\t\t\twarning("W016", this, this.id);\n
 \t\t\t}\n
 \t\t\tthis.left = left;\n
 \t\t\tthis.right = expression(p);\n
@@ -4320,74 +5130,91 @@ klass:\n
 \n
 \n
 \tfunction bitwiseassignop(s) {\n
-\t\tsymbol(s, 20).exps = true;\n
-\t\treturn infix(s, function (left, that) {\n
-\t\t\tif (option.bitwise) {\n
-\t\t\t\twarning("Unexpected use of \'{a}\'.", that, that.id);\n
+\t\treturn assignop(s, function (left, that) {\n
+\t\t\tif (state.option.bitwise) {\n
+\t\t\t\twarning("W016", that, that.id);\n
 \t\t\t}\n
-\t\t\tnonadjacent(prevtoken, token);\n
-\t\t\tnonadjacent(token, nexttoken);\n
+\t\t\tnonadjacent(state.tokens.prev, state.tokens.curr);\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\tif (left) {\n
 \t\t\t\tif (left.id === "." || left.id === "[" ||\n
-\t\t\t\t\t\t(left.identifier && !left.reserved)) {\n
-\t\t\t\t\texpression(19);\n
+\t\t\t\t\t\t(left.identifier && !isReserved(left))) {\n
+\t\t\t\t\texpression(10);\n
 \t\t\t\t\treturn that;\n
 \t\t\t\t}\n
-\t\t\t\tif (left === syntax["function"]) {\n
-\t\t\t\t\twarning(\n
-"Expected an identifier in an assignment, and instead saw a function invocation.",\n
-\t\t\t\t\t\t\t\ttoken);\n
+\t\t\t\tif (left === state.syntax["function"]) {\n
+\t\t\t\t\twarning("W023", state.tokens.curr);\n
 \t\t\t\t}\n
 \t\t\t\treturn that;\n
 \t\t\t}\n
-\t\t\terror("Bad assignment.", that);\n
+\t\t\terror("E031", that);\n
 \t\t}, 20);\n
 \t}\n
 \n
 \n
 \tfunction suffix(s) {\n
 \t\tvar x = symbol(s, 150);\n
+\n
 \t\tx.led = function (left) {\n
-\t\t\tif (option.plusplus) {\n
-\t\t\t\twarning("Unexpected use of \'{a}\'.", this, this.id);\n
-\t\t\t} else if ((!left.identifier || left.reserved) &&\n
-\t\t\t\t\tleft.id !== "." && left.id !== "[") {\n
-\t\t\t\twarning("Bad operand.", this);\n
+\t\t\tif (state.option.plusplus) {\n
+\t\t\t\twarning("W016", this, this.id);\n
+\t\t\t} else if ((!left.identifier || isReserved(left)) && left.id !== "." && left.id !== "[") {\n
+\t\t\t\twarning("W017", this);\n
 \t\t\t}\n
+\n
 \t\t\tthis.left = left;\n
 \t\t\treturn this;\n
 \t\t};\n
 \t\treturn x;\n
 \t}\n
-\tfunction optionalidentifier(fnparam) {\n
-\t\tif (nexttoken.identifier) {\n
-\t\t\tadvance();\n
-\t\t\tif (token.reserved && !option.es5) {\n
-\t\t\t\tif (!fnparam || token.value !== "undefined") {\n
-\t\t\t\t\twarning("Expected an identifier and instead saw \'{a}\' (a reserved word).",\n
-\t\t\t\t\t\t\ttoken, token.id);\n
-\t\t\t\t}\n
+\n
+\tfunction optionalidentifier(fnparam, prop) {\n
+\t\tif (!state.tokens.next.identifier) {\n
+\t\t\treturn;\n
+\t\t}\n
+\n
+\t\tadvance();\n
+\n
+\t\tvar curr = state.tokens.curr;\n
+\t\tvar val  = state.tokens.curr.value;\n
+\n
+\t\tif (!isReserved(curr)) {\n
+\t\t\treturn val;\n
+\t\t}\n
+\n
+\t\tif (prop) {\n
+\t\t\tif (state.option.inES5()) {\n
+\t\t\t\treturn val;\n
 \t\t\t}\n
-\t\t\treturn token.value;\n
 \t\t}\n
+\n
+\t\tif (fnparam && val === "undefined") {\n
+\t\t\treturn val;\n
+\t\t}\n
+\t\tif (prop && !api.getCache("displayed:I002")) {\n
+\t\t\tapi.setCache("displayed:I002", true);\n
+\t\t\twarning("I002");\n
+\t\t}\n
+\n
+\t\twarning("W024", state.tokens.curr, state.tokens.curr.id);\n
+\t\treturn val;\n
 \t}\n
-\tfunction identifier(fnparam) {\n
-\t\tvar i = optionalidentifier(fnparam);\n
+\tfunction identifier(fnparam, prop) {\n
+\t\tvar i = optionalidentifier(fnparam, prop);\n
 \t\tif (i) {\n
 \t\t\treturn i;\n
 \t\t}\n
-\t\tif (token.id === "function" && nexttoken.id === "(") {\n
-\t\t\twarning("Missing name in function declaration.");\n
+\t\tif (state.tokens.curr.id === "function" && state.tokens.next.id === "(") {\n
+\t\t\twarning("W025");\n
 \t\t} else {\n
-\t\t\terror("Expected an identifier and instead saw \'{a}\'.",\n
-\t\t\t\t\tnexttoken, nexttoken.value);\n
+\t\t\terror("E030", state.tokens.next, state.tokens.next.value);\n
 \t\t}\n
 \t}\n
 \n
 \n
 \tfunction reachable(s) {\n
 \t\tvar i = 0, t;\n
-\t\tif (nexttoken.id !== ";" || noreach) {\n
+\t\tif (state.tokens.next.id !== ";" || noreach) {\n
 \t\t\treturn;\n
 \t\t}\n
 \t\tfor (;;) {\n
@@ -4397,14 +5224,15 @@ klass:\n
 \t\t\t}\n
 \t\t\tif (t.id !== "(endline)") {\n
 \t\t\t\tif (t.id === "function") {\n
-\t\t\t\t\tif (!option.latedef) {\n
+\t\t\t\t\tif (!state.option.latedef) {\n
 \t\t\t\t\t\tbreak;\n
 \t\t\t\t\t}\n
-\t\t\t\t\twarning(\n
-"Inner functions should be listed at the top of the outer function.", t);\n
+\n
+\t\t\t\t\twarning("W026", t);\n
 \t\t\t\t\tbreak;\n
 \t\t\t\t}\n
-\t\t\t\twarning("Unreachable \'{a}\' after \'{b}\'.", t, t.value, s);\n
+\n
+\t\t\t\twarning("W027", t, t.value, s);\n
 \t\t\t\tbreak;\n
 \t\t\t}\n
 \t\t\ti += 1;\n
@@ -4413,29 +5241,46 @@ klass:\n
 \n
 \n
 \tfunction statement(noindent) {\n
-\t\tvar i = indent, r, s = scope, t = nexttoken;\n
+\t\tvar values;\n
+\t\tvar i = indent, r, s = scope, t = state.tokens.next;\n
 \n
 \t\tif (t.id === ";") {\n
 \t\t\tadvance(";");\n
 \t\t\treturn;\n
 \t\t}\n
+\t\tvar res = isReserved(t);\n
 \n
-\t\tif (t.identifier && !t.reserved && peek().id === ":") {\n
+\t\tif (res && t.meta && t.meta.isFutureReservedWord && peek().id === ":") {\n
+\t\t\twarning("W024", t, t.id);\n
+\t\t\tres = false;\n
+\t\t}\n
+\t\tif (_.has(["[", "{"], t.value)) {\n
+\t\t\tif (lookupBlockType().isDestAssign) {\n
+\t\t\t\tif (!state.option.inESNext()) {\n
+\t\t\t\t\twarning("W104", state.tokens.curr, "destructuring expression");\n
+\t\t\t\t}\n
+\t\t\t\tvalues = destructuringExpression();\n
+\t\t\t\tvalues.forEach(function (tok) {\n
+\t\t\t\t\tisundef(funct, "W117", tok.token, tok.id);\n
+\t\t\t\t});\n
+\t\t\t\tadvance("=");\n
+\t\t\t\tdestructuringExpressionMatch(values, expression(10, true));\n
+\t\t\t\tadvance(";");\n
+\t\t\t\treturn;\n
+\t\t\t}\n
+\t\t}\n
+\t\tif (t.identifier && !res && peek().id === ":") {\n
 \t\t\tadvance();\n
 \t\t\tadvance(":");\n
 \t\t\tscope = Object.create(s);\n
 \t\t\taddlabel(t.value, "label");\n
 \n
-\t\t\tif (!nexttoken.labelled && nexttoken.value !== "{") {\n
-\t\t\t\twarning("Label \'{a}\' on {b} statement.", nexttoken, t.value, nexttoken.value);\n
-\t\t\t}\n
-\n
-\t\t\tif (jx.test(t.value + ":")) {\n
-\t\t\t\twarning("Label \'{a}\' looks like a javascript url.", t, t.value);\n
+\t\t\tif (!state.tokens.next.labelled && state.tokens.next.value !== "{") {\n
+\t\t\t\twarning("W028", state.tokens.next, t.value, state.tokens.next.value);\n
 \t\t\t}\n
 \n
-\t\t\tnexttoken.label = t.value;\n
-\t\t\tt = nexttoken;\n
+\t\t\tstate.tokens.next.label = t.value;\n
+\t\t\tt = state.tokens.next;\n
 \t\t}\n
 \n
 \t\tif (t.id === "{") {\n
@@ -4449,28 +5294,23 @@ klass:\n
 \t\tr = expression(0, true);\n
 \n
 \t\tif (!t.block) {\n
-\t\t\tif (!option.expr && (!r || !r.exps)) {\n
-\t\t\t\twarning("Expected an assignment or function call and instead saw an expression.",\n
-\t\t\t\t\ttoken);\n
-\t\t\t} else if (option.nonew && r.id === "(" && r.left.id === "new") {\n
-\t\t\t\twarning("Do not use \'new\' for side effects.", t);\n
+\t\t\tif (!state.option.expr && (!r || !r.exps)) {\n
+\t\t\t\twarning("W030", state.tokens.curr);\n
+\t\t\t} else if (state.option.nonew && r && r.left && r.id === "(" && r.left.id === "new") {\n
+\t\t\t\twarning("W031", t);\n
 \t\t\t}\n
 \n
-\t\t\tif (nexttoken.id === ",") {\n
-\t\t\t\treturn comma();\n
-\t\t\t}\n
-\n
-\t\t\tif (nexttoken.id !== ";") {\n
-\t\t\t\tif (!option.asi) {\n
-\t\t\t\t\tif (!option.lastsemic || nexttoken.id !== "}" ||\n
-\t\t\t\t\t\t\tnexttoken.line !== token.line) {\n
-\t\t\t\t\t\twarningAt("Missing semicolon.", token.line, token.character);\n
+\t\t\tif (state.tokens.next.id !== ";") {\n
+\t\t\t\tif (!state.option.asi) {\n
+\t\t\t\t\tif (!state.option.lastsemic || state.tokens.next.id !== "}" ||\n
+\t\t\t\t\t\tstate.tokens.next.line !== state.tokens.curr.line) {\n
+\t\t\t\t\t\twarningAt("W033", state.tokens.curr.line, state.tokens.curr.character);\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
 \t\t\t} else {\n
-\t\t\t\tadjacent(token, nexttoken);\n
+\t\t\t\tadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\t\tadvance(";");\n
-\t\t\t\tnonadjacent(token, nexttoken);\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\t}\n
 \t\t}\n
 \n
@@ -4483,15 +5323,17 @@ klass:\n
 \tfunction statements(startLine) {\n
 \t\tvar a = [], p;\n
 \n
-\t\twhile (!nexttoken.reach && nexttoken.id !== "(end)") {\n
-\t\t\tif (nexttoken.id === ";") {\n
+\t\twhile (!state.tokens.next.reach && state.tokens.next.id !== "(end)") {\n
+\t\t\tif (state.tokens.next.id === ";") {\n
 \t\t\t\tp = peek();\n
-\t\t\t\tif (!p || p.id !== "(") {\n
-\t\t\t\t\twarning("Unnecessary semicolon.");\n
+\n
+\t\t\t\tif (!p || (p.id !== "(" && p.id !== "[")) {\n
+\t\t\t\t\twarning("W032");\n
 \t\t\t\t}\n
+\n
 \t\t\t\tadvance(";");\n
 \t\t\t} else {\n
-\t\t\t\ta.push(statement(startLine === nexttoken.line));\n
+\t\t\t\ta.push(statement(startLine === state.tokens.next.line));\n
 \t\t\t}\n
 \t\t}\n
 \t\treturn a;\n
@@ -4500,7 +5342,7 @@ klass:\n
 \t\tvar i, p, pn;\n
 \n
 \t\tfor (;;) {\n
-\t\t\tif (nexttoken.id === "(string)") {\n
+\t\t\tif (state.tokens.next.id === "(string)") {\n
 \t\t\t\tp = peek(0);\n
 \t\t\t\tif (p.id === "(endline)") {\n
 \t\t\t\t\ti = 1;\n
@@ -4515,28 +5357,28 @@ klass:\n
 \t\t\t\t\t\t\tpn.id !== "}") {\n
 \t\t\t\t\t\t\tbreak;\n
 \t\t\t\t\t\t}\n
-\t\t\t\t\t\twarning("Missing semicolon.", nexttoken);\n
+\t\t\t\t\t\twarning("W033", state.tokens.next);\n
 \t\t\t\t\t} else {\n
 \t\t\t\t\t\tp = pn;\n
 \t\t\t\t\t}\n
 \t\t\t\t} else if (p.id === "}") {\n
-\t\t\t\t\twarning("Missing semicolon.", p);\n
+\t\t\t\t\twarning("W033", p);\n
 \t\t\t\t} else if (p.id !== ";") {\n
 \t\t\t\t\tbreak;\n
 \t\t\t\t}\n
 \n
 \t\t\t\tindentation();\n
 \t\t\t\tadvance();\n
-\t\t\t\tif (directive[token.value]) {\n
-\t\t\t\t\twarning("Unnecessary directive \\"{a}\\".", token, token.value);\n
+\t\t\t\tif (state.directive[state.tokens.curr.value]) {\n
+\t\t\t\t\twarning("W034", state.tokens.curr, state.tokens.curr.value);\n
 \t\t\t\t}\n
 \n
-\t\t\t\tif (token.value === "use strict") {\n
-\t\t\t\t\tif (!option["(explicitNewcap)"])\n
-\t\t\t\t\t\toption.newcap = true;\n
-\t\t\t\t\toption.undef = true;\n
+\t\t\t\tif (state.tokens.curr.value === "use strict") {\n
+\t\t\t\t\tif (!state.option["(explicitNewcap)"])\n
+\t\t\t\t\t\tstate.option.newcap = true;\n
+\t\t\t\t\tstate.option.undef = true;\n
 \t\t\t\t}\n
-\t\t\t\tdirective[token.value] = true;\n
+\t\t\t\tstate.directive[state.tokens.curr.value] = true;\n
 \n
 \t\t\t\tif (p.id === ";") {\n
 \t\t\t\t\tadvance(";");\n
@@ -4546,7 +5388,7 @@ klass:\n
 \t\t\tbreak;\n
 \t\t}\n
 \t}\n
-\tfunction block(ordinary, stmt, isfunc) {\n
+\tfunction block(ordinary, stmt, isfunc, isfatarrow) {\n
 \t\tvar a,\n
 \t\t\tb = inblock,\n
 \t\t\told_indent = indent,\n
@@ -4558,37 +5400,39 @@ klass:\n
 \n
 \t\tinblock = ordinary;\n
 \n
-\t\tif (!ordinary || !option.funcscope)\n
+\t\tif (!ordinary || !state.option.funcscope)\n
 \t\t\tscope = Object.create(scope);\n
 \n
-\t\tnonadjacent(token, nexttoken);\n
-\t\tt = nexttoken;\n
+\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\tt = state.tokens.next;\n
 \n
 \t\tvar metrics = funct["(metrics)"];\n
 \t\tmetrics.nestedBlockDepth += 1;\n
 \t\tmetrics.verifyMaxNestedBlockDepthPerFunction();\n
 \n
-\t\tif (nexttoken.id === "{") {\n
+\t\tif (state.tokens.next.id === "{") {\n
 \t\t\tadvance("{");\n
-\t\t\tline = token.line;\n
-\t\t\tif (nexttoken.id !== "}") {\n
-\t\t\t\tindent += option.indent;\n
-\t\t\t\twhile (!ordinary && nexttoken.from > indent) {\n
-\t\t\t\t\tindent += option.indent;\n
+\t\t\tfunct["(blockscope)"].stack();\n
+\n
+\t\t\tline = state.tokens.curr.line;\n
+\t\t\tif (state.tokens.next.id !== "}") {\n
+\t\t\t\tindent += state.option.indent;\n
+\t\t\t\twhile (!ordinary && state.tokens.next.from > indent) {\n
+\t\t\t\t\tindent += state.option.indent;\n
 \t\t\t\t}\n
 \n
 \t\t\t\tif (isfunc) {\n
 \t\t\t\t\tm = {};\n
-\t\t\t\t\tfor (d in directive) {\n
-\t\t\t\t\t\tif (is_own(directive, d)) {\n
-\t\t\t\t\t\t\tm[d] = directive[d];\n
+\t\t\t\t\tfor (d in state.directive) {\n
+\t\t\t\t\t\tif (_.has(state.directive, d)) {\n
+\t\t\t\t\t\t\tm[d] = state.directive[d];\n
 \t\t\t\t\t\t}\n
 \t\t\t\t\t}\n
 \t\t\t\t\tdirectives();\n
 \n
-\t\t\t\t\tif (option.strict && funct["(context)"]["(global)"]) {\n
-\t\t\t\t\t\tif (!m["use strict"] && !directive["use strict"]) {\n
-\t\t\t\t\t\t\twarning("Missing \\"use strict\\" statement.");\n
+\t\t\t\t\tif (state.option.strict && funct["(context)"]["(global)"]) {\n
+\t\t\t\t\t\tif (!m["use strict"] && !state.directive["use strict"]) {\n
+\t\t\t\t\t\t\twarning("E007");\n
 \t\t\t\t\t\t}\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
@@ -4598,37 +5442,65 @@ klass:\n
 \t\t\t\tmetrics.statementCount += a.length;\n
 \n
 \t\t\t\tif (isfunc) {\n
-\t\t\t\t\tdirective = m;\n
+\t\t\t\t\tstate.directive = m;\n
 \t\t\t\t}\n
 \n
-\t\t\t\tindent -= option.indent;\n
-\t\t\t\tif (line !== nexttoken.line) {\n
+\t\t\t\tindent -= state.option.indent;\n
+\t\t\t\tif (line !== state.tokens.next.line) {\n
 \t\t\t\t\tindentation();\n
 \t\t\t\t}\n
-\t\t\t} else if (line !== nexttoken.line) {\n
+\t\t\t} else if (line !== state.tokens.next.line) {\n
 \t\t\t\tindentation();\n
 \t\t\t}\n
 \t\t\tadvance("}", t);\n
+\n
+\t\t\tfunct["(blockscope)"].unstack();\n
+\n
 \t\t\tindent = old_indent;\n
 \t\t} else if (!ordinary) {\n
-\t\t\terror("Expected \'{a}\' and instead saw \'{b}\'.",\n
-\t\t\t\t  nexttoken, "{", nexttoken.value);\n
+\t\t\tif (isfunc) {\n
+\t\t\t\tm = {};\n
+\t\t\t\tif (stmt && !isfatarrow && !state.option.inMoz(true)) {\n
+\t\t\t\t\terror("W118", state.tokens.curr, "function closure expressions");\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (!stmt) {\n
+\t\t\t\t\tfor (d in state.directive) {\n
+\t\t\t\t\t\tif (_.has(state.directive, d)) {\n
+\t\t\t\t\t\t\tm[d] = state.directive[d];\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\t\t\t\texpression(10);\n
+\n
+\t\t\t\tif (state.option.strict && funct["(context)"]["(global)"]) {\n
+\t\t\t\t\tif (!m["use strict"] && !state.directive["use strict"]) {\n
+\t\t\t\t\t\twarning("E007");\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\t\t\t} else {\n
+\t\t\t\terror("E021", state.tokens.next, "{", state.tokens.next.value);\n
+\t\t\t}\n
 \t\t} else {\n
-\t\t\tif (!stmt || option.curly)\n
-\t\t\t\twarning("Expected \'{a}\' and instead saw \'{b}\'.",\n
-\t\t\t\t\t\tnexttoken, "{", nexttoken.value);\n
+\t\t\tfunct["(nolet)"] = true;\n
+\n
+\t\t\tif (!stmt || state.option.curly) {\n
+\t\t\t\twarning("W116", state.tokens.next, "{", state.tokens.next.value);\n
+\t\t\t}\n
 \n
 \t\t\tnoreach = true;\n
-\t\t\tindent += option.indent;\n
-\t\t\ta = [statement(nexttoken.line === token.line)];\n
-\t\t\tindent -= option.indent;\n
+\t\t\tindent += state.option.indent;\n
+\t\t\ta = [statement(state.tokens.next.line === state.tokens.curr.line)];\n
+\t\t\tindent -= state.option.indent;\n
 \t\t\tnoreach = false;\n
+\n
+\t\t\tdelete funct["(nolet)"];\n
 \t\t}\n
 \t\tfunct["(verb)"] = null;\n
-\t\tif (!ordinary || !option.funcscope) scope = s;\n
+\t\tif (!ordinary || !state.option.funcscope) scope = s;\n
 \t\tinblock = b;\n
-\t\tif (ordinary && option.noempty && (!a || a.length === 0)) {\n
-\t\t\twarning("Empty block.");\n
+\t\tif (ordinary && state.option.noempty && (!a || a.length === 0)) {\n
+\t\t\twarning("W035");\n
 \t\t}\n
 \t\tmetrics.nestedBlockDepth -= 1;\n
 \t\treturn a;\n
@@ -4637,7 +5509,7 @@ klass:\n
 \n
 \tfunction countMember(m) {\n
 \t\tif (membersOnly && typeof membersOnly[m] !== "boolean") {\n
-\t\t\twarning("Unexpected /*member \'{a}\'.", token, m);\n
+\t\t\twarning("W036", state.tokens.curr, m);\n
 \t\t}\n
 \t\tif (typeof member[m] === "number") {\n
 \t\t\tmember[m] += 1;\n
@@ -4647,8 +5519,8 @@ klass:\n
 \t}\n
 \n
 \n
-\tfunction note_implied(token) {\n
-\t\tvar name = token.value, line = token.line, a = implied[name];\n
+\tfunction note_implied(tkn) {\n
+\t\tvar name = tkn.value, line = tkn.line, a = implied[name];\n
 \t\tif (typeof a === "function") {\n
 \t\t\ta = false;\n
 \t\t}\n
@@ -4669,7 +5541,7 @@ klass:\n
 \t\treturn this;\n
 \t});\n
 \n
-\tsyntax["(identifier)"] = {\n
+\tstate.syntax["(identifier)"] = {\n
 \t\ttype: "(identifier)",\n
 \t\tlbp: 0,\n
 \t\tidentifier: true,\n
@@ -4687,33 +5559,42 @@ klass:\n
 \t\t\t\ts = funct;\n
 \t\t\t\tfunct = f;\n
 \t\t\t}\n
-\t\t\tif (funct === s) {\n
-\t\t\t\tswitch (funct[v]) {\n
+\t\t\tvar block;\n
+\t\t\tif (_.has(funct, "(blockscope)")) {\n
+\t\t\t\tblock = funct["(blockscope)"].getlabel(v);\n
+\t\t\t}\n
+\t\t\tif (funct === s || block) {\n
+\t\t\t\tswitch (block ? block[v]["(type)"] : funct[v]) {\n
 \t\t\t\tcase "unused":\n
-\t\t\t\t\tfunct[v] = "var";\n
+\t\t\t\t\tif (block) block[v]["(type)"] = "var";\n
+\t\t\t\t\telse funct[v] = "var";\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tcase "unction":\n
-\t\t\t\t\tfunct[v] = "function";\n
+\t\t\t\t\tif (block) block[v]["(type)"] = "function";\n
+\t\t\t\t\telse funct[v] = "function";\n
 \t\t\t\t\tthis["function"] = true;\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tcase "function":\n
 \t\t\t\t\tthis["function"] = true;\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tcase "label":\n
-\t\t\t\t\twarning("\'{a}\' is a statement label.", token, v);\n
+\t\t\t\t\twarning("W037", state.tokens.curr, v);\n
 \t\t\t\t\tbreak;\n
 \t\t\t\t}\n
 \t\t\t} else if (funct["(global)"]) {\n
 \n
-\t\t\t\tif (option.undef && typeof predefined[v] !== "boolean") {\n
+\t\t\t\tif (typeof predefined[v] !== "boolean") {\n
 \t\t\t\t\tif (!(anonname === "typeof" || anonname === "delete") ||\n
-\t\t\t\t\t\t(nexttoken && (nexttoken.value === "." || nexttoken.value === "["))) {\n
+\t\t\t\t\t\t(state.tokens.next && (state.tokens.next.value === "." ||\n
+\t\t\t\t\t\t\tstate.tokens.next.value === "["))) {\n
 \n
-\t\t\t\t\t\tisundef(funct, "\'{a}\' is not defined.", token, v);\n
+\t\t\t\t\t\tif (!funct["(comparray)"].check(v)) {\n
+\t\t\t\t\t\t\tisundef(funct, "W117", state.tokens.curr, v);\n
+\t\t\t\t\t\t}\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
 \n
-\t\t\t\tnote_implied(token);\n
+\t\t\t\tnote_implied(state.tokens.curr);\n
 \t\t\t} else {\n
 \n
 \t\t\t\tswitch (funct[v]) {\n
@@ -4721,10 +5602,10 @@ klass:\n
 \t\t\t\tcase "function":\n
 \t\t\t\tcase "var":\n
 \t\t\t\tcase "unused":\n
-\t\t\t\t\twarning("\'{a}\' used out of scope.", token, v);\n
+\t\t\t\t\twarning("W038", state.tokens.curr, v);\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tcase "label":\n
-\t\t\t\t\twarning("\'{a}\' is a statement label.", token, v);\n
+\t\t\t\t\twarning("W037", state.tokens.curr, v);\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tcase "outer":\n
 \t\t\t\tcase "global":\n
@@ -4733,19 +5614,17 @@ klass:\n
 \t\t\t\t\tif (s === true) {\n
 \t\t\t\t\t\tfunct[v] = true;\n
 \t\t\t\t\t} else if (s === null) {\n
-\t\t\t\t\t\twarning("\'{a}\' is not allowed.", token, v);\n
-\t\t\t\t\t\tnote_implied(token);\n
+\t\t\t\t\t\twarning("W039", state.tokens.curr, v);\n
+\t\t\t\t\t\tnote_implied(state.tokens.curr);\n
 \t\t\t\t\t} else if (typeof s !== "object") {\n
-\t\t\t\t\t\tif (option.undef) {\n
-\t\t\t\t\t\t\tif (!(anonname === "typeof" || anonname === "delete") ||\n
-\t\t\t\t\t\t\t\t(nexttoken &&\n
-\t\t\t\t\t\t\t\t\t(nexttoken.value === "." || nexttoken.value === "["))) {\n
+\t\t\t\t\t\tif (!(anonname === "typeof" || anonname === "delete") ||\n
+\t\t\t\t\t\t\t(state.tokens.next &&\n
+\t\t\t\t\t\t\t\t(state.tokens.next.value === "." || state.tokens.next.value === "["))) {\n
 \n
-\t\t\t\t\t\t\t\tisundef(funct, "\'{a}\' is not defined.", token, v);\n
-\t\t\t\t\t\t\t}\n
+\t\t\t\t\t\t\tisundef(funct, "W117", state.tokens.curr, v);\n
 \t\t\t\t\t\t}\n
 \t\t\t\t\t\tfunct[v] = true;\n
-\t\t\t\t\t\tnote_implied(token);\n
+\t\t\t\t\t\tnote_implied(state.tokens.curr);\n
 \t\t\t\t\t} else {\n
 \t\t\t\t\t\tswitch (s[v]) {\n
 \t\t\t\t\t\tcase "function":\n
@@ -4763,7 +5642,7 @@ klass:\n
 \t\t\t\t\t\t\tfunct[v] = s["(global)"] ? "global" : "outer";\n
 \t\t\t\t\t\t\tbreak;\n
 \t\t\t\t\t\tcase "label":\n
-\t\t\t\t\t\t\twarning("\'{a}\' is a statement label.", token, v);\n
+\t\t\t\t\t\t\twarning("W037", state.tokens.curr, v);\n
 \t\t\t\t\t\t}\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
@@ -4771,8 +5650,7 @@ klass:\n
 \t\t\treturn this;\n
 \t\t},\n
 \t\tled: function () {\n
-\t\t\terror("Expected an operator and instead saw \'{a}\'.",\n
-\t\t\t\tnexttoken, nexttoken.value);\n
+\t\t\terror("E033", state.tokens.next, state.tokens.next.value);\n
 \t\t}\n
 \t};\n
 \n
@@ -4783,10 +5661,6 @@ klass:\n
 \tdelim("(endline)");\n
 \tdelim("(begin)");\n
 \tdelim("(end)").reach = true;\n
-\tdelim("</").reach = true;\n
-\tdelim("<!");\n
-\tdelim("<!--");\n
-\tdelim("-->");\n
 \tdelim("(error)").reach = true;\n
 \tdelim("}").reach = true;\n
 \tdelim(")");\n
@@ -4795,17 +5669,16 @@ klass:\n
 \tdelim("\'").reach = true;\n
 \tdelim(";");\n
 \tdelim(":").reach = true;\n
-\tdelim(",");\n
 \tdelim("#");\n
-\tdelim("@");\n
+\n
 \treserve("else");\n
 \treserve("case").reach = true;\n
 \treserve("catch");\n
 \treserve("default").reach = true;\n
 \treserve("finally");\n
 \treservevar("arguments", function (x) {\n
-\t\tif (directive["use strict"] && funct["(global)"]) {\n
-\t\t\twarning("Strict violation.", x);\n
+\t\tif (state.directive["use strict"] && funct["(global)"]) {\n
+\t\t\twarning("E008", x);\n
 \t\t}\n
 \t});\n
 \treservevar("eval");\n
@@ -4813,28 +5686,49 @@ klass:\n
 \treservevar("Infinity");\n
 \treservevar("null");\n
 \treservevar("this", function (x) {\n
-\t\tif (directive["use strict"] && !option.validthis && ((funct["(statement)"] &&\n
+\t\tif (state.directive["use strict"] && !state.option.validthis && ((funct["(statement)"] &&\n
 \t\t\t\tfunct["(name)"].charAt(0) > "Z") || funct["(global)"])) {\n
-\t\t\twarning("Possible strict violation.", x);\n
+\t\t\twarning("W040", x);\n
 \t\t}\n
 \t});\n
 \treservevar("true");\n
 \treservevar("undefined");\n
+\n
 \tassignop("=", "assign", 20);\n
 \tassignop("+=", "assignadd", 20);\n
 \tassignop("-=", "assignsub", 20);\n
 \tassignop("*=", "assignmult", 20);\n
 \tassignop("/=", "assigndiv", 20).nud = function () {\n
-\t\terror("A regular expression literal can be confused with \'/=\'.");\n
+\t\terror("E014");\n
 \t};\n
 \tassignop("%=", "assignmod", 20);\n
+\n
 \tbitwiseassignop("&=", "assignbitand", 20);\n
 \tbitwiseassignop("|=", "assignbitor", 20);\n
 \tbitwiseassignop("^=", "assignbitxor", 20);\n
 \tbitwiseassignop("<<=", "assignshiftleft", 20);\n
 \tbitwiseassignop(">>=", "assignshiftright", 20);\n
 \tbitwiseassignop(">>>=", "assignshiftrightunsigned", 20);\n
+\tinfix(",", function (left, that) {\n
+\t\tvar expr;\n
+\t\tthat.exprs = [left];\n
+\t\tif (!comma({peek: true})) {\n
+\t\t\treturn that;\n
+\t\t}\n
+\t\twhile (true) {\n
+\t\t\tif (!(expr = expression(10)))  {\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\t\t\tthat.exprs.push(expr);\n
+\t\t\tif (state.tokens.next.value !== "," || !comma()) {\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\t\t}\n
+\t\treturn that;\n
+\t}, 10, true);\n
+\n
 \tinfix("?", function (left, that) {\n
+\t\tincreaseComplexityCount();\n
 \t\tthat.left = left;\n
 \t\tthat.right = expression(10);\n
 \t\tadvance(":");\n
@@ -4842,37 +5736,40 @@ klass:\n
 \t\treturn that;\n
 \t}, 30);\n
 \n
-\tinfix("||", "or", 40);\n
+\tvar orPrecendence = 40;\n
+\tinfix("||", function (left, that) {\n
+\t\tincreaseComplexityCount();\n
+\t\tthat.left = left;\n
+\t\tthat.right = expression(orPrecendence);\n
+\t\treturn that;\n
+\t}, orPrecendence);\n
 \tinfix("&&", "and", 50);\n
 \tbitwise("|", "bitor", 70);\n
 \tbitwise("^", "bitxor", 80);\n
 \tbitwise("&", "bitand", 90);\n
 \trelation("==", function (left, right) {\n
-\t\tvar eqnull = option.eqnull && (left.value === "null" || right.value === "null");\n
+\t\tvar eqnull = state.option.eqnull && (left.value === "null" || right.value === "null");\n
 \n
-\t\tif (!eqnull && option.eqeqeq)\n
-\t\t\twarning("Expected \'{a}\' and instead saw \'{b}\'.", this, "===", "==");\n
+\t\tif (!eqnull && state.option.eqeqeq)\n
+\t\t\twarning("W116", this, "===", "==");\n
 \t\telse if (isPoorRelation(left))\n
-\t\t\twarning("Use \'{a}\' to compare with \'{b}\'.", this, "===", left.value);\n
+\t\t\twarning("W041", this, "===", left.value);\n
 \t\telse if (isPoorRelation(right))\n
-\t\t\twarning("Use \'{a}\' to compare with \'{b}\'.", this, "===", right.value);\n
+\t\t\twarning("W041", this, "===", right.value);\n
 \n
 \t\treturn this;\n
 \t});\n
 \trelation("===");\n
 \trelation("!=", function (left, right) {\n
-\t\tvar eqnull = option.eqnull &&\n
+\t\tvar eqnull = state.option.eqnull &&\n
 \t\t\t\t(left.value === "null" || right.value === "null");\n
 \n
-\t\tif (!eqnull && option.eqeqeq) {\n
-\t\t\twarning("Expected \'{a}\' and instead saw \'{b}\'.",\n
-\t\t\t\t\tthis, "!==", "!=");\n
+\t\tif (!eqnull && state.option.eqeqeq) {\n
+\t\t\twarning("W116", this, "!==", "!=");\n
 \t\t} else if (isPoorRelation(left)) {\n
-\t\t\twarning("Use \'{a}\' to compare with \'{b}\'.",\n
-\t\t\t\t\tthis, "!==", left.value);\n
+\t\t\twarning("W041", this, "!==", left.value);\n
 \t\t} else if (isPoorRelation(right)) {\n
-\t\t\twarning("Use \'{a}\' to compare with \'{b}\'.",\n
-\t\t\t\t\tthis, "!==", right.value);\n
+\t\t\twarning("W041", this, "!==", right.value);\n
 \t\t}\n
 \t\treturn this;\n
 \t});\n
@@ -4891,8 +5788,8 @@ klass:\n
 \t\tif (left && right && left.id === "(string)" && right.id === "(string)") {\n
 \t\t\tleft.value += right.value;\n
 \t\t\tleft.character = right.character;\n
-\t\t\tif (!option.scripturl && jx.test(left.value)) {\n
-\t\t\t\twarning("JavaScript URL.", left);\n
+\t\t\tif (!state.option.scripturl && reg.javascriptURL.test(left.value)) {\n
+\t\t\t\twarning("W050", left);\n
 \t\t\t}\n
 \t\t\treturn left;\n
 \t\t}\n
@@ -4902,13 +5799,13 @@ klass:\n
 \t}, 130);\n
 \tprefix("+", "num");\n
 \tprefix("+++", function () {\n
-\t\twarning("Confusing pluses.");\n
+\t\twarning("W007");\n
 \t\tthis.right = expression(150);\n
 \t\tthis.arity = "unary";\n
 \t\treturn this;\n
 \t});\n
 \tinfix("+++", function (left) {\n
-\t\twarning("Confusing pluses.");\n
+\t\twarning("W007");\n
 \t\tthis.left = left;\n
 \t\tthis.right = expression(130);\n
 \t\treturn this;\n
@@ -4916,13 +5813,13 @@ klass:\n
 \tinfix("-", "sub", 130);\n
 \tprefix("-", "neg");\n
 \tprefix("---", function () {\n
-\t\twarning("Confusing minuses.");\n
+\t\twarning("W006");\n
 \t\tthis.right = expression(150);\n
 \t\tthis.arity = "unary";\n
 \t\treturn this;\n
 \t});\n
 \tinfix("---", function (left) {\n
-\t\twarning("Confusing minuses.");\n
+\t\twarning("W006");\n
 \t\tthis.left = left;\n
 \t\tthis.right = expression(130);\n
 \t\treturn this;\n
@@ -4933,23 +5830,34 @@ klass:\n
 \n
 \tsuffix("++", "postinc");\n
 \tprefix("++", "preinc");\n
-\tsyntax["++"].exps = true;\n
+\tstate.syntax["++"].exps = true;\n
 \n
 \tsuffix("--", "postdec");\n
 \tprefix("--", "predec");\n
-\tsyntax["--"].exps = true;\n
+\tstate.syntax["--"].exps = true;\n
 \tprefix("delete", function () {\n
-\t\tvar p = expression(0);\n
+\t\tvar p = expression(10);\n
 \t\tif (!p || (p.id !== "." && p.id !== "[")) {\n
-\t\t\twarning("Variables should not be deleted.");\n
+\t\t\twarning("W051");\n
 \t\t}\n
 \t\tthis.first = p;\n
 \t\treturn this;\n
 \t}).exps = true;\n
 \n
 \tprefix("~", function () {\n
-\t\tif (option.bitwise) {\n
-\t\t\twarning("Unexpected \'{a}\'.", this, "~");\n
+\t\tif (state.option.bitwise) {\n
+\t\t\twarning("W052", this, "~");\n
+\t\t}\n
+\t\texpression(150);\n
+\t\treturn this;\n
+\t});\n
+\n
+\tprefix("...", function () {\n
+\t\tif (!state.option.inESNext()) {\n
+\t\t\twarning("W104", this, "spread/rest operator");\n
+\t\t}\n
+\t\tif (!state.tokens.next.identifier) {\n
+\t\t\terror("E030", state.tokens.next, state.tokens.next.value);\n
 \t\t}\n
 \t\texpression(150);\n
 \t\treturn this;\n
@@ -4958,11 +5866,17 @@ klass:\n
 \tprefix("!", function () {\n
 \t\tthis.right = expression(150);\n
 \t\tthis.arity = "unary";\n
+\n
+\t\tif (!this.right) { // \'!\' followed by nothing? Give up.\n
+\t\t\tquit("E041", this.line || 0);\n
+\t\t}\n
+\n
 \t\tif (bang[this.right.id] === true) {\n
-\t\t\twarning("Confusing use of \'{a}\'.", this, "!");\n
+\t\t\twarning("W018", this, "!");\n
 \t\t}\n
 \t\treturn this;\n
 \t});\n
+\n
 \tprefix("typeof", "typeof");\n
 \tprefix("new", function () {\n
 \t\tvar c = expression(155), i;\n
@@ -4975,11 +5889,11 @@ klass:\n
 \t\t\t\tcase "Boolean":\n
 \t\t\t\tcase "Math":\n
 \t\t\t\tcase "JSON":\n
-\t\t\t\t\twarning("Do not use {a} as a constructor.", prevtoken, c.value);\n
+\t\t\t\t\twarning("W053", state.tokens.prev, c.value);\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tcase "Function":\n
-\t\t\t\t\tif (!option.evil) {\n
-\t\t\t\t\t\twarning("The Function constructor is eval.");\n
+\t\t\t\t\tif (!state.option.evil) {\n
+\t\t\t\t\t\twarning("W054");\n
 \t\t\t\t\t}\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tcase "Date":\n
@@ -4988,102 +5902,113 @@ klass:\n
 \t\t\t\tdefault:\n
 \t\t\t\t\tif (c.id !== "function") {\n
 \t\t\t\t\t\ti = c.value.substr(0, 1);\n
-\t\t\t\t\t\tif (option.newcap && (i < "A" || i > "Z") && !is_own(global, c.value)) {\n
-\t\t\t\t\t\t\twarning("A constructor name should start with an uppercase letter.",\n
-\t\t\t\t\t\t\t\ttoken);\n
+\t\t\t\t\t\tif (state.option.newcap && (i < "A" || i > "Z") && !_.has(global, c.value)) {\n
+\t\t\t\t\t\t\twarning("W055", state.tokens.curr);\n
 \t\t\t\t\t\t}\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
 \t\t\t} else {\n
 \t\t\t\tif (c.id !== "." && c.id !== "[" && c.id !== "(") {\n
-\t\t\t\t\twarning("Bad constructor.", token);\n
+\t\t\t\t\twarning("W056", state.tokens.curr);\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t} else {\n
-\t\t\tif (!option.supernew)\n
-\t\t\t\twarning("Weird construction. Delete \'new\'.", this);\n
+\t\t\tif (!state.option.supernew)\n
+\t\t\t\twarning("W057", this);\n
 \t\t}\n
-\t\tadjacent(token, nexttoken);\n
-\t\tif (nexttoken.id !== "(" && !option.supernew) {\n
-\t\t\twarning("Missing \'()\' invoking a constructor.",\n
-\t\t\t\ttoken, token.value);\n
+\t\tadjacent(state.tokens.curr, state.tokens.next);\n
+\t\tif (state.tokens.next.id !== "(" && !state.option.supernew) {\n
+\t\t\twarning("W058", state.tokens.curr, state.tokens.curr.value);\n
 \t\t}\n
 \t\tthis.first = c;\n
 \t\treturn this;\n
 \t});\n
-\tsyntax["new"].exps = true;\n
+\tstate.syntax["new"].exps = true;\n
 \n
 \tprefix("void").exps = true;\n
 \n
 \tinfix(".", function (left, that) {\n
-\t\tadjacent(prevtoken, token);\n
+\t\tadjacent(state.tokens.prev, state.tokens.curr);\n
 \t\tnobreak();\n
-\t\tvar m = identifier();\n
+\t\tvar m = identifier(false, true);\n
+\n
 \t\tif (typeof m === "string") {\n
 \t\t\tcountMember(m);\n
 \t\t}\n
+\n
 \t\tthat.left = left;\n
 \t\tthat.right = m;\n
+\n
+\t\tif (m && m === "hasOwnProperty" && state.tokens.next.value === "=") {\n
+\t\t\twarning("W001");\n
+\t\t}\n
+\n
 \t\tif (left && left.value === "arguments" && (m === "callee" || m === "caller")) {\n
-\t\t\tif (option.noarg)\n
-\t\t\t\twarning("Avoid arguments.{a}.", left, m);\n
-\t\t\telse if (directive["use strict"])\n
-\t\t\t\terror("Strict violation.");\n
-\t\t} else if (!option.evil && left && left.value === "document" &&\n
+\t\t\tif (state.option.noarg)\n
+\t\t\t\twarning("W059", left, m);\n
+\t\t\telse if (state.directive["use strict"])\n
+\t\t\t\terror("E008");\n
+\t\t} else if (!state.option.evil && left && left.value === "document" &&\n
 \t\t\t\t(m === "write" || m === "writeln")) {\n
-\t\t\twarning("document.write can be a form of eval.", left);\n
+\t\t\twarning("W060", left);\n
 \t\t}\n
-\t\tif (!option.evil && (m === "eval" || m === "execScript")) {\n
-\t\t\twarning("eval is evil.");\n
+\n
+\t\tif (!state.option.evil && (m === "eval" || m === "execScript")) {\n
+\t\t\twarning("W061");\n
 \t\t}\n
+\n
 \t\treturn that;\n
 \t}, 160, true);\n
 \n
 \tinfix("(", function (left, that) {\n
-\t\tif (prevtoken.id !== "}" && prevtoken.id !== ")") {\n
-\t\t\tnobreak(prevtoken, token);\n
+\t\tif (state.tokens.prev.id !== "}" && state.tokens.prev.id !== ")") {\n
+\t\t\tnobreak(state.tokens.prev, state.tokens.curr);\n
 \t\t}\n
+\n
 \t\tnospace();\n
-\t\tif (option.immed && !left.immed && left.id === "function") {\n
-\t\t\twarning("Wrap an immediate function invocation in parentheses " +\n
-\t\t\t\t"to assist the reader in understanding that the expression " +\n
-\t\t\t\t"is the result of a function, and not the function itself.");\n
+\t\tif (state.option.immed && left && !left.immed && left.id === "function") {\n
+\t\t\twarning("W062");\n
 \t\t}\n
-\t\tvar n = 0,\n
-\t\t\tp = [];\n
+\n
+\t\tvar n = 0;\n
+\t\tvar p = [];\n
+\n
 \t\tif (left) {\n
 \t\t\tif (left.type === "(identifier)") {\n
 \t\t\t\tif (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) {\n
 \t\t\t\t\tif ("Number String Boolean Date Object".indexOf(left.value) === -1) {\n
 \t\t\t\t\t\tif (left.value === "Math") {\n
-\t\t\t\t\t\t\twarning("Math is not a function.", left);\n
-\t\t\t\t\t\t} else if (option.newcap) {\n
-\t\t\t\t\t\t\twarning("Missing \'new\' prefix when invoking a constructor.", left);\n
+\t\t\t\t\t\t\twarning("W063", left);\n
+\t\t\t\t\t\t} else if (state.option.newcap) {\n
+\t\t\t\t\t\t\twarning("W064", left);\n
 \t\t\t\t\t\t}\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t}\n
-\t\tif (nexttoken.id !== ")") {\n
+\n
+\t\tif (state.tokens.next.id !== ")") {\n
 \t\t\tfor (;;) {\n
 \t\t\t\tp[p.length] = expression(10);\n
 \t\t\t\tn += 1;\n
-\t\t\t\tif (nexttoken.id !== ",") {\n
+\t\t\t\tif (state.tokens.next.id !== ",") {\n
 \t\t\t\t\tbreak;\n
 \t\t\t\t}\n
 \t\t\t\tcomma();\n
 \t\t\t}\n
 \t\t}\n
+\n
 \t\tadvance(")");\n
-\t\tnospace(prevtoken, token);\n
+\t\tnospace(state.tokens.prev, state.tokens.curr);\n
+\n
 \t\tif (typeof left === "object") {\n
 \t\t\tif (left.value === "parseInt" && n === 1) {\n
-\t\t\t\twarning("Missing radix parameter.", token);\n
+\t\t\t\twarning("W065", state.tokens.curr);\n
 \t\t\t}\n
-\t\t\tif (!option.evil) {\n
+\t\t\tif (!state.option.evil) {\n
 \t\t\t\tif (left.value === "eval" || left.value === "Function" ||\n
 \t\t\t\t\t\tleft.value === "execScript") {\n
-\t\t\t\t\twarning("eval is evil.", left);\n
+\t\t\t\t\twarning("W061", left);\n
 \n
 \t\t\t\t\tif (p[0] && [0].id === "(string)") {\n
 \t\t\t\t\t\taddInternalSrc(left, p[0].value);\n
@@ -5091,99 +6016,188 @@ klass:\n
 \t\t\t\t} else if (p[0] && p[0].id === "(string)" &&\n
 \t\t\t\t\t   (left.value === "setTimeout" ||\n
 \t\t\t\t\t\tleft.value === "setInterval")) {\n
-\t\t\t\t\twarning(\n
-\t"Implied eval is evil. Pass a function instead of a string.", left);\n
+\t\t\t\t\twarning("W066", left);\n
 \t\t\t\t\taddInternalSrc(left, p[0].value);\n
 \t\t\t\t} else if (p[0] && p[0].id === "(string)" &&\n
 \t\t\t\t\t   left.value === "." &&\n
 \t\t\t\t\t   left.left.value === "window" &&\n
 \t\t\t\t\t   (left.right === "setTimeout" ||\n
 \t\t\t\t\t\tleft.right === "setInterval")) {\n
-\t\t\t\t\twarning(\n
-\t"Implied eval is evil. Pass a function instead of a string.", left);\n
+\t\t\t\t\twarning("W066", left);\n
 \t\t\t\t\taddInternalSrc(left, p[0].value);\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t\tif (!left.identifier && left.id !== "." && left.id !== "[" &&\n
 \t\t\t\t\tleft.id !== "(" && left.id !== "&&" && left.id !== "||" &&\n
 \t\t\t\t\tleft.id !== "?") {\n
-\t\t\t\twarning("Bad invocation.", left);\n
+\t\t\t\twarning("W067", left);\n
 \t\t\t}\n
 \t\t}\n
+\n
 \t\tthat.left = left;\n
 \t\treturn that;\n
 \t}, 155, true).exps = true;\n
 \n
 \tprefix("(", function () {\n
 \t\tnospace();\n
-\t\tif (nexttoken.id === "function") {\n
-\t\t\tnexttoken.immed = true;\n
+\t\tvar bracket, brackets = [];\n
+\t\tvar pn, pn1, i = 0;\n
+\t\tvar ret;\n
+\n
+\t\tdo {\n
+\t\t\tpn = peek(i);\n
+\t\t\ti += 1;\n
+\t\t\tpn1 = peek(i);\n
+\t\t\ti += 1;\n
+\t\t} while (pn.value !== ")" && pn1.value !== "=>" && pn1.value !== ";" && pn1.type !== "(end)");\n
+\n
+\t\tif (state.tokens.next.id === "function") {\n
+\t\t\tstate.tokens.next.immed = true;\n
+\t\t}\n
+\n
+\t\tvar exprs = [];\n
+\n
+\t\tif (state.tokens.next.id !== ")") {\n
+\t\t\tfor (;;) {\n
+\t\t\t\tif (pn1.value === "=>" && state.tokens.next.value === "{") {\n
+\t\t\t\t\tbracket = state.tokens.next;\n
+\t\t\t\t\tbracket.left = destructuringExpression();\n
+\t\t\t\t\tbrackets.push(bracket);\n
+\t\t\t\t\tfor (var t in bracket.left) {\n
+\t\t\t\t\t\texprs.push(bracket.left[t].token);\n
+\t\t\t\t\t}\n
+\t\t\t\t} else {\n
+\t\t\t\t\texprs.push(expression(10));\n
+\t\t\t\t}\n
+\t\t\t\tif (state.tokens.next.id !== ",") {\n
+\t\t\t\t\tbreak;\n
+\t\t\t\t}\n
+\t\t\t\tcomma();\n
+\t\t\t}\n
 \t\t}\n
-\t\tvar v = expression(0);\n
+\n
 \t\tadvance(")", this);\n
-\t\tnospace(prevtoken, token);\n
-\t\tif (option.immed && v.id === "function") {\n
-\t\t\tif (nexttoken.id !== "(" &&\n
-\t\t\t  (nexttoken.id !== "." || (peek().value !== "call" && peek().value !== "apply"))) {\n
-\t\t\t\twarning(\n
-"Do not wrap function literals in parens unless they are to be immediately invoked.",\n
-\t\t\t\t\t\tthis);\n
+\t\tnospace(state.tokens.prev, state.tokens.curr);\n
+\t\tif (state.option.immed && exprs[0] && exprs[0].id === "function") {\n
+\t\t\tif (state.tokens.next.id !== "(" &&\n
+\t\t\t  (state.tokens.next.id !== "." || (peek().value !== "call" && peek().value !== "apply"))) {\n
+\t\t\t\twarning("W068", this);\n
 \t\t\t}\n
 \t\t}\n
 \n
-\t\treturn v;\n
+\t\tif (state.tokens.next.value === "=>") {\n
+\t\t\treturn exprs;\n
+\t\t}\n
+\t\tif (!exprs.length) {\n
+\t\t\treturn;\n
+\t\t}\n
+\t\tif (exprs.length > 1) {\n
+\t\t\tret = Object.create(state.syntax[","]);\n
+\t\t\tret.exprs = exprs;\n
+\t\t} else {\n
+\t\t\tret = exprs[0];\n
+\t\t}\n
+\t\tif (ret) {\n
+\t\t\tret.paren = true;\n
+\t\t}\n
+\t\treturn ret;\n
 \t});\n
 \n
+\tapplication("=>");\n
+\n
 \tinfix("[", function (left, that) {\n
-\t\tnobreak(prevtoken, token);\n
+\t\tnobreak(state.tokens.prev, state.tokens.curr);\n
 \t\tnospace();\n
-\t\tvar e = expression(0), s;\n
+\t\tvar e = expression(10), s;\n
 \t\tif (e && e.type === "(string)") {\n
-\t\t\tif (!option.evil && (e.value === "eval" || e.value === "execScript")) {\n
-\t\t\t\twarning("eval is evil.", that);\n
+\t\t\tif (!state.option.evil && (e.value === "eval" || e.value === "execScript")) {\n
+\t\t\t\twarning("W061", that);\n
 \t\t\t}\n
+\n
 \t\t\tcountMember(e.value);\n
-\t\t\tif (!option.sub && ix.test(e.value)) {\n
-\t\t\t\ts = syntax[e.value];\n
-\t\t\t\tif (!s || !s.reserved) {\n
-\t\t\t\t\twarning("[\'{a}\'] is better written in dot notation.",\n
-\t\t\t\t\t\t\tprevtoken, e.value);\n
+\t\t\tif (!state.option.sub && reg.identifier.test(e.value)) {\n
+\t\t\t\ts = state.syntax[e.value];\n
+\t\t\t\tif (!s || !isReserved(s)) {\n
+\t\t\t\t\twarning("W069", state.tokens.prev, e.value);\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t}\n
 \t\tadvance("]", that);\n
-\t\tnospace(prevtoken, token);\n
+\n
+\t\tif (e && e.value === "hasOwnProperty" && state.tokens.next.value === "=") {\n
+\t\t\twarning("W001");\n
+\t\t}\n
+\n
+\t\tnospace(state.tokens.prev, state.tokens.curr);\n
 \t\tthat.left = left;\n
 \t\tthat.right = e;\n
 \t\treturn that;\n
 \t}, 160, true);\n
 \n
+\tfunction comprehensiveArrayExpression() {\n
+\t\tvar res = {};\n
+\t\tres.exps = true;\n
+\t\tfunct["(comparray)"].stack();\n
+\n
+\t\tres.right = expression(10);\n
+\t\tadvance("for");\n
+\t\tif (state.tokens.next.value === "each") {\n
+\t\t\tadvance("each");\n
+\t\t\tif (!state.option.inMoz(true)) {\n
+\t\t\t\twarning("W118", state.tokens.curr, "for each");\n
+\t\t\t}\n
+\t\t}\n
+\t\tadvance("(");\n
+\t\tfunct["(comparray)"].setState("define");\n
+\t\tres.left = expression(10);\n
+\t\tadvance(")");\n
+\t\tif (state.tokens.next.value === "if") {\n
+\t\t\tadvance("if");\n
+\t\t\tadvance("(");\n
+\t\t\tfunct["(comparray)"].setState("filter");\n
+\t\t\tres.filter = expression(10);\n
+\t\t\tadvance(")");\n
+\t\t}\n
+\t\tadvance("]");\n
+\t\tfunct["(comparray)"].unstack();\n
+\t\treturn res;\n
+\t}\n
+\n
 \tprefix("[", function () {\n
-\t\tvar b = token.line !== nexttoken.line;\n
+\t\tvar blocktype = lookupBlockType(true);\n
+\t\tif (blocktype.isCompArray) {\n
+\t\t\tif (!state.option.inMoz(true)) {\n
+\t\t\t\twarning("W118", state.tokens.curr, "array comprehension");\n
+\t\t\t}\n
+\t\t\treturn comprehensiveArrayExpression();\n
+\t\t} else if (blocktype.isDestAssign && !state.option.inESNext()) {\n
+\t\t\twarning("W104", state.tokens.curr, "destructuring assignment");\n
+\t\t}\n
+\t\tvar b = state.tokens.curr.line !== state.tokens.next.line;\n
 \t\tthis.first = [];\n
 \t\tif (b) {\n
-\t\t\tindent += option.indent;\n
-\t\t\tif (nexttoken.from === indent + option.indent) {\n
-\t\t\t\tindent += option.indent;\n
+\t\t\tindent += state.option.indent;\n
+\t\t\tif (state.tokens.next.from === indent + state.option.indent) {\n
+\t\t\t\tindent += state.option.indent;\n
 \t\t\t}\n
 \t\t}\n
-\t\twhile (nexttoken.id !== "(end)") {\n
-\t\t\twhile (nexttoken.id === ",") {\n
-\t\t\t\tif (!option.es5)\n
-\t\t\t\t\twarning("Extra comma.");\n
+\t\twhile (state.tokens.next.id !== "(end)") {\n
+\t\t\twhile (state.tokens.next.id === ",") {\n
+\t\t\t\tif (!state.option.inES5())\n
+\t\t\t\t\twarning("W070");\n
 \t\t\t\tadvance(",");\n
 \t\t\t}\n
-\t\t\tif (nexttoken.id === "]") {\n
+\t\t\tif (state.tokens.next.id === "]") {\n
 \t\t\t\tbreak;\n
 \t\t\t}\n
-\t\t\tif (b && token.line !== nexttoken.line) {\n
+\t\t\tif (b && state.tokens.curr.line !== state.tokens.next.line) {\n
 \t\t\t\tindentation();\n
 \t\t\t}\n
 \t\t\tthis.first.push(expression(10));\n
-\t\t\tif (nexttoken.id === ",") {\n
-\t\t\t\tcomma();\n
-\t\t\t\tif (nexttoken.id === "]" && !option.es5) {\n
-\t\t\t\t\twarning("Extra comma.", token);\n
+\t\t\tif (state.tokens.next.id === ",") {\n
+\t\t\t\tcomma({ allowTrailing: true });\n
+\t\t\t\tif (state.tokens.next.id === "]" && !state.option.inES5(true)) {\n
+\t\t\t\t\twarning("W070", state.tokens.curr);\n
 \t\t\t\t\tbreak;\n
 \t\t\t\t}\n
 \t\t\t} else {\n
@@ -5191,7 +6205,7 @@ klass:\n
 \t\t\t}\n
 \t\t}\n
 \t\tif (b) {\n
-\t\t\tindent -= option.indent;\n
+\t\t\tindent -= state.option.indent;\n
 \t\t\tindentation();\n
 \t\t}\n
 \t\tadvance("]", this);\n
@@ -5200,71 +6214,153 @@ klass:\n
 \n
 \n
 \tfunction property_name() {\n
-\t\tvar id = optionalidentifier(true);\n
+\t\tvar id = optionalidentifier(false, true);\n
+\n
 \t\tif (!id) {\n
-\t\t\tif (nexttoken.id === "(string)") {\n
-\t\t\t\tid = nexttoken.value;\n
+\t\t\tif (state.tokens.next.id === "(string)") {\n
+\t\t\t\tid = state.tokens.next.value;\n
 \t\t\t\tadvance();\n
-\t\t\t} else if (nexttoken.id === "(number)") {\n
-\t\t\t\tid = nexttoken.value.toString();\n
+\t\t\t} else if (state.tokens.next.id === "(number)") {\n
+\t\t\t\tid = state.tokens.next.value.toString();\n
 \t\t\t\tadvance();\n
 \t\t\t}\n
 \t\t}\n
+\n
+\t\tif (id === "hasOwnProperty") {\n
+\t\t\twarning("W001");\n
+\t\t}\n
+\n
 \t\treturn id;\n
 \t}\n
 \n
 \n
-\tfunction functionparams() {\n
-\t\tvar next   = nexttoken;\n
+\tfunction functionparams(parsed) {\n
+\t\tvar curr, next;\n
 \t\tvar params = [];\n
 \t\tvar ident;\n
+\t\tvar tokens = [];\n
+\t\tvar t;\n
+\t\tvar pastDefault = false;\n
+\n
+\t\tif (parsed) {\n
+\t\t\tif (parsed instanceof Array) {\n
+\t\t\t\tfor (var i in parsed) {\n
+\t\t\t\t\tcurr = parsed[i];\n
+\t\t\t\t\tif (_.contains(["{", "["], curr.id)) {\n
+\t\t\t\t\t\tfor (t in curr.left) {\n
+\t\t\t\t\t\t\tt = tokens[t];\n
+\t\t\t\t\t\t\tif (t.id) {\n
+\t\t\t\t\t\t\t\tparams.push(t.id);\n
+\t\t\t\t\t\t\t\taddlabel(t.id, "unused", t.token);\n
+\t\t\t\t\t\t\t}\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t} else if (curr.value === "...") {\n
+\t\t\t\t\t\tif (!state.option.inESNext()) {\n
+\t\t\t\t\t\t\twarning("W104", curr, "spread/rest operator");\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t\tcontinue;\n
+\t\t\t\t\t} else {\n
+\t\t\t\t\t\taddlabel(curr.value, "unused", curr);\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\t\t\t\treturn params;\n
+\t\t\t} else {\n
+\t\t\t\tif (parsed.identifier === true) {\n
+\t\t\t\t\taddlabel(parsed.value, "unused", parsed);\n
+\t\t\t\t\treturn [parsed];\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tnext = state.tokens.next;\n
 \n
 \t\tadvance("(");\n
 \t\tnospace();\n
 \n
-\t\tif (nexttoken.id === ")") {\n
+\t\tif (state.tokens.next.id === ")") {\n
 \t\t\tadvance(")");\n
 \t\t\treturn;\n
 \t\t}\n
 \n
 \t\tfor (;;) {\n
-\t\t\tident = identifier(true);\n
-\t\t\tparams.push(ident);\n
-\t\t\taddlabel(ident, "unused", token);\n
-\t\t\tif (nexttoken.id === ",") {\n
+\t\t\tif (_.contains(["{", "["], state.tokens.next.id)) {\n
+\t\t\t\ttokens = destructuringExpression();\n
+\t\t\t\tfor (t in tokens) {\n
+\t\t\t\t\tt = tokens[t];\n
+\t\t\t\t\tif (t.id) {\n
+\t\t\t\t\t\tparams.push(t.id);\n
+\t\t\t\t\t\taddlabel(t.id, "unused", t.token);\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\t\t\t} else if (state.tokens.next.value === "...") {\n
+\t\t\t\tif (!state.option.inESNext()) {\n
+\t\t\t\t\twarning("W104", state.tokens.next, "spread/rest operator");\n
+\t\t\t\t}\n
+\t\t\t\tadvance("...");\n
+\t\t\t\tnospace();\n
+\t\t\t\tident = identifier(true);\n
+\t\t\t\tparams.push(ident);\n
+\t\t\t\taddlabel(ident, "unused", state.tokens.curr);\n
+\t\t\t} else {\n
+\t\t\t\tident = identifier(true);\n
+\t\t\t\tparams.push(ident);\n
+\t\t\t\taddlabel(ident, "unused", state.tokens.curr);\n
+\t\t\t}\n
+\t\t\tif (pastDefault) {\n
+\t\t\t\tif (state.tokens.next.id !== "=") {\n
+\t\t\t\t\terror("E051", state.tokens.current);\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t\tif (state.tokens.next.id === "=") {\n
+\t\t\t\tif (!state.option.inESNext()) {\n
+\t\t\t\t\twarning("W119", state.tokens.next, "default parameters");\n
+\t\t\t\t}\n
+\t\t\t\tadvance("=");\n
+\t\t\t\tpastDefault = true;\n
+\t\t\t\texpression(10);\n
+\t\t\t}\n
+\t\t\tif (state.tokens.next.id === ",") {\n
 \t\t\t\tcomma();\n
 \t\t\t} else {\n
 \t\t\t\tadvance(")", next);\n
-\t\t\t\tnospace(prevtoken, token);\n
+\t\t\t\tnospace(state.tokens.prev, state.tokens.curr);\n
 \t\t\t\treturn params;\n
 \t\t\t}\n
 \t\t}\n
 \t}\n
 \n
 \n
-\tfunction doFunction(name, statement) {\n
+\tfunction doFunction(name, statement, generator, fatarrowparams) {\n
 \t\tvar f;\n
-\t\tvar oldOption = option;\n
+\t\tvar oldOption = state.option;\n
+\t\tvar oldIgnored = state.ignored;\n
 \t\tvar oldScope  = scope;\n
 \n
-\t\toption = Object.create(option);\n
+\t\tstate.option = Object.create(state.option);\n
+\t\tstate.ignored = Object.create(state.ignored);\n
 \t\tscope  = Object.create(scope);\n
 \n
 \t\tfunct = {\n
-\t\t\t"(name)"\t : name || "\\"" + anonname + "\\"",\n
-\t\t\t"(line)"\t : nexttoken.line,\n
-\t\t\t"(character)": nexttoken.character,\n
-\t\t\t"(context)"  : funct,\n
-\t\t\t"(breakage)" : 0,\n
-\t\t\t"(loopage)"  : 0,\n
-\t\t\t"(metrics)"  : createMetrics(nexttoken),\n
-\t\t\t"(scope)"\t : scope,\n
-\t\t\t"(statement)": statement,\n
-\t\t\t"(tokens)"\t : {}\n
+\t\t\t"(name)"      : name || "\\"" + anonname + "\\"",\n
+\t\t\t"(line)"      : state.tokens.next.line,\n
+\t\t\t"(character)" : state.tokens.next.character,\n
+\t\t\t"(context)"   : funct,\n
+\t\t\t"(breakage)"  : 0,\n
+\t\t\t"(loopage)"   : 0,\n
+\t\t\t"(metrics)"   : createMetrics(state.tokens.next),\n
+\t\t\t"(scope)"     : scope,\n
+\t\t\t"(statement)" : statement,\n
+\t\t\t"(tokens)"    : {},\n
+\t\t\t"(blockscope)": funct["(blockscope)"],\n
+\t\t\t"(comparray)" : funct["(comparray)"]\n
 \t\t};\n
 \n
+\t\tif (generator) {\n
+\t\t\tfunct["(generator)"] = true;\n
+\t\t}\n
+\n
 \t\tf = funct;\n
-\t\ttoken.funct = funct;\n
+\t\tstate.tokens.curr.funct = funct;\n
 \n
 \t\tfunctions.push(funct);\n
 \n
@@ -5272,18 +6368,25 @@ klass:\n
 \t\t\taddlabel(name, "function");\n
 \t\t}\n
 \n
-\t\tfunct["(params)"] = functionparams();\n
+\t\tfunct["(params)"] = functionparams(fatarrowparams);\n
+\n
 \t\tfunct["(metrics)"].verifyMaxParametersPerFunction(funct["(params)"]);\n
 \n
-\t\tblock(false, false, true);\n
+\t\tblock(false, true, true, fatarrowparams ? true:false);\n
+\n
+\t\tif (generator && funct["(generator)"] !== "yielded") {\n
+\t\t\terror("E047", state.tokens.curr);\n
+\t\t}\n
 \n
 \t\tfunct["(metrics)"].verifyMaxStatementsPerFunction();\n
 \t\tfunct["(metrics)"].verifyMaxComplexityPerFunction();\n
+\t\tfunct["(unusedOption)"] = state.option.unused;\n
 \n
 \t\tscope = oldScope;\n
-\t\toption = oldOption;\n
-\t\tfunct["(last)"] = token.line;\n
-\t\tfunct["(lastcharacter)"] = token.character;\n
+\t\tstate.option = oldOption;\n
+\t\tstate.ignored = oldIgnored;\n
+\t\tfunct["(last)"] = state.tokens.curr.line;\n
+\t\tfunct["(lastcharacter)"] = state.tokens.curr.character;\n
 \t\tfunct = funct["(context)"];\n
 \n
 \t\treturn f;\n
@@ -5295,37 +6398,33 @@ klass:\n
 \t\t\tnestedBlockDepth: -1,\n
 \t\t\tComplexityCount: 1,\n
 \t\t\tverifyMaxStatementsPerFunction: function () {\n
-\t\t\t\tif (option.maxstatements &&\n
-\t\t\t\t\tthis.statementCount > option.maxstatements) {\n
-\t\t\t\t\tvar message = "Too many statements per function (" + this.statementCount + ").";\n
-\t\t\t\t\twarning(message, functionStartToken);\n
+\t\t\t\tif (state.option.maxstatements &&\n
+\t\t\t\t\tthis.statementCount > state.option.maxstatements) {\n
+\t\t\t\t\twarning("W071", functionStartToken, this.statementCount);\n
 \t\t\t\t}\n
 \t\t\t},\n
 \n
 \t\t\tverifyMaxParametersPerFunction: function (params) {\n
 \t\t\t\tparams = params || [];\n
 \n
-\t\t\t\tif (option.maxparams && params.length > option.maxparams) {\n
-\t\t\t\t\tvar message = "Too many parameters per function (" + params.length + ").";\n
-\t\t\t\t\twarning(message, functionStartToken);\n
+\t\t\t\tif (state.option.maxparams && params.length > state.option.maxparams) {\n
+\t\t\t\t\twarning("W072", functionStartToken, params.length);\n
 \t\t\t\t}\n
 \t\t\t},\n
 \n
 \t\t\tverifyMaxNestedBlockDepthPerFunction: function () {\n
-\t\t\t\tif (option.maxdepth &&\n
+\t\t\t\tif (state.option.maxdepth &&\n
 \t\t\t\t\tthis.nestedBlockDepth > 0 &&\n
-\t\t\t\t\tthis.nestedBlockDepth === option.maxdepth + 1) {\n
-\t\t\t\t\tvar message = "Blocks are nested too deeply (" + this.nestedBlockDepth + ").";\n
-\t\t\t\t\twarning(message);\n
+\t\t\t\t\tthis.nestedBlockDepth === state.option.maxdepth + 1) {\n
+\t\t\t\t\twarning("W073", null, this.nestedBlockDepth);\n
 \t\t\t\t}\n
 \t\t\t},\n
 \n
 \t\t\tverifyMaxComplexityPerFunction: function () {\n
-\t\t\t\tvar max = option.maxcomplexity;\n
+\t\t\t\tvar max = state.option.maxcomplexity;\n
 \t\t\t\tvar cc = this.ComplexityCount;\n
 \t\t\t\tif (max && cc > max) {\n
-\t\t\t\t\tvar message = "Cyclomatic complexity is too high per function (" + cc + ").";\n
-\t\t\t\t\twarning(message, functionStartToken);\n
+\t\t\t\t\twarning("W074", functionStartToken, cc);\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t};\n
@@ -5335,300 +6434,597 @@ klass:\n
 \t\tfunct["(metrics)"].ComplexityCount += 1;\n
 \t}\n
 \n
+\tfunction checkCondAssignment(expr) {\n
+\t\tvar id, paren;\n
+\t\tif (expr) {\n
+\t\t\tid = expr.id;\n
+\t\t\tparen = expr.paren;\n
+\t\t\tif (id === "," && (expr = expr.exprs[expr.exprs.length - 1])) {\n
+\t\t\t\tid = expr.id;\n
+\t\t\t\tparen = paren || expr.paren;\n
+\t\t\t}\n
+\t\t}\n
+\t\tswitch (id) {\n
+\t\tcase "=":\n
+\t\tcase "+=":\n
+\t\tcase "-=":\n
+\t\tcase "*=":\n
+\t\tcase "%=":\n
+\t\tcase "&=":\n
+\t\tcase "|=":\n
+\t\tcase "^=":\n
+\t\tcase "/=":\n
+\t\t\tif (!paren && !state.option.boss) {\n
+\t\t\t\twarning("W084");\n
+\t\t\t}\n
+\t\t}\n
+\t}\n
+\n
 \n
 \t(function (x) {\n
-\t\tx.nud = function () {\n
-\t\t\tvar b, f, i, p, t;\n
+\t\tx.nud = function (isclassdef) {\n
+\t\t\tvar b, f, i, p, t, g;\n
 \t\t\tvar props = {}; // All properties, including accessors\n
+\t\t\tvar tag = "";\n
 \n
-\t\t\tfunction saveProperty(name, token) {\n
-\t\t\t\tif (props[name] && is_own(props, name))\n
-\t\t\t\t\twarning("Duplicate member \'{a}\'.", nexttoken, i);\n
+\t\t\tfunction saveProperty(name, tkn) {\n
+\t\t\t\tif (props[name] && _.has(props, name))\n
+\t\t\t\t\twarning("W075", state.tokens.next, i);\n
 \t\t\t\telse\n
 \t\t\t\t\tprops[name] = {};\n
 \n
 \t\t\t\tprops[name].basic = true;\n
-\t\t\t\tprops[name].basicToken = token;\n
+\t\t\t\tprops[name].basictkn = tkn;\n
 \t\t\t}\n
 \n
-\t\t\tfunction saveSetter(name, token) {\n
-\t\t\t\tif (props[name] && is_own(props, name)) {\n
+\t\t\tfunction saveSetter(name, tkn) {\n
+\t\t\t\tif (props[name] && _.has(props, name)) {\n
 \t\t\t\t\tif (props[name].basic || props[name].setter)\n
-\t\t\t\t\t\twarning("Duplicate member \'{a}\'.", nexttoken, i);\n
+\t\t\t\t\t\twarning("W075", state.tokens.next, i);\n
 \t\t\t\t} else {\n
 \t\t\t\t\tprops[name] = {};\n
 \t\t\t\t}\n
 \n
 \t\t\t\tprops[name].setter = true;\n
-\t\t\t\tprops[name].setterToken = token;\n
+\t\t\t\tprops[name].setterToken = tkn;\n
 \t\t\t}\n
 \n
 \t\t\tfunction saveGetter(name) {\n
-\t\t\t\tif (props[name] && is_own(props, name)) {\n
+\t\t\t\tif (props[name] && _.has(props, name)) {\n
 \t\t\t\t\tif (props[name].basic || props[name].getter)\n
-\t\t\t\t\t\twarning("Duplicate member \'{a}\'.", nexttoken, i);\n
+\t\t\t\t\t\twarning("W075", state.tokens.next, i);\n
 \t\t\t\t} else {\n
 \t\t\t\t\tprops[name] = {};\n
 \t\t\t\t}\n
 \n
 \t\t\t\tprops[name].getter = true;\n
-\t\t\t\tprops[name].getterToken = token;\n
+\t\t\t\tprops[name].getterToken = state.tokens.curr;\n
 \t\t\t}\n
 \n
-\t\t\tb = token.line !== nexttoken.line;\n
+\t\t\tb = state.tokens.curr.line !== state.tokens.next.line;\n
 \t\t\tif (b) {\n
-\t\t\t\tindent += option.indent;\n
-\t\t\t\tif (nexttoken.from === indent + option.indent) {\n
-\t\t\t\t\tindent += option.indent;\n
+\t\t\t\tindent += state.option.indent;\n
+\t\t\t\tif (state.tokens.next.from === indent + state.option.indent) {\n
+\t\t\t\t\tindent += state.option.indent;\n
 \t\t\t\t}\n
 \t\t\t}\n
+\n
 \t\t\tfor (;;) {\n
-\t\t\t\tif (nexttoken.id === "}") {\n
+\t\t\t\tif (state.tokens.next.id === "}") {\n
 \t\t\t\t\tbreak;\n
 \t\t\t\t}\n
+\n
 \t\t\t\tif (b) {\n
 \t\t\t\t\tindentation();\n
 \t\t\t\t}\n
-\t\t\t\tif (nexttoken.value === "get" && peek().id !== ":") {\n
+\n
+\t\t\t\tif (isclassdef && state.tokens.next.value === "static") {\n
+\t\t\t\t\tadvance("static");\n
+\t\t\t\t\ttag = "static ";\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (state.tokens.next.value === "get" && peek().id !== ":") {\n
 \t\t\t\t\tadvance("get");\n
-\t\t\t\t\tif (!option.es5) {\n
-\t\t\t\t\t\terror("get/set are ES5 features.");\n
+\n
+\t\t\t\t\tif (!state.option.inES5(!isclassdef)) {\n
+\t\t\t\t\t\terror("E034");\n
 \t\t\t\t\t}\n
+\n
 \t\t\t\t\ti = property_name();\n
 \t\t\t\t\tif (!i) {\n
-\t\t\t\t\t\terror("Missing property name.");\n
+\t\t\t\t\t\terror("E035");\n
 \t\t\t\t\t}\n
-\t\t\t\t\tsaveGetter(i);\n
-\t\t\t\t\tt = nexttoken;\n
-\t\t\t\t\tadjacent(token, nexttoken);\n
+\t\t\t\t\tif (isclassdef && i === "constructor") {\n
+\t\t\t\t\t\terror("E049", state.tokens.next, "class getter method", i);\n
+\t\t\t\t\t}\n
+\n
+\t\t\t\t\tsaveGetter(tag + i);\n
+\t\t\t\t\tt = state.tokens.next;\n
+\t\t\t\t\tadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\t\t\tf = doFunction();\n
 \t\t\t\t\tp = f["(params)"];\n
+\n
 \t\t\t\t\tif (p) {\n
-\t\t\t\t\t\twarning("Unexpected parameter \'{a}\' in get {b} function.", t, p[0], i);\n
+\t\t\t\t\t\twarning("W076", t, p[0], i);\n
 \t\t\t\t\t}\n
-\t\t\t\t\tadjacent(token, nexttoken);\n
-\t\t\t\t} else if (nexttoken.value === "set" && peek().id !== ":") {\n
+\n
+\t\t\t\t\tadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\t\t} else if (state.tokens.next.value === "set" && peek().id !== ":") {\n
 \t\t\t\t\tadvance("set");\n
-\t\t\t\t\tif (!option.es5) {\n
-\t\t\t\t\t\terror("get/set are ES5 features.");\n
+\n
+\t\t\t\t\tif (!state.option.inES5(!isclassdef)) {\n
+\t\t\t\t\t\terror("E034");\n
 \t\t\t\t\t}\n
+\n
 \t\t\t\t\ti = property_name();\n
 \t\t\t\t\tif (!i) {\n
-\t\t\t\t\t\terror("Missing property name.");\n
+\t\t\t\t\t\terror("E035");\n
 \t\t\t\t\t}\n
-\t\t\t\t\tsaveSetter(i, nexttoken);\n
-\t\t\t\t\tt = nexttoken;\n
-\t\t\t\t\tadjacent(token, nexttoken);\n
+\t\t\t\t\tif (isclassdef && i === "constructor") {\n
+\t\t\t\t\t\terror("E049", state.tokens.next, "class setter method", i);\n
+\t\t\t\t\t}\n
+\n
+\t\t\t\t\tsaveSetter(tag + i, state.tokens.next);\n
+\t\t\t\t\tt = state.tokens.next;\n
+\t\t\t\t\tadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\t\t\tf = doFunction();\n
 \t\t\t\t\tp = f["(params)"];\n
+\n
 \t\t\t\t\tif (!p || p.length !== 1) {\n
-\t\t\t\t\t\twarning("Expected a single parameter in set {a} function.", t, i);\n
+\t\t\t\t\t\twarning("W077", t, i);\n
 \t\t\t\t\t}\n
 \t\t\t\t} else {\n
+\t\t\t\t\tg = false;\n
+\t\t\t\t\tif (state.tokens.next.value === "*" && state.tokens.next.type === "(punctuator)") {\n
+\t\t\t\t\t\tif (!state.option.inESNext()) {\n
+\t\t\t\t\t\t\twarning("W104", state.tokens.next, "generator functions");\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t\tadvance("*");\n
+\t\t\t\t\t\tg = true;\n
+\t\t\t\t\t}\n
 \t\t\t\t\ti = property_name();\n
-\t\t\t\t\tsaveProperty(i, nexttoken);\n
+\t\t\t\t\tsaveProperty(tag + i, state.tokens.next);\n
+\n
 \t\t\t\t\tif (typeof i !== "string") {\n
 \t\t\t\t\t\tbreak;\n
 \t\t\t\t\t}\n
-\t\t\t\t\tadvance(":");\n
-\t\t\t\t\tnonadjacent(token, nexttoken);\n
-\t\t\t\t\texpression(10);\n
+\n
+\t\t\t\t\tif (state.tokens.next.value === "(") {\n
+\t\t\t\t\t\tif (!state.option.inESNext()) {\n
+\t\t\t\t\t\t\twarning("W104", state.tokens.curr, "concise methods");\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t\tdoFunction(i, undefined, g);\n
+\t\t\t\t\t} else if (!isclassdef) {\n
+\t\t\t\t\t\tadvance(":");\n
+\t\t\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\t\t\t\texpression(10);\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\t\t\t\tif (isclassdef && i === "prototype") {\n
+\t\t\t\t\terror("E049", state.tokens.next, "class method", i);\n
 \t\t\t\t}\n
 \n
 \t\t\t\tcountMember(i);\n
-\t\t\t\tif (nexttoken.id === ",") {\n
-\t\t\t\t\tcomma();\n
-\t\t\t\t\tif (nexttoken.id === ",") {\n
-\t\t\t\t\t\twarning("Extra comma.", token);\n
-\t\t\t\t\t} else if (nexttoken.id === "}" && !option.es5) {\n
-\t\t\t\t\t\twarning("Extra comma.", token);\n
+\t\t\t\tif (isclassdef) {\n
+\t\t\t\t\ttag = "";\n
+\t\t\t\t\tcontinue;\n
+\t\t\t\t}\n
+\t\t\t\tif (state.tokens.next.id === ",") {\n
+\t\t\t\t\tcomma({ allowTrailing: true, property: true });\n
+\t\t\t\t\tif (state.tokens.next.id === ",") {\n
+\t\t\t\t\t\twarning("W070", state.tokens.curr);\n
+\t\t\t\t\t} else if (state.tokens.next.id === "}" && !state.option.inES5(true)) {\n
+\t\t\t\t\t\twarning("W070", state.tokens.curr);\n
 \t\t\t\t\t}\n
 \t\t\t\t} else {\n
 \t\t\t\t\tbreak;\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t\tif (b) {\n
-\t\t\t\tindent -= option.indent;\n
+\t\t\t\tindent -= state.option.indent;\n
 \t\t\t\tindentation();\n
 \t\t\t}\n
 \t\t\tadvance("}", this);\n
-\t\t\tif (option.es5) {\n
+\t\t\tif (state.option.inES5()) {\n
 \t\t\t\tfor (var name in props) {\n
-\t\t\t\t\tif (is_own(props, name) && props[name].setter && !props[name].getter) {\n
-\t\t\t\t\t\twarning("Setter is defined without getter.", props[name].setterToken);\n
+\t\t\t\t\tif (_.has(props, name) && props[name].setter && !props[name].getter) {\n
+\t\t\t\t\t\twarning("W078", props[name].setterToken);\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t\treturn this;\n
 \t\t};\n
 \t\tx.fud = function () {\n
-\t\t\terror("Expected to see a statement and instead saw a block.", token);\n
+\t\t\terror("E036", state.tokens.curr);\n
 \t\t};\n
 \t}(delim("{")));\n
 \n
-\tuseESNextSyntax = function () {\n
-\t\tvar conststatement = stmt("const", function (prefix) {\n
-\t\t\tvar id, name, value;\n
-\n
-\t\t\tthis.first = [];\n
-\t\t\tfor (;;) {\n
-\t\t\t\tnonadjacent(token, nexttoken);\n
-\t\t\t\tid = identifier();\n
-\t\t\t\tif (funct[id] === "const") {\n
-\t\t\t\t\twarning("const \'" + id + "\' has already been declared");\n
-\t\t\t\t}\n
-\t\t\t\tif (funct["(global)"] && predefined[id] === false) {\n
-\t\t\t\t\twarning("Redefinition of \'{a}\'.", token, id);\n
-\t\t\t\t}\n
-\t\t\t\taddlabel(id, "const");\n
-\t\t\t\tif (prefix) {\n
-\t\t\t\t\tbreak;\n
-\t\t\t\t}\n
-\t\t\t\tname = token;\n
-\t\t\t\tthis.first.push(token);\n
-\n
-\t\t\t\tif (nexttoken.id !== "=") {\n
-\t\t\t\t\twarning("const " +\n
-\t\t\t\t\t  "\'{a}\' is initialized to \'undefined\'.", token, id);\n
-\t\t\t\t}\n
-\n
-\t\t\t\tif (nexttoken.id === "=") {\n
-\t\t\t\t\tnonadjacent(token, nexttoken);\n
-\t\t\t\t\tadvance("=");\n
-\t\t\t\t\tnonadjacent(token, nexttoken);\n
-\t\t\t\t\tif (nexttoken.id === "undefined") {\n
-\t\t\t\t\t\twarning("It is not necessary to initialize " +\n
-\t\t\t\t\t\t  "\'{a}\' to \'undefined\'.", token, id);\n
-\t\t\t\t\t}\n
-\t\t\t\t\tif (peek(0).id === "=" && nexttoken.identifier) {\n
-\t\t\t\t\t\terror("Constant {a} was not declared correctly.",\n
-\t\t\t\t\t\t\t\tnexttoken, nexttoken.value);\n
-\t\t\t\t\t}\n
-\t\t\t\t\tvalue = expression(0);\n
-\t\t\t\t\tname.first = value;\n
-\t\t\t\t}\n
-\n
-\t\t\t\tif (nexttoken.id !== ",") {\n
-\t\t\t\t\tbreak;\n
+\tfunction destructuringExpression() {\n
+\t\tvar id, ids;\n
+\t\tvar identifiers = [];\n
+\t\tif (!state.option.inESNext()) {\n
+\t\t\twarning("W104", state.tokens.curr, "destructuring expression");\n
+\t\t}\n
+\t\tvar nextInnerDE = function () {\n
+\t\t\tvar ident;\n
+\t\t\tif (_.contains(["[", "{"], state.tokens.next.value)) {\n
+\t\t\t\tids = destructuringExpression();\n
+\t\t\t\tfor (var id in ids) {\n
+\t\t\t\t\tid = ids[id];\n
+\t\t\t\t\tidentifiers.push({ id: id.id, token: id.token });\n
+\t\t\t\t}\n
+\t\t\t} else if (state.tokens.next.value === ",") {\n
+\t\t\t\tidentifiers.push({ id: null, token: state.tokens.curr });\n
+\t\t\t} else {\n
+\t\t\t\tident = identifier();\n
+\t\t\t\tif (ident)\n
+\t\t\t\t\tidentifiers.push({ id: ident, token: state.tokens.curr });\n
+\t\t\t}\n
+\t\t};\n
+\t\tif (state.tokens.next.value === "[") {\n
+\t\t\tadvance("[");\n
+\t\t\tnextInnerDE();\n
+\t\t\twhile (state.tokens.next.value !== "]") {\n
+\t\t\t\tadvance(",");\n
+\t\t\t\tnextInnerDE();\n
+\t\t\t}\n
+\t\t\tadvance("]");\n
+\t\t} else if (state.tokens.next.value === "{") {\n
+\t\t\tadvance("{");\n
+\t\t\tid = identifier();\n
+\t\t\tif (state.tokens.next.value === ":") {\n
+\t\t\t\tadvance(":");\n
+\t\t\t\tnextInnerDE();\n
+\t\t\t} else {\n
+\t\t\t\tidentifiers.push({ id: id, token: state.tokens.curr });\n
+\t\t\t}\n
+\t\t\twhile (state.tokens.next.value !== "}") {\n
+\t\t\t\tadvance(",");\n
+\t\t\t\tid = identifier();\n
+\t\t\t\tif (state.tokens.next.value === ":") {\n
+\t\t\t\t\tadvance(":");\n
+\t\t\t\t\tnextInnerDE();\n
+\t\t\t\t} else {\n
+\t\t\t\t\tidentifiers.push({ id: id, token: state.tokens.curr });\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t\tadvance("}");\n
+\t\t}\n
+\t\treturn identifiers;\n
+\t}\n
+\tfunction destructuringExpressionMatch(tokens, value) {\n
+\t\tif (value.first) {\n
+\t\t\t_.zip(tokens, value.first).forEach(function (val) {\n
+\t\t\t\tvar token = val[0];\n
+\t\t\t\tvar value = val[1];\n
+\t\t\t\tif (token && value) {\n
+\t\t\t\t\ttoken.first = value;\n
+\t\t\t\t} else if (token && token.first && !value) {\n
+\t\t\t\t\twarning("W080", token.first, token.first.value);\n
+\t\t\t\t} /* else {\n
+\t\t\t\t\tXXX value is discarded: wouldn\'t it need a warning ?\n
+\t\t\t\t} */\n
+\t\t\t});\n
+\t\t}\n
+\t}\n
+\n
+\tvar conststatement = stmt("const", function (prefix) {\n
+\t\tvar tokens, value;\n
+\t\tvar lone;\n
+\n
+\t\tif (!state.option.inESNext()) {\n
+\t\t\twarning("W104", state.tokens.curr, "const");\n
+\t\t}\n
+\n
+\t\tthis.first = [];\n
+\t\tfor (;;) {\n
+\t\t\tvar names = [];\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\tif (_.contains(["{", "["], state.tokens.next.value)) {\n
+\t\t\t\ttokens = destructuringExpression();\n
+\t\t\t\tlone = false;\n
+\t\t\t} else {\n
+\t\t\t\ttokens = [ { id: identifier(), token: state.tokens.curr } ];\n
+\t\t\t\tlone = true;\n
+\t\t\t}\n
+\t\t\tfor (var t in tokens) {\n
+\t\t\t\tt = tokens[t];\n
+\t\t\t\tif (funct[t.id] === "const") {\n
+\t\t\t\t\twarning("E011", null, t.id);\n
+\t\t\t\t}\n
+\t\t\t\tif (funct["(global)"] && predefined[t.id] === false) {\n
+\t\t\t\t\twarning("W079", t.token, t.id);\n
+\t\t\t\t}\n
+\t\t\t\tif (t.id) {\n
+\t\t\t\t\taddlabel(t.id, "const");\n
+\t\t\t\t\tnames.push(t.token);\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t\tif (prefix) {\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\n
+\t\t\tthis.first = this.first.concat(names);\n
+\n
+\t\t\tif (state.tokens.next.id !== "=") {\n
+\t\t\t\twarning("E012", state.tokens.curr, state.tokens.curr.value);\n
+\t\t\t}\n
+\n
+\t\t\tif (state.tokens.next.id === "=") {\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\t\tadvance("=");\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\t\tif (state.tokens.next.id === "undefined") {\n
+\t\t\t\t\twarning("W080", state.tokens.prev, state.tokens.prev.value);\n
+\t\t\t\t}\n
+\t\t\t\tif (peek(0).id === "=" && state.tokens.next.identifier) {\n
+\t\t\t\t\twarning("W120", state.tokens.next, state.tokens.next.value);\n
+\t\t\t\t}\n
+\t\t\t\tvalue = expression(10);\n
+\t\t\t\tif (lone) {\n
+\t\t\t\t\ttokens[0].first = value;\n
+\t\t\t\t} else {\n
+\t\t\t\t\tdestructuringExpressionMatch(names, value);\n
 \t\t\t\t}\n
-\t\t\t\tcomma();\n
 \t\t\t}\n
-\t\t\treturn this;\n
-\t\t});\n
-\t\tconststatement.exps = true;\n
-\t};\n
 \n
+\t\t\tif (state.tokens.next.id !== ",") {\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\t\t\tcomma();\n
+\t\t}\n
+\t\treturn this;\n
+\t});\n
+\tconststatement.exps = true;\n
 \tvar varstatement = stmt("var", function (prefix) {\n
-\t\tvar id, name, value;\n
+\t\tvar tokens, lone, value;\n
 \n
-\t\tif (funct["(onevar)"] && option.onevar) {\n
-\t\t\twarning("Too many var statements.");\n
+\t\tif (funct["(onevar)"] && state.option.onevar) {\n
+\t\t\twarning("W081");\n
 \t\t} else if (!funct["(global)"]) {\n
 \t\t\tfunct["(onevar)"] = true;\n
 \t\t}\n
 \n
 \t\tthis.first = [];\n
-\n
 \t\tfor (;;) {\n
-\t\t\tnonadjacent(token, nexttoken);\n
-\t\t\tid = identifier();\n
+\t\t\tvar names = [];\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\tif (_.contains(["{", "["], state.tokens.next.value)) {\n
+\t\t\t\ttokens = destructuringExpression();\n
+\t\t\t\tlone = false;\n
+\t\t\t} else {\n
+\t\t\t\ttokens = [ { id: identifier(), token: state.tokens.curr } ];\n
+\t\t\t\tlone = true;\n
+\t\t\t}\n
+\t\t\tfor (var t in tokens) {\n
+\t\t\t\tt = tokens[t];\n
+\t\t\t\tif (state.option.inESNext() && funct[t.id] === "const") {\n
+\t\t\t\t\twarning("E011", null, t.id);\n
+\t\t\t\t}\n
+\t\t\t\tif (funct["(global)"] && predefined[t.id] === false) {\n
+\t\t\t\t\twarning("W079", t.token, t.id);\n
+\t\t\t\t}\n
+\t\t\t\tif (t.id) {\n
+\t\t\t\t\taddlabel(t.id, "unused", t.token);\n
+\t\t\t\t\tnames.push(t.token);\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t\tif (prefix) {\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\n
+\t\t\tthis.first = this.first.concat(names);\n
+\n
+\t\t\tif (state.tokens.next.id === "=") {\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\t\tadvance("=");\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\t\tif (state.tokens.next.id === "undefined") {\n
+\t\t\t\t\twarning("W080", state.tokens.prev, state.tokens.prev.value);\n
+\t\t\t\t}\n
+\t\t\t\tif (peek(0).id === "=" && state.tokens.next.identifier) {\n
+\t\t\t\t\twarning("W120", state.tokens.next, state.tokens.next.value);\n
+\t\t\t\t}\n
+\t\t\t\tvalue = expression(10);\n
+\t\t\t\tif (lone) {\n
+\t\t\t\t\ttokens[0].first = value;\n
+\t\t\t\t} else {\n
+\t\t\t\t\tdestructuringExpressionMatch(names, value);\n
+\t\t\t\t}\n
+\t\t\t}\n
 \n
-\t\t\tif (option.esnext && funct[id] === "const") {\n
-\t\t\t\twarning("const \'" + id + "\' has already been declared");\n
+\t\t\tif (state.tokens.next.id !== ",") {\n
+\t\t\t\tbreak;\n
 \t\t\t}\n
+\t\t\tcomma();\n
+\t\t}\n
+\t\treturn this;\n
+\t});\n
+\tvarstatement.exps = true;\n
+\tvar letstatement = stmt("let", function (prefix) {\n
+\t\tvar tokens, lone, value, letblock;\n
+\n
+\t\tif (!state.option.inESNext()) {\n
+\t\t\twarning("W104", state.tokens.curr, "let");\n
+\t\t}\n
 \n
-\t\t\tif (funct["(global)"] && predefined[id] === false) {\n
-\t\t\t\twarning("Redefinition of \'{a}\'.", token, id);\n
+\t\tif (state.tokens.next.value === "(") {\n
+\t\t\tif (!state.option.inMoz(true)) {\n
+\t\t\t\twarning("W118", state.tokens.next, "let block");\n
 \t\t\t}\n
+\t\t\tadvance("(");\n
+\t\t\tfunct["(blockscope)"].stack();\n
+\t\t\tletblock = true;\n
+\t\t} else if (funct["(nolet)"]) {\n
+\t\t\terror("E048", state.tokens.curr);\n
+\t\t}\n
 \n
-\t\t\taddlabel(id, "unused", token);\n
+\t\tif (funct["(onevar)"] && state.option.onevar) {\n
+\t\t\twarning("W081");\n
+\t\t} else if (!funct["(global)"]) {\n
+\t\t\tfunct["(onevar)"] = true;\n
+\t\t}\n
 \n
+\t\tthis.first = [];\n
+\t\tfor (;;) {\n
+\t\t\tvar names = [];\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\tif (_.contains(["{", "["], state.tokens.next.value)) {\n
+\t\t\t\ttokens = destructuringExpression();\n
+\t\t\t\tlone = false;\n
+\t\t\t} else {\n
+\t\t\t\ttokens = [ { id: identifier(), token: state.tokens.curr.value } ];\n
+\t\t\t\tlone = true;\n
+\t\t\t}\n
+\t\t\tfor (var t in tokens) {\n
+\t\t\t\tt = tokens[t];\n
+\t\t\t\tif (state.option.inESNext() && funct[t.id] === "const") {\n
+\t\t\t\t\twarning("E011", null, t.id);\n
+\t\t\t\t}\n
+\t\t\t\tif (funct["(global)"] && predefined[t.id] === false) {\n
+\t\t\t\t\twarning("W079", t.token, t.id);\n
+\t\t\t\t}\n
+\t\t\t\tif (t.id && !funct["(nolet)"]) {\n
+\t\t\t\t\taddlabel(t.id, "unused", t.token, true);\n
+\t\t\t\t\tnames.push(t.token);\n
+\t\t\t\t}\n
+\t\t\t}\n
 \t\t\tif (prefix) {\n
 \t\t\t\tbreak;\n
 \t\t\t}\n
 \n
-\t\t\tname = token;\n
-\t\t\tthis.first.push(token);\n
+\t\t\tthis.first = this.first.concat(names);\n
 \n
-\t\t\tif (nexttoken.id === "=") {\n
-\t\t\t\tnonadjacent(token, nexttoken);\n
+\t\t\tif (state.tokens.next.id === "=") {\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\t\tadvance("=");\n
-\t\t\t\tnonadjacent(token, nexttoken);\n
-\t\t\t\tif (nexttoken.id === "undefined") {\n
-\t\t\t\t\twarning("It is not necessary to initialize \'{a}\' to \'undefined\'.", token, id);\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\t\tif (state.tokens.next.id === "undefined") {\n
+\t\t\t\t\twarning("W080", state.tokens.prev, state.tokens.prev.value);\n
 \t\t\t\t}\n
-\t\t\t\tif (peek(0).id === "=" && nexttoken.identifier) {\n
-\t\t\t\t\terror("Variable {a} was not declared correctly.",\n
-\t\t\t\t\t\t\tnexttoken, nexttoken.value);\n
+\t\t\t\tif (peek(0).id === "=" && state.tokens.next.identifier) {\n
+\t\t\t\t\twarning("W120", state.tokens.next, state.tokens.next.value);\n
+\t\t\t\t}\n
+\t\t\t\tvalue = expression(10);\n
+\t\t\t\tif (lone) {\n
+\t\t\t\t\ttokens[0].first = value;\n
+\t\t\t\t} else {\n
+\t\t\t\t\tdestructuringExpressionMatch(names, value);\n
 \t\t\t\t}\n
-\t\t\t\tvalue = expression(0);\n
-\t\t\t\tname.first = value;\n
 \t\t\t}\n
-\t\t\tif (nexttoken.id !== ",") {\n
+\n
+\t\t\tif (state.tokens.next.id !== ",") {\n
 \t\t\t\tbreak;\n
 \t\t\t}\n
 \t\t\tcomma();\n
 \t\t}\n
+\t\tif (letblock) {\n
+\t\t\tadvance(")");\n
+\t\t\tblock(true, true);\n
+\t\t\tthis.block = true;\n
+\t\t\tfunct["(blockscope)"].unstack();\n
+\t\t}\n
+\n
 \t\treturn this;\n
 \t});\n
-\tvarstatement.exps = true;\n
+\tletstatement.exps = true;\n
+\n
+\tblockstmt("class", function () {\n
+\t\treturn classdef.call(this, true);\n
+\t});\n
+\n
+\tfunction classdef(stmt) {\n
+\t\tif (!state.option.inESNext()) {\n
+\t\t\twarning("W104", state.tokens.curr, "class");\n
+\t\t}\n
+\t\tif (stmt) {\n
+\t\t\tthis.name = identifier();\n
+\t\t\taddlabel(this.name, "unused", state.tokens.curr);\n
+\t\t} else if (state.tokens.next.identifier && state.tokens.next.value !== "extends") {\n
+\t\t\tthis.name = identifier();\n
+\t\t}\n
+\t\tclasstail(this);\n
+\t\treturn this;\n
+\t}\n
+\n
+\tfunction classtail(c) {\n
+\t\tvar strictness = state.directive["use strict"];\n
+\t\tif (state.tokens.next.value === "extends") {\n
+\t\t\tadvance("extends");\n
+\t\t\tc.heritage = expression(10);\n
+\t\t}\n
+\t\tstate.directive["use strict"] = true;\n
+\t\tadvance("{");\n
+\t\tc.body = state.syntax["{"].nud(true);\n
+\t\tstate.directive["use strict"] = strictness;\n
+\t}\n
 \n
 \tblockstmt("function", function () {\n
+\t\tvar generator = false;\n
+\t\tif (state.tokens.next.value === "*") {\n
+\t\t\tadvance("*");\n
+\t\t\tif (state.option.inESNext(true)) {\n
+\t\t\t\tgenerator = true;\n
+\t\t\t} else {\n
+\t\t\t\twarning("W119", state.tokens.curr, "function*");\n
+\t\t\t}\n
+\t\t}\n
 \t\tif (inblock) {\n
-\t\t\twarning("Function declarations should not be placed in blocks. " +\n
-\t\t\t\t"Use a function expression or move the statement to the top of " +\n
-\t\t\t\t"the outer function.", token);\n
+\t\t\twarning("W082", state.tokens.curr);\n
 \n
 \t\t}\n
 \t\tvar i = identifier();\n
-\t\tif (option.esnext && funct[i] === "const") {\n
-\t\t\twarning("const \'" + i + "\' has already been declared");\n
+\t\tif (funct[i] === "const") {\n
+\t\t\twarning("E011", null, i);\n
 \t\t}\n
-\t\tadjacent(token, nexttoken);\n
-\t\taddlabel(i, "unction", token);\n
+\t\tadjacent(state.tokens.curr, state.tokens.next);\n
+\t\taddlabel(i, "unction", state.tokens.curr);\n
 \n
-\t\tdoFunction(i, { statement: true });\n
-\t\tif (nexttoken.id === "(" && nexttoken.line === token.line) {\n
-\t\t\terror(\n
-"Function declarations are not invocable. Wrap the whole function invocation in parens.");\n
+\t\tdoFunction(i, { statement: true }, generator);\n
+\t\tif (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) {\n
+\t\t\terror("E039");\n
 \t\t}\n
 \t\treturn this;\n
 \t});\n
 \n
 \tprefix("function", function () {\n
+\t\tvar generator = false;\n
+\t\tif (state.tokens.next.value === "*") {\n
+\t\t\tif (!state.option.inESNext()) {\n
+\t\t\t\twarning("W119", state.tokens.curr, "function*");\n
+\t\t\t}\n
+\t\t\tadvance("*");\n
+\t\t\tgenerator = true;\n
+\t\t}\n
 \t\tvar i = optionalidentifier();\n
-\t\tif (i) {\n
-\t\t\tadjacent(token, nexttoken);\n
+\t\tif (i || state.option.gcl) {\n
+\t\t\tadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t} else {\n
-\t\t\tnonadjacent(token, nexttoken);\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t}\n
-\t\tdoFunction(i);\n
-\t\tif (!option.loopfunc && funct["(loopage)"]) {\n
-\t\t\twarning("Don\'t make functions within a loop.");\n
+\t\tdoFunction(i, undefined, generator);\n
+\t\tif (!state.option.loopfunc && funct["(loopage)"]) {\n
+\t\t\twarning("W083");\n
 \t\t}\n
 \t\treturn this;\n
 \t});\n
 \n
 \tblockstmt("if", function () {\n
-\t\tvar t = nexttoken;\n
+\t\tvar t = state.tokens.next;\n
 \t\tincreaseComplexityCount();\n
+\t\tstate.condition = true;\n
 \t\tadvance("(");\n
 \t\tnonadjacent(this, t);\n
 \t\tnospace();\n
-\t\texpression(20);\n
-\t\tif (nexttoken.id === "=") {\n
-\t\t\tif (!option.boss)\n
-\t\t\t\twarning("Assignment in conditional expression");\n
-\t\t\tadvance("=");\n
-\t\t\texpression(20);\n
-\t\t}\n
+\t\tcheckCondAssignment(expression(0));\n
 \t\tadvance(")", t);\n
-\t\tnospace(prevtoken, token);\n
+\t\tstate.condition = false;\n
+\t\tnospace(state.tokens.prev, state.tokens.curr);\n
 \t\tblock(true, true);\n
-\t\tif (nexttoken.id === "else") {\n
-\t\t\tnonadjacent(token, nexttoken);\n
+\t\tif (state.tokens.next.id === "else") {\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\tadvance("else");\n
-\t\t\tif (nexttoken.id === "if" || nexttoken.id === "switch") {\n
+\t\t\tif (state.tokens.next.id === "if" || state.tokens.next.id === "switch") {\n
 \t\t\t\tstatement(true);\n
 \t\t\t} else {\n
 \t\t\t\tblock(true, true);\n
@@ -5645,87 +7041,96 @@ klass:\n
 \t\t\tvar e;\n
 \n
 \t\t\tadvance("catch");\n
-\t\t\tnonadjacent(token, nexttoken);\n
+\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\tadvance("(");\n
 \n
 \t\t\tscope = Object.create(oldScope);\n
 \n
-\t\t\te = nexttoken.value;\n
-\t\t\tif (nexttoken.type !== "(identifier)") {\n
+\t\t\te = state.tokens.next.value;\n
+\t\t\tif (state.tokens.next.type !== "(identifier)") {\n
 \t\t\t\te = null;\n
-\t\t\t\twarning("Expected an identifier and instead saw \'{a}\'.", nexttoken, e);\n
+\t\t\t\twarning("E030", state.tokens.next, e);\n
 \t\t\t}\n
 \n
 \t\t\tadvance();\n
-\t\t\tadvance(")");\n
 \n
 \t\t\tfunct = {\n
-\t\t\t\t"(name)"\t : "(catch)",\n
-\t\t\t\t"(line)"\t : nexttoken.line,\n
-\t\t\t\t"(character)": nexttoken.character,\n
+\t\t\t\t"(name)"     : "(catch)",\n
+\t\t\t\t"(line)"     : state.tokens.next.line,\n
+\t\t\t\t"(character)": state.tokens.next.character,\n
 \t\t\t\t"(context)"  : funct,\n
 \t\t\t\t"(breakage)" : funct["(breakage)"],\n
 \t\t\t\t"(loopage)"  : funct["(loopage)"],\n
-\t\t\t\t"(scope)"\t : scope,\n
+\t\t\t\t"(scope)"    : scope,\n
 \t\t\t\t"(statement)": false,\n
-\t\t\t\t"(metrics)"  : createMetrics(nexttoken),\n
-\t\t\t\t"(catch)"\t : true,\n
-\t\t\t\t"(tokens)"\t : {}\n
+\t\t\t\t"(metrics)"  : createMetrics(state.tokens.next),\n
+\t\t\t\t"(catch)"    : true,\n
+\t\t\t\t"(tokens)"   : {},\n
+\t\t\t\t"(blockscope)": funct["(blockscope)"],\n
+\t\t\t\t"(comparray)": funct["(comparray)"]\n
 \t\t\t};\n
 \n
 \t\t\tif (e) {\n
 \t\t\t\taddlabel(e, "exception");\n
 \t\t\t}\n
 \n
-\t\t\ttoken.funct = funct;\n
+\t\t\tif (state.tokens.next.value === "if") {\n
+\t\t\t\tif (!state.option.inMoz(true)) {\n
+\t\t\t\t\twarning("W118", state.tokens.curr, "catch filter");\n
+\t\t\t\t}\n
+\t\t\t\tadvance("if");\n
+\t\t\t\texpression(0);\n
+\t\t\t}\n
+\n
+\t\t\tadvance(")");\n
+\n
+\t\t\tstate.tokens.curr.funct = funct;\n
 \t\t\tfunctions.push(funct);\n
 \n
 \t\t\tblock(false);\n
 \n
 \t\t\tscope = oldScope;\n
 \n
-\t\t\tfunct["(last)"] = token.line;\n
-\t\t\tfunct["(lastcharacter)"] = token.character;\n
+\t\t\tfunct["(last)"] = state.tokens.curr.line;\n
+\t\t\tfunct["(lastcharacter)"] = state.tokens.curr.character;\n
 \t\t\tfunct = funct["(context)"];\n
 \t\t}\n
 \n
 \t\tblock(false);\n
 \n
-\t\tif (nexttoken.id === "catch") {\n
+\t\twhile (state.tokens.next.id === "catch") {\n
 \t\t\tincreaseComplexityCount();\n
+\t\t\tif (b && (!state.option.inMoz(true))) {\n
+\t\t\t\twarning("W118", state.tokens.next, "multiple catch blocks");\n
+\t\t\t}\n
 \t\t\tdoCatch();\n
 \t\t\tb = true;\n
 \t\t}\n
 \n
-\t\tif (nexttoken.id === "finally") {\n
+\t\tif (state.tokens.next.id === "finally") {\n
 \t\t\tadvance("finally");\n
 \t\t\tblock(false);\n
 \t\t\treturn;\n
-\t\t} else if (!b) {\n
-\t\t\terror("Expected \'{a}\' and instead saw \'{b}\'.",\n
-\t\t\t\t\tnexttoken, "catch", nexttoken.value);\n
+\t\t}\n
+\n
+\t\tif (!b) {\n
+\t\t\terror("E021", state.tokens.next, "catch", state.tokens.next.value);\n
 \t\t}\n
 \n
 \t\treturn this;\n
 \t});\n
 \n
 \tblockstmt("while", function () {\n
-\t\tvar t = nexttoken;\n
+\t\tvar t = state.tokens.next;\n
 \t\tfunct["(breakage)"] += 1;\n
 \t\tfunct["(loopage)"] += 1;\n
 \t\tincreaseComplexityCount();\n
 \t\tadvance("(");\n
 \t\tnonadjacent(this, t);\n
 \t\tnospace();\n
-\t\texpression(20);\n
-\t\tif (nexttoken.id === "=") {\n
-\t\t\tif (!option.boss)\n
-\t\t\t\twarning("Assignment in conditional expression");\n
-\t\t\tadvance("=");\n
-\t\t\texpression(20);\n
-\t\t}\n
+\t\tcheckCondAssignment(expression(0));\n
 \t\tadvance(")", t);\n
-\t\tnospace(prevtoken, token);\n
+\t\tnospace(state.tokens.prev, state.tokens.curr);\n
 \t\tblock(true, true);\n
 \t\tfunct["(breakage)"] -= 1;\n
 \t\tfunct["(loopage)"] -= 1;\n
@@ -5733,11 +7138,11 @@ klass:\n
 \t}).labelled = true;\n
 \n
 \tblockstmt("with", function () {\n
-\t\tvar t = nexttoken;\n
-\t\tif (directive["use strict"]) {\n
-\t\t\terror("\'with\' is not allowed in strict mode.", token);\n
-\t\t} else if (!option.withstmt) {\n
-\t\t\twarning("Don\'t use \'with\'.", token);\n
+\t\tvar t = state.tokens.next;\n
+\t\tif (state.directive["use strict"]) {\n
+\t\t\terror("E010", state.tokens.curr);\n
+\t\t} else if (!state.option.withstmt) {\n
+\t\t\twarning("W085", state.tokens.curr);\n
 \t\t}\n
 \n
 \t\tadvance("(");\n
@@ -5745,32 +7150,34 @@ klass:\n
 \t\tnospace();\n
 \t\texpression(0);\n
 \t\tadvance(")", t);\n
-\t\tnospace(prevtoken, token);\n
+\t\tnospace(state.tokens.prev, state.tokens.curr);\n
 \t\tblock(true, true);\n
 \n
 \t\treturn this;\n
 \t});\n
 \n
 \tblockstmt("switch", function () {\n
-\t\tvar t = nexttoken,\n
+\t\tvar t = state.tokens.next,\n
 \t\t\tg = false;\n
 \t\tfunct["(breakage)"] += 1;\n
 \t\tadvance("(");\n
 \t\tnonadjacent(this, t);\n
 \t\tnospace();\n
-\t\tthis.condition = expression(20);\n
+\t\tcheckCondAssignment(expression(0));\n
 \t\tadvance(")", t);\n
-\t\tnospace(prevtoken, token);\n
-\t\tnonadjacent(token, nexttoken);\n
-\t\tt = nexttoken;\n
+\t\tnospace(state.tokens.prev, state.tokens.curr);\n
+\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\tt = state.tokens.next;\n
 \t\tadvance("{");\n
-\t\tnonadjacent(token, nexttoken);\n
-\t\tindent += option.indent;\n
+\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\tindent += state.option.indent;\n
 \t\tthis.cases = [];\n
+\n
 \t\tfor (;;) {\n
-\t\t\tswitch (nexttoken.id) {\n
+\t\t\tswitch (state.tokens.next.id) {\n
 \t\t\tcase "case":\n
 \t\t\t\tswitch (funct["(verb)"]) {\n
+\t\t\t\tcase "yield":\n
 \t\t\t\tcase "break":\n
 \t\t\t\tcase "case":\n
 \t\t\t\tcase "continue":\n
@@ -5779,13 +7186,11 @@ klass:\n
 \t\t\t\tcase "throw":\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tdefault:\n
-\t\t\t\t\tif (!ft.test(lines[nexttoken.line - 2])) {\n
-\t\t\t\t\t\twarning(\n
-\t\t\t\t\t\t\t"Expected a \'break\' statement before \'case\'.",\n
-\t\t\t\t\t\t\ttoken);\n
+\t\t\t\t\tif (!reg.fallsThrough.test(state.lines[state.tokens.next.line - 2])) {\n
+\t\t\t\t\t\twarning("W086", state.tokens.curr, "case");\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
-\t\t\t\tindentation(-option.indent);\n
+\t\t\t\tindentation(-state.option.indent);\n
 \t\t\t\tadvance("case");\n
 \t\t\t\tthis.cases.push(expression(20));\n
 \t\t\t\tincreaseComplexityCount();\n
@@ -5795,60 +7200,55 @@ klass:\n
 \t\t\t\tbreak;\n
 \t\t\tcase "default":\n
 \t\t\t\tswitch (funct["(verb)"]) {\n
+\t\t\t\tcase "yield":\n
 \t\t\t\tcase "break":\n
 \t\t\t\tcase "continue":\n
 \t\t\t\tcase "return":\n
 \t\t\t\tcase "throw":\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tdefault:\n
-\t\t\t\t\tif (!ft.test(lines[nexttoken.line - 2])) {\n
-\t\t\t\t\t\twarning(\n
-\t\t\t\t\t\t\t"Expected a \'break\' statement before \'default\'.",\n
-\t\t\t\t\t\t\ttoken);\n
+\t\t\t\t\tif (this.cases.length) {\n
+\t\t\t\t\t\tif (!reg.fallsThrough.test(state.lines[state.tokens.next.line - 2])) {\n
+\t\t\t\t\t\t\twarning("W086", state.tokens.curr, "default");\n
+\t\t\t\t\t\t}\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
-\t\t\t\tindentation(-option.indent);\n
+\t\t\t\tindentation(-state.option.indent);\n
 \t\t\t\tadvance("default");\n
 \t\t\t\tg = true;\n
 \t\t\t\tadvance(":");\n
 \t\t\t\tbreak;\n
 \t\t\tcase "}":\n
-\t\t\t\tindent -= option.indent;\n
+\t\t\t\tindent -= state.option.indent;\n
 \t\t\t\tindentation();\n
 \t\t\t\tadvance("}", t);\n
-\t\t\t\tif (this.cases.length === 1 || this.condition.id === "true" ||\n
-\t\t\t\t\t\tthis.condition.id === "false") {\n
-\t\t\t\t\tif (!option.onecase)\n
-\t\t\t\t\t\twarning("This \'switch\' should be an \'if\'.", this);\n
-\t\t\t\t}\n
 \t\t\t\tfunct["(breakage)"] -= 1;\n
 \t\t\t\tfunct["(verb)"] = undefined;\n
 \t\t\t\treturn;\n
 \t\t\tcase "(end)":\n
-\t\t\t\terror("Missing \'{a}\'.", nexttoken, "}");\n
+\t\t\t\terror("E023", state.tokens.next, "}");\n
 \t\t\t\treturn;\n
 \t\t\tdefault:\n
 \t\t\t\tif (g) {\n
-\t\t\t\t\tswitch (token.id) {\n
+\t\t\t\t\tswitch (state.tokens.curr.id) {\n
 \t\t\t\t\tcase ",":\n
-\t\t\t\t\t\terror("Each value should have its own case label.");\n
+\t\t\t\t\t\terror("E040");\n
 \t\t\t\t\t\treturn;\n
 \t\t\t\t\tcase ":":\n
 \t\t\t\t\t\tg = false;\n
 \t\t\t\t\t\tstatements();\n
 \t\t\t\t\t\tbreak;\n
 \t\t\t\t\tdefault:\n
-\t\t\t\t\t\terror("Missing \':\' on a case clause.", token);\n
+\t\t\t\t\t\terror("E025", state.tokens.curr);\n
 \t\t\t\t\t\treturn;\n
 \t\t\t\t\t}\n
 \t\t\t\t} else {\n
-\t\t\t\t\tif (token.id === ":") {\n
+\t\t\t\t\tif (state.tokens.curr.id === ":") {\n
 \t\t\t\t\t\tadvance(":");\n
-\t\t\t\t\t\terror("Unexpected \'{a}\'.", token, ":");\n
+\t\t\t\t\t\terror("E024", state.tokens.curr, ":");\n
 \t\t\t\t\t\tstatements();\n
 \t\t\t\t\t} else {\n
-\t\t\t\t\t\terror("Expected \'{a}\' and instead saw \'{b}\'.",\n
-\t\t\t\t\t\t\tnexttoken, "case", nexttoken.value);\n
+\t\t\t\t\t\terror("E021", state.tokens.next, "case", state.tokens.next.value);\n
 \t\t\t\t\t\treturn;\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
@@ -5857,8 +7257,8 @@ klass:\n
 \t}).labelled = true;\n
 \n
 \tstmt("debugger", function () {\n
-\t\tif (!option.debug) {\n
-\t\t\twarning("All \'debugger\' statements should be removed.");\n
+\t\tif (!state.option.debug) {\n
+\t\t\twarning("W087");\n
 \t\t}\n
 \t\treturn this;\n
 \t}).exps = true;\n
@@ -5869,21 +7269,15 @@ klass:\n
 \t\t\tfunct["(loopage)"] += 1;\n
 \t\t\tincreaseComplexityCount();\n
 \n
-\t\t\tthis.first = block(true);\n
+\t\t\tthis.first = block(true, true);\n
 \t\t\tadvance("while");\n
-\t\t\tvar t = nexttoken;\n
-\t\t\tnonadjacent(token, t);\n
+\t\t\tvar t = state.tokens.next;\n
+\t\t\tnonadjacent(state.tokens.curr, t);\n
 \t\t\tadvance("(");\n
 \t\t\tnospace();\n
-\t\t\texpression(20);\n
-\t\t\tif (nexttoken.id === "=") {\n
-\t\t\t\tif (!option.boss)\n
-\t\t\t\t\twarning("Assignment in conditional expression");\n
-\t\t\t\tadvance("=");\n
-\t\t\t\texpression(20);\n
-\t\t\t}\n
+\t\t\tcheckCondAssignment(expression(0));\n
 \t\t\tadvance(")", t);\n
-\t\t\tnospace(prevtoken, token);\n
+\t\t\tnospace(state.tokens.prev, state.tokens.curr);\n
 \t\t\tfunct["(breakage)"] -= 1;\n
 \t\t\tfunct["(loopage)"] -= 1;\n
 \t\t\treturn this;\n
@@ -5893,110 +7287,163 @@ klass:\n
 \t}());\n
 \n
 \tblockstmt("for", function () {\n
-\t\tvar s, t = nexttoken;\n
+\t\tvar s, t = state.tokens.next;\n
+\t\tvar letscope = false;\n
+\t\tvar foreachtok = null;\n
+\n
+\t\tif (t.value === "each") {\n
+\t\t\tforeachtok = t;\n
+\t\t\tadvance("each");\n
+\t\t\tif (!state.option.inMoz(true)) {\n
+\t\t\t\twarning("W118", state.tokens.curr, "for each");\n
+\t\t\t}\n
+\t\t}\n
+\n
 \t\tfunct["(breakage)"] += 1;\n
 \t\tfunct["(loopage)"] += 1;\n
 \t\tincreaseComplexityCount();\n
 \t\tadvance("(");\n
 \t\tnonadjacent(this, t);\n
 \t\tnospace();\n
-\t\tif (peek(nexttoken.id === "var" ? 1 : 0).id === "in") {\n
-\t\t\tif (nexttoken.id === "var") {\n
+\t\tvar nextop; // contains the token of the "in" or "of" operator\n
+\t\tvar i = 0;\n
+\t\tvar inof = ["in", "of"];\n
+\t\tdo {\n
+\t\t\tnextop = peek(i);\n
+\t\t\t++i;\n
+\t\t} while (!_.contains(inof, nextop.value) && nextop.value !== ";" &&\n
+\t\t\t\t\tnextop.type !== "(end)");\n
+\t\tif (_.contains(inof, nextop.value)) {\n
+\t\t\tif (!state.option.inESNext() && nextop.value === "of") {\n
+\t\t\t\terror("W104", nextop, "for of");\n
+\t\t\t}\n
+\t\t\tif (state.tokens.next.id === "var") {\n
 \t\t\t\tadvance("var");\n
-\t\t\t\tvarstatement.fud.call(varstatement, true);\n
+\t\t\t\tstate.syntax["var"].fud.call(state.syntax["var"].fud, true);\n
+\t\t\t} else if (state.tokens.next.
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+id === "let") {\n
+\t\t\t\tadvance("let");\n
+\t\t\t\tletscope = true;\n
+\t\t\t\tfunct["(blockscope)"].stack();\n
+\t\t\t\tstate.syntax["let"].fud.call(state.syntax["let"].fud, true);\n
 \t\t\t} else {\n
-\t\t\t\tswitch (funct[nexttoken.value]) {\n
+\t\t\t\tswitch (funct[state.tokens.next.value]) {\n
 \t\t\t\tcase "unused":\n
-\t\t\t\t\tfunct[nexttoken.value] = "var";\n
+\t\t\t\t\tfunct[state.tokens.next.value] = "var";\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tcase "var":\n
 \t\t\t\t\tbreak;\n
 \t\t\t\tdefault:\n
-\t\t\t\t\twarning("Bad for in variable \'{a}\'.",\n
-\t\t\t\t\t\t\tnexttoken, nexttoken.value);\n
+\t\t\t\t\tif (!funct["(blockscope)"].getlabel(state.tokens.next.value))\n
+\t\t\t\t\t\twarning("W088", state.tokens.next, state.tokens.next.value);\n
 \t\t\t\t}\n
 \t\t\t\tadvance();\n
 \t\t\t}\n
-\t\t\tadvance("in");\n
+\t\t\tadvance(nextop.value);\n
 \t\t\texpression(20);\n
 \t\t\tadvance(")", t);\n
 \t\t\ts = block(true, true);\n
-\t\t\tif (option.forin && s && (s.length > 1 || typeof s[0] !== "object" ||\n
+\t\t\tif (state.option.forin && s && (s.length > 1 || typeof s[0] !== "object" ||\n
 \t\t\t\t\ts[0].value !== "if")) {\n
-\t\t\t\twarning("The body of a for in should be wrapped in an if statement to filter " +\n
-\t\t\t\t\t\t"unwanted properties from the prototype.", this);\n
+\t\t\t\twarning("W089", this);\n
 \t\t\t}\n
 \t\t\tfunct["(breakage)"] -= 1;\n
 \t\t\tfunct["(loopage)"] -= 1;\n
-\t\t\treturn this;\n
 \t\t} else {\n
-\t\t\tif (nexttoken.id !== ";") {\n
-\t\t\t\tif (nexttoken.id === "var") {\n
+\t\t\tif (foreachtok) {\n
+\t\t\t\terror("E045", foreachtok);\n
+\t\t\t}\n
+\t\t\tif (state.tokens.next.id !== ";") {\n
+\t\t\t\tif (state.tokens.next.id === "var") {\n
 \t\t\t\t\tadvance("var");\n
-\t\t\t\t\tvarstatement.fud.call(varstatement);\n
+\t\t\t\t\tstate.syntax["var"].fud.call(state.syntax["var"].fud);\n
+\t\t\t\t} else if (state.tokens.next.id === "let") {\n
+\t\t\t\t\tadvance("let");\n
+\t\t\t\t\tletscope = true;\n
+\t\t\t\t\tfunct["(blockscope)"].stack();\n
+\t\t\t\t\tstate.syntax["let"].fud.call(state.syntax["let"].fud);\n
 \t\t\t\t} else {\n
 \t\t\t\t\tfor (;;) {\n
 \t\t\t\t\t\texpression(0, "for");\n
-\t\t\t\t\t\tif (nexttoken.id !== ",") {\n
+\t\t\t\t\t\tif (state.tokens.next.id !== ",") {\n
 \t\t\t\t\t\t\tbreak;\n
 \t\t\t\t\t\t}\n
 \t\t\t\t\t\tcomma();\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
 \t\t\t}\n
-\t\t\tnolinebreak(token);\n
+\t\t\tnolinebreak(state.tokens.curr);\n
 \t\t\tadvance(";");\n
-\t\t\tif (nexttoken.id !== ";") {\n
-\t\t\t\texpression(20);\n
-\t\t\t\tif (nexttoken.id === "=") {\n
-\t\t\t\t\tif (!option.boss)\n
-\t\t\t\t\t\twarning("Assignment in conditional expression");\n
-\t\t\t\t\tadvance("=");\n
-\t\t\t\t\texpression(20);\n
-\t\t\t\t}\n
+\t\t\tif (state.tokens.next.id !== ";") {\n
+\t\t\t\tcheckCondAssignment(expression(0));\n
 \t\t\t}\n
-\t\t\tnolinebreak(token);\n
+\t\t\tnolinebreak(state.tokens.curr);\n
 \t\t\tadvance(";");\n
-\t\t\tif (nexttoken.id === ";") {\n
-\t\t\t\terror("Expected \'{a}\' and instead saw \'{b}\'.",\n
-\t\t\t\t\t\tnexttoken, ")", ";");\n
+\t\t\tif (state.tokens.next.id === ";") {\n
+\t\t\t\terror("E021", state.tokens.next, ")", ";");\n
 \t\t\t}\n
-\t\t\tif (nexttoken.id !== ")") {\n
+\t\t\tif (state.tokens.next.id !== ")") {\n
 \t\t\t\tfor (;;) {\n
 \t\t\t\t\texpression(0, "for");\n
-\t\t\t\t\tif (nexttoken.id !== ",") {\n
+\t\t\t\t\tif (state.tokens.next.id !== ",") {\n
 \t\t\t\t\t\tbreak;\n
 \t\t\t\t\t}\n
 \t\t\t\t\tcomma();\n
 \t\t\t\t}\n
 \t\t\t}\n
 \t\t\tadvance(")", t);\n
-\t\t\tnospace(prevtoken, token);\n
+\t\t\tnospace(state.tokens.prev, state.tokens.curr);\n
 \t\t\tblock(true, true);\n
 \t\t\tfunct["(breakage)"] -= 1;\n
 \t\t\tfunct["(loopage)"] -= 1;\n
-\t\t\treturn this;\n
+\n
+\t\t}\n
+\t\tif (letscope) {\n
+\t\t\tfunct["(blockscope)"].unstack();\n
 \t\t}\n
+\t\treturn this;\n
 \t}).labelled = true;\n
 \n
 \n
 \tstmt("break", function () {\n
-\t\tvar v = nexttoken.value;\n
+\t\tvar v = state.tokens.next.value;\n
 \n
 \t\tif (funct["(breakage)"] === 0)\n
-\t\t\twarning("Unexpected \'{a}\'.", nexttoken, this.value);\n
+\t\t\twarning("W052", state.tokens.next, this.value);\n
 \n
-\t\tif (!option.asi)\n
+\t\tif (!state.option.asi)\n
 \t\t\tnolinebreak(this);\n
 \n
-\t\tif (nexttoken.id !== ";") {\n
-\t\t\tif (token.line === nexttoken.line) {\n
+\t\tif (state.tokens.next.id !== ";" && !state.tokens.next.reach) {\n
+\t\t\tif (state.tokens.curr.line === state.tokens.next.line) {\n
 \t\t\t\tif (funct[v] !== "label") {\n
-\t\t\t\t\twarning("\'{a}\' is not a statement label.", nexttoken, v);\n
+\t\t\t\t\twarning("W090", state.tokens.next, v);\n
 \t\t\t\t} else if (scope[v] !== funct) {\n
-\t\t\t\t\twarning("\'{a}\' is out of scope.", nexttoken, v);\n
+\t\t\t\t\twarning("W091", state.tokens.next, v);\n
 \t\t\t\t}\n
-\t\t\t\tthis.first = nexttoken;\n
+\t\t\t\tthis.first = state.tokens.next;\n
 \t\t\t\tadvance();\n
 \t\t\t}\n
 \t\t}\n
@@ -6006,26 +7453,26 @@ klass:\n
 \n
 \n
 \tstmt("continue", function () {\n
-\t\tvar v = nexttoken.value;\n
+\t\tvar v = state.tokens.next.value;\n
 \n
 \t\tif (funct["(breakage)"] === 0)\n
-\t\t\twarning("Unexpected \'{a}\'.", nexttoken, this.value);\n
+\t\t\twarning("W052", state.tokens.next, this.value);\n
 \n
-\t\tif (!option.asi)\n
+\t\tif (!state.option.asi)\n
 \t\t\tnolinebreak(this);\n
 \n
-\t\tif (nexttoken.id !== ";") {\n
-\t\t\tif (token.line === nexttoken.line) {\n
+\t\tif (state.tokens.next.id !== ";" && !state.tokens.next.reach) {\n
+\t\t\tif (state.tokens.curr.line === state.tokens.next.line) {\n
 \t\t\t\tif (funct[v] !== "label") {\n
-\t\t\t\t\twarning("\'{a}\' is not a statement label.", nexttoken, v);\n
+\t\t\t\t\twarning("W090", state.tokens.next, v);\n
 \t\t\t\t} else if (scope[v] !== funct) {\n
-\t\t\t\t\twarning("\'{a}\' is out of scope.", nexttoken, v);\n
+\t\t\t\t\twarning("W091", state.tokens.next, v);\n
 \t\t\t\t}\n
-\t\t\t\tthis.first = nexttoken;\n
+\t\t\t\tthis.first = state.tokens.next;\n
 \t\t\t\tadvance();\n
 \t\t\t}\n
 \t\t} else if (!funct["(loopage)"]) {\n
-\t\t\twarning("Unexpected \'{a}\'.", nexttoken, this.value);\n
+\t\t\twarning("W052", state.tokens.next, this.value);\n
 \t\t}\n
 \t\treachable("continue");\n
 \t\treturn this;\n
@@ -6033,86 +7480,355 @@ klass:\n
 \n
 \n
 \tstmt("return", function () {\n
-\t\tif (this.line === nexttoken.line) {\n
-\t\t\tif (nexttoken.id === "(regexp)")\n
-\t\t\t\twarning("Wrap the /regexp/ literal in parens to disambiguate the slash operator.");\n
+\t\tif (this.line === state.tokens.next.line) {\n
+\t\t\tif (state.tokens.next.id === "(regexp)")\n
+\t\t\t\twarning("W092");\n
 \n
-\t\t\tif (nexttoken.id !== ";" && !nexttoken.reach) {\n
-\t\t\t\tnonadjacent(token, nexttoken);\n
-\t\t\t\tif (peek().value === "=" && !option.boss) {\n
-\t\t\t\t\twarningAt("Did you mean to return a conditional instead of an assignment?",\n
-\t\t\t\t\t\t\t  token.line, token.character + 1);\n
-\t\t\t\t}\n
+\t\t\tif (state.tokens.next.id !== ";" && !state.tokens.next.reach) {\n
+\t\t\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\t\tthis.first = expression(0);\n
+\n
+\t\t\t\tif (this.first &&\n
+\t\t\t\t\t\tthis.first.type === "(punctuator)" && this.first.value === "=" && !state.option.boss) {\n
+\t\t\t\t\twarningAt("W093", this.first.line, this.first.character);\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t} else {\n
+\t\t\tif (state.tokens.next.type === "(punctuator)" &&\n
+\t\t\t\t["[", "{", "+", "-"].indexOf(state.tokens.next.value) > -1) {\n
+\t\t\t\tnolinebreak(this); // always warn (Line breaking error)\n
 \t\t\t}\n
-\t\t} else if (!option.asi) {\n
-\t\t\tnolinebreak(this); // always warn (Line breaking error)\n
 \t\t}\n
 \t\treachable("return");\n
 \t\treturn this;\n
 \t}).exps = true;\n
 \n
+\t(function (x) {\n
+\t\tx.exps = true;\n
+\t\tx.lbp = 25;\n
+\t}(prefix("yield", function () {\n
+\t\tvar prev = state.tokens.prev;\n
+\t\tif (state.option.inESNext(true) && !funct["(generator)"]) {\n
+\t\t\terror("E046", state.tokens.curr, "yield");\n
+\t\t} else if (!state.option.inESNext()) {\n
+\t\t\twarning("W104", state.tokens.curr, "yield");\n
+\t\t}\n
+\t\tfunct["(generator)"] = "yielded";\n
+\t\tif (this.line === state.tokens.next.line || !state.option.inMoz(true)) {\n
+\t\t\tif (state.tokens.next.id === "(regexp)")\n
+\t\t\t\twarning("W092");\n
+\n
+\t\t\tif (state.tokens.next.id !== ";" && !state.tokens.next.reach && state.tokens.next.nud) {\n
+\t\t\t\tnobreaknonadjacent(state.tokens.curr, state.tokens.next);\n
+\t\t\t\tthis.first = expression(10);\n
+\n
+\t\t\t\tif (this.first.type === "(punctuator)" && this.first.value === "=" && !state.option.boss) {\n
+\t\t\t\t\twarningAt("W093", this.first.line, this.first.character);\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\tif (state.option.inMoz(true) && state.tokens.next.id !== ")" &&\n
+\t\t\t\t\t(prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === "yield")) {\n
+\t\t\t\terror("E050", this);\n
+\t\t\t}\n
+\t\t} else if (!state.option.asi) {\n
+\t\t\tnolinebreak(this); // always warn (Line breaking error)\n
+\t\t}\n
+\t\treturn this;\n
+\t})));\n
+\n
 \n
 \tstmt("throw", function () {\n
 \t\tnolinebreak(this);\n
-\t\tnonadjacent(token, nexttoken);\n
+\t\tnonadjacent(state.tokens.curr, state.tokens.next);\n
 \t\tthis.first = expression(20);\n
 \t\treachable("throw");\n
 \t\treturn this;\n
 \t}).exps = true;\n
 \n
-\treserve("class");\n
-\treserve("const");\n
-\treserve("enum");\n
-\treserve("export");\n
-\treserve("extends");\n
-\treserve("import");\n
-\treserve("super");\n
-\n
-\treserve("let");\n
-\treserve("yield");\n
-\treserve("implements");\n
-\treserve("interface");\n
-\treserve("package");\n
-\treserve("private");\n
-\treserve("protected");\n
-\treserve("public");\n
-\treserve("static");\n
+\tstmt("import", function () {\n
+\t\tif (!state.option.inESNext()) {\n
+\t\t\twarning("W119", state.tokens.curr, "import");\n
+\t\t}\n
+\n
+\t\tif (state.tokens.next.identifier) {\n
+\t\t\tthis.name = identifier();\n
+\t\t\taddlabel(this.name, "unused", state.tokens.curr);\n
+\t\t} else {\n
+\t\t\tadvance("{");\n
+\t\t\tfor (;;) {\n
+\t\t\t\tvar importName;\n
+\t\t\t\tif (state.tokens.next.type === "default") {\n
+\t\t\t\t\timportName = "default";\n
+\t\t\t\t\tadvance("default");\n
+\t\t\t\t} else {\n
+\t\t\t\t\timportName = identifier();\n
+\t\t\t\t}\n
+\t\t\t\tif (state.tokens.next.value === "as") {\n
+\t\t\t\t\tadvance("as");\n
+\t\t\t\t\timportName = identifier();\n
+\t\t\t\t}\n
+\t\t\t\taddlabel(importName, "unused", state.tokens.curr);\n
+\n
+\t\t\t\tif (state.tokens.next.value === ",") {\n
+\t\t\t\t\tadvance(",");\n
+\t\t\t\t} else if (state.tokens.next.value === "}") {\n
+\t\t\t\t\tadvance("}");\n
+\t\t\t\t\tbreak;\n
+\t\t\t\t} else {\n
+\t\t\t\t\terror("E024", state.tokens.next, state.tokens.next.value);\n
+\t\t\t\t\tbreak;\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tadvance("from");\n
+\t\tadvance("(string)");\n
+\t\treturn this;\n
+\t}).exps = true;\n
+\n
+\tstmt("export", function () {\n
+\t\tif (!state.option.inESNext()) {\n
+\t\t\twarning("W119", state.tokens.curr, "export");\n
+\t\t}\n
+\n
+\t\tif (state.tokens.next.type === "default") {\n
+\t\t\tadvance("default");\n
+\t\t\tif (state.tokens.next.id === "function" || state.tokens.next.id === "class") {\n
+\t\t\t\tthis.block = true;\n
+\t\t\t}\n
+\t\t\tthis.exportee = expression(10);\n
+\n
+\t\t\treturn this;\n
+\t\t}\n
+\n
+\t\tif (state.tokens.next.value === "{") {\n
+\t\t\tadvance("{");\n
+\t\t\tfor (;;) {\n
+\t\t\t\tidentifier();\n
+\n
+\t\t\t\tif (state.tokens.next.value === ",") {\n
+\t\t\t\t\tadvance(",");\n
+\t\t\t\t} else if (state.tokens.next.value === "}") {\n
+\t\t\t\t\tadvance("}");\n
+\t\t\t\t\tbreak;\n
+\t\t\t\t} else {\n
+\t\t\t\t\terror("E024", state.tokens.next, state.tokens.next.value);\n
+\t\t\t\t\tbreak;\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t\treturn this;\n
+\t\t}\n
+\n
+\t\tif (state.tokens.next.id === "var") {\n
+\t\t\tadvance("var");\n
+\t\t\tstate.syntax["var"].fud.call(state.syntax["var"].fud);\n
+\t\t} else if (state.tokens.next.id === "let") {\n
+\t\t\tadvance("let");\n
+\t\t\tstate.syntax["let"].fud.call(state.syntax["let"].fud);\n
+\t\t} else if (state.tokens.next.id === "const") {\n
+\t\t\tadvance("const");\n
+\t\t\tstate.syntax["const"].fud.call(state.syntax["const"].fud);\n
+\t\t} else if (state.tokens.next.id === "function") {\n
+\t\t\tthis.block = true;\n
+\t\t\tadvance("function");\n
+\t\t\tstate.syntax["function"].fud();\n
+\t\t} else if (state.tokens.next.id === "class") {\n
+\t\t\tthis.block = true;\n
+\t\t\tadvance("class");\n
+\t\t\tstate.syntax["class"].fud();\n
+\t\t} else {\n
+\t\t\terror("E024", state.tokens.next, state.tokens.next.value);\n
+\t\t}\n
+\n
+\t\treturn this;\n
+\t}).exps = true;\n
+\n
+\tFutureReservedWord("abstract");\n
+\tFutureReservedWord("boolean");\n
+\tFutureReservedWord("byte");\n
+\tFutureReservedWord("char");\n
+\tFutureReservedWord("class", { es5: true, nud: classdef });\n
+\tFutureReservedWord("double");\n
+\tFutureReservedWord("enum", { es5: true });\n
+\tFutureReservedWord("export", { es5: true });\n
+\tFutureReservedWord("extends", { es5: true });\n
+\tFutureReservedWord("final");\n
+\tFutureReservedWord("float");\n
+\tFutureReservedWord("goto");\n
+\tFutureReservedWord("implements", { es5: true, strictOnly: true });\n
+\tFutureReservedWord("import", { es5: true });\n
+\tFutureReservedWord("int");\n
+\tFutureReservedWord("interface", { es5: true, strictOnly: true });\n
+\tFutureReservedWord("long");\n
+\tFutureReservedWord("native");\n
+\tFutureReservedWord("package", { es5: true, strictOnly: true });\n
+\tFutureReservedWord("private", { es5: true, strictOnly: true });\n
+\tFutureReservedWord("protected", { es5: true, strictOnly: true });\n
+\tFutureReservedWord("public", { es5: true, strictOnly: true });\n
+\tFutureReservedWord("short");\n
+\tFutureReservedWord("static", { es5: true, strictOnly: true });\n
+\tFutureReservedWord("super", { es5: true });\n
+\tFutureReservedWord("synchronized");\n
+\tFutureReservedWord("throws");\n
+\tFutureReservedWord("transient");\n
+\tFutureReservedWord("volatile");\n
+\n
+\tvar lookupBlockType = function () {\n
+\t\tvar pn, pn1;\n
+\t\tvar i = 0;\n
+\t\tvar bracketStack = 0;\n
+\t\tvar ret = {};\n
+\t\tif (_.contains(["[", "{"], state.tokens.curr.value))\n
+\t\t\tbracketStack += 1;\n
+\t\tif (_.contains(["[", "{"], state.tokens.next.value))\n
+\t\t\tbracketStack += 1;\n
+\t\tif (_.contains(["]", "}"], state.tokens.next.value))\n
+\t\t\tbracketStack -= 1;\n
+\t\tdo {\n
+\t\t\tpn = peek(i);\n
+\t\t\tpn1 = peek(i + 1);\n
+\t\t\ti = i + 1;\n
+\t\t\tif (_.contains(["[", "{"], pn.value)) {\n
+\t\t\t\tbracketStack += 1;\n
+\t\t\t} else if (_.contains(["]", "}"], pn.value)) {\n
+\t\t\t\tbracketStack -= 1;\n
+\t\t\t}\n
+\t\t\tif (pn.identifier && pn.value === "for" && bracketStack === 1) {\n
+\t\t\t\tret.isCompArray = true;\n
+\t\t\t\tret.notJson = true;\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\t\t\tif (_.contains(["}", "]"], pn.value) && pn1.value === "=") {\n
+\t\t\t\tret.isDestAssign = true;\n
+\t\t\t\tret.notJson = true;\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\t\t\tif (pn.value === ";") {\n
+\t\t\t\tret.isBlock = true;\n
+\t\t\t\tret.notJson = true;\n
+\t\t\t}\n
+\t\t} while (bracketStack > 0 && pn.id !== "(end)" && i < 15);\n
+\t\treturn ret;\n
+\t};\n
+\tfunction destructuringAssignOrJsonValue() {\n
+\n
+\t\tvar block = lookupBlockType();\n
+\t\tif (block.notJson) {\n
+\t\t\tif (!state.option.inESNext() && block.isDestAssign) {\n
+\t\t\t\twarning("W104", state.tokens.curr, "destructuring assignment");\n
+\t\t\t}\n
+\t\t\tstatements();\n
+\t\t} else {\n
+\t\t\tstate.option.laxbreak = true;\n
+\t\t\tstate.jsonMode = true;\n
+\t\t\tjsonValue();\n
+\t\t}\n
+\t}\n
+\n
+\tvar arrayComprehension = function () {\n
+\t\tvar CompArray = function () {\n
+\t\t\tthis.mode = "use";\n
+\t\t\tthis.variables = [];\n
+\t\t};\n
+\t\tvar _carrays = [];\n
+\t\tvar _current;\n
+\t\tfunction declare(v) {\n
+\t\t\tvar l = _current.variables.filter(function (elt) {\n
+\t\t\t\tif (elt.value === v) {\n
+\t\t\t\t\telt.undef = false;\n
+\t\t\t\t\treturn v;\n
+\t\t\t\t}\n
+\t\t\t}).length;\n
+\t\t\treturn l !== 0;\n
+\t\t}\n
+\t\tfunction use(v) {\n
+\t\t\tvar l = _current.variables.filter(function (elt) {\n
+\t\t\t\tif (elt.value === v && !elt.undef) {\n
+\t\t\t\t\tif (elt.unused === true) {\n
+\t\t\t\t\t\telt.unused = false;\n
+\t\t\t\t\t}\n
+\t\t\t\t\treturn v;\n
+\t\t\t\t}\n
+\t\t\t}).length;\n
+\t\t\treturn (l === 0);\n
+\t\t}\n
+\t\treturn {stack: function () {\n
+\t\t\t\t\t_current = new CompArray();\n
+\t\t\t\t\t_carrays.push(_current);\n
+\t\t\t\t},\n
+\t\t\t\tunstack: function () {\n
+\t\t\t\t\t_current.variables.filter(function (v) {\n
+\t\t\t\t\t\tif (v.unused)\n
+\t\t\t\t\t\t\twarning("W098", v.token, v.value);\n
+\t\t\t\t\t\tif (v.undef)\n
+\t\t\t\t\t\t\tisundef(v.funct, "W117", v.token, v.value);\n
+\t\t\t\t\t});\n
+\t\t\t\t\t_carrays.splice(_carrays[_carrays.length - 1], 1);\n
+\t\t\t\t\t_current = _carrays[_carrays.length - 1];\n
+\t\t\t\t},\n
+\t\t\t\tsetState: function (s) {\n
+\t\t\t\t\tif (_.contains(["use", "define", "filter"], s))\n
+\t\t\t\t\t\t_current.mode = s;\n
+\t\t\t\t},\n
+\t\t\t\tcheck: function (v) {\n
+\t\t\t\t\tif (_current && _current.mode === "use") {\n
+\t\t\t\t\t\t_current.variables.push({funct: funct,\n
+\t\t\t\t\t\t\t\t\t\t\t\t\ttoken: state.tokens.curr,\n
+\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: v,\n
+\t\t\t\t\t\t\t\t\t\t\t\t\tundef: true,\n
+\t\t\t\t\t\t\t\t\t\t\t\t\tunused: false});\n
+\t\t\t\t\t\treturn true;\n
+\t\t\t\t\t} else if (_current && _current.mode === "define") {\n
+\t\t\t\t\t\tif (!declare(v)) {\n
+\t\t\t\t\t\t\t_current.variables.push({funct: funct,\n
+\t\t\t\t\t\t\t\t\t\t\t\t\t\ttoken: state.tokens.curr,\n
+\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: v,\n
+\t\t\t\t\t\t\t\t\t\t\t\t\t\tundef: false,\n
+\t\t\t\t\t\t\t\t\t\t\t\t\t\tunused: true});\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t\treturn true;\n
+\t\t\t\t\t} else if (_current && _current.mode === "filter") {\n
+\t\t\t\t\t\tif (use(v)) {\n
+\t\t\t\t\t\t\tisundef(funct, "W117", state.tokens.curr, v);\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t\treturn true;\n
+\t\t\t\t\t}\n
+\t\t\t\t\treturn false;\n
+\t\t\t\t}\n
+\t\t\t\t};\n
+\t};\n
 \n
 \tfunction jsonValue() {\n
 \n
 \t\tfunction jsonObject() {\n
-\t\t\tvar o = {}, t = nexttoken;\n
+\t\t\tvar o = {}, t = state.tokens.next;\n
 \t\t\tadvance("{");\n
-\t\t\tif (nexttoken.id !== "}") {\n
+\t\t\tif (state.tokens.next.id !== "}") {\n
 \t\t\t\tfor (;;) {\n
-\t\t\t\t\tif (nexttoken.id === "(end)") {\n
-\t\t\t\t\t\terror("Missing \'}\' to match \'{\' from line {a}.",\n
-\t\t\t\t\t\t\t\tnexttoken, t.line);\n
-\t\t\t\t\t} else if (nexttoken.id === "}") {\n
-\t\t\t\t\t\twarning("Unexpected comma.", token);\n
+\t\t\t\t\tif (state.tokens.next.id === "(end)") {\n
+\t\t\t\t\t\terror("E026", state.tokens.next, t.line);\n
+\t\t\t\t\t} else if (state.tokens.next.id === "}") {\n
+\t\t\t\t\t\twarning("W094", state.tokens.curr);\n
 \t\t\t\t\t\tbreak;\n
-\t\t\t\t\t} else if (nexttoken.id === ",") {\n
-\t\t\t\t\t\terror("Unexpected comma.", nexttoken);\n
-\t\t\t\t\t} else if (nexttoken.id !== "(string)") {\n
-\t\t\t\t\t\twarning("Expected a string and instead saw {a}.",\n
-\t\t\t\t\t\t\t\tnexttoken, nexttoken.value);\n
+\t\t\t\t\t} else if (state.tokens.next.id === ",") {\n
+\t\t\t\t\t\terror("E028", state.tokens.next);\n
+\t\t\t\t\t} else if (state.tokens.next.id !== "(string)") {\n
+\t\t\t\t\t\twarning("W095", state.tokens.next, state.tokens.next.value);\n
 \t\t\t\t\t}\n
-\t\t\t\t\tif (o[nexttoken.value] === true) {\n
-\t\t\t\t\t\twarning("Duplicate key \'{a}\'.",\n
-\t\t\t\t\t\t\t\tnexttoken, nexttoken.value);\n
-\t\t\t\t\t} else if ((nexttoken.value === "__proto__" &&\n
-\t\t\t\t\t\t!option.proto) || (nexttoken.value === "__iterator__" &&\n
-\t\t\t\t\t\t!option.iterator)) {\n
-\t\t\t\t\t\twarning("The \'{a}\' key may produce unexpected results.",\n
-\t\t\t\t\t\t\tnexttoken, nexttoken.value);\n
+\t\t\t\t\tif (o[state.tokens.next.value] === true) {\n
+\t\t\t\t\t\twarning("W075", state.tokens.next, state.tokens.next.value);\n
+\t\t\t\t\t} else if ((state.tokens.next.value === "__proto__" &&\n
+\t\t\t\t\t\t!state.option.proto) || (state.tokens.next.value === "__iterator__" &&\n
+\t\t\t\t\t\t!state.option.iterator)) {\n
+\t\t\t\t\t\twarning("W096", state.tokens.next, state.tokens.next.value);\n
 \t\t\t\t\t} else {\n
-\t\t\t\t\t\to[nexttoken.value] = true;\n
+\t\t\t\t\t\to[state.tokens.next.value] = true;\n
 \t\t\t\t\t}\n
 \t\t\t\t\tadvance();\n
 \t\t\t\t\tadvance(":");\n
 \t\t\t\t\tjsonValue();\n
-\t\t\t\t\tif (nexttoken.id !== ",") {\n
+\t\t\t\t\tif (state.tokens.next.id !== ",") {\n
 \t\t\t\t\t\tbreak;\n
 \t\t\t\t\t}\n
 \t\t\t\t\tadvance(",");\n
@@ -6122,21 +7838,20 @@ klass:\n
 \t\t}\n
 \n
 \t\tfunction jsonArray() {\n
-\t\t\tvar t = nexttoken;\n
+\t\t\tvar t = state.tokens.next;\n
 \t\t\tadvance("[");\n
-\t\t\tif (nexttoken.id !== "]") {\n
+\t\t\tif (state.tokens.next.id !== "]") {\n
 \t\t\t\tfor (;;) {\n
-\t\t\t\t\tif (nexttoken.id === "(end)") {\n
-\t\t\t\t\t\terror("Missing \']\' to match \'[\' from line {a}.",\n
-\t\t\t\t\t\t\t\tnexttoken, t.line);\n
-\t\t\t\t\t} else if (nexttoken.id === "]") {\n
-\t\t\t\t\t\twarning("Unexpected comma.", token);\n
+\t\t\t\t\tif (state.tokens.next.id === "(end)") {\n
+\t\t\t\t\t\terror("E027", state.tokens.next, t.line);\n
+\t\t\t\t\t} else if (state.tokens.next.id === "]") {\n
+\t\t\t\t\t\twarning("W094", state.tokens.curr);\n
 \t\t\t\t\t\tbreak;\n
-\t\t\t\t\t} else if (nexttoken.id === ",") {\n
-\t\t\t\t\t\terror("Unexpected comma.", nexttoken);\n
+\t\t\t\t\t} else if (state.tokens.next.id === ",") {\n
+\t\t\t\t\t\terror("E028", state.tokens.next);\n
 \t\t\t\t\t}\n
 \t\t\t\t\tjsonValue();\n
-\t\t\t\t\tif (nexttoken.id !== ",") {\n
+\t\t\t\t\tif (state.tokens.next.id !== ",") {\n
 \t\t\t\t\t\tbreak;\n
 \t\t\t\t\t}\n
 \t\t\t\t\tadvance(",");\n
@@ -6145,7 +7860,7 @@ klass:\n
 \t\t\tadvance("]");\n
 \t\t}\n
 \n
-\t\tswitch (nexttoken.id) {\n
+\t\tswitch (state.tokens.next.id) {\n
 \t\tcase "{":\n
 \t\t\tjsonObject();\n
 \t\t\tbreak;\n
@@ -6161,20 +7876,72 @@ klass:\n
 \t\t\tbreak;\n
 \t\tcase "-":\n
 \t\t\tadvance("-");\n
-\t\t\tif (token.character !== nexttoken.from) {\n
-\t\t\t\twarning("Unexpected space after \'-\'.", token);\n
+\t\t\tif (state.tokens.curr.character !== state.tokens.next.from) {\n
+\t\t\t\twarning("W011", state.tokens.curr);\n
 \t\t\t}\n
-\t\t\tadjacent(token, nexttoken);\n
+\t\t\tadjacent(state.tokens.curr, state.tokens.next);\n
 \t\t\tadvance("(number)");\n
 \t\t\tbreak;\n
 \t\tdefault:\n
-\t\t\terror("Expected a JSON value.", nexttoken);\n
+\t\t\terror("E003", state.tokens.next);\n
 \t\t}\n
 \t}\n
-\tvar itself = function (s, o, g) {\n
-\t\tvar a, i, k, x;\n
-\t\tvar optionKeys;\n
+\n
+\tvar blockScope = function () {\n
+\t\tvar _current = {};\n
+\t\tvar _variables = [_current];\n
+\n
+\t\tfunction _checkBlockLabels() {\n
+\t\t\tfor (var t in _current) {\n
+\t\t\t\tif (_current[t]["(type)"] === "unused") {\n
+\t\t\t\t\tif (state.option.unused) {\n
+\t\t\t\t\t\tvar tkn = _current[t]["(token)"];\n
+\t\t\t\t\t\tvar line = tkn.line;\n
+\t\t\t\t\t\tvar chr  = tkn.character;\n
+\t\t\t\t\t\twarningAt("W098", line, chr, t);\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\treturn {\n
+\t\t\tstack: function () {\n
+\t\t\t\t_current = {};\n
+\t\t\t\t_variables.push(_current);\n
+\t\t\t},\n
+\n
+\t\t\tunstack: function () {\n
+\t\t\t\t_checkBlockLabels();\n
+\t\t\t\t_variables.splice(_variables.length - 1, 1);\n
+\t\t\t\t_current = _.last(_variables);\n
+\t\t\t},\n
+\n
+\t\t\tgetlabel: function (l) {\n
+\t\t\t\tfor (var i = _variables.length - 1 ; i >= 0; --i) {\n
+\t\t\t\t\tif (_.has(_variables[i], l)) {\n
+\t\t\t\t\t\treturn _variables[i];\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\t\t\t},\n
+\n
+\t\t\tcurrent: {\n
+\t\t\t\thas: function (t) {\n
+\t\t\t\t\treturn _.has(_current, t);\n
+\t\t\t\t},\n
+\t\t\t\tadd: function (t, type, tok) {\n
+\t\t\t\t\t_current[t] = { "(type)" : type,\n
+\t\t\t\t\t\t\t\t\t"(token)": tok };\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t};\n
+\t};\n
+\tvar itself = function (s, o, g) {\n
+\t\tvar i, k, x;\n
+\t\tvar optionKeys;\n
 \t\tvar newOptionObj = {};\n
+\t\tvar newIgnoredObj = {};\n
+\n
+\t\tstate.reset();\n
 \n
 \t\tif (o && o.scope) {\n
 \t\t\tJSHINT.scope = o.scope;\n
@@ -6186,48 +7953,67 @@ klass:\n
 \t\t\tJSHINT.scope = "(main)";\n
 \t\t}\n
 \n
-\t\tpredefined = Object.create(standard);\n
-\t\tdeclared = Object.create(null);\n
+\t\tpredefined = Object.create(null);\n
+\t\tcombine(predefined, vars.ecmaIdentifiers);\n
+\t\tcombine(predefined, vars.reservedVars);\n
+\n
 \t\tcombine(predefined, g || {});\n
 \n
+\t\tdeclared = Object.create(null);\n
+\t\texported = Object.create(null);\n
+\n
+\t\tfunction each(obj, cb) {\n
+\t\t\tif (!obj)\n
+\t\t\t\treturn;\n
+\n
+\t\t\tif (!Array.isArray(obj) && typeof obj === "object")\n
+\t\t\t\tobj = Object.keys(obj);\n
+\n
+\t\t\tobj.forEach(cb);\n
+\t\t}\n
+\n
 \t\tif (o) {\n
-\t\t\ta = o.predef;\n
-\t\t\tif (a) {\n
-\t\t\t\tif (!Array.isArray(a) && typeof a === "object") {\n
-\t\t\t\t\ta = Object.keys(a);\n
-\t\t\t\t}\n
-\t\t\t\ta.forEach(function (item) {\n
-\t\t\t\t\tvar slice;\n
-\t\t\t\t\tif (item[0] === "-") {\n
-\t\t\t\t\t\tslice = item.slice(1);\n
-\t\t\t\t\t\tJSHINT.blacklist[slice] = slice;\n
-\t\t\t\t\t} else {\n
-\t\t\t\t\t\tpredefined[item] = true;\n
-\t\t\t\t\t}\n
-\t\t\t\t});\n
-\t\t\t}\n
+\t\t\teach(o.predef || null, function (item) {\n
+\t\t\t\tvar slice, prop;\n
+\n
+\t\t\t\tif (item[0] === "-") {\n
+\t\t\t\t\tslice = item.slice(1);\n
+\t\t\t\t\tJSHINT.blacklist[slice] = slice;\n
+\t\t\t\t} else {\n
+\t\t\t\t\tprop = Object.getOwnPropertyDescriptor(o.predef, item);\n
+\t\t\t\t\tpredefined[item] = prop ? prop.value : false;\n
+\t\t\t\t}\n
+\t\t\t});\n
+\n
+\t\t\teach(o.exported || null, function (item) {\n
+\t\t\t\texported[item] = true;\n
+\t\t\t});\n
+\n
+\t\t\tdelete o.predef;\n
+\t\t\tdelete o.exported;\n
 \n
 \t\t\toptionKeys = Object.keys(o);\n
 \t\t\tfor (x = 0; x < optionKeys.length; x++) {\n
-\t\t\t\tnewOptionObj[optionKeys[x]] = o[optionKeys[x]];\n
+\t\t\t\tif (/^-W\\d{3}$/g.test(optionKeys[x])) {\n
+\t\t\t\t\tnewIgnoredObj[optionKeys[x].slice(1)] = true;\n
+\t\t\t\t} else {\n
+\t\t\t\t\tnewOptionObj[optionKeys[x]] = o[optionKeys[x]];\n
 \n
-\t\t\t\tif (optionKeys[x] === "newcap" && o[optionKeys[x]] === false)\n
-\t\t\t\t\tnewOptionObj["(explicitNewcap)"] = true;\n
+\t\t\t\t\tif (optionKeys[x] === "newcap" && o[optionKeys[x]] === false)\n
+\t\t\t\t\t\tnewOptionObj["(explicitNewcap)"] = true;\n
 \n
-\t\t\t\tif (optionKeys[x] === "indent")\n
-\t\t\t\t\tnewOptionObj.white = true;\n
+\t\t\t\t\tif (optionKeys[x] === "indent")\n
+\t\t\t\t\t\tnewOptionObj["(explicitIndent)"] = o[optionKeys[x]] === false ? false : true;\n
+\t\t\t\t}\n
 \t\t\t}\n
 \t\t}\n
 \n
-\t\toption = newOptionObj;\n
+\t\tstate.option = newOptionObj;\n
+\t\tstate.ignored = newIgnoredObj;\n
 \n
-\t\toption.indent = option.indent || 4;\n
-\t\toption.maxerr = option.maxerr || 50;\n
+\t\tstate.option.indent = state.option.indent || 4;\n
+\t\tstate.option.maxerr = state.option.maxerr || 50;\n
 \n
-\t\ttab = "";\n
-\t\tfor (i = 0; i < option.indent; i += 1) {\n
-\t\t\ttab += " ";\n
-\t\t}\n
 \t\tindent = 1;\n
 \t\tglobal = Object.create(predefined);\n
 \t\tscope = global;\n
@@ -6238,7 +8024,9 @@ klass:\n
 \t\t\t"(breakage)": 0,\n
 \t\t\t"(loopage)":  0,\n
 \t\t\t"(tokens)":   {},\n
-\t\t\t"(metrics)":   createMetrics(nexttoken)\n
+\t\t\t"(metrics)":   createMetrics(state.tokens.next),\n
+\t\t\t"(blockscope)": blockScope(),\n
+\t\t\t"(comparray)": arrayComprehension()\n
 \t\t};\n
 \t\tfunctions = [funct];\n
 \t\turls = [];\n
@@ -6248,61 +8036,106 @@ klass:\n
 \t\timplied = {};\n
 \t\tinblock = false;\n
 \t\tlookahead = [];\n
-\t\tjsonmode = false;\n
 \t\twarnings = 0;\n
-\t\tlines = [];\n
 \t\tunuseds = [];\n
 \n
 \t\tif (!isString(s) && !Array.isArray(s)) {\n
-\t\t\terrorAt("Input is neither a string nor an array of strings.", 0);\n
+\t\t\terrorAt("E004", 0);\n
 \t\t\treturn false;\n
 \t\t}\n
 \n
-\t\tif (isString(s) && /^\\s*$/g.test(s)) {\n
-\t\t\terrorAt("Input is an empty string.", 0);\n
-\t\t\treturn false;\n
-\t\t}\n
+\t\tapi = {\n
+\t\t\tget isJSON() {\n
+\t\t\t\treturn state.jsonMode;\n
+\t\t\t},\n
 \n
-\t\tif (s.length === 0) {\n
-\t\t\terrorAt("Input is an empty array.", 0);\n
-\t\t\treturn false;\n
-\t\t}\n
+\t\t\tgetOption: function (name) {\n
+\t\t\t\treturn state.option[name] || null;\n
+\t\t\t},\n
+\n
+\t\t\tgetCache: function (name) {\n
+\t\t\t\treturn state.cache[name];\n
+\t\t\t},\n
+\n
+\t\t\tsetCache: function (name, value) {\n
+\t\t\t\tstate.cache[name] = value;\n
+\t\t\t},\n
+\n
+\t\t\twarn: function (code, data) {\n
+\t\t\t\twarningAt.apply(null, [ code, data.line, data.char ].concat(data.data));\n
+\t\t\t},\n
+\n
+\t\t\ton: function (names, listener) {\n
+\t\t\t\tnames.split(" ").forEach(function (name) {\n
+\t\t\t\t\temitter.on(name, listener);\n
+\t\t\t\t}.bind(this));\n
+\t\t\t}\n
+\t\t};\n
+\n
+\t\temitter.removeAllListeners();\n
+\t\t(extraModules || []).forEach(function (func) {\n
+\t\t\tfunc(api);\n
+\t\t});\n
+\n
+\t\tstate.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax["(begin)"];\n
+\n
+\t\tlex = new Lexer(s);\n
 \n
-\t\tlex.init(s);\n
+\t\tlex.on("warning", function (ev) {\n
+\t\t\twarningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data));\n
+\t\t});\n
+\n
+\t\tlex.on("error", function (ev) {\n
+\t\t\terrorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data));\n
+\t\t});\n
+\n
+\t\tlex.on("fatal", function (ev) {\n
+\t\t\tquit("E041", ev.line, ev.from);\n
+\t\t});\n
+\n
+\t\tlex.on("Identifier", function (ev) {\n
+\t\t\temitter.emit("Identifier", ev);\n
+\t\t});\n
+\n
+\t\tlex.on("String", function (ev) {\n
+\t\t\temitter.emit("String", ev);\n
+\t\t});\n
 \n
-\t\tprereg = true;\n
-\t\tdirective = {};\n
+\t\tlex.on("Number", function (ev) {\n
+\t\t\temitter.emit("Number", ev);\n
+\t\t});\n
 \n
-\t\tprevtoken = token = nexttoken = syntax["(begin)"];\n
+\t\tlex.start();\n
 \t\tfor (var name in o) {\n
-\t\t\tif (is_own(o, name)) {\n
-\t\t\t\tcheckOption(name, token);\n
+\t\t\tif (_.has(o, name)) {\n
+\t\t\t\tcheckOption(name, state.tokens.curr);\n
 \t\t\t}\n
 \t\t}\n
 \n
 \t\tassume();\n
 \t\tcombine(predefined, g || {});\n
 \t\tcomma.first = true;\n
-\t\tquotmark = undefined;\n
 \n
 \t\ttry {\n
 \t\t\tadvance();\n
-\t\t\tswitch (nexttoken.id) {\n
+\t\t\tswitch (state.tokens.next.id) {\n
 \t\t\tcase "{":\n
 \t\t\tcase "[":\n
-\t\t\t\toption.laxbreak = true;\n
-\t\t\t\tjsonmode = true;\n
-\t\t\t\tjsonValue();\n
+\t\t\t\tdestructuringAssignOrJsonValue();\n
 \t\t\t\tbreak;\n
 \t\t\tdefault:\n
 \t\t\t\tdirectives();\n
-\t\t\t\tif (directive["use strict"] && !option.globalstrict) {\n
-\t\t\t\t\twarning("Use the function form of \\"use strict\\".", prevtoken);\n
+\n
+\t\t\t\tif (state.directive["use strict"]) {\n
+\t\t\t\t\tif (!state.option.globalstrict && !state.option.node) {\n
+\t\t\t\t\t\twarning("W097", state.tokens.prev);\n
+\t\t\t\t\t}\n
 \t\t\t\t}\n
 \n
 \t\t\t\tstatements();\n
 \t\t\t}\n
-\t\t\tadvance((nexttoken && nexttoken.value !== ".")\t? "(end)" : undefined);\n
+\t\t\tadvance((state.tokens.next && state.tokens.next.value !== ".")\t? "(end)" : undefined);\n
+\t\t\tfunct["(blockscope)"].unstack();\n
 \n
 \t\t\tvar markDefined = function (name, context) {\n
 \t\t\t\tdo {\n
@@ -6338,12 +8171,29 @@ klass:\n
 \t\t\t\t\timplied[name] = newImplied;\n
 \t\t\t};\n
 \n
-\t\t\tvar warnUnused = function (name, token) {\n
-\t\t\t\tvar line = token.line;\n
-\t\t\t\tvar chr  = token.character;\n
+\t\t\tvar warnUnused = function (name, tkn, type, unused_opt) {\n
+\t\t\t\tvar line = tkn.line;\n
+\t\t\t\tvar chr  = tkn.character;\n
+\n
+\t\t\t\tif (unused_opt === undefined) {\n
+\t\t\t\t\tunused_opt = state.option.unused;\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (unused_opt === true) {\n
+\t\t\t\t\tunused_opt = "last-param";\n
+\t\t\t\t}\n
+\n
+\t\t\t\tvar warnable_types = {\n
+\t\t\t\t\t"vars": ["var"],\n
+\t\t\t\t\t"last-param": ["var", "param"],\n
+\t\t\t\t\t"strict": ["var", "param", "last-param"]\n
+\t\t\t\t};\n
 \n
-\t\t\t\tif (option.unused)\n
-\t\t\t\t\twarningAt("\'{a}\' is defined but never used.", line, chr, name);\n
+\t\t\t\tif (unused_opt) {\n
+\t\t\t\t\tif (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) {\n
+\t\t\t\t\t\twarningAt("W098", line, chr, name);\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
 \n
 \t\t\t\tunuseds.push({\n
 \t\t\t\t\tname: name,\n
@@ -6354,7 +8204,7 @@ klass:\n
 \n
 \t\t\tvar checkUnused = function (func, key) {\n
 \t\t\t\tvar type = func[key];\n
-\t\t\t\tvar token = func["(tokens)"][key];\n
+\t\t\t\tvar tkn = func["(tokens)"][key];\n
 \n
 \t\t\t\tif (key.charAt(0) === "(")\n
 \t\t\t\t\treturn;\n
@@ -6363,22 +8213,29 @@ klass:\n
 \t\t\t\t\treturn;\n
 \t\t\t\tif (func["(params)"] && func["(params)"].indexOf(key) !== -1)\n
 \t\t\t\t\treturn;\n
+\t\t\t\tif (func["(global)"] && _.has(exported, key)) {\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
 \n
-\t\t\t\twarnUnused(key, token);\n
+\t\t\t\twarnUnused(key, tkn, "var");\n
 \t\t\t};\n
 \t\t\tfor (i = 0; i < JSHINT.undefs.length; i += 1) {\n
 \t\t\t\tk = JSHINT.undefs[i].slice(0);\n
 \n
 \t\t\t\tif (markDefined(k[2].value, k[0])) {\n
 \t\t\t\t\tclearImplied(k[2].value, k[2].line);\n
-\t\t\t\t} else {\n
+\t\t\t\t} else if (state.option.undef) {\n
 \t\t\t\t\twarning.apply(warning, k.slice(1));\n
 \t\t\t\t}\n
 \t\t\t}\n
 \n
 \t\t\tfunctions.forEach(function (func) {\n
+\t\t\t\tif (func["(unusedOption)"] === false) {\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
+\n
 \t\t\t\tfor (var key in func) {\n
-\t\t\t\t\tif (is_own(func, key)) {\n
+\t\t\t\t\tif (_.has(func, key)) {\n
 \t\t\t\t\t\tcheckUnused(func, key);\n
 \t\t\t\t\t}\n
 \t\t\t\t}\n
@@ -6388,36 +8245,45 @@ klass:\n
 \n
 \t\t\t\tvar params = func["(params)"].slice();\n
 \t\t\t\tvar param  = params.pop();\n
-\t\t\t\tvar type;\n
+\t\t\t\tvar type, unused_opt;\n
 \n
 \t\t\t\twhile (param) {\n
 \t\t\t\t\ttype = func[param];\n
+\t\t\t\t\tunused_opt = func["(unusedOption)"] || state.option.unused;\n
+\t\t\t\t\tunused_opt = unused_opt === true ? "last-param" : unused_opt;\n
 \n
 \t\t\t\t\tif (param === "undefined")\n
 \t\t\t\t\t\treturn;\n
 \n
-\t\t\t\t\tif (type !== "unused" && type !== "unction")\n
+\t\t\t\t\tif (type === "unused" || type === "unction") {\n
+\t\t\t\t\t\twarnUnused(param, func["(tokens)"][param], "param", func["(unusedOption)"]);\n
+\t\t\t\t\t} else if (unused_opt === "last-param") {\n
 \t\t\t\t\t\treturn;\n
+\t\t\t\t\t}\n
 \n
-\t\t\t\t\twarnUnused(param, func["(tokens)"][param]);\n
 \t\t\t\t\tparam = params.pop();\n
 \t\t\t\t}\n
 \t\t\t});\n
 \n
 \t\t\tfor (var key in declared) {\n
-\t\t\t\tif (is_own(declared, key) && !is_own(global, key)) {\n
-\t\t\t\t\twarnUnused(key, declared[key]);\n
+\t\t\t\tif (_.has(declared, key) && !_.has(global, key)) {\n
+\t\t\t\t\twarnUnused(key, declared[key], "var");\n
 \t\t\t\t}\n
 \t\t\t}\n
-\t\t} catch (e) {\n
-\t\t\tif (e) {\n
-\t\t\t\tvar nt = nexttoken || {};\n
+\n
+\t\t} catch (err) {\n
+\t\t\tif (err && err.name === "JSHintError") {\n
+\t\t\t\tvar nt = state.tokens.next || {};\n
 \t\t\t\tJSHINT.errors.push({\n
-\t\t\t\t\traw\t\t  : e.raw,\n
-\t\t\t\t\treason\t  : e.message,\n
-\t\t\t\t\tline\t  : e.line || nt.line,\n
-\t\t\t\t\tcharacter : e.character || nt.from\n
+\t\t\t\t\tscope     : "(main)",\n
+\t\t\t\t\traw       : err.raw,\n
+\t\t\t\t\tcode      : err.code,\n
+\t\t\t\t\treason    : err.message,\n
+\t\t\t\t\tline      : err.line || nt.line,\n
+\t\t\t\t\tcharacter : err.character || nt.from\n
 \t\t\t\t}, null);\n
+\t\t\t} else {\n
+\t\t\t\tthrow err;\n
 \t\t\t}\n
 \t\t}\n
 \n
@@ -6433,10 +8299,15 @@ klass:\n
 \n
 \t\treturn JSHINT.errors.length === 0;\n
 \t};\n
+\titself.addModule = function (func) {\n
+\t\textraModules.push(func);\n
+\t};\n
+\n
+\titself.addModule(style.register);\n
 \titself.data = function () {\n
 \t\tvar data = {\n
 \t\t\tfunctions: [],\n
-\t\t\toptions: option\n
+\t\t\toptions: state.option\n
 \t\t};\n
 \t\tvar implieds = [];\n
 \t\tvar members = [];\n
@@ -6446,12 +8317,12 @@ klass:\n
 \t\t\tdata.errors = itself.errors;\n
 \t\t}\n
 \n
-\t\tif (jsonmode) {\n
+\t\tif (state.jsonMode) {\n
 \t\t\tdata.json = true;\n
 \t\t}\n
 \n
 \t\tfor (n in implied) {\n
-\t\t\tif (is_own(implied, n)) {\n
+\t\t\tif (_.has(implied, n)) {\n
 \t\t\t\timplieds.push({\n
 \t\t\t\t\tname: n,\n
 \t\t\t\t\tline: implied[n]\n
@@ -6518,6 +8389,1822 @@ if (typeof exports === "object" && exports) {\n
 \texports.JSHINT = JSHINT;\n
 }\n
 \n
+},\n
+{"../shared/messages.js":2,"../shared/vars.js":3,"./lex.js":5,"./reg.js":6,"./state.js":7,"./style.js":8,"console-browserify":9,"events":10,"underscore":1}],\n
+5:[function(req,module,exports){\n
+\n
+\n
+\n
+var _      = req("underscore");\n
+var events = req("events");\n
+var reg    = req("./reg.js");\n
+var state  = req("./state.js").state;\n
+\n
+var Token = {\n
+\tIdentifier: 1,\n
+\tPunctuator: 2,\n
+\tNumericLiteral: 3,\n
+\tStringLiteral: 4,\n
+\tComment: 5,\n
+\tKeyword: 6,\n
+\tNullLiteral: 7,\n
+\tBooleanLiteral: 8,\n
+\tRegExp: 9\n
+};\n
+\n
+var unicodeLetterTable = [\n
+\t170, 170, 181, 181, 186, 186, 192, 214,\n
+\t216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750,\n
+\t880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908,\n
+\t910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366,\n
+\t1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610,\n
+\t1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775,\n
+\t1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957,\n
+\t1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069,\n
+\t2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2308, 2361,\n
+\t2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431,\n
+\t2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482,\n
+\t2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\n
+\t2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608,\n
+\t2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654,\n
+\t2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736,\n
+\t2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785,\n
+\t2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867,\n
+\t2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929,\n
+\t2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970,\n
+\t2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001,\n
+\t3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123,\n
+\t3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212,\n
+\t3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261,\n
+\t3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344,\n
+\t3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\n
+\t3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526,\n
+\t3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716,\n
+\t3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743,\n
+\t3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760,\n
+\t3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805,\n
+\t3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138,\n
+\t4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198,\n
+\t4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4304, 4346,\n
+\t4348, 4348, 4352, 4680, 4682, 4685, 4688, 4694, 4696, 4696,\n
+\t4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789,\n
+\t4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880,\n
+\t4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740,\n
+\t5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900,\n
+\t5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000,\n
+\t6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312,\n
+\t6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516,\n
+\t6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823,\n
+\t6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7104, 7141,\n
+\t7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409,\n
+\t7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013,\n
+\t8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061,\n
+\t8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140,\n
+\t8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\n
+\t8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455,\n
+\t8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486,\n
+\t8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521,\n
+\t8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358,\n
+\t11360, 11492, 11499, 11502, 11520, 11557, 11568, 11621,\n
+\t11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694,\n
+\t11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726,\n
+\t11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295,\n
+\t12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438,\n
+\t12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589,\n
+\t12593, 12686, 12704, 12730, 12784, 12799, 13312, 13312,\n
+\t19893, 19893, 19968, 19968, 40907, 40907, 40960, 42124,\n
+\t42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539,\n
+\t42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783,\n
+\t42786, 42888, 42891, 42894, 42896, 42897, 42912, 42921,\n
+\t43002, 43009, 43011, 43013, 43015, 43018, 43020, 43042,\n
+\t43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\n
+\t43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442,\n
+\t43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595,\n
+\t43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697,\n
+\t43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714,\n
+\t43739, 43741, 43777, 43782, 43785, 43790, 43793, 43798,\n
+\t43808, 43814, 43816, 43822, 43968, 44002, 44032, 44032,\n
+\t55203, 55203, 55216, 55238, 55243, 55291, 63744, 64045,\n
+\t64048, 64109, 64112, 64217, 64256, 64262, 64275, 64279,\n
+\t64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316,\n
+\t64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433,\n
+\t64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\n
+\t65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370,\n
+\t65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495,\n
+\t65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594,\n
+\t65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786,\n
+\t65856, 65908, 66176, 66204, 66208, 66256, 66304, 66334,\n
+\t66352, 66378, 66432, 66461, 66464, 66499, 66504, 66511,\n
+\t66513, 66517, 66560, 66717, 67584, 67589, 67592, 67592,\n
+\t67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669,\n
+\t67840, 67861, 67872, 67897, 68096, 68096, 68112, 68115,\n
+\t68117, 68119, 68121, 68147, 68192, 68220, 68352, 68405,\n
+\t68416, 68437, 68448, 68466, 68608, 68680, 69635, 69687,\n
+\t69763, 69807, 73728, 74606, 74752, 74850, 77824, 78894,\n
+\t92160, 92728, 110592, 110593, 119808, 119892, 119894, 119964,\n
+\t119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980,\n
+\t119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069,\n
+\t120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121,\n
+\t120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144,\n
+\t120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570,\n
+\t120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686,\n
+\t120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779,\n
+\t131072, 131072, 173782, 173782, 173824, 173824, 177972, 177972,\n
+\t177984, 177984, 178205, 178205, 194560, 195101\n
+];\n
+\n
+var identifierStartTable = [];\n
+\n
+for (var i = 0; i < 128; i++) {\n
+\tidentifierStartTable[i] =\n
+\t\ti === 36 ||           // $\n
+\t\ti >= 65 && i <= 90 || // A-Z\n
+\t\ti === 95 ||           // _\n
+\t\ti >= 97 && i <= 122;  // a-z\n
+}\n
+\n
+var identifierPartTable = [];\n
+\n
+for (var i = 0; i < 128; i++) {\n
+\tidentifierPartTable[i] =\n
+\t\tidentifierStartTable[i] || // $, _, A-Z, a-z\n
+\t\ti >= 48 && i <= 57;        // 0-9\n
+}\n
+\n
+function asyncTrigger() {\n
+\tvar _checks = [];\n
+\n
+\treturn {\n
+\t\tpush: function (fn) {\n
+\t\t\t_checks.push(fn);\n
+\t\t},\n
+\n
+\t\tcheck: function () {\n
+\t\t\tfor (var check = 0; check < _checks.length; ++check) {\n
+\t\t\t\t_checks[check]();\n
+\t\t\t}\n
+\n
+\t\t\t_checks.splice(0, _checks.length);\n
+\t\t}\n
+\t};\n
+}\n
+function Lexer(source) {\n
+\tvar lines = source;\n
+\n
+\tif (typeof lines === "string") {\n
+\t\tlines = lines\n
+\t\t\t.replace(/\\r\\n/g, "\\n")\n
+\t\t\t.replace(/\\r/g, "\\n")\n
+\t\t\t.split("\\n");\n
+\t}\n
+\n
+\tif (lines[0] && lines[0].substr(0, 2) === "#!") {\n
+\t\tlines[0] = "";\n
+\t}\n
+\n
+\tthis.emitter = new events.EventEmitter();\n
+\tthis.source = source;\n
+\tthis.setLines(lines);\n
+\tthis.prereg = true;\n
+\n
+\tthis.line = 0;\n
+\tthis.char = 1;\n
+\tthis.from = 1;\n
+\tthis.input = "";\n
+\n
+\tfor (var i = 0; i < state.option.indent; i += 1) {\n
+\t\tstate.tab += " ";\n
+\t}\n
+}\n
+\n
+Lexer.prototype = {\n
+\t_lines: [],\n
+\n
+\tgetLines: function () {\n
+\t\tthis._lines = state.lines;\n
+\t\treturn this._lines;\n
+\t},\n
+\n
+\tsetLines: function (val) {\n
+\t\tthis._lines = val;\n
+\t\tstate.lines = this._lines;\n
+\t},\n
+\tpeek: function (i) {\n
+\t\treturn this.input.charAt(i || 0);\n
+\t},\n
+\tskip: function (i) {\n
+\t\ti = i || 1;\n
+\t\tthis.char += i;\n
+\t\tthis.input = this.input.slice(i);\n
+\t},\n
+\ton: function (names, listener) {\n
+\t\tnames.split(" ").forEach(function (name) {\n
+\t\t\tthis.emitter.on(name, listener);\n
+\t\t}.bind(this));\n
+\t},\n
+\ttrigger: function () {\n
+\t\tthis.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments));\n
+\t},\n
+\ttriggerAsync: function (type, args, checks, fn) {\n
+\t\tchecks.push(function () {\n
+\t\t\tif (fn()) {\n
+\t\t\t\tthis.trigger(type, args);\n
+\t\t\t}\n
+\t\t}.bind(this));\n
+\t},\n
+\tscanPunctuator: function () {\n
+\t\tvar ch1 = this.peek();\n
+\t\tvar ch2, ch3, ch4;\n
+\n
+\t\tswitch (ch1) {\n
+\t\tcase ".":\n
+\t\t\tif ((/^[0-9]$/).test(this.peek(1))) {\n
+\t\t\t\treturn null;\n
+\t\t\t}\n
+\t\t\tif (this.peek(1) === "." && this.peek(2) === ".") {\n
+\t\t\t\treturn {\n
+\t\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\t\tvalue: "..."\n
+\t\t\t\t};\n
+\t\t\t}\n
+\t\tcase "(":\n
+\t\tcase ")":\n
+\t\tcase ";":\n
+\t\tcase ",":\n
+\t\tcase "{":\n
+\t\tcase "}":\n
+\t\tcase "[":\n
+\t\tcase "]":\n
+\t\tcase ":":\n
+\t\tcase "~":\n
+\t\tcase "?":\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: ch1\n
+\t\t\t};\n
+\t\tcase "#":\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: ch1\n
+\t\t\t};\n
+\t\tcase "":\n
+\t\t\treturn null;\n
+\t\t}\n
+\n
+\t\tch2 = this.peek(1);\n
+\t\tch3 = this.peek(2);\n
+\t\tch4 = this.peek(3);\n
+\n
+\t\tif (ch1 === ">" && ch2 === ">" && ch3 === ">" && ch4 === "=") {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: ">>>="\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\tif (ch1 === "=" && ch2 === "=" && ch3 === "=") {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: "==="\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\tif (ch1 === "!" && ch2 === "=" && ch3 === "=") {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: "!=="\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\tif (ch1 === ">" && ch2 === ">" && ch3 === ">") {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: ">>>"\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\tif (ch1 === "<" && ch2 === "<" && ch3 === "=") {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: "<<="\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\tif (ch1 === ">" && ch2 === ">" && ch3 === "=") {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: ">>="\n
+\t\t\t};\n
+\t\t}\n
+\t\tif (ch1 === "=" && ch2 === ">") {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: ch1 + ch2\n
+\t\t\t};\n
+\t\t}\n
+\t\tif (ch1 === ch2 && ("+-<>&|".indexOf(ch1) >= 0)) {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: ch1 + ch2\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\tif ("<>=!+-*%&|^".indexOf(ch1) >= 0) {\n
+\t\t\tif (ch2 === "=") {\n
+\t\t\t\treturn {\n
+\t\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\t\tvalue: ch1 + ch2\n
+\t\t\t\t};\n
+\t\t\t}\n
+\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: ch1\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\tif (ch1 === "/") {\n
+\t\t\tif (ch2 === "=" && /\\/=(?!(\\S*\\/[gim]?))/.test(this.input)) {\n
+\t\t\t\treturn {\n
+\t\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\t\tvalue: "/="\n
+\t\t\t\t};\n
+\t\t\t}\n
+\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Punctuator,\n
+\t\t\t\tvalue: "/"\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\treturn null;\n
+\t},\n
+\tscanComments: function () {\n
+\t\tvar ch1 = this.peek();\n
+\t\tvar ch2 = this.peek(1);\n
+\t\tvar rest = this.input.substr(2);\n
+\t\tvar startLine = this.line;\n
+\t\tvar startChar = this.char;\n
+\n
+\t\tfunction commentToken(label, body, opt) {\n
+\t\t\tvar special = ["jshint", "jslint", "members", "member", "globals", "global", "exported"];\n
+\t\t\tvar isSpecial = false;\n
+\t\t\tvar value = label + body;\n
+\t\t\tvar commentType = "plain";\n
+\t\t\topt = opt || {};\n
+\n
+\t\t\tif (opt.isMultiline) {\n
+\t\t\t\tvalue += "*/";\n
+\t\t\t}\n
+\n
+\t\t\tspecial.forEach(function (str) {\n
+\t\t\t\tif (isSpecial) {\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
+\t\t\t\tif (label === "//" && str !== "jshint") {\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (body.substr(0, str.length) === str) {\n
+\t\t\t\t\tisSpecial = true;\n
+\t\t\t\t\tlabel = label + str;\n
+\t\t\t\t\tbody = body.substr(str.length);\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (!isSpecial && body.charAt(0) === " " && body.substr(1, str.length) === str) {\n
+\t\t\t\t\tisSpecial = true;\n
+\t\t\t\t\tlabel = label + " " + str;\n
+\t\t\t\t\tbody = body.substr(str.length + 1);\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (!isSpecial) {\n
+\t\t\t\t\treturn;\n
+\t\t\t\t}\n
+\n
+\t\t\t\tswitch (str) {\n
+\t\t\t\tcase "member":\n
+\t\t\t\t\tcommentType = "members";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "global":\n
+\t\t\t\t\tcommentType = "globals";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tdefault:\n
+\t\t\t\t\tcommentType = str;\n
+\t\t\t\t}\n
+\t\t\t});\n
+\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Comment,\n
+\t\t\t\tcommentType: commentType,\n
+\t\t\t\tvalue: value,\n
+\t\t\t\tbody: body,\n
+\t\t\t\tisSpecial: isSpecial,\n
+\t\t\t\tisMultiline: opt.isMultiline || false,\n
+\t\t\t\tisMalformed: opt.isMalformed || false\n
+\t\t\t};\n
+\t\t}\n
+\t\tif (ch1 === "*" && ch2 === "/") {\n
+\t\t\tthis.trigger("error", {\n
+\t\t\t\tcode: "E018",\n
+\t\t\t\tline: startLine,\n
+\t\t\t\tcharacter: startChar\n
+\t\t\t});\n
+\n
+\t\t\tthis.skip(2);\n
+\t\t\treturn null;\n
+\t\t}\n
+\t\tif (ch1 !== "/" || (ch2 !== "*" && ch2 !== "/")) {\n
+\t\t\treturn null;\n
+\t\t}\n
+\t\tif (ch2 === "/") {\n
+\t\t\tthis.skip(this.input.length); // Skip to the EOL.\n
+\t\t\treturn commentToken("//", rest);\n
+\t\t}\n
+\n
+\t\tvar body = "";\n
+\t\tif (ch2 === "*") {\n
+\t\t\tthis.skip(2);\n
+\n
+\t\t\twhile (this.peek() !== "*" || this.peek(1) !== "/") {\n
+\t\t\t\tif (this.peek() === "") { // End of Line\n
+\t\t\t\t\tbody += "\\n";\n
+\t\t\t\t\tif (!this.nextLine()) {\n
+\t\t\t\t\t\tthis.trigger("error", {\n
+\t\t\t\t\t\t\tcode: "E017",\n
+\t\t\t\t\t\t\tline: startLine,\n
+\t\t\t\t\t\t\tcharacter: startChar\n
+\t\t\t\t\t\t});\n
+\n
+\t\t\t\t\t\treturn commentToken("/*", body, {\n
+\t\t\t\t\t\t\tisMultiline: true,\n
+\t\t\t\t\t\t\tisMalformed: true\n
+\t\t\t\t\t\t});\n
+\t\t\t\t\t}\n
+\t\t\t\t} else {\n
+\t\t\t\t\tbody += this.peek();\n
+\t\t\t\t\tthis.skip();\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\tthis.skip(2);\n
+\t\t\treturn commentToken("/*", body, { isMultiline: true });\n
+\t\t}\n
+\t},\n
+\tscanKeyword: function () {\n
+\t\tvar result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input);\n
+\t\tvar keywords = [\n
+\t\t\t"if", "in", "do", "var", "for", "new",\n
+\t\t\t"try", "let", "this", "else", "case",\n
+\t\t\t"void", "with", "enum", "while", "break",\n
+\t\t\t"catch", "throw", "const", "yield", "class",\n
+\t\t\t"super", "return", "typeof", "delete",\n
+\t\t\t"switch", "export", "import", "default",\n
+\t\t\t"finally", "extends", "function", "continue",\n
+\t\t\t"debugger", "instanceof"\n
+\t\t];\n
+\n
+\t\tif (result && keywords.indexOf(result[0]) >= 0) {\n
+\t\t\treturn {\n
+\t\t\t\ttype: Token.Keyword,\n
+\t\t\t\tvalue: result[0]\n
+\t\t\t};\n
+\t\t}\n
+\n
+\t\treturn null;\n
+\t},\n
+\tscanIdentifier: function () {\n
+\t\tvar id = "";\n
+\t\tvar index = 0;\n
+\t\tvar type, char;\n
+\n
+\t\tfunction isUnicodeLetter(code) {\n
+\t\t\tfor (var i = 0; i < unicodeLetterTable.length;) {\n
+\t\t\t\tif (code < unicodeLetterTable[i++]) {\n
+\t\t\t\t\treturn false;\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (code <= unicodeLetterTable[i++]) {\n
+\t\t\t\t\treturn true;\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\treturn false;\n
+\t\t}\n
+\n
+\t\tfunction isHexDigit(str) {\n
+\t\t\treturn (/^[0-9a-fA-F]$/).test(str);\n
+\t\t}\n
+\n
+\t\tvar readUnicodeEscapeSequence = function () {\n
+\t\t\tindex += 1;\n
+\n
+\t\t\tif (this.peek(index) !== "u") {\n
+\t\t\t\treturn null;\n
+\t\t\t}\n
+\n
+\t\t\tvar ch1 = this.peek(index + 1);\n
+\t\t\tvar ch2 = this.peek(index + 2);\n
+\t\t\tvar ch3 = this.peek(index + 3);\n
+\t\t\tvar ch4 = this.peek(index + 4);\n
+\t\t\tvar code;\n
+\n
+\t\t\tif (isHexDigit(ch1) && isHexDigit(ch2) && isHexDigit(ch3) && isHexDigit(ch4)) {\n
+\t\t\t\tcode = parseInt(ch1 + ch2 + ch3 + ch4, 16);\n
+\n
+\t\t\t\tif (isUnicodeLetter(code)) {\n
+\t\t\t\t\tindex += 5;\n
+\t\t\t\t\treturn "\\\\u" + ch1 + ch2 + ch3 + ch4;\n
+\t\t\t\t}\n
+\n
+\t\t\t\treturn null;\n
+\t\t\t}\n
+\n
+\t\t\treturn null;\n
+\t\t}.bind(this);\n
+\n
+\t\tvar getIdentifierStart = function () {\n
+\t\t\tvar chr = this.peek(index);\n
+\t\t\tvar code = chr.charCodeAt(0);\n
+\n
+\t\t\tif (code === 92) {\n
+\t\t\t\treturn readUnicodeEscapeSequence();\n
+\t\t\t}\n
+\n
+\t\t\tif (code < 128) {\n
+\t\t\t\tif (identifierStartTable[code]) {\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t\treturn chr;\n
+\t\t\t\t}\n
+\n
+\t\t\t\treturn null;\n
+\t\t\t}\n
+\n
+\t\t\tif (isUnicodeLetter(code)) {\n
+\t\t\t\tindex += 1;\n
+\t\t\t\treturn chr;\n
+\t\t\t}\n
+\n
+\t\t\treturn null;\n
+\t\t}.bind(this);\n
+\n
+\t\tvar getIdentifierPart = function () {\n
+\t\t\tvar chr = this.peek(index);\n
+\t\t\tvar code = chr.charCodeAt(0);\n
+\n
+\t\t\tif (code === 92) {\n
+\t\t\t\treturn readUnicodeEscapeSequence();\n
+\t\t\t}\n
+\n
+\t\t\tif (code < 128) {\n
+\t\t\t\tif (identifierPartTable[code]) {\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t\treturn chr;\n
+\t\t\t\t}\n
+\n
+\t\t\t\treturn null;\n
+\t\t\t}\n
+\n
+\t\t\tif (isUnicodeLetter(code)) {\n
+\t\t\t\tindex += 1;\n
+\t\t\t\treturn chr;\n
+\t\t\t}\n
+\n
+\t\t\treturn null;\n
+\t\t}.bind(this);\n
+\n
+\t\tchar = getIdentifierStart();\n
+\t\tif (char === null) {\n
+\t\t\treturn null;\n
+\t\t}\n
+\n
+\t\tid = char;\n
+\t\tfor (;;) {\n
+\t\t\tchar = getIdentifierPart();\n
+\n
+\t\t\tif (char === null) {\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\n
+\t\t\tid += char;\n
+\t\t}\n
+\n
+\t\tswitch (id) {\n
+\t\tcase "true":\n
+\t\tcase "false":\n
+\t\t\ttype = Token.BooleanLiteral;\n
+\t\t\tbreak;\n
+\t\tcase "null":\n
+\t\t\ttype = Token.NullLiteral;\n
+\t\t\tbreak;\n
+\t\tdefault:\n
+\t\t\ttype = Token.Identifier;\n
+\t\t}\n
+\n
+\t\treturn {\n
+\t\t\ttype: type,\n
+\t\t\tvalue: id\n
+\t\t};\n
+\t},\n
+\tscanNumericLiteral: function () {\n
+\t\tvar index = 0;\n
+\t\tvar value = "";\n
+\t\tvar length = this.input.length;\n
+\t\tvar char = this.peek(index);\n
+\t\tvar bad;\n
+\n
+\t\tfunction isDecimalDigit(str) {\n
+\t\t\treturn (/^[0-9]$/).test(str);\n
+\t\t}\n
+\n
+\t\tfunction isOctalDigit(str) {\n
+\t\t\treturn (/^[0-7]$/).test(str);\n
+\t\t}\n
+\n
+\t\tfunction isHexDigit(str) {\n
+\t\t\treturn (/^[0-9a-fA-F]$/).test(str);\n
+\t\t}\n
+\n
+\t\tfunction isIdentifierStart(ch) {\n
+\t\t\treturn (ch === "$") || (ch === "_") || (ch === "\\\\") ||\n
+\t\t\t\t(ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z");\n
+\t\t}\n
+\n
+\t\tif (char !== "." && !isDecimalDigit(char)) {\n
+\t\t\treturn null;\n
+\t\t}\n
+\n
+\t\tif (char !== ".") {\n
+\t\t\tvalue = this.peek(index);\n
+\t\t\tindex += 1;\n
+\t\t\tchar = this.peek(index);\n
+\n
+\t\t\tif (value === "0") {\n
+\t\t\t\tif (char === "x" || char === "X") {\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t\tvalue += char;\n
+\n
+\t\t\t\t\twhile (index < length) {\n
+\t\t\t\t\t\tchar = this.peek(index);\n
+\t\t\t\t\t\tif (!isHexDigit(char)) {\n
+\t\t\t\t\t\t\tbreak;\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t\tvalue += char;\n
+\t\t\t\t\t\tindex += 1;\n
+\t\t\t\t\t}\n
+\n
+\t\t\t\t\tif (value.length <= 2) { // 0x\n
+\t\t\t\t\t\treturn {\n
+\t\t\t\t\t\t\ttype: Token.NumericLiteral,\n
+\t\t\t\t\t\t\tvalue: value,\n
+\t\t\t\t\t\t\tisMalformed: true\n
+\t\t\t\t\t\t};\n
+\t\t\t\t\t}\n
+\n
+\t\t\t\t\tif (index < length) {\n
+\t\t\t\t\t\tchar = this.peek(index);\n
+\t\t\t\t\t\tif (isIdentifierStart(char)) {\n
+\t\t\t\t\t\t\treturn null;\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t}\n
+\n
+\t\t\t\t\treturn {\n
+\t\t\t\t\t\ttype: Token.NumericLiteral,\n
+\t\t\t\t\t\tvalue: value,\n
+\t\t\t\t\t\tbase: 16,\n
+\t\t\t\t\t\tisMalformed: false\n
+\t\t\t\t\t};\n
+\t\t\t\t}\n
+\t\t\t\tif (isOctalDigit(char)) {\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t\tvalue += char;\n
+\t\t\t\t\tbad = false;\n
+\n
+\t\t\t\t\twhile (index < length) {\n
+\t\t\t\t\t\tchar = this.peek(index);\n
+\n
+\t\t\t\t\t\tif (isDecimalDigit(char)) {\n
+\t\t\t\t\t\t\tbad = true;\n
+\t\t\t\t\t\t} else if (!isOctalDigit(char)) {\n
+\t\t\t\t\t\t\tbreak;\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t\tvalue += char;\n
+\t\t\t\t\t\tindex += 1;\n
+\t\t\t\t\t}\n
+\n
+\t\t\t\t\tif (index < length) {\n
+\t\t\t\t\t\tchar = this.peek(index);\n
+\t\t\t\t\t\tif (isIdentifierStart(char)) {\n
+\t\t\t\t\t\t\treturn null;\n
+\t\t\t\t\t\t}\n
+\t\t\t\t\t}\n
+\n
+\t\t\t\t\treturn {\n
+\t\t\t\t\t\ttype: Token.NumericLiteral,\n
+\t\t\t\t\t\tvalue: value,\n
+\t\t\t\t\t\tbase: 8,\n
+\t\t\t\t\t\tisMalformed: false\n
+\t\t\t\t\t};\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (isDecimalDigit(char)) {\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t\tvalue += char;\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\twhile (index < length) {\n
+\t\t\t\tchar = this.peek(index);\n
+\t\t\t\tif (!isDecimalDigit(char)) {\n
+\t\t\t\t\tbreak;\n
+\t\t\t\t}\n
+\t\t\t\tvalue += char;\n
+\t\t\t\tindex += 1;\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tif (char === ".") {\n
+\t\t\tvalue += char;\n
+\t\t\tindex += 1;\n
+\n
+\t\t\twhile (index < length) {\n
+\t\t\t\tchar = this.peek(index);\n
+\t\t\t\tif (!isDecimalDigit(char)) {\n
+\t\t\t\t\tbreak;\n
+\t\t\t\t}\n
+\t\t\t\tvalue += char;\n
+\t\t\t\tindex += 1;\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tif (char === "e" || char === "E") {\n
+\t\t\tvalue += char;\n
+\t\t\tindex += 1;\n
+\t\t\tchar = this.peek(index);\n
+\n
+\t\t\tif (char === "+" || char === "-") {\n
+\t\t\t\tvalue += this.peek(index);\n
+\t\t\t\tindex += 1;\n
+\t\t\t}\n
+\n
+\t\t\tchar = this.peek(index);\n
+\t\t\tif (isDecimalDigit(char)) {\n
+\t\t\t\tvalue += char;\n
+\t\t\t\tindex += 1;\n
+\n
+\t\t\t\twhile (index < length) {\n
+\t\t\t\t\tchar = this.peek(index);\n
+\t\t\t\t\tif (!isDecimalDigit(char)) {\n
+\t\t\t\t\t\tbreak;\n
+\t\t\t\t\t}\n
+\t\t\t\t\tvalue += char;\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t}\n
+\t\t\t} else {\n
+\t\t\t\treturn null;\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tif (index < length) {\n
+\t\t\tchar = this.peek(index);\n
+\t\t\tif (isIdentifierStart(char)) {\n
+\t\t\t\treturn null;\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\treturn {\n
+\t\t\ttype: Token.NumericLiteral,\n
+\t\t\tvalue: value,\n
+\t\t\tbase: 10,\n
+\t\t\tisMalformed: !isFinite(value)\n
+\t\t};\n
+\t},\n
+\tscanStringLiteral: function (checks) {\n
+\t\tvar quote = this.peek();\n
+\t\tif (quote !== "\\"" && quote !== "\'") {\n
+\t\t\treturn null;\n
+\t\t}\n
+\t\tthis.triggerAsync("warning", {\n
+\t\t\tcode: "W108",\n
+\t\t\tline: this.line,\n
+\t\t\tcharacter: this.char // +1?\n
+\t\t}, checks, function () { return state.jsonMode && quote !== "\\""; });\n
+\n
+\t\tvar value = "";\n
+\t\tvar startLine = this.line;\n
+\t\tvar startChar = this.char;\n
+\t\tvar allowNewLine = false;\n
+\n
+\t\tthis.skip();\n
+\n
+\t\twhile (this.peek() !== quote) {\n
+\t\t\twhile (this.peek() === "") { // End Of Line\n
+\n
+\t\t\t\tif (!allowNewLine) {\n
+\t\t\t\t\tthis.trigger("warning", {\n
+\t\t\t\t\t\tcode: "W112",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char\n
+\t\t\t\t\t});\n
+\t\t\t\t} else {\n
+\t\t\t\t\tallowNewLine = false;\n
+\n
+\t\t\t\t\tthis.triggerAsync("warning", {\n
+\t\t\t\t\t\tcode: "W043",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char\n
+\t\t\t\t\t}, checks, function () { return !state.option.multistr; });\n
+\n
+\t\t\t\t\tthis.triggerAsync("warning", {\n
+\t\t\t\t\t\tcode: "W042",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char\n
+\t\t\t\t\t}, checks, function () { return state.jsonMode && state.option.multistr; });\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (!this.nextLine()) {\n
+\t\t\t\t\tthis.trigger("error", {\n
+\t\t\t\t\t\tcode: "E029",\n
+\t\t\t\t\t\tline: startLine,\n
+\t\t\t\t\t\tcharacter: startChar\n
+\t\t\t\t\t});\n
+\n
+\t\t\t\t\treturn {\n
+\t\t\t\t\t\ttype: Token.StringLiteral,\n
+\t\t\t\t\t\tvalue: value,\n
+\t\t\t\t\t\tisUnclosed: true,\n
+\t\t\t\t\t\tquote: quote\n
+\t\t\t\t\t};\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\tallowNewLine = false;\n
+\t\t\tvar char = this.peek();\n
+\t\t\tvar jump = 1; // A length of a jump, after we\'re done\n
+\n
+\t\t\tif (char < " ") {\n
+\t\t\t\tthis.trigger("warning", {\n
+\t\t\t\t\tcode: "W113",\n
+\t\t\t\t\tline: this.line,\n
+\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\tdata: [ "<non-printable>" ]\n
+\t\t\t\t});\n
+\t\t\t}\n
+\n
+\t\t\tif (char === "\\\\") {\n
+\t\t\t\tthis.skip();\n
+\t\t\t\tchar = this.peek();\n
+\n
+\t\t\t\tswitch (char) {\n
+\t\t\t\tcase "\'":\n
+\t\t\t\t\tthis.triggerAsync("warning", {\n
+\t\t\t\t\t\tcode: "W114",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\t\tdata: [ "\\\\\'" ]\n
+\t\t\t\t\t}, checks, function () {return state.jsonMode; });\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "b":\n
+\t\t\t\t\tchar = "\\b";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "f":\n
+\t\t\t\t\tchar = "\\f";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "n":\n
+\t\t\t\t\tchar = "\\n";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "r":\n
+\t\t\t\t\tchar = "\\r";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "t":\n
+\t\t\t\t\tchar = "\\t";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "0":\n
+\t\t\t\t\tchar = "\\0";\n
+\t\t\t\t\tvar n = parseInt(this.peek(1), 10);\n
+\t\t\t\t\tthis.triggerAsync("warning", {\n
+\t\t\t\t\t\tcode: "W115",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char\n
+\t\t\t\t\t}, checks,\n
+\t\t\t\t\tfunction () { return n >= 0 && n <= 7 && state.directive["use strict"]; });\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "u":\n
+\t\t\t\t\tchar = String.fromCharCode(parseInt(this.input.substr(1, 4), 16));\n
+\t\t\t\t\tjump = 5;\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "v":\n
+\t\t\t\t\tthis.triggerAsync("warning", {\n
+\t\t\t\t\t\tcode: "W114",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\t\tdata: [ "\\\\v" ]\n
+\t\t\t\t\t}, checks, function () { return state.jsonMode; });\n
+\n
+\t\t\t\t\tchar = "\\v";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "x":\n
+\t\t\t\t\tvar\tx = parseInt(this.input.substr(1, 2), 16);\n
+\n
+\t\t\t\t\tthis.triggerAsync("warning", {\n
+\t\t\t\t\t\tcode: "W114",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\t\tdata: [ "\\\\x-" ]\n
+\t\t\t\t\t}, checks, function () { return state.jsonMode; });\n
+\n
+\t\t\t\t\tchar = String.fromCharCode(x);\n
+\t\t\t\t\tjump = 3;\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "\\\\":\n
+\t\t\t\tcase "\\"":\n
+\t\t\t\tcase "/":\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "":\n
+\t\t\t\t\tallowNewLine = true;\n
+\t\t\t\t\tchar = "";\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tcase "!":\n
+\t\t\t\t\tif (value.slice(value.length - 2) === "<") {\n
+\t\t\t\t\t\tbreak;\n
+\t\t\t\t\t}\n
+\t\t\t\tdefault:\n
+\t\t\t\t\tthis.trigger("warning", {\n
+\t\t\t\t\t\tcode: "W044",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char\n
+\t\t\t\t\t});\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\tvalue += char;\n
+\t\t\tthis.skip(jump);\n
+\t\t}\n
+\n
+\t\tthis.skip();\n
+\t\treturn {\n
+\t\t\ttype: Token.StringLiteral,\n
+\t\t\tvalue: value,\n
+\t\t\tisUnclosed: false,\n
+\t\t\tquote: quote\n
+\t\t};\n
+\t},\n
+\tscanRegExp: function () {\n
+\t\tvar index = 0;\n
+\t\tvar length = this.input.length;\n
+\t\tvar char = this.peek();\n
+\t\tvar value = char;\n
+\t\tvar body = "";\n
+\t\tvar flags = [];\n
+\t\tvar malformed = false;\n
+\t\tvar isCharSet = false;\n
+\t\tvar terminated;\n
+\n
+\t\tvar scanUnexpectedChars = function () {\n
+\t\t\tif (char < " ") {\n
+\t\t\t\tmalformed = true;\n
+\t\t\t\tthis.trigger("warning", {\n
+\t\t\t\t\tcode: "W048",\n
+\t\t\t\t\tline: this.line,\n
+\t\t\t\t\tcharacter: this.char\n
+\t\t\t\t});\n
+\t\t\t}\n
+\t\t\tif (char === "<") {\n
+\t\t\t\tmalformed = true;\n
+\t\t\t\tthis.trigger("warning", {\n
+\t\t\t\t\tcode: "W049",\n
+\t\t\t\t\tline: this.line,\n
+\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\tdata: [ char ]\n
+\t\t\t\t});\n
+\t\t\t}\n
+\t\t}.bind(this);\n
+\t\tif (!this.prereg || char !== "/") {\n
+\t\t\treturn null;\n
+\t\t}\n
+\n
+\t\tindex += 1;\n
+\t\tterminated = false;\n
+\n
+\t\twhile (index < length) {\n
+\t\t\tchar = this.peek(index);\n
+\t\t\tvalue += char;\n
+\t\t\tbody += char;\n
+\n
+\t\t\tif (isCharSet) {\n
+\t\t\t\tif (char === "]") {\n
+\t\t\t\t\tif (this.peek(index - 1) !== "\\\\" || this.peek(index - 2) === "\\\\") {\n
+\t\t\t\t\t\tisCharSet = false;\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (char === "\\\\") {\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t\tchar = this.peek(index);\n
+\t\t\t\t\tbody += char;\n
+\t\t\t\t\tvalue += char;\n
+\n
+\t\t\t\t\tscanUnexpectedChars();\n
+\t\t\t\t}\n
+\n
+\t\t\t\tindex += 1;\n
+\t\t\t\tcontinue;\n
+\t\t\t}\n
+\n
+\t\t\tif (char === "\\\\") {\n
+\t\t\t\tindex += 1;\n
+\t\t\t\tchar = this.peek(index);\n
+\t\t\t\tbody += char;\n
+\t\t\t\tvalue += char;\n
+\n
+\t\t\t\tscanUnexpectedChars();\n
+\n
+\t\t\t\tif (char === "/") {\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t\tcontinue;\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (char === "[") {\n
+\t\t\t\t\tindex += 1;\n
+\t\t\t\t\tcontinue;\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\tif (char === "[") {\n
+\t\t\t\tisCharSet = true;\n
+\t\t\t\tindex += 1;\n
+\t\t\t\tcontinue;\n
+\t\t\t}\n
+\n
+\t\t\tif (char === "/") {\n
+\t\t\t\tbody = body.substr(0, body.length - 1);\n
+\t\t\t\tterminated = true;\n
+\t\t\t\tindex += 1;\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\n
+\t\t\tindex += 1;\n
+\t\t}\n
+\n
+\t\tif (!terminated) {\n
+\t\t\tthis.trigger("error", {\n
+\t\t\t\tcode: "E015",\n
+\t\t\t\tline: this.line,\n
+\t\t\t\tcharacter: this.from\n
+\t\t\t});\n
+\n
+\t\t\treturn void this.trigger("fatal", {\n
+\t\t\t\tline: this.line,\n
+\t\t\t\tfrom: this.from\n
+\t\t\t});\n
+\t\t}\n
+\n
+\t\twhile (index < length) {\n
+\t\t\tchar = this.peek(index);\n
+\t\t\tif (!/[gim]/.test(char)) {\n
+\t\t\t\tbreak;\n
+\t\t\t}\n
+\t\t\tflags.push(char);\n
+\t\t\tvalue += char;\n
+\t\t\tindex += 1;\n
+\t\t}\n
+\n
+\t\ttry {\n
+\t\t\tnew RegExp(body, flags.join(""));\n
+\t\t} catch (err) {\n
+\t\t\tmalformed = true;\n
+\t\t\tthis.trigger("error", {\n
+\t\t\t\tcode: "E016",\n
+\t\t\t\tline: this.line,\n
+\t\t\t\tcharacter: this.char,\n
+\t\t\t\tdata: [ err.message ] // Platform dependent!\n
+\t\t\t});\n
+\t\t}\n
+\n
+\t\treturn {\n
+\t\t\ttype: Token.RegExp,\n
+\t\t\tvalue: value,\n
+\t\t\tflags: flags,\n
+\t\t\tisMalformed: malformed\n
+\t\t};\n
+\t},\n
+\tscanMixedSpacesAndTabs: function () {\n
+\t\tvar at, match;\n
+\n
+\t\tif (state.option.smarttabs) {\n
+\t\t\tmatch = this.input.match(/(\\/\\/|^\\s?\\*)? \\t/);\n
+\t\t\tat = match && !match[1] ? 0 : -1;\n
+\t\t} else {\n
+\t\t\tat = this.input.search(/ \\t|\\t [^\\*]/);\n
+\t\t}\n
+\n
+\t\treturn at;\n
+\t},\n
+\tscanUnsafeChars: function () {\n
+\t\treturn this.input.search(reg.unsafeChars);\n
+\t},\n
+\tnext: function (checks) {\n
+\t\tthis.from = this.char;\n
+\t\tvar start;\n
+\t\tif (/\\s/.test(this.peek())) {\n
+\t\t\tstart = this.char;\n
+\n
+\t\t\twhile (/\\s/.test(this.peek())) {\n
+\t\t\t\tthis.from += 1;\n
+\t\t\t\tthis.skip();\n
+\t\t\t}\n
+\n
+\t\t\tif (this.peek() === "") { // EOL\n
+\t\t\t\tif (!/^\\s*$/.test(this.getLines()[this.line - 1]) && state.option.trailing) {\n
+\t\t\t\t\tthis.trigger("warning", { code: "W102", line: this.line, character: start });\n
+\t\t\t\t}\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tvar match = this.scanComments() ||\n
+\t\t\tthis.scanStringLiteral(checks);\n
+\n
+\t\tif (match) {\n
+\t\t\treturn match;\n
+\t\t}\n
+\n
+\t\tmatch =\n
+\t\t\tthis.scanRegExp() ||\n
+\t\t\tthis.scanPunctuator() ||\n
+\t\t\tthis.scanKeyword() ||\n
+\t\t\tthis.scanIdentifier() ||\n
+\t\t\tthis.scanNumericLiteral();\n
+\n
+\t\tif (match) {\n
+\t\t\tthis.skip(match.value.length);\n
+\t\t\treturn match;\n
+\t\t}\n
+\n
+\t\treturn null;\n
+\t},\n
+\tnextLine: function () {\n
+\t\tvar char;\n
+\n
+\t\tif (this.line >= this.getLines().length) {\n
+\t\t\treturn false;\n
+\t\t}\n
+\n
+\t\tthis.input = this.getLines()[this.line];\n
+\t\tthis.line += 1;\n
+\t\tthis.char = 1;\n
+\t\tthis.from = 1;\n
+\n
+\t\tchar = this.scanMixedSpacesAndTabs();\n
+\t\tif (char >= 0) {\n
+\t\t\tthis.trigger("warning", { code: "W099", line: this.line, character: char + 1 });\n
+\t\t}\n
+\n
+\t\tthis.input = this.input.replace(/\\t/g, state.tab);\n
+\t\tchar = this.scanUnsafeChars();\n
+\n
+\t\tif (char >= 0) {\n
+\t\t\tthis.trigger("warning", { code: "W100", line: this.line, character: char });\n
+\t\t}\n
+\n
+\t\tif (state.option.maxlen && state.option.maxlen < this.input.length) {\n
+\t\t\tthis.trigger("warning", { code: "W101", line: this.line, character: this.input.length });\n
+\t\t}\n
+\n
+\t\treturn true;\n
+\t},\n
+\tstart: function () {\n
+\t\tthis.nextLine();\n
+\t},\n
+\ttoken: function () {\n
+\t\tvar checks = asyncTrigger();\n
+\t\tvar token;\n
+\n
+\n
+\t\tfunction isReserved(token, isProperty) {\n
+\t\t\tif (!token.reserved) {\n
+\t\t\t\treturn false;\n
+\t\t\t}\n
+\t\t\tvar meta = token.meta;\n
+\n
+\t\t\tif (meta && meta.isFutureReservedWord && state.option.inES5()) {\n
+\t\t\t\tif (!meta.es5) {\n
+\t\t\t\t\treturn false;\n
+\t\t\t\t}\n
+\t\t\t\tif (meta.strictOnly) {\n
+\t\t\t\t\tif (!state.option.strict && !state.directive["use strict"]) {\n
+\t\t\t\t\t\treturn false;\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (isProperty) {\n
+\t\t\t\t\treturn false;\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\treturn true;\n
+\t\t}\n
+\t\tvar create = function (type, value, isProperty) {\n
+\t\t\tvar obj;\n
+\n
+\t\t\tif (type !== "(endline)" && type !== "(end)") {\n
+\t\t\t\tthis.prereg = false;\n
+\t\t\t}\n
+\n
+\t\t\tif (type === "(punctuator)") {\n
+\t\t\t\tswitch (value) {\n
+\t\t\t\tcase ".":\n
+\t\t\t\tcase ")":\n
+\t\t\t\tcase "~":\n
+\t\t\t\tcase "#":\n
+\t\t\t\tcase "]":\n
+\t\t\t\t\tthis.prereg = false;\n
+\t\t\t\t\tbreak;\n
+\t\t\t\tdefault:\n
+\t\t\t\t\tthis.prereg = true;\n
+\t\t\t\t}\n
+\n
+\t\t\t\tobj = Object.create(state.syntax[value] || state.syntax["(error)"]);\n
+\t\t\t}\n
+\n
+\t\t\tif (type === "(identifier)") {\n
+\t\t\t\tif (value === "return" || value === "case" || value === "typeof") {\n
+\t\t\t\t\tthis.prereg = true;\n
+\t\t\t\t}\n
+\n
+\t\t\t\tif (_.has(state.syntax, value)) {\n
+\t\t\t\t\tobj = Object.create(state.syntax[value] || state.syntax["(error)"]);\n
+\t\t\t\t\tif (!isReserved(obj, isProperty && type === "(identifier)")) {\n
+\t\t\t\t\t\tobj = null;\n
+\t\t\t\t\t}\n
+\t\t\t\t}\n
+\t\t\t}\n
+\n
+\t\t\tif (!obj) {\n
+\t\t\t\tobj = Object.create(state.syntax[type]);\n
+\t\t\t}\n
+\n
+\t\t\tobj.identifier = (type === "(identifier)");\n
+\t\t\tobj.type = obj.type || type;\n
+\t\t\tobj.value = value;\n
+\t\t\tobj.line = this.line;\n
+\t\t\tobj.character = this.char;\n
+\t\t\tobj.from = this.from;\n
+\n
+\t\t\tif (isProperty && obj.identifier) {\n
+\t\t\t\tobj.isProperty = isProperty;\n
+\t\t\t}\n
+\n
+\t\t\tobj.check = checks.check;\n
+\n
+\t\t\treturn obj;\n
+\t\t}.bind(this);\n
+\n
+\t\tfor (;;) {\n
+\t\t\tif (!this.input.length) {\n
+\t\t\t\treturn create(this.nextLine() ? "(endline)" : "(end)", "");\n
+\t\t\t}\n
+\n
+\t\t\ttoken = this.next(checks);\n
+\n
+\t\t\tif (!token) {\n
+\t\t\t\tif (this.input.length) {\n
+\t\t\t\t\tthis.trigger("error", {\n
+\t\t\t\t\t\tcode: "E024",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\t\tdata: [ this.peek() ]\n
+\t\t\t\t\t});\n
+\n
+\t\t\t\t\tthis.input = "";\n
+\t\t\t\t}\n
+\n
+\t\t\t\tcontinue;\n
+\t\t\t}\n
+\n
+\t\t\tswitch (token.type) {\n
+\t\t\tcase Token.StringLiteral:\n
+\t\t\t\tthis.triggerAsync("String", {\n
+\t\t\t\t\tline: this.line,\n
+\t\t\t\t\tchar: this.char,\n
+\t\t\t\t\tfrom: this.from,\n
+\t\t\t\t\tvalue: token.value,\n
+\t\t\t\t\tquote: token.quote\n
+\t\t\t\t}, checks, function () { return true; });\n
+\n
+\t\t\t\treturn create("(string)", token.value);\n
+\t\t\tcase Token.Identifier:\n
+\t\t\t\tthis.trigger("Identifier", {\n
+\t\t\t\t\tline: this.line,\n
+\t\t\t\t\tchar: this.char,\n
+\t\t\t\t\tfrom: this.form,\n
+\t\t\t\t\tname: token.value,\n
+\t\t\t\t\tisProperty: state.tokens.curr.id === "."\n
+\t\t\t\t});\n
+\t\t\tcase Token.Keyword:\n
+\t\t\tcase Token.NullLiteral:\n
+\t\t\tcase Token.BooleanLiteral:\n
+\t\t\t\treturn create("(identifier)", token.value, state.tokens.curr.id === ".");\n
+\n
+\t\t\tcase Token.NumericLiteral:\n
+\t\t\t\tif (token.isMalformed) {\n
+\t\t\t\t\tthis.trigger("warning", {\n
+\t\t\t\t\t\tcode: "W045",\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\t\tdata: [ token.value ]\n
+\t\t\t\t\t});\n
+\t\t\t\t}\n
+\n
+\t\t\t\tthis.triggerAsync("warning", {\n
+\t\t\t\t\tcode: "W114",\n
+\t\t\t\t\tline: this.line,\n
+\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\tdata: [ "0x-" ]\n
+\t\t\t\t}, checks, function () { return token.base === 16 && state.jsonMode; });\n
+\n
+\t\t\t\tthis.triggerAsync("warning", {\n
+\t\t\t\t\tcode: "W115",\n
+\t\t\t\t\tline: this.line,\n
+\t\t\t\t\tcharacter: this.char\n
+\t\t\t\t}, checks, function () {\n
+\t\t\t\t\treturn state.directive["use strict"] && token.base === 8; \n
+\t\t\t\t});\n
+\n
+\t\t\t\tthis.trigger("Number", {\n
+\t\t\t\t\tline: this.line,\n
+\t\t\t\t\tchar: this.char,\n
+\t\t\t\t\tfrom: this.from,\n
+\t\t\t\t\tvalue: token.value,\n
+\t\t\t\t\tbase: token.base,\n
+\t\t\t\t\tisMalformed: token.malformed\n
+\t\t\t\t});\n
+\n
+\t\t\t\treturn create("(number)", token.value);\n
+\n
+\t\t\tcase Token.RegExp:\n
+\t\t\t\treturn create("(regexp)", token.value);\n
+\n
+\t\t\tcase Token.Comment:\n
+\t\t\t\tstate.tokens.curr.comment = true;\n
+\n
+\t\t\t\tif (token.isSpecial) {\n
+\t\t\t\t\treturn {\n
+\t\t\t\t\t\tvalue: token.value,\n
+\t\t\t\t\t\tbody: token.body,\n
+\t\t\t\t\t\ttype: token.commentType,\n
+\t\t\t\t\t\tisSpecial: token.isSpecial,\n
+\t\t\t\t\t\tline: this.line,\n
+\t\t\t\t\t\tcharacter: this.char,\n
+\t\t\t\t\t\tfrom: this.from\n
+\t\t\t\t\t};\n
+\t\t\t\t}\n
+\n
+\t\t\t\tbreak;\n
+\n
+\t\t\tcase "":\n
+\t\t\t\tbreak;\n
+\n
+\t\t\tdefault:\n
+\t\t\t\treturn create("(punctuator)", token.value);\n
+\t\t\t}\n
+\t\t}\n
+\t}\n
+};\n
+\n
+exports.Lexer = Lexer;\n
+\n
+},\n
+{"./reg.js":6,"./state.js":7,"events":10,"underscore":1}],\n
+6:[function(req,module,exports){\n
+\n
+"use string";\n
+exports.unsafeString =\n
+\t/@cc|<\\/?|script|\\]\\s*\\]|<\\s*!|&lt/i;\n
+exports.unsafeChars =\n
+\t/[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/;\n
+exports.needEsc =\n
+\t/[\\u0000-\\u001f&<"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/;\n
+\n
+exports.needEscGlobal =\n
+\t/[\\u0000-\\u001f&<"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n
+exports.starSlash = /\\*\\//;\n
+exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;\n
+exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\\s*:/i;\n
+exports.fallsThrough = /^\\s*\\/\\*\\s*falls?\\sthrough\\s*\\*\\/\\s*$/;\n
+\n
+},\n
+{}],\n
+7:[function(req,module,exports){\n
+\n
+\n
+var state = {\n
+\tsyntax: {},\n
+\n
+\treset: function () {\n
+\t\tthis.tokens = {\n
+\t\t\tprev: null,\n
+\t\t\tnext: null,\n
+\t\t\tcurr: null\n
+\t\t};\n
+\n
+\t\tthis.option = {};\n
+\t\tthis.ignored = {};\n
+\t\tthis.directive = {};\n
+\t\tthis.jsonMode = false;\n
+\t\tthis.jsonWarnings = [];\n
+\t\tthis.lines = [];\n
+\t\tthis.tab = "";\n
+\t\tthis.cache = {}; // Node.JS doesn\'t have Map. Sniff.\n
+\t}\n
+};\n
+\n
+exports.state = state;\n
+\n
+},\n
+{}],\n
+8:[function(req,module,exports){\n
+\n
+\n
+exports.register = function (linter) {\n
+\n
+\tlinter.on("Identifier", function style_scanProto(data) {\n
+\t\tif (linter.getOption("proto")) {\n
+\t\t\treturn;\n
+\t\t}\n
+\n
+\t\tif (data.name === "__proto__") {\n
+\t\t\tlinter.warn("W103", {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.char,\n
+\t\t\t\tdata: [ data.name ]\n
+\t\t\t});\n
+\t\t}\n
+\t});\n
+\n
+\tlinter.on("Identifier", function style_scanIterator(data) {\n
+\t\tif (linter.getOption("iterator")) {\n
+\t\t\treturn;\n
+\t\t}\n
+\n
+\t\tif (data.name === "__iterator__") {\n
+\t\t\tlinter.warn("W104", {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.char,\n
+\t\t\t\tdata: [ data.name ]\n
+\t\t\t});\n
+\t\t}\n
+\t});\n
+\n
+\tlinter.on("Identifier", function style_scanDangling(data) {\n
+\t\tif (!linter.getOption("nomen")) {\n
+\t\t\treturn;\n
+\t\t}\n
+\t\tif (data.name === "_") {\n
+\t\t\treturn;\n
+\t\t}\n
+\t\tif (linter.getOption("node")) {\n
+\t\t\tif (/^(__dirname|__filename)$/.test(data.name) && !data.isProperty) {\n
+\t\t\t\treturn;\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tif (/^(_+.*|.*_+)$/.test(data.name)) {\n
+\t\t\tlinter.warn("W105", {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.from,\n
+\t\t\t\tdata: [ "dangling \'_\'", data.name ]\n
+\t\t\t});\n
+\t\t}\n
+\t});\n
+\n
+\tlinter.on("Identifier", function style_scanCamelCase(data) {\n
+\t\tif (!linter.getOption("camelcase")) {\n
+\t\t\treturn;\n
+\t\t}\n
+\n
+\t\tif (data.name.replace(/^_+/, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) {\n
+\t\t\tlinter.warn("W106", {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.from,\n
+\t\t\t\tdata: [ data.name ]\n
+\t\t\t});\n
+\t\t}\n
+\t});\n
+\n
+\tlinter.on("String", function style_scanQuotes(data) {\n
+\t\tvar quotmark = linter.getOption("quotmark");\n
+\t\tvar code;\n
+\n
+\t\tif (!quotmark) {\n
+\t\t\treturn;\n
+\t\t}\n
+\n
+\t\tif (quotmark === "single" && data.quote !== "\'") {\n
+\t\t\tcode = "W109";\n
+\t\t}\n
+\n
+\t\tif (quotmark === "double" && data.quote !== "\\"") {\n
+\t\t\tcode = "W108";\n
+\t\t}\n
+\n
+\t\tif (quotmark === true) {\n
+\t\t\tif (!linter.getCache("quotmark")) {\n
+\t\t\t\tlinter.setCache("quotmark", data.quote);\n
+\t\t\t}\n
+\n
+\t\t\tif (linter.getCache("quotmark") !== data.quote) {\n
+\t\t\t\tcode = "W110";\n
+\t\t\t}\n
+\t\t}\n
+\n
+\t\tif (code) {\n
+\t\t\tlinter.warn(code, {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.char,\n
+\t\t\t});\n
+\t\t}\n
+\t});\n
+\n
+\tlinter.on("Number", function style_scanNumbers(data) {\n
+\t\tif (data.value.charAt(0) === ".") {\n
+\t\t\tlinter.warn("W008", {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.char,\n
+\t\t\t\tdata: [ data.value ]\n
+\t\t\t});\n
+\t\t}\n
+\n
+\t\tif (data.value.substr(data.value.length - 1) === ".") {\n
+\t\t\tlinter.warn("W047", {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.char,\n
+\t\t\t\tdata: [ data.value ]\n
+\t\t\t});\n
+\t\t}\n
+\n
+\t\tif (/^00+/.test(data.value)) {\n
+\t\t\tlinter.warn("W046", {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.char,\n
+\t\t\t\tdata: [ data.value ]\n
+\t\t\t});\n
+\t\t}\n
+\t});\n
+\n
+\tlinter.on("String", function style_scanJavaScriptURLs(data) {\n
+\t\tvar re = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\\s*:/i;\n
+\n
+\t\tif (linter.getOption("scripturl")) {\n
+\t\t\treturn;\n
+\t\t}\n
+\n
+\t\tif (re.test(data.value)) {\n
+\t\t\tlinter.warn("W107", {\n
+\t\t\t\tline: data.line,\n
+\t\t\t\tchar: data.char\n
+\t\t\t});\n
+\t\t}\n
+\t});\n
+};\n
+},\n
+{}],\n
+9:[function(req,module,exports){\n
+\n
+},\n
+{}],\n
+10:[function(req,module,exports){\n
+var process=req("__browserify_process");if (!process.EventEmitter) process.EventEmitter = function () {};\n
+\n
+var EventEmitter = exports.EventEmitter = process.EventEmitter;\n
+var isArray = typeof Array.isArray === \'function\'\n
+    ? Array.isArray\n
+    : function (xs) {\n
+        return Object.prototype.toString.call(xs) === \'[object Array]\'\n
+    }\n
+;\n
+function indexOf (xs, x) {\n
+    if (xs.indexOf) return xs.indexOf(x);\n
+    for (var i = 0; i < xs.length; i++) {\n
+        if (x === xs[i]) return i;\n
+    }\n
+    return -1;\n
+}\n
+var defaultMaxListeners = 200;\n
+EventEmitter.prototype.setMaxListeners = function(n) {\n
+  if (!this._events) this._events = {};\n
+  this._events.maxListeners = n;\n
+};\n
+\n
+\n
+EventEmitter.prototype.emit = function(type) {\n
+  if (type === \'error\') {\n
+    if (!this._events || !this._events.error ||\n
+        (isArray(this._events.error) && !this._events.error.length))\n
+    {\n
+      if (arguments[1] instanceof Error) {\n
+        throw arguments[1]; // Unhandled \'error\' event\n
+      } else {\n
+        throw new Error("Uncaught, unspecified \'error\' event.");\n
+      }\n
+      return false;\n
+    }\n
+  }\n
+\n
+  if (!this._events) return false;\n
+  var handler = this._events[type];\n
+  if (!handler) return false;\n
+\n
+  if (typeof handler == \'function\') {\n
+    switch (arguments.length) {\n
+      case 1:\n
+        handler.call(this);\n
+        break;\n
+      case 2:\n
+        handler.call(this, arguments[1]);\n
+        break;\n
+      case 3:\n
+        handler.call(this, arguments[1], arguments[2]);\n
+        break;\n
+      default:\n
+        var args = Array.prototype.slice.call(arguments, 1);\n
+        handler.apply(this, args);\n
+    }\n
+    return true;\n
+\n
+  } else if (isArray(handler)) {\n
+    var args = Array.prototype.slice.call(arguments, 1);\n
+\n
+    var listeners = handler.slice();\n
+    for (var i = 0, l = listeners.length; i < l; i++) {\n
+      listeners[i].apply(this, args);\n
+    }\n
+    return true;\n
+\n
+  } else {\n
+    return false;\n
+  }\n
+};\n
+EventEmitter.prototype.addListener = function(type, listener) {\n
+  if (\'function\' !== typeof listener) {\n
+    throw new Error(\'addListener only takes instances of Function\');\n
+  }\n
+\n
+  if (!this._events) this._events = {};\n
+  this.emit(\'newListener\', type, listener);\n
+\n
+  if (!this._events[type]) {\n
+    this._events[type] = listener;\n
+  } else if (isArray(this._events[type])) {\n
+    if (!this._events[type].warned) {\n
+      var m;\n
+      if (this._events.maxListeners !== undefined) {\n
+        m = this._events.maxListeners;\n
+      } else {\n
+        m = defaultMaxListeners;\n
+      }\n
+\n
+      if (m && m > 0 && this._events[type].length > m) {\n
+        this._events[type].warned = true;\n
+        console.error(\'(node) warning: possible EventEmitter memory \' +\n
+                      \'leak detected. %d listeners added. \' +\n
+                      \'Use emitter.setMaxListeners() to increase limit.\',\n
+                      this._events[type].length);\n
+        console.trace();\n
+      }\n
+    }\n
+    this._events[type].push(listener);\n
+  } else {\n
+    this._events[type] = [this._events[type], listener];\n
+  }\n
+\n
+  return this;\n
+};\n
+\n
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;\n
+\n
+EventEmitter.prototype.once = function(type, listener) {\n
+  var self = this;\n
+  self.on(type, function g() {\n
+    self.removeListener(type, g);\n
+    listener.apply(this, arguments);\n
+  });\n
+\n
+  return this;\n
+};\n
+\n
+EventEmitter.prototype.removeListener = function(type, listener) {\n
+  if (\'function\' !== typeof listener) {\n
+    throw new Error(\'removeListener only takes instances of Function\');\n
+  }\n
+  if (!this._events || !this._events[type]) return this;\n
+\n
+  var list = this._events[type];\n
+\n
+  if (isArray(list)) {\n
+    var i = indexOf(list, listener);\n
+    if (i < 0) return this;\n
+    list.splice(i, 1);\n
+    if (list.length == 0)\n
+      delete this._events[type];\n
+  } else if (this._events[type] === listener) {\n
+    delete this._events[type];\n
+  }\n
+\n
+  return this;\n
+};\n
+\n
+EventEmitter.prototype.removeAllListeners = function(type) {\n
+  if (arguments.length === 0) {\n
+    this._events = {};\n
+    return this;\n
+  }\n
+  if (type && this._events && this._events[type]) this._events[type] = null;\n
+  return this;\n
+};\n
+\n
+EventEmitter.prototype.listeners = function(type) {\n
+  if (!this._events) this._events = {};\n
+  if (!this._events[type]) this._events[type] = [];\n
+  if (!isArray(this._events[type])) {\n
+    this._events[type] = [this._events[type]];\n
+  }\n
+  return this._events[type];\n
+};\n
+\n
+EventEmitter.listenerCount = function(emitter, type) {\n
+  var ret;\n
+  if (!emitter._events || !emitter._events[type])\n
+    ret = 0;\n
+  else if (typeof emitter._events[type] === \'function\')\n
+    ret = 1;\n
+  else\n
+    ret = emitter._events[type].length;\n
+  return ret;\n
+};\n
+\n
+},\n
+{"__browserify_process":11}],\n
+11:[function(req,module,exports){\n
+\n
+var process = module.exports = {};\n
+\n
+process.nextTick = (function () {\n
+    var canSetImmediate = typeof window !== \'undefined\'\n
+    && window.setImmediate;\n
+    var canPost = typeof window !== \'undefined\'\n
+    && window.postMessage && window.addEventListener\n
+    ;\n
+\n
+    if (canSetImmediate) {\n
+        return function (f) { return window.setImmediate(f) };\n
+    }\n
+\n
+    if (canPost) {\n
+        var queue = [];\n
+        window.addEventListener(\'message\', function (ev) {\n
+            if (ev.source === window && ev.data === \'process-tick\') {\n
+                ev.stopPropagation();\n
+                if (queue.length > 0) {\n
+                    var fn = queue.shift();\n
+                    fn();\n
+                }\n
+            }\n
+        }, true);\n
+\n
+        return function nextTick(fn) {\n
+            queue.push(fn);\n
+            window.postMessage(\'process-tick\', \'*\');\n
+        };\n
+    }\n
+\n
+    return function nextTick(fn) {\n
+        setTimeout(fn, 0);\n
+    };\n
+})();\n
+\n
+process.title = \'browser\';\n
+process.browser = true;\n
+process.env = {};\n
+process.argv = [];\n
+\n
+process.binding = function (name) {\n
+    throw new Error(\'process.binding is not supported\');\n
+}\n
+process.cwd = function () { return \'/\' };\n
+process.chdir = function (dir) {\n
+    throw new Error(\'process.chdir is not supported\');\n
+};\n
+\n
+},\n
+{}],\n
+"jshint":[function(req,module,exports){\n
+module.exports=req(\'n4bKNg\');\n
+},\n
+{}]},{},["n4bKNg"])\n
+;\n
+\n
+function req() {return require.apply(this, arguments)}\n
+module.exports = req("jshint");\n
+\n
 });
 
 ]]></string> </value>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-json.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-json.js.xml
index a2e6fbe211..a5b984cc4d 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-json.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-json.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155570.42</string> </value>
+            <value> <string>ts83646620.5</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>66183</int> </value>
+            <value> <int>67205</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -55,31 +55,30 @@ if (typeof window.window != "undefined" && window.document) {\n
     return;\n
 }\n
 \n
-window.console = {\n
-    log: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    },\n
-    error: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    }\n
+window.console = function() {\n
+    var msgs = Array.prototype.slice.call(arguments, 0);\n
+    postMessage({type: "log", data: msgs});\n
 };\n
+window.console.error =\n
+window.console.warn = \n
+window.console.log =\n
+window.console.trace = window.console;\n
+\n
 window.window = window;\n
 window.ace = window;\n
 \n
 window.normalizeModule = function(parentId, moduleName) {\n
     if (moduleName.indexOf("!") !== -1) {\n
         var chunks = moduleName.split("!");\n
-        return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);\n
+        return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);\n
     }\n
     if (moduleName.charAt(0) == ".") {\n
         var base = parentId.split("/").slice(0, -1).join("/");\n
-        moduleName = base + "/" + moduleName;\n
+        moduleName = (base ? base + "/" : "") + moduleName;\n
         \n
         while(moduleName.indexOf(".") !== -1 && previous != moduleName) {\n
             var previous = moduleName;\n
-            moduleName = moduleName.replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
+            moduleName = moduleName.replace(/^\\.\\//, "").replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
         }\n
     }\n
     \n
@@ -94,9 +93,9 @@ window.require = function(parentId, id) {\n
     if (!id.charAt)\n
         throw new Error("worker.js require() accepts only (parentId, id) as arguments");\n
 \n
-    id = normalizeModule(parentId, id);\n
+    id = window.normalizeModule(parentId, id);\n
 \n
-    var module = require.modules[id];\n
+    var module = window.require.modules[id];\n
     if (module) {\n
         if (!module.initialized) {\n
             module.initialized = true;\n
@@ -106,48 +105,60 @@ window.require = function(parentId, id) {\n
     }\n
     \n
     var chunks = id.split("/");\n
-    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n
+    if (!window.require.tlns)\n
+        return console.log("unable to load " + id);\n
+    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n
     var path = chunks.join("/") + ".js";\n
     \n
-    require.id = id;\n
+    window.require.id = id;\n
     importScripts(path);\n
-    return require(parentId, id);\n
+    return window.require(parentId, id);\n
 };\n
-\n
-require.modules = {};\n
-require.tlns = {};\n
+window.require.modules = {};\n
+window.require.tlns = {};\n
 \n
 window.define = function(id, deps, factory) {\n
     if (arguments.length == 2) {\n
         factory = deps;\n
         if (typeof id != "string") {\n
             deps = id;\n
-            id = require.id;\n
+            id = window.require.id;\n
         }\n
     } else if (arguments.length == 1) {\n
         factory = id;\n
-        id = require.id;\n
+        deps = []\n
+        id = window.require.id;\n
     }\n
+\n
+    if (!deps.length)\n
+        deps = [\'require\', \'exports\', \'module\']\n
 \n
     if (id.indexOf("text!") === 0) \n
         return;\n
     \n
-    var req = function(deps, factory) {\n
-        return require(id, deps, factory);\n
+    var req = function(childId) {\n
+        return window.require(id, childId);\n
     };\n
 \n
-    require.modules[id] = {\n
+    window.require.modules[id] = {\n
+        exports: {},\n
         factory: function() {\n
-            var module = {\n
-                exports: {}\n
-            };\n
-            var returnExports = factory(req, module.exports, module);\n
+            var module = this;\n
+            var returnExports = factory.apply(this, deps.map(function(dep) {\n
+              switch(dep) {\n
+                  case \'require\': return req\n
+                  case \'exports\': return module.exports\n
+                  case \'module\':  return module\n
+                  default:        return req(dep)\n
+              }\n
+            }));\n
             if (returnExports)\n
                 module.exports = returnExports;\n
             return module;\n
         }\n
     };\n
 };\n
+window.define.amd = {}\n
 \n
 window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
     require.tlns = topLevelNamespaces;\n
@@ -155,8 +166,8 @@ window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
 \n
 window.initSender = function initSender() {\n
 \n
-    var EventEmitter = require("ace/lib/event_emitter").EventEmitter;\n
-    var oop = require("ace/lib/oop");\n
+    var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;\n
+    var oop = window.require("ace/lib/oop");\n
     \n
     var Sender = function() {};\n
     \n
@@ -207,158 +218,7 @@ window.onmessage = function(e) {\n
         sender._emit(msg.event, msg.data);\n
     }\n
 };\n
-})(this);\n
-\n
-define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-var EventEmitter = {};\n
-var stopPropagation = function() { this.propagationStopped = true; };\n
-var preventDefault = function() { this.defaultPrevented = true; };\n
-\n
-EventEmitter._emit =\n
-EventEmitter._dispatchEvent = function(eventName, e) {\n
-    this._eventRegistry || (this._eventRegistry = {});\n
-    this._defaultHandlers || (this._defaultHandlers = {});\n
-\n
-    var listeners = this._eventRegistry[eventName] || [];\n
-    var defaultHandler = this._defaultHandlers[eventName];\n
-    if (!listeners.length && !defaultHandler)\n
-        return;\n
-\n
-    if (typeof e != "object" || !e)\n
-        e = {};\n
-\n
-    if (!e.type)\n
-        e.type = eventName;\n
-    if (!e.stopPropagation)\n
-        e.stopPropagation = stopPropagation;\n
-    if (!e.preventDefault)\n
-        e.preventDefault = preventDefault;\n
-\n
-    for (var i=0; i<listeners.length; i++) {\n
-        listeners[i](e, this);\n
-        if (e.propagationStopped)\n
-            break;\n
-    }\n
-    \n
-    if (defaultHandler && !e.defaultPrevented)\n
-        return defaultHandler(e, this);\n
-};\n
-\n
-\n
-EventEmitter._signal = function(eventName, e) {\n
-    var listeners = (this._eventRegistry || {})[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    for (var i=0; i<listeners.length; i++)\n
-        listeners[i](e, this);\n
-};\n
-\n
-EventEmitter.once = function(eventName, callback) {\n
-    var _self = this;\n
-    callback && this.addEventListener(eventName, function newCallback() {\n
-        _self.removeEventListener(eventName, newCallback);\n
-        callback.apply(null, arguments);\n
-    });\n
-};\n
-\n
-\n
-EventEmitter.setDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        handlers = this._defaultHandlers = {_disabled_: {}};\n
-    \n
-    if (handlers[eventName]) {\n
-        var old = handlers[eventName];\n
-        var disabled = handlers._disabled_[eventName];\n
-        if (!disabled)\n
-            handlers._disabled_[eventName] = disabled = [];\n
-        disabled.push(old);\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1) \n
-            disabled.splice(i, 1);\n
-    }\n
-    handlers[eventName] = callback;\n
-};\n
-EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        return;\n
-    var disabled = handlers._disabled_[eventName];\n
-    \n
-    if (handlers[eventName] == callback) {\n
-        var old = handlers[eventName];\n
-        if (disabled)\n
-            this.setDefaultHandler(eventName, disabled.pop());\n
-    } else if (disabled) {\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1)\n
-            disabled.splice(i, 1);\n
-    }\n
-};\n
-\n
-EventEmitter.on =\n
-EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        listeners = this._eventRegistry[eventName] = [];\n
-\n
-    if (listeners.indexOf(callback) == -1)\n
-        listeners[capturing ? "unshift" : "push"](callback);\n
-    return callback;\n
-};\n
-\n
-EventEmitter.off =\n
-EventEmitter.removeListener =\n
-EventEmitter.removeEventListener = function(eventName, callback) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    var index = listeners.indexOf(callback);\n
-    if (index !== -1)\n
-        listeners.splice(index, 1);\n
-};\n
-\n
-EventEmitter.removeAllListeners = function(eventName) {\n
-    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
-};\n
-\n
-exports.EventEmitter = EventEmitter;\n
-\n
-});\n
-\n
-define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-exports.inherits = (function() {\n
-    var tempCtor = function() {};\n
-    return function(ctor, superCtor) {\n
-        tempCtor.prototype = superCtor.prototype;\n
-        ctor.super_ = superCtor.prototype;\n
-        ctor.prototype = new tempCtor();\n
-        ctor.prototype.constructor = ctor;\n
-    };\n
-}());\n
-\n
-exports.mixin = function(obj, mixin) {\n
-    for (var key in mixin) {\n
-        obj[key] = mixin[key];\n
-    }\n
-    return obj;\n
-};\n
-\n
-exports.implement = function(proto, mixin) {\n
-    exports.mixin(proto, mixin);\n
-};\n
-\n
-});\n
+})(this);// https://github.com/kriskowal/es5-shim\n
 \n
 define(\'ace/lib/es5-shim\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
@@ -1094,6 +954,32 @@ oop.inherits(JsonWorker, Mirror);\n
 }).call(JsonWorker.prototype);\n
 \n
 });\n
+\n
+define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+exports.inherits = (function() {\n
+    var tempCtor = function() {};\n
+    return function(ctor, superCtor) {\n
+        tempCtor.prototype = superCtor.prototype;\n
+        ctor.super_ = superCtor.prototype;\n
+        ctor.prototype = new tempCtor();\n
+        ctor.prototype.constructor = ctor;\n
+    };\n
+}());\n
+\n
+exports.mixin = function(obj, mixin) {\n
+    for (var key in mixin) {\n
+        obj[key] = mixin[key];\n
+    }\n
+    return obj;\n
+};\n
+\n
+exports.implement = function(proto, mixin) {\n
+    exports.mixin(proto, mixin);\n
+};\n
+\n
+});\n
 define(\'ace/worker/mirror\', [\'require\', \'exports\', \'module\' , \'ace/document\', \'ace/lib/lang\'], function(require, exports, module) {\n
 \n
 \n
@@ -1223,7 +1109,7 @@ var Document = function(text) {\n
     };\n
     this.getTextRange = function(range) {\n
         if (range.start.row == range.end.row) {\n
-            return this.$lines[range.start.row]\n
+            return this.getLine(range.start.row)\n
                 .substring(range.start.column, range.end.column);\n
         }\n
         var lines = this.getLines(range.start.row, range.end.row);\n
@@ -1334,6 +1220,8 @@ var Document = function(text) {\n
         return end;\n
     };\n
     this.remove = function(range) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         range.start = this.$clipPosition(range.start);\n
         range.end = this.$clipPosition(range.end);\n
 \n
@@ -1417,6 +1305,8 @@ var Document = function(text) {\n
         this._emit("change", { data: delta });\n
     };\n
     this.replace = function(range, text) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         if (text.length == 0 && range.isEmpty())\n
             return range.start;\n
         if (text == this.getTextRange(range))\n
@@ -1489,6 +1379,132 @@ var Document = function(text) {\n
 exports.Document = Document;\n
 });\n
 \n
+define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+var EventEmitter = {};\n
+var stopPropagation = function() { this.propagationStopped = true; };\n
+var preventDefault = function() { this.defaultPrevented = true; };\n
+\n
+EventEmitter._emit =\n
+EventEmitter._dispatchEvent = function(eventName, e) {\n
+    this._eventRegistry || (this._eventRegistry = {});\n
+    this._defaultHandlers || (this._defaultHandlers = {});\n
+\n
+    var listeners = this._eventRegistry[eventName] || [];\n
+    var defaultHandler = this._defaultHandlers[eventName];\n
+    if (!listeners.length && !defaultHandler)\n
+        return;\n
+\n
+    if (typeof e != "object" || !e)\n
+        e = {};\n
+\n
+    if (!e.type)\n
+        e.type = eventName;\n
+    if (!e.stopPropagation)\n
+        e.stopPropagation = stopPropagation;\n
+    if (!e.preventDefault)\n
+        e.preventDefault = preventDefault;\n
+\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++) {\n
+        listeners[i](e, this);\n
+        if (e.propagationStopped)\n
+            break;\n
+    }\n
+    \n
+    if (defaultHandler && !e.defaultPrevented)\n
+        return defaultHandler(e, this);\n
+};\n
+\n
+\n
+EventEmitter._signal = function(eventName, e) {\n
+    var listeners = (this._eventRegistry || {})[eventName];\n
+    if (!listeners)\n
+        return;\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++)\n
+        listeners[i](e, this);\n
+};\n
+\n
+EventEmitter.once = function(eventName, callback) {\n
+    var _self = this;\n
+    callback && this.addEventListener(eventName, function newCallback() {\n
+        _self.removeEventListener(eventName, newCallback);\n
+        callback.apply(null, arguments);\n
+    });\n
+};\n
+\n
+\n
+EventEmitter.setDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        handlers = this._defaultHandlers = {_disabled_: {}};\n
+    \n
+    if (handlers[eventName]) {\n
+        var old = handlers[eventName];\n
+        var disabled = handlers._disabled_[eventName];\n
+        if (!disabled)\n
+            handlers._disabled_[eventName] = disabled = [];\n
+        disabled.push(old);\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1) \n
+            disabled.splice(i, 1);\n
+    }\n
+    handlers[eventName] = callback;\n
+};\n
+EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        return;\n
+    var disabled = handlers._disabled_[eventName];\n
+    \n
+    if (handlers[eventName] == callback) {\n
+        var old = handlers[eventName];\n
+        if (disabled)\n
+            this.setDefaultHandler(eventName, disabled.pop());\n
+    } else if (disabled) {\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1)\n
+            disabled.splice(i, 1);\n
+    }\n
+};\n
+\n
+EventEmitter.on =\n
+EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        listeners = this._eventRegistry[eventName] = [];\n
+\n
+    if (listeners.indexOf(callback) == -1)\n
+        listeners[capturing ? "unshift" : "push"](callback);\n
+    return callback;\n
+};\n
+\n
+EventEmitter.off =\n
+EventEmitter.removeListener =\n
+EventEmitter.removeEventListener = function(eventName, callback) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        return;\n
+\n
+    var index = listeners.indexOf(callback);\n
+    if (index !== -1)\n
+        listeners.splice(index, 1);\n
+};\n
+\n
+EventEmitter.removeAllListeners = function(eventName) {\n
+    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
+};\n
+\n
+exports.EventEmitter = EventEmitter;\n
+\n
+});\n
+\n
 define(\'ace/range\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 var comparePoints = function(p1, p2) {\n
@@ -1735,29 +1751,25 @@ var oop = require("./lib/oop");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 \n
 var Anchor = exports.Anchor = function(doc, row, column) {\n
-    this.document = doc;\n
-\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.attach(doc);\n
+    \n
     if (typeof column == "undefined")\n
         this.setPosition(row.row, row.column);\n
     else\n
         this.setPosition(row, column);\n
-\n
-    this.$onChange = this.onChange.bind(this);\n
-    doc.on("change", this.$onChange);\n
 };\n
 \n
 (function() {\n
 \n
     oop.implement(this, EventEmitter);\n
-\n
     this.getPosition = function() {\n
         return this.$clipPositionToDocument(this.row, this.column);\n
     };\n
-\n
     this.getDocument = function() {\n
         return this.document;\n
     };\n
-\n
+    this.$insertRight = false;\n
     this.onChange = function(e) {\n
         var delta = e.data;\n
         var range = delta.range;\n
@@ -1778,7 +1790,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         if (delta.action === "insertText") {\n
             if (start.row === row && start.column <= column) {\n
-                if (start.row === end.row) {\n
+                if (start.column === column && this.$insertRight) {\n
+                } else if (start.row === end.row) {\n
                     column += end.column - start.column;\n
                 } else {\n
                     column -= start.column;\n
@@ -1819,7 +1832,6 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         this.setPosition(row, column, true);\n
     };\n
-\n
     this.setPosition = function(row, column, noClip) {\n
         var pos;\n
         if (noClip) {\n
@@ -1846,10 +1858,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
             value: pos\n
         });\n
     };\n
-\n
     this.detach = function() {\n
         this.document.removeEventListener("change", this.$onChange);\n
     };\n
+    this.attach = function(doc) {\n
+        this.document = doc || this.document;\n
+        this.document.on("change", this.$onChange);\n
+    };\n
     this.$clipPositionToDocument = function(row, column) {\n
         var pos = {};\n
 \n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-lua.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-lua.js.xml
index e4f3bc45e0..31bd6fbd27 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-lua.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-lua.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155570.58</string> </value>
+            <value> <string>ts83646621.49</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>95258</int> </value>
+            <value> <int>100225</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -55,31 +55,30 @@ if (typeof window.window != "undefined" && window.document) {\n
     return;\n
 }\n
 \n
-window.console = {\n
-    log: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    },\n
-    error: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    }\n
+window.console = function() {\n
+    var msgs = Array.prototype.slice.call(arguments, 0);\n
+    postMessage({type: "log", data: msgs});\n
 };\n
+window.console.error =\n
+window.console.warn = \n
+window.console.log =\n
+window.console.trace = window.console;\n
+\n
 window.window = window;\n
 window.ace = window;\n
 \n
 window.normalizeModule = function(parentId, moduleName) {\n
     if (moduleName.indexOf("!") !== -1) {\n
         var chunks = moduleName.split("!");\n
-        return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);\n
+        return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);\n
     }\n
     if (moduleName.charAt(0) == ".") {\n
         var base = parentId.split("/").slice(0, -1).join("/");\n
-        moduleName = base + "/" + moduleName;\n
+        moduleName = (base ? base + "/" : "") + moduleName;\n
         \n
         while(moduleName.indexOf(".") !== -1 && previous != moduleName) {\n
             var previous = moduleName;\n
-            moduleName = moduleName.replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
+            moduleName = moduleName.replace(/^\\.\\//, "").replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
         }\n
     }\n
     \n
@@ -94,9 +93,9 @@ window.require = function(parentId, id) {\n
     if (!id.charAt)\n
         throw new Error("worker.js require() accepts only (parentId, id) as arguments");\n
 \n
-    id = normalizeModule(parentId, id);\n
+    id = window.normalizeModule(parentId, id);\n
 \n
-    var module = require.modules[id];\n
+    var module = window.require.modules[id];\n
     if (module) {\n
         if (!module.initialized) {\n
             module.initialized = true;\n
@@ -106,48 +105,60 @@ window.require = function(parentId, id) {\n
     }\n
     \n
     var chunks = id.split("/");\n
-    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n
+    if (!window.require.tlns)\n
+        return console.log("unable to load " + id);\n
+    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n
     var path = chunks.join("/") + ".js";\n
     \n
-    require.id = id;\n
+    window.require.id = id;\n
     importScripts(path);\n
-    return require(parentId, id);\n
+    return window.require(parentId, id);\n
 };\n
-\n
-require.modules = {};\n
-require.tlns = {};\n
+window.require.modules = {};\n
+window.require.tlns = {};\n
 \n
 window.define = function(id, deps, factory) {\n
     if (arguments.length == 2) {\n
         factory = deps;\n
         if (typeof id != "string") {\n
             deps = id;\n
-            id = require.id;\n
+            id = window.require.id;\n
         }\n
     } else if (arguments.length == 1) {\n
         factory = id;\n
-        id = require.id;\n
+        deps = []\n
+        id = window.require.id;\n
     }\n
+\n
+    if (!deps.length)\n
+        deps = [\'require\', \'exports\', \'module\']\n
 \n
     if (id.indexOf("text!") === 0) \n
         return;\n
     \n
-    var req = function(deps, factory) {\n
-        return require(id, deps, factory);\n
+    var req = function(childId) {\n
+        return window.require(id, childId);\n
     };\n
 \n
-    require.modules[id] = {\n
+    window.require.modules[id] = {\n
+        exports: {},\n
         factory: function() {\n
-            var module = {\n
-                exports: {}\n
-            };\n
-            var returnExports = factory(req, module.exports, module);\n
+            var module = this;\n
+            var returnExports = factory.apply(this, deps.map(function(dep) {\n
+              switch(dep) {\n
+                  case \'require\': return req\n
+                  case \'exports\': return module.exports\n
+                  case \'module\':  return module\n
+                  default:        return req(dep)\n
+              }\n
+            }));\n
             if (returnExports)\n
                 module.exports = returnExports;\n
             return module;\n
         }\n
     };\n
 };\n
+window.define.amd = {}\n
 \n
 window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
     require.tlns = topLevelNamespaces;\n
@@ -155,8 +166,8 @@ window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
 \n
 window.initSender = function initSender() {\n
 \n
-    var EventEmitter = require("ace/lib/event_emitter").EventEmitter;\n
-    var oop = require("ace/lib/oop");\n
+    var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;\n
+    var oop = window.require("ace/lib/oop");\n
     \n
     var Sender = function() {};\n
     \n
@@ -207,158 +218,7 @@ window.onmessage = function(e) {\n
         sender._emit(msg.event, msg.data);\n
     }\n
 };\n
-})(this);\n
-\n
-define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-var EventEmitter = {};\n
-var stopPropagation = function() { this.propagationStopped = true; };\n
-var preventDefault = function() { this.defaultPrevented = true; };\n
-\n
-EventEmitter._emit =\n
-EventEmitter._dispatchEvent = function(eventName, e) {\n
-    this._eventRegistry || (this._eventRegistry = {});\n
-    this._defaultHandlers || (this._defaultHandlers = {});\n
-\n
-    var listeners = this._eventRegistry[eventName] || [];\n
-    var defaultHandler = this._defaultHandlers[eventName];\n
-    if (!listeners.length && !defaultHandler)\n
-        return;\n
-\n
-    if (typeof e != "object" || !e)\n
-        e = {};\n
-\n
-    if (!e.type)\n
-        e.type = eventName;\n
-    if (!e.stopPropagation)\n
-        e.stopPropagation = stopPropagation;\n
-    if (!e.preventDefault)\n
-        e.preventDefault = preventDefault;\n
-\n
-    for (var i=0; i<listeners.length; i++) {\n
-        listeners[i](e, this);\n
-        if (e.propagationStopped)\n
-            break;\n
-    }\n
-    \n
-    if (defaultHandler && !e.defaultPrevented)\n
-        return defaultHandler(e, this);\n
-};\n
-\n
-\n
-EventEmitter._signal = function(eventName, e) {\n
-    var listeners = (this._eventRegistry || {})[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    for (var i=0; i<listeners.length; i++)\n
-        listeners[i](e, this);\n
-};\n
-\n
-EventEmitter.once = function(eventName, callback) {\n
-    var _self = this;\n
-    callback && this.addEventListener(eventName, function newCallback() {\n
-        _self.removeEventListener(eventName, newCallback);\n
-        callback.apply(null, arguments);\n
-    });\n
-};\n
-\n
-\n
-EventEmitter.setDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        handlers = this._defaultHandlers = {_disabled_: {}};\n
-    \n
-    if (handlers[eventName]) {\n
-        var old = handlers[eventName];\n
-        var disabled = handlers._disabled_[eventName];\n
-        if (!disabled)\n
-            handlers._disabled_[eventName] = disabled = [];\n
-        disabled.push(old);\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1) \n
-            disabled.splice(i, 1);\n
-    }\n
-    handlers[eventName] = callback;\n
-};\n
-EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        return;\n
-    var disabled = handlers._disabled_[eventName];\n
-    \n
-    if (handlers[eventName] == callback) {\n
-        var old = handlers[eventName];\n
-        if (disabled)\n
-            this.setDefaultHandler(eventName, disabled.pop());\n
-    } else if (disabled) {\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1)\n
-            disabled.splice(i, 1);\n
-    }\n
-};\n
-\n
-EventEmitter.on =\n
-EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        listeners = this._eventRegistry[eventName] = [];\n
-\n
-    if (listeners.indexOf(callback) == -1)\n
-        listeners[capturing ? "unshift" : "push"](callback);\n
-    return callback;\n
-};\n
-\n
-EventEmitter.off =\n
-EventEmitter.removeListener =\n
-EventEmitter.removeEventListener = function(eventName, callback) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    var index = listeners.indexOf(callback);\n
-    if (index !== -1)\n
-        listeners.splice(index, 1);\n
-};\n
-\n
-EventEmitter.removeAllListeners = function(eventName) {\n
-    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
-};\n
-\n
-exports.EventEmitter = EventEmitter;\n
-\n
-});\n
-\n
-define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-exports.inherits = (function() {\n
-    var tempCtor = function() {};\n
-    return function(ctor, superCtor) {\n
-        tempCtor.prototype = superCtor.prototype;\n
-        ctor.super_ = superCtor.prototype;\n
-        ctor.prototype = new tempCtor();\n
-        ctor.prototype.constructor = ctor;\n
-    };\n
-}());\n
-\n
-exports.mixin = function(obj, mixin) {\n
-    for (var key in mixin) {\n
-        obj[key] = mixin[key];\n
-    }\n
-    return obj;\n
-};\n
-\n
-exports.implement = function(proto, mixin) {\n
-    exports.mixin(proto, mixin);\n
-};\n
-\n
-});\n
+})(this);// https://github.com/kriskowal/es5-shim\n
 \n
 define(\'ace/lib/es5-shim\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
@@ -1094,6 +954,32 @@ oop.inherits(Worker, Mirror);\n
 }).call(Worker.prototype);\n
 \n
 });\n
+\n
+define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+exports.inherits = (function() {\n
+    var tempCtor = function() {};\n
+    return function(ctor, superCtor) {\n
+        tempCtor.prototype = superCtor.prototype;\n
+        ctor.super_ = superCtor.prototype;\n
+        ctor.prototype = new tempCtor();\n
+        ctor.prototype.constructor = ctor;\n
+    };\n
+}());\n
+\n
+exports.mixin = function(obj, mixin) {\n
+    for (var key in mixin) {\n
+        obj[key] = mixin[key];\n
+    }\n
+    return obj;\n
+};\n
+\n
+exports.implement = function(proto, mixin) {\n
+    exports.mixin(proto, mixin);\n
+};\n
+\n
+});\n
 define(\'ace/worker/mirror\', [\'require\', \'exports\', \'module\' , \'ace/document\', \'ace/lib/lang\'], function(require, exports, module) {\n
 \n
 \n
@@ -1223,7 +1109,7 @@ var Document = function(text) {\n
     };\n
     this.getTextRange = function(range) {\n
         if (range.start.row == range.end.row) {\n
-            return this.$lines[range.start.row]\n
+            return this.getLine(range.start.row)\n
                 .substring(range.start.column, range.end.column);\n
         }\n
         var lines = this.getLines(range.start.row, range.end.row);\n
@@ -1334,6 +1220,8 @@ var Document = function(text) {\n
         return end;\n
     };\n
     this.remove = function(range) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         range.start = this.$clipPosition(range.start);\n
         range.end = this.$clipPosition(range.end);\n
 \n
@@ -1417,6 +1305,8 @@ var Document = function(text) {\n
         this._emit("change", { data: delta });\n
     };\n
     this.replace = function(range, text) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         if (text.length == 0 && range.isEmpty())\n
             return range.start;\n
         if (text == this.getTextRange(range))\n
@@ -1489,6 +1379,132 @@ var Document = function(text) {\n
 exports.Document = Document;\n
 });\n
 \n
+define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+var EventEmitter = {};\n
+var stopPropagation = function() { this.propagationStopped = true; };\n
+var preventDefault = function() { this.defaultPrevented = true; };\n
+\n
+EventEmitter._emit =\n
+EventEmitter._dispatchEvent = function(eventName, e) {\n
+    this._eventRegistry || (this._eventRegistry = {});\n
+    this._defaultHandlers || (this._defaultHandlers = {});\n
+\n
+    var listeners = this._eventRegistry[eventName] || [];\n
+    var defaultHandler = this._defaultHandlers[eventName];\n
+    if (!listeners.length && !defaultHandler)\n
+        return;\n
+\n
+    if (typeof e != "object" || !e)\n
+        e = {};\n
+\n
+    if (!e.type)\n
+        e.type = eventName;\n
+    if (!e.stopPropagation)\n
+        e.stopPropagation = stopPropagation;\n
+    if (!e.preventDefault)\n
+        e.preventDefault = preventDefault;\n
+\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++) {\n
+        listeners[i](e, this);\n
+        if (e.propagationStopped)\n
+            break;\n
+    }\n
+    \n
+    if (defaultHandler && !e.defaultPrevented)\n
+        return defaultHandler(e, this);\n
+};\n
+\n
+\n
+EventEmitter._signal = function(eventName, e) {\n
+    var listeners = (this._eventRegistry || {})[eventName];\n
+    if (!listeners)\n
+        return;\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++)\n
+        listeners[i](e, this);\n
+};\n
+\n
+EventEmitter.once = function(eventName, callback) {\n
+    var _self = this;\n
+    callback && this.addEventListener(eventName, function newCallback() {\n
+        _self.removeEventListener(eventName, newCallback);\n
+        callback.apply(null, arguments);\n
+    });\n
+};\n
+\n
+\n
+EventEmitter.setDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        handlers = this._defaultHandlers = {_disabled_: {}};\n
+    \n
+    if (handlers[eventName]) {\n
+        var old = handlers[eventName];\n
+        var disabled = handlers._disabled_[eventName];\n
+        if (!disabled)\n
+            handlers._disabled_[eventName] = disabled = [];\n
+        disabled.push(old);\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1) \n
+            disabled.splice(i, 1);\n
+    }\n
+    handlers[eventName] = callback;\n
+};\n
+EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        return;\n
+    var disabled = handlers._disabled_[eventName];\n
+    \n
+    if (handlers[eventName] == callback) {\n
+        var old = handlers[eventName];\n
+        if (disabled)\n
+            this.setDefaultHandler(eventName, disabled.pop());\n
+    } else if (disabled) {\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1)\n
+            disabled.splice(i, 1);\n
+    }\n
+};\n
+\n
+EventEmitter.on =\n
+EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        listeners = this._eventRegistry[eventName] = [];\n
+\n
+    if (listeners.indexOf(callback) == -1)\n
+        listeners[capturing ? "unshift" : "push"](callback);\n
+    return callback;\n
+};\n
+\n
+EventEmitter.off =\n
+EventEmitter.removeListener =\n
+EventEmitter.removeEventListener = function(eventName, callback) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        return;\n
+\n
+    var index = listeners.indexOf(callback);\n
+    if (index !== -1)\n
+        listeners.splice(index, 1);\n
+};\n
+\n
+EventEmitter.removeAllListeners = function(eventName) {\n
+    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
+};\n
+\n
+exports.EventEmitter = EventEmitter;\n
+\n
+});\n
+\n
 define(\'ace/range\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 var comparePoints = function(p1, p2) {\n
@@ -1735,29 +1751,25 @@ var oop = require("./lib/oop");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 \n
 var Anchor = exports.Anchor = function(doc, row, column) {\n
-    this.document = doc;\n
-\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.attach(doc);\n
+    \n
     if (typeof column == "undefined")\n
         this.setPosition(row.row, row.column);\n
     else\n
         this.setPosition(row, column);\n
-\n
-    this.$onChange = this.onChange.bind(this);\n
-    doc.on("change", this.$onChange);\n
 };\n
 \n
 (function() {\n
 \n
     oop.implement(this, EventEmitter);\n
-\n
     this.getPosition = function() {\n
         return this.$clipPositionToDocument(this.row, this.column);\n
     };\n
-\n
     this.getDocument = function() {\n
         return this.document;\n
     };\n
-\n
+    this.$insertRight = false;\n
     this.onChange = function(e) {\n
         var delta = e.data;\n
         var range = delta.range;\n
@@ -1778,7 +1790,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         if (delta.action === "insertText") {\n
             if (start.row === row && start.column <= column) {\n
-                if (start.row === end.row) {\n
+                if (start.column === column && this.$insertRight) {\n
+                } else if (start.row === end.row) {\n
                     column += end.column - start.column;\n
                 } else {\n
                     column -= start.column;\n
@@ -1819,7 +1832,6 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         this.setPosition(row, column, true);\n
     };\n
-\n
     this.setPosition = function(row, column, noClip) {\n
         var pos;\n
         if (noClip) {\n
@@ -1846,10 +1858,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
             value: pos\n
         });\n
     };\n
-\n
     this.detach = function() {\n
         this.document.removeEventListener("change", this.$onChange);\n
     };\n
+    this.attach = function(doc) {\n
+        this.document = doc || this.document;\n
+        this.document.on("change", this.$onChange);\n
+    };\n
     this.$clipPositionToDocument = function(row, column) {\n
         var pos = {};\n
 \n
@@ -2052,33 +2067,33 @@ exports.delayedCall = function(fcn, defaultTimeout) {\n
     return _self;\n
 };\n
 });\n
-define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'exports\'], function(require, exports, module) {\n
+define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 (function (root, name, factory) {\n
-  \n
-\n
-  if (typeof exports !== \'undefined\') {\n
-    factory(exports);\n
-  } else if (typeof define === \'function\' && define.amd) {\n
-    define([\'exports\'], factory);\n
-  } else {\n
-    factory((root[name] = {}));\n
-  }\n
+   factory(exports)\n
 }(this, \'luaparse\', function (exports) {\n
   \n
 \n
-  exports.version = \'0.0.11\';\n
+  exports.version = \'0.1.4\';\n
 \n
   var input, options, length;\n
   var defaultOptions = exports.defaultOptions = {\n
       wait: false\n
     , comments: true\n
     , scope: false\n
+    , locations: false\n
+    , ranges: false\n
   };\n
 \n
   var EOF = 1, StringLiteral = 2, Keyword = 4, Identifier = 8\n
     , NumericLiteral = 16, Punctuator = 32, BooleanLiteral = 64\n
     , NilLiteral = 128, VarargLiteral = 256;\n
+\n
+  exports.tokenTypes = { EOF: EOF, StringLiteral: StringLiteral\n
+    , Keyword: Keyword, Identifier: Identifier, NumericLiteral: NumericLiteral\n
+    , Punctuator: Punctuator, BooleanLiteral: BooleanLiteral\n
+    , NilLiteral: NilLiteral, VarargLiteral: VarargLiteral\n
+  };\n
 \n
   var errors = exports.errors = {\n
       unexpected: \'Unexpected %1 \\\'%2\\\' near \\\'%3\\\'\'\n
@@ -2334,16 +2349,41 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
         , argument: argument\n
       };\n
     }\n
+\n
+    , comment: function(value, raw) {\n
+      return {\n
+          type: \'Comment\'\n
+        , value: value\n
+        , raw: raw\n
+      };\n
+    }\n
   };\n
+\n
+  function finishNode(node) {\n
+    if (trackLocations) {\n
+      var location = locations.pop();\n
+      location.complete();\n
+      if (options.locations) node.loc = location.loc;\n
+      if (options.ranges) node.range = location.range;\n
+    }\n
+    return node;\n
+  }\n
 \n
   var slice = Array.prototype.slice\n
     , toString = Object.prototype.toString\n
-    , indexOf = Array.prototype.indexOf || function indexOf(element) {\n
-      for (var i = 0, length = this.length; i < length; i++) {\n
-        if (this[i] === element) return i;\n
+    , indexOf = function indexOf(array, element) {\n
+      for (var i = 0, length = array.length; i < length; i++) {\n
+        if (array[i] === element) return i;\n
       }\n
       return -1;\n
     };\n
+\n
+  function indexOfObject(array, property, element) {\n
+    for (var i = 0, length = array.length; i < length; i++) {\n
+      if (array[i][property] === element) return i;\n
+    }\n
+    return -1;\n
+  }\n
 \n
   function sprintf(format) {\n
     var args = slice.call(arguments, 1);\n
@@ -2358,7 +2398,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       , dest = {}\n
       , src, prop;\n
 \n
-    for (var i = 0, l = args.length; i < l; i++) {\n
+    for (var i = 0, length = args.length; i < length; i++) {\n
       src = args[i];\n
       for (prop in src) if (src.hasOwnProperty(prop)) {\n
         dest[prop] = src[prop];\n
@@ -2412,13 +2452,16 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
 \n
   var index\n
     , token\n
+    , previousToken\n
     , lookahead\n
     , comments\n
     , tokenStart\n
     , line\n
     , lineStart;\n
 \n
-  function readToken() {\n
+  exports.lex = lex;\n
+\n
+  function lex() {\n
     skipWhiteSpace();\n
     while (45 === input.charCodeAt(index) &&\n
            45 === input.charCodeAt(index + 1)) {\n
@@ -2433,12 +2476,12 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       , range: [index, index]\n
     };\n
 \n
-    var character = input.charCodeAt(index)\n
+    var charCode = input.charCodeAt(index)\n
       , next = input.charCodeAt(index + 1);\n
     tokenStart = index;\n
-    if (isIdentifierStart(character)) return scanIdentifierOrKeyword();\n
+    if (isIdentifierStart(charCode)) return scanIdentifierOrKeyword();\n
 \n
-    switch (character) {\n
+    switch (charCode) {\n
       case 39: case 34: // \'"\n
         return scanStringLiteral();\n
       case 48: case 49: case 50: case 51: case 52: case 53:\n
@@ -2486,10 +2529,10 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
 \n
   function skipWhiteSpace() {\n
     while (index < length) {\n
-      var character = input.charCodeAt(index);\n
-      if (isWhiteSpace(character)) {\n
+      var charCode = input.charCodeAt(index);\n
+      if (isWhiteSpace(charCode)) {\n
         index++;\n
-      } else if (isLineTerminator(character)) {\n
+      } else if (isLineTerminator(charCode)) {\n
         line++;\n
         lineStart = ++index;\n
       } else {\n
@@ -2549,18 +2592,18 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     var delimiter = input.charCodeAt(index++)\n
       , stringStart = index\n
       , string = \'\'\n
-      , character;\n
+      , charCode;\n
 \n
     while (index < length) {\n
-      character = input.charCodeAt(index++);\n
-      if (delimiter === character) break;\n
-      if (92 === character) { // \\\n
+      charCode = input.charCodeAt(index++);\n
+      if (delimiter === charCode) break;\n
+      if (92 === charCode) { // \\\n
         string += input.slice(stringStart, index - 1) + readEscapeSequence();\n
         stringStart = index;\n
       }\n
-      else if (index >= length || isLineTerminator(character)) {\n
+      else if (index >= length || isLineTerminator(charCode)) {\n
         string += input.slice(stringStart, index - 1);\n
-        raise({}, errors.unfinishedString, string + String.fromCharCode(character));\n
+        raise({}, errors.unfinishedString, string + String.fromCharCode(charCode));\n
       }\n
     }\n
     string += input.slice(stringStart, index - 1);\n
@@ -2691,7 +2734,9 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     var character = input.charAt(index)\n
       , content = \'\'\n
       , isLong = false\n
-      , commentStart = index;\n
+      , commentStart = index\n
+      , lineStartComment = lineStart\n
+      , lineComment = line;\n
 \n
     if (\'[\' === character) {\n
       content = readLongString();\n
@@ -2703,15 +2748,21 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
         if (isLineTerminator(input.charCodeAt(index))) break;\n
         index++;\n
       }\n
-      content = input.slice(commentStart, index);\n
+      if (options.comments) content = input.slice(commentStart, index);\n
     }\n
 \n
     if (options.comments) {\n
-      comments.push({\n
-          type: \'Comment\'\n
-        , value: content\n
-        , raw: input.slice(tokenStart, index)\n
-      });\n
+      var node = ast.comment(content, input.slice(tokenStart, index));\n
+      if (options.locations) {\n
+        node.loc = {\n
+            start: { line: lineComment, column: tokenStart - lineStartComment }\n
+          , end: { line: line, column: index - lineStart }\n
+        };\n
+      }\n
+      if (options.ranges) {\n
+        node.range = [tokenStart, index];\n
+      }\n
+      comments.push(node);\n
     }\n
   }\n
 \n
@@ -2738,7 +2789,6 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
         line++;\n
         lineStart = index;\n
       }\n
-\n
       if (\']\' === character) {\n
         terminator = true;\n
         for (var i = 0; i < level; i++) {\n
@@ -2755,8 +2805,9 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
   }\n
 \n
   function next() {\n
+    previousToken = token;\n
     token = lookahead;\n
-    lookahead = readToken();\n
+    lookahead = lex();\n
   }\n
 \n
   function consume(value) {\n
@@ -2772,28 +2823,28 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     else raise(token, errors.expected, value, token.value);\n
   }\n
 \n
-  function isWhiteSpace(character) {\n
-    return 9 === character || 32 === character || 0xB === character || 0xC === character;\n
+  function isWhiteSpace(charCode) {\n
+    return 9 === charCode || 32 === charCode || 0xB === charCode || 0xC === charCode;\n
   }\n
 \n
-  function isLineTerminator(character) {\n
-    return 10 === character || 13 === character;\n
+  function isLineTerminator(charCode) {\n
+    return 10 === charCode || 13 === charCode;\n
   }\n
 \n
-  function isDecDigit(character) {\n
-    return character >= 48 && character <= 57;\n
+  function isDecDigit(charCode) {\n
+    return charCode >= 48 && charCode <= 57;\n
   }\n
 \n
-  function isHexDigit(character) {\n
-    return (character >= 48 && character <= 57) || (character >= 97 && character <= 102) || (character >= 65 && character <= 70);\n
+  function isHexDigit(charCode) {\n
+    return (charCode >= 48 && charCode <= 57) || (charCode >= 97 && charCode <= 102) || (charCode >= 65 && charCode <= 70);\n
   }\n
 \n
-  function isIdentifierStart(character) {\n
-    return (character >= 65 && character <= 90) || (character >= 97 && character <= 122) || 95 === character;\n
+  function isIdentifierStart(charCode) {\n
+    return (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122) || 95 === charCode;\n
   }\n
 \n
-  function isIdentifierPart(character) {\n
-    return (character >= 65 && character <= 90) || (character >= 97 && character <= 122) || 95 === character || (character >= 48 && character <= 57);\n
+  function isIdentifierPart(charCode) {\n
+    return (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122) || 95 === charCode || (charCode >= 48 && charCode <= 57);\n
   }\n
 \n
   function isKeyword(id) {\n
@@ -2842,8 +2893,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
   }\n
   var scopes\n
     , scopeDepth\n
-    , globals\n
-    , globalNames;\n
+    , globals;\n
   function createScope() {\n
     scopes.push(Array.apply(null, scopes[scopeDepth++]));\n
   }\n
@@ -2852,7 +2902,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     scopeDepth--;\n
   }\n
   function scopeIdentifierName(name) {\n
-    if (-1 !== indexOf.call(scopes[scopeDepth], name)) return;\n
+    if (-1 !== indexOf(scopes[scopeDepth], name)) return;\n
     scopes[scopeDepth].push(name);\n
   }\n
   function scopeIdentifier(node) {\n
@@ -2860,22 +2910,60 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     attachScope(node, true);\n
   }\n
   function attachScope(node, isLocal) {\n
-    if (!isLocal && -1 === indexOf.call(globalNames, node.name)) {\n
-      globalNames.push(node.name);\n
+    if (!isLocal && -1 === indexOfObject(globals, \'name\', node.name))\n
       globals.push(node);\n
-    }\n
 \n
     node.isLocal = isLocal;\n
   }\n
   function scopeHasName(name) {\n
-    return (-1 !== indexOf.call(scopes[scopeDepth], name));\n
+    return (-1 !== indexOf(scopes[scopeDepth], name));\n
+  }\n
+\n
+  var locations = []\n
+    , trackLocations;\n
+\n
+  function createLocationMarker() {\n
+    return new Marker(token);\n
+  }\n
+\n
+  function Marker(token) {\n
+    if (options.locations) {\n
+      this.loc = {\n
+          start: {\n
+            line: token.line\n
+          , column: token.range[0] - token.lineStart\n
+        }\n
+        , end: {\n
+            line: 0\n
+          , column: 0\n
+        }\n
+      };\n
+    }\n
+    if (options.ranges) this.range = [token.range[0], 0];\n
+  }\n
+  Marker.prototype.complete = function() {\n
+    if (options.locations) {\n
+      this.loc.end.line = previousToken.line;\n
+      this.loc.end.column = previousToken.range[1] - previousToken.lineStart;\n
+    }\n
+    if (options.ranges) {\n
+      this.range[1] = previousToken.range[1];\n
+    }\n
+  };\n
+  function markLocation() {\n
+    if (trackLocations) locations.push(createLocationMarker());\n
+  }\n
+  function pushLocation(marker) {\n
+    if (trackLocations) locations.push(marker);\n
   }\n
 \n
   function parseChunk() {\n
     next();\n
+    markLocation();\n
     var body = parseBlock();\n
     if (EOF !== token.type) unexpected(token);\n
-    return ast.chunk(body);\n
+    if (trackLocations && !body.length) previousToken = token;\n
+    return finishNode(ast.chunk(body));\n
   }\n
 \n
   function parseBlock(terminator) {\n
@@ -2897,6 +2985,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
   }\n
 \n
   function parseStatement() {\n
+    markLocation();\n
     if (Keyword === token.type) {\n
       switch (token.value) {\n
         case \'local\':    next(); return parseLocalStatement();\n
@@ -2917,6 +3006,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     if (Punctuator === token.type) {\n
       if (consume(\'::\')) return parseLabelStatement();\n
     }\n
+    if (trackLocations) locations.pop();\n
     if (consume(\';\')) return;\n
 \n
     return parseAssignmentOrCallStatement();\n
@@ -2932,11 +3022,11 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     }\n
 \n
     expect(\'::\');\n
-    return ast.labelStatement(label);\n
+    return finishNode(ast.labelStatement(label));\n
   }\n
 \n
   function parseBreakStatement() {\n
-    return ast.breakStatement();\n
+    return finishNode(ast.breakStatement());\n
   }\n
 \n
   function parseGotoStatement() {\n
@@ -2944,13 +3034,13 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       , label = parseIdentifier();\n
 \n
     if (options.scope) label.isLabel = scopeHasName(\'::\' + name + \'::\');\n
-    return ast.gotoStatement(label);\n
+    return finishNode(ast.gotoStatement(label));\n
   }\n
 \n
   function parseDoStatement() {\n
     var body = parseBlock();\n
     expect(\'end\');\n
-    return ast.doStatement(body);\n
+    return finishNode(ast.doStatement(body));\n
   }\n
 \n
   function parseWhileStatement() {\n
@@ -2958,14 +3048,14 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     expect(\'do\');\n
     var body = parseBlock();\n
     expect(\'end\');\n
-    return ast.whileStatement(condition, body);\n
+    return finishNode(ast.whileStatement(condition, body));\n
   }\n
 \n
   function parseRepeatStatement() {\n
     var body = parseBlock();\n
     expect(\'until\');\n
     var condition = parseExpectedExpression();\n
-    return ast.repeatStatement(condition, body);\n
+    return finishNode(ast.repeatStatement(condition, body));\n
   }\n
 \n
   function parseReturnStatement() {\n
@@ -2980,33 +3070,44 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       }\n
       consume(\';\'); // grammar tells us ; is optional here.\n
     }\n
-    return ast.returnStatement(expressions);\n
+    return finishNode(ast.returnStatement(expressions));\n
   }\n
 \n
   function parseIfStatement() {\n
     var clauses = []\n
       , condition\n
-      , body;\n
-\n
+      , body\n
+      , marker;\n
+    if (trackLocations) {\n
+      marker = locations[locations.length - 1];\n
+      locations.push(marker);\n
+    }\n
     condition = parseExpectedExpression();\n
     expect(\'then\');\n
     body = parseBlock();\n
-    clauses.push(ast.ifClause(condition, body));\n
+    clauses.push(finishNode(ast.ifClause(condition, body)));\n
 \n
+    if (trackLocations) marker = createLocationMarker();\n
     while (consume(\'elseif\')) {\n
+      pushLocation(marker);\n
       condition = parseExpectedExpression();\n
       expect(\'then\');\n
       body = parseBlock();\n
-      clauses.push(ast.elseifClause(condition, body));\n
+      clauses.push(finishNode(ast.elseifClause(condition, body)));\n
+      if (trackLocations) marker = createLocationMarker();\n
     }\n
 \n
     if (consume(\'else\')) {\n
+      if (trackLocations) {\n
+        marker = new Marker(previousToken);\n
+        locations.push(marker);\n
+      }\n
       body = parseBlock();\n
-      clauses.push(ast.elseClause(body));\n
+      clauses.push(finishNode(ast.elseClause(body)));\n
     }\n
 \n
     expect(\'end\');\n
-    return ast.ifStatement(clauses);\n
+    return finishNode(ast.ifStatement(clauses));\n
   }\n
 \n
   function parseForStatement() {\n
@@ -3023,8 +3124,9 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       body = parseBlock();\n
       expect(\'end\');\n
 \n
-      return ast.forNumericStatement(variable, start, end, step, body);\n
-    } else {\n
+      return finishNode(ast.forNumericStatement(variable, start, end, step, body));\n
+    }\n
+    else {\n
       var variables = [variable];\n
       while (consume(\',\')) {\n
         variable = parseIdentifier();\n
@@ -3042,7 +3144,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       body = parseBlock();\n
       expect(\'end\');\n
 \n
-      return ast.forGenericStatement(variables, iterators, body);\n
+      return finishNode(ast.forGenericStatement(variables, iterators, body));\n
     }\n
   }\n
 \n
@@ -3071,7 +3173,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
         }\n
       }\n
 \n
-      return ast.localStatement(variables, init);\n
+      return finishNode(ast.localStatement(variables, init));\n
     }\n
     if (consume(\'function\')) {\n
       name = parseIdentifier();\n
@@ -3084,7 +3186,10 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
 \n
   function parseAssignmentOrCallStatement() {\n
     var previous = token\n
-      , expression = parsePrefixExpression();\n
+      , expression, marker;\n
+\n
+    if (trackLocations) marker = createLocationMarker();\n
+    expression = parsePrefixExpression();\n
 \n
     if (null == expression) return unexpected(token);\n
     if (\',=\'.indexOf(token.value) >= 0) {\n
@@ -3102,19 +3207,23 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
         exp = parseExpectedExpression();\n
         init.push(exp);\n
       } while (consume(\',\'));\n
-      return ast.assignmentStatement(variables, init);\n
+\n
+      pushLocation(marker);\n
+      return finishNode(ast.assignmentStatement(variables, init));\n
     }\n
     if (isCallExpression(expression)) {\n
-      return ast.callStatement(expression);\n
+      pushLocation(marker);\n
+      return finishNode(ast.callStatement(expression));\n
     }\n
     return unexpected(previous);\n
   }\n
 \n
   function parseIdentifier() {\n
+    markLocation();\n
     var identifier = token.value;\n
     if (Identifier !== token.type) raiseUnexpectedToken(\'<name>\', token);\n
     next();\n
-    return ast.identifier(identifier);\n
+    return finishNode(ast.identifier(identifier));\n
   }\n
 \n
   function parseFunctionDeclaration(name, isLocal) {\n
@@ -3130,7 +3239,8 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
 \n
           if (consume(\',\')) continue;\n
           else if (consume(\')\')) break;\n
-        } else if (VarargLiteral === token.type) {\n
+        }\n
+        else if (VarargLiteral === token.type) {\n
           parameters.push(parsePrimaryExpression());\n
           expect(\')\');\n
           break;\n
@@ -3144,24 +3254,29 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     expect(\'end\');\n
 \n
     isLocal = isLocal || false;\n
-    return ast.functionStatement(name, parameters, isLocal, body);\n
+    return finishNode(ast.functionStatement(name, parameters, isLocal, body));\n
   }\n
 \n
   function parseFunctionName() {\n
-    var base = parseIdentifier()\n
-      , name;\n
+    var base, name, marker;\n
+\n
+    if (trackLocations) marker = createLocationMarker();\n
+    base = parseIdentifier();\n
+\n
     if (options.scope) attachScope(base, false);\n
 \n
     while (consume(\'.\')) {\n
+      pushLocation(marker);\n
       name = parseIdentifier();\n
       if (options.scope) attachScope(name, false);\n
-      base = ast.memberExpression(base, \'.\', name);\n
+      base = finishNode(ast.memberExpression(base, \'.\', name));\n
     }\n
 \n
     if (consume(\':\')) {\n
+      pushLocation(marker);\n
       name = parseIdentifier();\n
       if (options.scope) attachScope(name, false);\n
-      base = ast.memberExpression(base, \':\', name);\n
+      base = finishNode(ast.memberExpression(base, \':\', name));\n
     }\n
 \n
     return base;\n
@@ -3172,23 +3287,27 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       , key, value;\n
 \n
     while (true) {\n
+      markLocation();\n
       if (Punctuator === token.type && consume(\'[\')) {\n
         key = parseExpectedExpression();\n
         expect(\']\');\n
         expect(\'=\');\n
         value = parseExpectedExpression();\n
-        fields.push(ast.tableKey(key, value));\n
+        fields.push(finishNode(ast.tableKey(key, value)));\n
       } else if (Identifier === token.type) {\n
         key = parseExpectedExpression();\n
         if (consume(\'=\')) {\n
           value = parseExpectedExpression();\n
-          fields.push(ast.tableKeyString(key, value));\n
+          fields.push(finishNode(ast.tableKeyString(key, value)));\n
         } else {\n
-          fields.push(ast.tableValue(key));\n
+          fields.push(finishNode(ast.tableValue(key)));\n
         }\n
       } else {\n
-        if (null == (value = parseExpression())) break;\n
-        fields.push(ast.tableValue(value));\n
+        if (null == (value = parseExpression())) {\n
+          locations.pop();\n
+          break;\n
+        }\n
+        fields.push(finishNode(ast.tableValue(value)));\n
       }\n
       if (\',;\'.indexOf(token.value) >= 0) {\n
         next();\n
@@ -3197,7 +3316,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       if (\'}\' === token.value) break;\n
     }\n
     expect(\'}\');\n
-    return ast.tableConstructorExpression(fields);\n
+    return finishNode(ast.tableConstructorExpression(fields));\n
   }\n
 \n
   function parseExpression() {\n
@@ -3212,34 +3331,37 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
   }\n
 \n
   function binaryPrecedence(operator) {\n
-    var character = operator.charCodeAt(0)\n
+    var charCode = operator.charCodeAt(0)\n
       , length = operator.length;\n
 \n
     if (1 === length) {\n
-      switch (character) {\n
+      switch (charCode) {\n
         case 94: return 10; // ^\n
         case 42: case 47: case 37: return 7; // * / %\n
         case 43: case 45: return 6; // + -\n
         case 60: case 62: return 3; // < >\n
       }\n
     } else if (2 === length) {\n
-      switch (character) {\n
+      switch (charCode) {\n
         case 46: return 5; // ..\n
         case 60: case 62: case 61: case 126: return 3; // <= >= == ~=\n
         case 111: return 1; // or\n
       }\n
-    } else if (97 === character && \'and\' === operator) return 2;\n
+    } else if (97 === charCode && \'and\' === operator) return 2;\n
     return 0;\n
   }\n
 \n
   function parseSubExpression(minPrecedence) {\n
-    var operator = token.value;\n
-    var expression;\n
+    var operator = token.value\n
+      , expression, marker;\n
+\n
+    if (trackLocations) marker = createLocationMarker();\n
     if (isUnary(token)) {\n
+      markLocation();\n
       next();\n
       var argument = parseSubExpression(8);\n
       if (argument == null) raiseUnexpectedToken(\'<expression>\', token);\n
-      expression = ast.unaryExpression(operator, argument);\n
+      expression = finishNode(ast.unaryExpression(operator, argument));\n
     }\n
     if (null == expression) {\n
       expression = parsePrimaryExpression();\n
@@ -3261,14 +3383,18 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       next();\n
       var right = parseSubExpression(precedence);\n
       if (null == right) raiseUnexpectedToken(\'<expression>\', token);\n
-      expression = ast.binaryExpression(operator, expression, right);\n
+      if (trackLocations) locations.push(marker);\n
+      expression = finishNode(ast.binaryExpression(operator, expression, right));\n
+\n
     }\n
     return expression;\n
   }\n
 \n
   function parsePrefixExpression() {\n
-    var base, name\n
+    var base, name, marker\n
       , isLocal;\n
+\n
+    if (trackLocations) marker = createLocationMarker();\n
     if (Identifier === token.type) {\n
       name = token.value;\n
       base = parseIdentifier();\n
@@ -3285,31 +3411,37 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
       if (Punctuator === token.type) {\n
         switch (token.value) {\n
           case \'[\':\n
+            pushLocation(marker);\n
             next();\n
             expression = parseExpectedExpression();\n
-            base = ast.indexExpression(base, expression);\n
+            base = finishNode(ast.indexExpression(base, expression));\n
             expect(\']\');\n
             break;\n
           case \'.\':\n
+            pushLocation(marker);\n
             next();\n
             identifier = parseIdentifier();\n
             if (options.scope) attachScope(identifier, isLocal);\n
-            base = ast.memberExpression(base, \'.\', identifier);\n
+            base = finishNode(ast.memberExpression(base, \'.\', identifier));\n
             break;\n
           case \':\':\n
+            pushLocation(marker);\n
             next();\n
             identifier = parseIdentifier();\n
             if (options.scope) attachScope(identifier, isLocal);\n
-            base = ast.memberExpression(base, \':\', identifier);\n
+            base = finishNode(ast.memberExpression(base, \':\', identifier));\n
+            pushLocation(marker);\n
             base = parseCallExpression(base);\n
             break;\n
           case \'(\': case \'{\': // args\n
+            pushLocation(marker);\n
             base = parseCallExpression(base);\n
             break;\n
           default:\n
             return base;\n
         }\n
       } else if (StringLiteral === token.type) {\n
+        pushLocation(marker);\n
         base = parseCallExpression(base);\n
       } else {\n
         break;\n
@@ -3333,16 +3465,16 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
           }\n
 \n
           expect(\')\');\n
-          return ast.callExpression(base, expressions);\n
+          return finishNode(ast.callExpression(base, expressions));\n
 \n
         case \'{\':\n
+          markLocation();\n
           next();\n
           var table = parseTableConstructor();\n
-          return ast.tableCallExpression(base, table);\n
+          return finishNode(ast.tableCallExpression(base, table));\n
       }\n
-\n
     } else if (StringLiteral === token.type) {\n
-      return ast.stringCallExpression(base, parsePrimaryExpression());\n
+      return finishNode(ast.stringCallExpression(base, parsePrimaryExpression()));\n
     }\n
 \n
     raiseUnexpectedToken(\'function arguments\', token);\n
@@ -3351,17 +3483,24 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
   function parsePrimaryExpression() {\n
     var literals = StringLiteral | NumericLiteral | BooleanLiteral | NilLiteral | VarargLiteral\n
       , value = token.value\n
-      , type = token.type;\n
+      , type = token.type\n
+      , marker;\n
+\n
+    if (trackLocations) marker = createLocationMarker();\n
 \n
     if (type & literals) {\n
+      pushLocation(marker);\n
       var raw = input.slice(token.range[0], token.range[1]);\n
       next();\n
-      return ast.literal(type, value, raw);\n
+      return finishNode(ast.literal(type, value, raw));\n
     } else if (Keyword === type && \'function\' === value) {\n
+      pushLocation(marker);\n
       next();\n
       return parseFunctionDeclaration(null);\n
-    } else if (consume(\'{\'))\n
+    } else if (consume(\'{\')) {\n
+      pushLocation(marker);\n
       return parseTableConstructor();\n
+    }\n
   }\n
 \n
   exports.parse = parse;\n
@@ -3382,7 +3521,7 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     scopes = [[]];\n
     scopeDepth = 0;\n
     globals = [];\n
-    globalNames = [];\n
+    locations = [];\n
 \n
     if (options.comments) comments = [];\n
     if (!options.wait) return end();\n
@@ -3401,14 +3540,18 @@ define(\'ace/mode/lua/luaparse\', [\'require\', \'exports\', \'module\' , \'expo
     if (\'undefined\' !== typeof _input) write(_input);\n
 \n
     length = input.length;\n
-    lookahead = readToken();\n
+    trackLocations = options.locations || options.ranges;\n
+    lookahead = lex();\n
 \n
     var chunk = parseChunk();\n
     if (options.comments) chunk.comments = comments;\n
     if (options.scope) chunk.globals = globals;\n
+\n
+    if (locations.length > 0)\n
+      throw new Error(\'Location tracking failed. This is most likely a bug in luaparse\');\n
+\n
     return chunk;\n
   }\n
-  exports.lex = readToken;\n
 \n
 }));\n
 \n
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-php.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-php.js.xml
index 61563566ac..c04a8883a6 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-php.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-php.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155570.73</string> </value>
+            <value> <string>ts83646620.49</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>224350</int> </value>
+            <value> <int>229384</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -55,31 +55,30 @@ if (typeof window.window != "undefined" && window.document) {\n
     return;\n
 }\n
 \n
-window.console = {\n
-    log: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    },\n
-    error: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    }\n
+window.console = function() {\n
+    var msgs = Array.prototype.slice.call(arguments, 0);\n
+    postMessage({type: "log", data: msgs});\n
 };\n
+window.console.error =\n
+window.console.warn = \n
+window.console.log =\n
+window.console.trace = window.console;\n
+\n
 window.window = window;\n
 window.ace = window;\n
 \n
 window.normalizeModule = function(parentId, moduleName) {\n
     if (moduleName.indexOf("!") !== -1) {\n
         var chunks = moduleName.split("!");\n
-        return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);\n
+        return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);\n
     }\n
     if (moduleName.charAt(0) == ".") {\n
         var base = parentId.split("/").slice(0, -1).join("/");\n
-        moduleName = base + "/" + moduleName;\n
+        moduleName = (base ? base + "/" : "") + moduleName;\n
         \n
         while(moduleName.indexOf(".") !== -1 && previous != moduleName) {\n
             var previous = moduleName;\n
-            moduleName = moduleName.replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
+            moduleName = moduleName.replace(/^\\.\\//, "").replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
         }\n
     }\n
     \n
@@ -94,9 +93,9 @@ window.require = function(parentId, id) {\n
     if (!id.charAt)\n
         throw new Error("worker.js require() accepts only (parentId, id) as arguments");\n
 \n
-    id = normalizeModule(parentId, id);\n
+    id = window.normalizeModule(parentId, id);\n
 \n
-    var module = require.modules[id];\n
+    var module = window.require.modules[id];\n
     if (module) {\n
         if (!module.initialized) {\n
             module.initialized = true;\n
@@ -106,48 +105,60 @@ window.require = function(parentId, id) {\n
     }\n
     \n
     var chunks = id.split("/");\n
-    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n
+    if (!window.require.tlns)\n
+        return console.log("unable to load " + id);\n
+    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n
     var path = chunks.join("/") + ".js";\n
     \n
-    require.id = id;\n
+    window.require.id = id;\n
     importScripts(path);\n
-    return require(parentId, id);\n
+    return window.require(parentId, id);\n
 };\n
-\n
-require.modules = {};\n
-require.tlns = {};\n
+window.require.modules = {};\n
+window.require.tlns = {};\n
 \n
 window.define = function(id, deps, factory) {\n
     if (arguments.length == 2) {\n
         factory = deps;\n
         if (typeof id != "string") {\n
             deps = id;\n
-            id = require.id;\n
+            id = window.require.id;\n
         }\n
     } else if (arguments.length == 1) {\n
         factory = id;\n
-        id = require.id;\n
+        deps = []\n
+        id = window.require.id;\n
     }\n
+\n
+    if (!deps.length)\n
+        deps = [\'require\', \'exports\', \'module\']\n
 \n
     if (id.indexOf("text!") === 0) \n
         return;\n
     \n
-    var req = function(deps, factory) {\n
-        return require(id, deps, factory);\n
+    var req = function(childId) {\n
+        return window.require(id, childId);\n
     };\n
 \n
-    require.modules[id] = {\n
+    window.require.modules[id] = {\n
+        exports: {},\n
         factory: function() {\n
-            var module = {\n
-                exports: {}\n
-            };\n
-            var returnExports = factory(req, module.exports, module);\n
+            var module = this;\n
+            var returnExports = factory.apply(this, deps.map(function(dep) {\n
+              switch(dep) {\n
+                  case \'require\': return req\n
+                  case \'exports\': return module.exports\n
+                  case \'module\':  return module\n
+                  default:        return req(dep)\n
+              }\n
+            }));\n
             if (returnExports)\n
                 module.exports = returnExports;\n
             return module;\n
         }\n
     };\n
 };\n
+window.define.amd = {}\n
 \n
 window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
     require.tlns = topLevelNamespaces;\n
@@ -155,8 +166,8 @@ window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
 \n
 window.initSender = function initSender() {\n
 \n
-    var EventEmitter = require("ace/lib/event_emitter").EventEmitter;\n
-    var oop = require("ace/lib/oop");\n
+    var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;\n
+    var oop = window.require("ace/lib/oop");\n
     \n
     var Sender = function() {};\n
     \n
@@ -207,158 +218,7 @@ window.onmessage = function(e) {\n
         sender._emit(msg.event, msg.data);\n
     }\n
 };\n
-})(this);\n
-\n
-define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-var EventEmitter = {};\n
-var stopPropagation = function() { this.propagationStopped = true; };\n
-var preventDefault = function() { this.defaultPrevented = true; };\n
-\n
-EventEmitter._emit =\n
-EventEmitter._dispatchEvent = function(eventName, e) {\n
-    this._eventRegistry || (this._eventRegistry = {});\n
-    this._defaultHandlers || (this._defaultHandlers = {});\n
-\n
-    var listeners = this._eventRegistry[eventName] || [];\n
-    var defaultHandler = this._defaultHandlers[eventName];\n
-    if (!listeners.length && !defaultHandler)\n
-        return;\n
-\n
-    if (typeof e != "object" || !e)\n
-        e = {};\n
-\n
-    if (!e.type)\n
-        e.type = eventName;\n
-    if (!e.stopPropagation)\n
-        e.stopPropagation = stopPropagation;\n
-    if (!e.preventDefault)\n
-        e.preventDefault = preventDefault;\n
-\n
-    for (var i=0; i<listeners.length; i++) {\n
-        listeners[i](e, this);\n
-        if (e.propagationStopped)\n
-            break;\n
-    }\n
-    \n
-    if (defaultHandler && !e.defaultPrevented)\n
-        return defaultHandler(e, this);\n
-};\n
-\n
-\n
-EventEmitter._signal = function(eventName, e) {\n
-    var listeners = (this._eventRegistry || {})[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    for (var i=0; i<listeners.length; i++)\n
-        listeners[i](e, this);\n
-};\n
-\n
-EventEmitter.once = function(eventName, callback) {\n
-    var _self = this;\n
-    callback && this.addEventListener(eventName, function newCallback() {\n
-        _self.removeEventListener(eventName, newCallback);\n
-        callback.apply(null, arguments);\n
-    });\n
-};\n
-\n
-\n
-EventEmitter.setDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        handlers = this._defaultHandlers = {_disabled_: {}};\n
-    \n
-    if (handlers[eventName]) {\n
-        var old = handlers[eventName];\n
-        var disabled = handlers._disabled_[eventName];\n
-        if (!disabled)\n
-            handlers._disabled_[eventName] = disabled = [];\n
-        disabled.push(old);\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1) \n
-            disabled.splice(i, 1);\n
-    }\n
-    handlers[eventName] = callback;\n
-};\n
-EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        return;\n
-    var disabled = handlers._disabled_[eventName];\n
-    \n
-    if (handlers[eventName] == callback) {\n
-        var old = handlers[eventName];\n
-        if (disabled)\n
-            this.setDefaultHandler(eventName, disabled.pop());\n
-    } else if (disabled) {\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1)\n
-            disabled.splice(i, 1);\n
-    }\n
-};\n
-\n
-EventEmitter.on =\n
-EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        listeners = this._eventRegistry[eventName] = [];\n
-\n
-    if (listeners.indexOf(callback) == -1)\n
-        listeners[capturing ? "unshift" : "push"](callback);\n
-    return callback;\n
-};\n
-\n
-EventEmitter.off =\n
-EventEmitter.removeListener =\n
-EventEmitter.removeEventListener = function(eventName, callback) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    var index = listeners.indexOf(callback);\n
-    if (index !== -1)\n
-        listeners.splice(index, 1);\n
-};\n
-\n
-EventEmitter.removeAllListeners = function(eventName) {\n
-    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
-};\n
-\n
-exports.EventEmitter = EventEmitter;\n
-\n
-});\n
-\n
-define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-exports.inherits = (function() {\n
-    var tempCtor = function() {};\n
-    return function(ctor, superCtor) {\n
-        tempCtor.prototype = superCtor.prototype;\n
-        ctor.super_ = superCtor.prototype;\n
-        ctor.prototype = new tempCtor();\n
-        ctor.prototype.constructor = ctor;\n
-    };\n
-}());\n
-\n
-exports.mixin = function(obj, mixin) {\n
-    for (var key in mixin) {\n
-        obj[key] = mixin[key];\n
-    }\n
-    return obj;\n
-};\n
-\n
-exports.implement = function(proto, mixin) {\n
-    exports.mixin(proto, mixin);\n
-};\n
-\n
-});\n
+})(this);// https://github.com/kriskowal/es5-shim\n
 \n
 define(\'ace/lib/es5-shim\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
@@ -1099,6 +959,32 @@ oop.inherits(PhpWorker, Mirror);\n
 }).call(PhpWorker.prototype);\n
 \n
 });\n
+\n
+define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+exports.inherits = (function() {\n
+    var tempCtor = function() {};\n
+    return function(ctor, superCtor) {\n
+        tempCtor.prototype = superCtor.prototype;\n
+        ctor.super_ = superCtor.prototype;\n
+        ctor.prototype = new tempCtor();\n
+        ctor.prototype.constructor = ctor;\n
+    };\n
+}());\n
+\n
+exports.mixin = function(obj, mixin) {\n
+    for (var key in mixin) {\n
+        obj[key] = mixin[key];\n
+    }\n
+    return obj;\n
+};\n
+\n
+exports.implement = function(proto, mixin) {\n
+    exports.mixin(proto, mixin);\n
+};\n
+\n
+});\n
 define(\'ace/worker/mirror\', [\'require\', \'exports\', \'module\' , \'ace/document\', \'ace/lib/lang\'], function(require, exports, module) {\n
 \n
 \n
@@ -1228,7 +1114,7 @@ var Document = function(text) {\n
     };\n
     this.getTextRange = function(range) {\n
         if (range.start.row == range.end.row) {\n
-            return this.$lines[range.start.row]\n
+            return this.getLine(range.start.row)\n
                 .substring(range.start.column, range.end.column);\n
         }\n
         var lines = this.getLines(range.start.row, range.end.row);\n
@@ -1339,6 +1225,8 @@ var Document = function(text) {\n
         return end;\n
     };\n
     this.remove = function(range) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         range.start = this.$clipPosition(range.start);\n
         range.end = this.$clipPosition(range.end);\n
 \n
@@ -1422,6 +1310,8 @@ var Document = function(text) {\n
         this._emit("change", { data: delta });\n
     };\n
     this.replace = function(range, text) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         if (text.length == 0 && range.isEmpty())\n
             return range.start;\n
         if (text == this.getTextRange(range))\n
@@ -1494,6 +1384,132 @@ var Document = function(text) {\n
 exports.Document = Document;\n
 });\n
 \n
+define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+var EventEmitter = {};\n
+var stopPropagation = function() { this.propagationStopped = true; };\n
+var preventDefault = function() { this.defaultPrevented = true; };\n
+\n
+EventEmitter._emit =\n
+EventEmitter._dispatchEvent = function(eventName, e) {\n
+    this._eventRegistry || (this._eventRegistry = {});\n
+    this._defaultHandlers || (this._defaultHandlers = {});\n
+\n
+    var listeners = this._eventRegistry[eventName] || [];\n
+    var defaultHandler = this._defaultHandlers[eventName];\n
+    if (!listeners.length && !defaultHandler)\n
+        return;\n
+\n
+    if (typeof e != "object" || !e)\n
+        e = {};\n
+\n
+    if (!e.type)\n
+        e.type = eventName;\n
+    if (!e.stopPropagation)\n
+        e.stopPropagation = stopPropagation;\n
+    if (!e.preventDefault)\n
+        e.preventDefault = preventDefault;\n
+\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++) {\n
+        listeners[i](e, this);\n
+        if (e.propagationStopped)\n
+            break;\n
+    }\n
+    \n
+    if (defaultHandler && !e.defaultPrevented)\n
+        return defaultHandler(e, this);\n
+};\n
+\n
+\n
+EventEmitter._signal = function(eventName, e) {\n
+    var listeners = (this._eventRegistry || {})[eventName];\n
+    if (!listeners)\n
+        return;\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++)\n
+        listeners[i](e, this);\n
+};\n
+\n
+EventEmitter.once = function(eventName, callback) {\n
+    var _self = this;\n
+    callback && this.addEventListener(eventName, function newCallback() {\n
+        _self.removeEventListener(eventName, newCallback);\n
+        callback.apply(null, arguments);\n
+    });\n
+};\n
+\n
+\n
+EventEmitter.setDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        handlers = this._defaultHandlers = {_disabled_: {}};\n
+    \n
+    if (handlers[eventName]) {\n
+        var old = handlers[eventName];\n
+        var disabled = handlers._disabled_[eventName];\n
+        if (!disabled)\n
+            handlers._disabled_[eventName] = disabled = [];\n
+        disabled.push(old);\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1) \n
+            disabled.splice(i, 1);\n
+    }\n
+    handlers[eventName] = callback;\n
+};\n
+EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        return;\n
+    var disabled = handlers._disabled_[eventName];\n
+    \n
+    if (handlers[eventName] == callback) {\n
+        var old = handlers[eventName];\n
+        if (disabled)\n
+            this.setDefaultHandler(eventName, disabled.pop());\n
+    } else if (disabled) {\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1)\n
+            disabled.splice(i, 1);\n
+    }\n
+};\n
+\n
+EventEmitter.on =\n
+EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        listeners = this._eventRegistry[eventName] = [];\n
+\n
+    if (listeners.indexOf(callback) == -1)\n
+        listeners[capturing ? "unshift" : "push"](callback);\n
+    return callback;\n
+};\n
+\n
+EventEmitter.off =\n
+EventEmitter.removeListener =\n
+EventEmitter.removeEventListener = function(eventName, callback) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        return;\n
+\n
+    var index = listeners.indexOf(callback);\n
+    if (index !== -1)\n
+        listeners.splice(index, 1);\n
+};\n
+\n
+EventEmitter.removeAllListeners = function(eventName) {\n
+    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
+};\n
+\n
+exports.EventEmitter = EventEmitter;\n
+\n
+});\n
+\n
 define(\'ace/range\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 var comparePoints = function(p1, p2) {\n
@@ -1740,29 +1756,25 @@ var oop = require("./lib/oop");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 \n
 var Anchor = exports.Anchor = function(doc, row, column) {\n
-    this.document = doc;\n
-\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.attach(doc);\n
+    \n
     if (typeof column == "undefined")\n
         this.setPosition(row.row, row.column);\n
     else\n
         this.setPosition(row, column);\n
-\n
-    this.$onChange = this.onChange.bind(this);\n
-    doc.on("change", this.$onChange);\n
 };\n
 \n
 (function() {\n
 \n
     oop.implement(this, EventEmitter);\n
-\n
     this.getPosition = function() {\n
         return this.$clipPositionToDocument(this.row, this.column);\n
     };\n
-\n
     this.getDocument = function() {\n
         return this.document;\n
     };\n
-\n
+    this.$insertRight = false;\n
     this.onChange = function(e) {\n
         var delta = e.data;\n
         var range = delta.range;\n
@@ -1783,7 +1795,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         if (delta.action === "insertText") {\n
             if (start.row === row && start.column <= column) {\n
-                if (start.row === end.row) {\n
+                if (start.column === column && this.$insertRight) {\n
+                } else if (start.row === end.row) {\n
                     column += end.column - start.column;\n
                 } else {\n
                     column -= start.column;\n
@@ -1824,7 +1837,6 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         this.setPosition(row, column, true);\n
     };\n
-\n
     this.setPosition = function(row, column, noClip) {\n
         var pos;\n
         if (noClip) {\n
@@ -1851,10 +1863,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
             value: pos\n
         });\n
     };\n
-\n
     this.detach = function() {\n
         this.document.removeEventListener("change", this.$onChange);\n
     };\n
+    this.attach = function(doc) {\n
+        this.document = doc || this.document;\n
+        this.document.on("change", this.$onChange);\n
+    };\n
     this.$clipPositionToDocument = function(row, column) {\n
         var pos = {};\n
 \n
@@ -2067,8 +2082,6 @@ var PHP = {Constants:{}};\n
 \n
 \n
 \n
-\n
-\n
 PHP.Constants.T_INCLUDE = 262;\n
 PHP.Constants.T_INCLUDE_ONCE = 261;\n
 PHP.Constants.T_EVAL = 260;\n
@@ -2165,6 +2178,7 @@ PHP.Constants.T_ISSET = 350;\n
 PHP.Constants.T_EMPTY = 351;\n
 PHP.Constants.T_HALT_COMPILER = 352;\n
 PHP.Constants.T_CLASS = 353;\n
+PHP.Constants.T_TRAIT = 382;\n
 PHP.Constants.T_INTERFACE = 354;\n
 PHP.Constants.T_EXTENDS = 355;\n
 PHP.Constants.T_IMPLEMENTS = 356;\n
@@ -2212,6 +2226,10 @@ PHP.Lexer = function( src, ini ) {\n
     openTag = (ini === undefined || (/^(on|true|1)$/i.test(ini.short_open_tag) ) ? /(\\<\\?php\\s|\\<\\?|\\<\\%|\\<script language\\=(\'|")?php(\'|")?\\>)/i : /(\\<\\?php\\s|<\\?=|\\<script language\\=(\'|")?php(\'|")?\\>)/i),\n
         openTagStart = (ini === undefined || (/^(on|true|1)$/i.test(ini.short_open_tag)) ? /^(\\<\\?php\\s|\\<\\?|\\<\\%|\\<script language\\=(\'|")?php(\'|")?\\>)/i : /^(\\<\\?php\\s|<\\?=|\\<script language\\=(\'|")?php(\'|")?\\>)/i),\n
             tokens = [\n
+            {\n
+                value: PHP.Constants.T_NAMESPACE,\n
+                re: /^namespace(?=\\s)/i\n
+            },\n
             {\n
                 value: PHP.Constants.T_USE,\n
                 re: /^use(?=\\s)/i\n
@@ -2505,6 +2523,10 @@ PHP.Lexer = function( src, ini ) {\n
                 re: /^class(?=[\\s\\{])/i,\n
                 afterWhitespace: true\n
             },\n
+            {\n
+                value: PHP.Constants.T_TRAIT,\n
+                re: /^trait(?=[\\s]+[A-Za-z])/i,\n
+            },\n
             {\n
                 value: PHP.Constants.T_PUBLIC,\n
                 re: /^public(?=[\\s])/i\n
@@ -2716,7 +2738,7 @@ PHP.Lexer = function( src, ini ) {\n
 \n
                                 result = result.substring( match[ 0 ].length );\n
 \n
-                                match = result.match(/^(\\-\\>)([a-zA-Z0-9_\\x7f-\\xff]*)/);\n
+                                match = result.match(/^(\\-\\>)\\s*([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*)\\s*(\\()/);\n
 \n
                                 if ( match !== null ) {\n
 \n
@@ -2730,6 +2752,9 @@ PHP.Lexer = function( src, ini ) {\n
                                         match[ 2 ],\n
                                         line\n
                                         ]);\n
+                                    if (match[3]) {\n
+                                        results.push(match[3]);\n
+                                    }\n
                                     result = result.substring( match[ 0 ].length );\n
                                 }\n
 \n
@@ -2741,9 +2766,9 @@ PHP.Lexer = function( src, ini ) {\n
 \n
                             var re;\n
                             if ( curlyOpen > 0) {\n
-                                re = /^([^\\\\\\$"{}\\]]|\\\\.)+/g;\n
+                                re = /^([^\\\\\\$"{}\\]\\)]|\\\\.)+/g;\n
                             } else {\n
-                                re = /^([^\\\\\\$"{]|\\\\.|{[^\\$])+/g;\n
+                                re = /^([^\\\\\\$"{]|\\\\.|{[^\\$]|\\$(?=[^a-zA-Z_\\x7f-\\xff]))+/g;;\n
                             }\n
 \n
                             while(( match = result.match( re )) !== null ) {\n
@@ -2757,7 +2782,7 @@ PHP.Lexer = function( src, ini ) {\n
 \n
                                 results.push([\n
                                     parseInt(( curlyOpen > 0 ) ? PHP.Constants.T_CONSTANT_ENCAPSED_STRING : PHP.Constants.T_ENCAPSED_AND_WHITESPACE, 10),\n
-                                    match[ 0 ],\n
+                                    match[ 0 ].replace(/\\n/g,"\\\\n").replace(/\\r/g,""),\n
                                     line\n
                                     ]);\n
 \n
@@ -2788,10 +2813,16 @@ PHP.Lexer = function( src, ini ) {\n
 \n
                         return undefined;\n
 \n
+                    } else {\n
+                        result = result.replace(/\\r/g,"");\n
                     }\n
                     return result;\n
                 }\n
             },\n
+            {\n
+                value: PHP.Constants.T_NS_SEPARATOR,\n
+                re: /^\\\\(?=[a-zA-Z_])/\n
+            },\n
             {\n
                 value: PHP.Constants.T_STRING,\n
                 re: /^[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/\n
@@ -2826,7 +2857,7 @@ PHP.Lexer = function( src, ini ) {\n
 \n
                     if ( heredoc !== undefined ) {\n
 \n
-                        var regexp = new RegExp(\'([\\\\S\\\\s]*)(\\\\r\\\\n|\\\\n|\\\\r)(\' + heredoc + \')(;|\\\\r\\\\n|\\\\n)\',"i");\n
+                        var regexp = new RegExp(\'([\\\\S\\\\s]*?)(\\\\r\\\\n|\\\\n|\\\\r)(\' + heredoc + \')(;|\\\\r\\\\n|\\\\n)\',"i");\n
 \n
 \n
 \n
@@ -3134,9 +3165,13 @@ PHP.Parser.prototype.getNextToken = function( ) {\n
         if (typeof token === "string") {\n
             this.startAttributes[\'startLine\'] = this.line;\n
             this.endAttributes[\'endLine\'] = this.line;\n
-\n
-            this.tokenValue = token;\n
-            return token.charCodeAt(0);\n
+            if (\'b"\' === token) {\n
+                this.tokenValue = \'b"\';\n
+                return \'"\'.charCodeAt(0);\n
+            } else {\n
+                this.tokenValue = token;\n
+                return token.charCodeAt(0);\n
+            }\n
         } else {\n
 \n
 \n
@@ -3175,7 +3210,30 @@ PHP.Parser.prototype.tokenName = function( token ) {\n
     var constants = ["T_INCLUDE","T_INCLUDE_ONCE","T_EVAL","T_REQUIRE","T_REQUIRE_ONCE","T_LOGICAL_OR","T_LOGICAL_XOR","T_LOGICAL_AND","T_PRINT","T_PLUS_EQUAL","T_MINUS_EQUAL","T_MUL_EQUAL","T_DIV_EQUAL","T_CONCAT_EQUAL","T_MOD_EQUAL","T_AND_EQUAL","T_OR_EQUAL","T_XOR_EQUAL","T_SL_EQUAL","T_SR_EQUAL","T_BOOLEAN_OR","T_BOOLEAN_AND","T_IS_EQUAL","T_IS_NOT_EQUAL","T_IS_IDENTICAL","T_IS_NOT_IDENTICAL","T_IS_SMALLER_OR_EQUAL","T_IS_GREATER_OR_EQUAL","T_SL","T_SR","T_INSTANCEOF","T_INC","T_DEC","T_INT_CAST","T_DOUBLE_CAST","T_STRING_CAST","T_ARRAY_CAST","T_OBJECT_CAST","T_BOOL_CAST","T_UNSET_CAST","T_NEW","T_CLONE","T_EXIT","T_IF","T_ELSEIF","T_ELSE","T_ENDIF","T_LNUMBER","T_DNUMBER","T_STRING","T_STRING_VARNAME","T_VARIABLE","T_NUM_STRING","T_INLINE_HTML","T_CHARACTER","T_BAD_CHARACTER","T_ENCAPSED_AND_WHITESPACE","T_CONSTANT_ENCAPSED_STRING","T_ECHO","T_DO","T_WHILE","T_ENDWHILE","T_FOR","T_ENDFOR","T_FOREACH","T_ENDFOREACH","T_DECLARE","T_ENDDECLARE","T_AS","T_SWITCH","T_ENDSWITCH","T_CASE","T_DEFAULT","T_BREAK","T_CONTINUE","T_GOTO","T_FUNCTION","T_CONST","T_RETURN","T_TRY","T_CATCH","T_THROW","T_USE","T_INSTEADOF","T_GLOBAL","T_STATIC","T_ABSTRACT","T_FINAL","T_PRIVATE","T_PROTECTED","T_PUBLIC","T_VAR","T_UNSET","T_ISSET","T_EMPTY","T_HALT_COMPILER","T_CLASS","T_TRAIT","T_INTERFACE","T_EXTENDS","T_IMPLEMENTS","T_OBJECT_OPERATOR","T_DOUBLE_ARROW","T_LIST","T_ARRAY","T_CALLABLE","T_CLASS_C","T_TRAIT_C","T_METHOD_C","T_FUNC_C","T_LINE","T_FILE","T_COMMENT","T_DOC_COMMENT","T_OPEN_TAG","T_OPEN_TAG_WITH_ECHO","T_CLOSE_TAG","T_WHITESPACE","T_START_HEREDOC","T_END_HEREDOC","T_DOLLAR_OPEN_CURLY_BRACES","T_CURLY_OPEN","T_PAAMAYIM_NEKUDOTAYIM","T_DOUBLE_COLON","T_NAMESPACE","T_NS_C","T_DIR","T_NS_SEPARATOR"];\n
     var current = "UNKNOWN";\n
     constants.some(function( constant ) {\n
-        if (PHP.Constants[ constant ] === token) {\n
+        if (PHP.Constants[ constan
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+t ] === token) {\n
             current = constant;\n
             return true;\n
         } else {\n
@@ -3198,14 +3256,79 @@ PHP.Parser.prototype.createTokenMap = function() {\n
             tokenMap[ i ] = PHP.Constants.T_ECHO;\n
         } else if( PHP.Constants.T_CLOSE_TAG === i ) {\n
             tokenMap[ i ] = 59;\n
-        } else if ( \'UNKNOWN\' !== (name = this.tokenName( i ) ) ) {\n
-\n
+        } else if ( \'UNKNOWN\' !== (name = this.tokenName( i ) ) ) { \n
             tokenMap[ i ] =  this[name];\n
         }\n
     }\n
     return tokenMap;\n
 };\n
 \n
+var yynStandard = function () {\n
+    this.yyval =  this.yyastk[ this.stackPos-(1-1) ];\n
+};\n
+\n
+PHP.Parser.prototype.MakeArray = function( arr ) {\n
+    return Array.isArray( arr ) ? arr : [ arr ];\n
+}\n
+\n
+\n
+PHP.Parser.prototype.parseString = function( str ) {\n
+    var bLength = 0;\n
+    if (\'b\' === str[0]) {\n
+        bLength = 1;\n
+    }\n
+\n
+    if (\'\\\'\' === str[ bLength ]) {\n
+        str = str.replace(\n
+            [\'\\\\\\\\\', \'\\\\\\\'\'],\n
+            [  \'\\\\\',   \'\\\'\']);\n
+    } else {\n
+\n
+        str = this.parseEscapeSequences( str, \'"\');\n
+\n
+    }\n
+\n
+    return str;\n
+\n
+};\n
+\n
+PHP.Parser.prototype.parseEscapeSequences = function( str, quote ) {\n
+\n
+\n
+\n
+    if (undefined !== quote) {\n
+        str = str.replace(new RegExp(\'\\\\\' + quote, "g"), quote);\n
+    }\n
+\n
+    var replacements = {\n
+        \'\\\\\': \'\\\\\',\n
+        \'$\':  \'$\',\n
+        \'n\': "\\n",\n
+        \'r\': "\\r",\n
+        \'t\': "\\t",\n
+        \'f\': "\\f",\n
+        \'v\': "\\v",\n
+        \'e\': "\\x1B"\n
+    };\n
+\n
+    return str.replace(\n
+        /~\\\\\\\\([\\\\\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~/g,\n
+        function ( matches ){\n
+            var str = matches[1];\n
+\n
+            if ( replacements[ str ] !== undefined ) {\n
+                return replacements[ str ];\n
+            } else if (\'x\' === str[ 0 ] || \'X\' === str[ 0 ]) {\n
+                return chr(hexdec(str));\n
+            } else {\n
+                return chr(octdec(str));\n
+            }\n
+        }\n
+        );\n
+\n
+    return str;\n
+};\n
+\n
 PHP.Parser.prototype.TOKEN_NONE    = -1;\n
 PHP.Parser.prototype.TOKEN_INVALID = 149;\n
 \n
@@ -4574,7 +4697,28 @@ PHP.Parser.prototype.yyn121 = function ( attributes ) {\n
 \n
 PHP.Parser.prototype.yyn122 = function ( attributes ) {\n
      this.yyval = []; \n
-};\n
+};
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>\n
 \n
 PHP.Parser.prototype.yyn123 = function ( attributes ) {\n
      this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n
@@ -5677,6 +5821,63 @@ PHP.Parser.prototype.Stmt_Class_verifyModifier = function() {\n
 \n
 };\n
 \n
+PHP.Parser.prototype.Node_Stmt_Namespace = function() {\n
+    return {\n
+        type: "Node_Stmt_Namespace",\n
+        name: arguments[ 0 ],\n
+        attributes: arguments[ 2 ]\n
+    };  \n
+};\n
+\n
+PHP.Parser.prototype.Node_Stmt_Use = function() {\n
+    return {\n
+        type: "Node_Stmt_Use",\n
+        name: arguments[ 0 ],\n
+        attributes: arguments[ 2 ]\n
+    };  \n
+};\n
+\n
+PHP.Parser.prototype.Node_Stmt_UseUse = function() {\n
+    return {\n
+        type: "Node_Stmt_UseUse",\n
+        name: arguments[ 0 ],\n
+        as: arguments[1],\n
+        attributes: arguments[ 2 ]\n
+    };  \n
+};\n
+\n
+PHP.Parser.prototype.Node_Stmt_TraitUseAdaptation_Precedence = function() {\n
+    return {\n
+        type: "Node_Stmt_TraitUseAdaptation_Precedence",\n
+        name: arguments[ 0 ],\n
+        attributes: arguments[ 2 ]\n
+    };  \n
+};\n
+\n
+PHP.Parser.prototype.Node_Stmt_TraitUseAdaptation_Alias = function() {\n
+    return {\n
+        type: "Node_Stmt_TraitUseAdaptation_Alias",\n
+        name: arguments[ 0 ],\n
+        attributes: arguments[ 2 ]\n
+    };  \n
+};\n
+\n
+PHP.Parser.prototype.Node_Stmt_Trait = function() {\n
+    return {\n
+        type: "Node_Stmt_Trait",\n
+        name: arguments[ 0 ],\n
+        attributes: arguments[ 2 ]\n
+    };  \n
+};\n
+\n
+PHP.Parser.prototype.Node_Stmt_TraitUse = function() {\n
+    return {\n
+        type: "Node_Stmt_TraitUse",\n
+        name: arguments[ 0 ],\n
+        attributes: arguments[ 2 ]\n
+    };  \n
+};\n
+\n
 PHP.Parser.prototype.Node_Stmt_Class = function() {\n
     return {\n
         type: "Node_Stmt_Class",\n
@@ -6704,6 +6905,26 @@ PHP.Parser.prototype.Node_Name = function() {\n
   \n
 };\n
 \n
+PHP.Parser.prototype.Node_Name_FullyQualified = function() {\n
+   \n
+    return {\n
+        type: "Node_Name_FullyQualified",\n
+        parts: arguments[ 0 ],\n
+        attributes: arguments[ 1 ]\n
+    };  \n
+  \n
+};\n
+\n
+PHP.Parser.prototype.Node_Name_Relative = function() {\n
+   \n
+    return {\n
+        type: "Node_Name_Relative",\n
+        parts: arguments[ 0 ],\n
+        attributes: arguments[ 1 ]\n
+    };  \n
+  \n
+};\n
+\n
 PHP.Parser.prototype.Node_Param = function() {\n
    \n
     return {\n
@@ -6728,7 +6949,6 @@ PHP.Parser.prototype.Node_Arg = function() {\n
   \n
 };\n
 \n
-\n
 PHP.Parser.prototype.Node_Const = function() {\n
    \n
     return {\n
@@ -6743,9 +6963,13 @@ PHP.Parser.prototype.Node_Const = function() {\n
 \n
 exports.PHP = PHP;\n
 });\n
-
-
-]]></string> </value>
+</string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <none/>
+            </value>
         </item>
       </dictionary>
     </pickle>
diff --git a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-xquery.js.xml b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-xquery.js.xml
index 1f77b1fe4d..e57e31140b 100644
--- a/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-xquery.js.xml
+++ b/bt5/erp5_ace_editor/SkinTemplateItem/portal_skins/erp5_ace_editor/ace/worker-xquery.js.xml
@@ -8,7 +8,7 @@
       <dictionary>
         <item>
             <key> <string>_EtagSupport__etag</string> </key>
-            <value> <string>ts77155542.36</string> </value>
+            <value> <string>ts83646620.46</string> </value>
         </item>
         <item>
             <key> <string>__name__</string> </key>
@@ -30,7 +30,7 @@
         </item>
         <item>
             <key> <string>size</string> </key>
-            <value> <int>1157746</int> </value>
+            <value> <int>1158768</int> </value>
         </item>
         <item>
             <key> <string>title</string> </key>
@@ -55,31 +55,30 @@ if (typeof window.window != "undefined" && window.document) {\n
     return;\n
 }\n
 \n
-window.console = {\n
-    log: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    },\n
-    error: function() {\n
-        var msgs = Array.prototype.slice.call(arguments, 0);\n
-        postMessage({type: "log", data: msgs});\n
-    }\n
+window.console = function() {\n
+    var msgs = Array.prototype.slice.call(arguments, 0);\n
+    postMessage({type: "log", data: msgs});\n
 };\n
+window.console.error =\n
+window.console.warn = \n
+window.console.log =\n
+window.console.trace = window.console;\n
+\n
 window.window = window;\n
 window.ace = window;\n
 \n
 window.normalizeModule = function(parentId, moduleName) {\n
     if (moduleName.indexOf("!") !== -1) {\n
         var chunks = moduleName.split("!");\n
-        return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);\n
+        return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);\n
     }\n
     if (moduleName.charAt(0) == ".") {\n
         var base = parentId.split("/").slice(0, -1).join("/");\n
-        moduleName = base + "/" + moduleName;\n
+        moduleName = (base ? base + "/" : "") + moduleName;\n
         \n
         while(moduleName.indexOf(".") !== -1 && previous != moduleName) {\n
             var previous = moduleName;\n
-            moduleName = moduleName.replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
+            moduleName = moduleName.replace(/^\\.\\//, "").replace(/\\/\\.\\//, "/").replace(/[^\\/]+\\/\\.\\.\\//, "");\n
         }\n
     }\n
     \n
@@ -94,9 +93,9 @@ window.require = function(parentId, id) {\n
     if (!id.charAt)\n
         throw new Error("worker.js require() accepts only (parentId, id) as arguments");\n
 \n
-    id = normalizeModule(parentId, id);\n
+    id = window.normalizeModule(parentId, id);\n
 \n
-    var module = require.modules[id];\n
+    var module = window.require.modules[id];\n
     if (module) {\n
         if (!module.initialized) {\n
             module.initialized = true;\n
@@ -106,48 +105,60 @@ window.require = function(parentId, id) {\n
     }\n
     \n
     var chunks = id.split("/");\n
-    chunks[0] = require.tlns[chunks[0]] || chunks[0];\n
+    if (!window.require.tlns)\n
+        return console.log("unable to load " + id);\n
+    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n
     var path = chunks.join("/") + ".js";\n
     \n
-    require.id = id;\n
+    window.require.id = id;\n
     importScripts(path);\n
-    return require(parentId, id);\n
+    return window.require(parentId, id);\n
 };\n
-\n
-require.modules = {};\n
-require.tlns = {};\n
+window.require.modules = {};\n
+window.require.tlns = {};\n
 \n
 window.define = function(id, deps, factory) {\n
     if (arguments.length == 2) {\n
         factory = deps;\n
         if (typeof id != "string") {\n
             deps = id;\n
-            id = require.id;\n
+            id = window.require.id;\n
         }\n
     } else if (arguments.length == 1) {\n
         factory = id;\n
-        id = require.id;\n
+        deps = []\n
+        id = window.require.id;\n
     }\n
+\n
+    if (!deps.length)\n
+        deps = [\'require\', \'exports\', \'module\']\n
 \n
     if (id.indexOf("text!") === 0) \n
         return;\n
     \n
-    var req = function(deps, factory) {\n
-        return require(id, deps, factory);\n
+    var req = function(childId) {\n
+        return window.require(id, childId);\n
     };\n
 \n
-    require.modules[id] = {\n
+    window.require.modules[id] = {\n
+        exports: {},\n
         factory: function() {\n
-            var module = {\n
-                exports: {}\n
-            };\n
-            var returnExports = factory(req, module.exports, module);\n
+            var module = this;\n
+            var returnExports = factory.apply(this, deps.map(function(dep) {\n
+              switch(dep) {\n
+                  case \'require\': return req\n
+                  case \'exports\': return module.exports\n
+                  case \'module\':  return module\n
+                  default:        return req(dep)\n
+              }\n
+            }));\n
             if (returnExports)\n
                 module.exports = returnExports;\n
             return module;\n
         }\n
     };\n
 };\n
+window.define.amd = {}\n
 \n
 window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
     require.tlns = topLevelNamespaces;\n
@@ -155,8 +166,8 @@ window.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n
 \n
 window.initSender = function initSender() {\n
 \n
-    var EventEmitter = require("ace/lib/event_emitter").EventEmitter;\n
-    var oop = require("ace/lib/oop");\n
+    var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;\n
+    var oop = window.require("ace/lib/oop");\n
     \n
     var Sender = function() {};\n
     \n
@@ -207,158 +218,7 @@ window.onmessage = function(e) {\n
         sender._emit(msg.event, msg.data);\n
     }\n
 };\n
-})(this);\n
-\n
-define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-var EventEmitter = {};\n
-var stopPropagation = function() { this.propagationStopped = true; };\n
-var preventDefault = function() { this.defaultPrevented = true; };\n
-\n
-EventEmitter._emit =\n
-EventEmitter._dispatchEvent = function(eventName, e) {\n
-    this._eventRegistry || (this._eventRegistry = {});\n
-    this._defaultHandlers || (this._defaultHandlers = {});\n
-\n
-    var listeners = this._eventRegistry[eventName] || [];\n
-    var defaultHandler = this._defaultHandlers[eventName];\n
-    if (!listeners.length && !defaultHandler)\n
-        return;\n
-\n
-    if (typeof e != "object" || !e)\n
-        e = {};\n
-\n
-    if (!e.type)\n
-        e.type = eventName;\n
-    if (!e.stopPropagation)\n
-        e.stopPropagation = stopPropagation;\n
-    if (!e.preventDefault)\n
-        e.preventDefault = preventDefault;\n
-\n
-    for (var i=0; i<listeners.length; i++) {\n
-        listeners[i](e, this);\n
-        if (e.propagationStopped)\n
-            break;\n
-    }\n
-    \n
-    if (defaultHandler && !e.defaultPrevented)\n
-        return defaultHandler(e, this);\n
-};\n
-\n
-\n
-EventEmitter._signal = function(eventName, e) {\n
-    var listeners = (this._eventRegistry || {})[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    for (var i=0; i<listeners.length; i++)\n
-        listeners[i](e, this);\n
-};\n
-\n
-EventEmitter.once = function(eventName, callback) {\n
-    var _self = this;\n
-    callback && this.addEventListener(eventName, function newCallback() {\n
-        _self.removeEventListener(eventName, newCallback);\n
-        callback.apply(null, arguments);\n
-    });\n
-};\n
-\n
-\n
-EventEmitter.setDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        handlers = this._defaultHandlers = {_disabled_: {}};\n
-    \n
-    if (handlers[eventName]) {\n
-        var old = handlers[eventName];\n
-        var disabled = handlers._disabled_[eventName];\n
-        if (!disabled)\n
-            handlers._disabled_[eventName] = disabled = [];\n
-        disabled.push(old);\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1) \n
-            disabled.splice(i, 1);\n
-    }\n
-    handlers[eventName] = callback;\n
-};\n
-EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
-    var handlers = this._defaultHandlers\n
-    if (!handlers)\n
-        return;\n
-    var disabled = handlers._disabled_[eventName];\n
-    \n
-    if (handlers[eventName] == callback) {\n
-        var old = handlers[eventName];\n
-        if (disabled)\n
-            this.setDefaultHandler(eventName, disabled.pop());\n
-    } else if (disabled) {\n
-        var i = disabled.indexOf(callback);\n
-        if (i != -1)\n
-            disabled.splice(i, 1);\n
-    }\n
-};\n
-\n
-EventEmitter.on =\n
-EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        listeners = this._eventRegistry[eventName] = [];\n
-\n
-    if (listeners.indexOf(callback) == -1)\n
-        listeners[capturing ? "unshift" : "push"](callback);\n
-    return callback;\n
-};\n
-\n
-EventEmitter.off =\n
-EventEmitter.removeListener =\n
-EventEmitter.removeEventListener = function(eventName, callback) {\n
-    this._eventRegistry = this._eventRegistry || {};\n
-\n
-    var listeners = this._eventRegistry[eventName];\n
-    if (!listeners)\n
-        return;\n
-\n
-    var index = listeners.indexOf(callback);\n
-    if (index !== -1)\n
-        listeners.splice(index, 1);\n
-};\n
-\n
-EventEmitter.removeAllListeners = function(eventName) {\n
-    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
-};\n
-\n
-exports.EventEmitter = EventEmitter;\n
-\n
-});\n
-\n
-define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
-\n
-\n
-exports.inherits = (function() {\n
-    var tempCtor = function() {};\n
-    return function(ctor, superCtor) {\n
-        tempCtor.prototype = superCtor.prototype;\n
-        ctor.super_ = superCtor.prototype;\n
-        ctor.prototype = new tempCtor();\n
-        ctor.prototype.constructor = ctor;\n
-    };\n
-}());\n
-\n
-exports.mixin = function(obj, mixin) {\n
-    for (var key in mixin) {\n
-        obj[key] = mixin[key];\n
-    }\n
-    return obj;\n
-};\n
-\n
-exports.implement = function(proto, mixin) {\n
-    exports.mixin(proto, mixin);\n
-};\n
-\n
-});\n
+})(this);// https://github.com/kriskowal/es5-shim\n
 \n
 define(\'ace/lib/es5-shim\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
@@ -1108,6 +968,32 @@ oop.inherits(XQueryWorker, Mirror);\n
 }).call(XQueryWorker.prototype);\n
 \n
 });\n
+\n
+define(\'ace/lib/oop\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+exports.inherits = (function() {\n
+    var tempCtor = function() {};\n
+    return function(ctor, superCtor) {\n
+        tempCtor.prototype = superCtor.prototype;\n
+        ctor.super_ = superCtor.prototype;\n
+        ctor.prototype = new tempCtor();\n
+        ctor.prototype.constructor = ctor;\n
+    };\n
+}());\n
+\n
+exports.mixin = function(obj, mixin) {\n
+    for (var key in mixin) {\n
+        obj[key] = mixin[key];\n
+    }\n
+    return obj;\n
+};\n
+\n
+exports.implement = function(proto, mixin) {\n
+    exports.mixin(proto, mixin);\n
+};\n
+\n
+});\n
 define(\'ace/worker/mirror\', [\'require\', \'exports\', \'module\' , \'ace/document\', \'ace/lib/lang\'], function(require, exports, module) {\n
 \n
 \n
@@ -1237,7 +1123,7 @@ var Document = function(text) {\n
     };\n
     this.getTextRange = function(range) {\n
         if (range.start.row == range.end.row) {\n
-            return this.$lines[range.start.row]\n
+            return this.getLine(range.start.row)\n
                 .substring(range.start.column, range.end.column);\n
         }\n
         var lines = this.getLines(range.start.row, range.end.row);\n
@@ -1348,6 +1234,8 @@ var Document = function(text) {\n
         return end;\n
     };\n
     this.remove = function(range) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         range.start = this.$clipPosition(range.start);\n
         range.end = this.$clipPosition(range.end);\n
 \n
@@ -1431,6 +1319,8 @@ var Document = function(text) {\n
         this._emit("change", { data: delta });\n
     };\n
     this.replace = function(range, text) {\n
+        if (!range instanceof Range)\n
+            range = Range.fromPoints(range.start, range.end);\n
         if (text.length == 0 && range.isEmpty())\n
             return range.start;\n
         if (text == this.getTextRange(range))\n
@@ -1503,6 +1393,132 @@ var Document = function(text) {\n
 exports.Document = Document;\n
 });\n
 \n
+define(\'ace/lib/event_emitter\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
+\n
+\n
+var EventEmitter = {};\n
+var stopPropagation = function() { this.propagationStopped = true; };\n
+var preventDefault = function() { this.defaultPrevented = true; };\n
+\n
+EventEmitter._emit =\n
+EventEmitter._dispatchEvent = function(eventName, e) {\n
+    this._eventRegistry || (this._eventRegistry = {});\n
+    this._defaultHandlers || (this._defaultHandlers = {});\n
+\n
+    var listeners = this._eventRegistry[eventName] || [];\n
+    var defaultHandler = this._defaultHandlers[eventName];\n
+    if (!listeners.length && !defaultHandler)\n
+        return;\n
+\n
+    if (typeof e != "object" || !e)\n
+        e = {};\n
+\n
+    if (!e.type)\n
+        e.type = eventName;\n
+    if (!e.stopPropagation)\n
+        e.stopPropagation = stopPropagation;\n
+    if (!e.preventDefault)\n
+        e.preventDefault = preventDefault;\n
+\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++) {\n
+        listeners[i](e, this);\n
+        if (e.propagationStopped)\n
+            break;\n
+    }\n
+    \n
+    if (defaultHandler && !e.defaultPrevented)\n
+        return defaultHandler(e, this);\n
+};\n
+\n
+\n
+EventEmitter._signal = function(eventName, e) {\n
+    var listeners = (this._eventRegistry || {})[eventName];\n
+    if (!listeners)\n
+        return;\n
+    listeners = listeners.slice();\n
+    for (var i=0; i<listeners.length; i++)\n
+        listeners[i](e, this);\n
+};\n
+\n
+EventEmitter.once = function(eventName, callback) {\n
+    var _self = this;\n
+    callback && this.addEventListener(eventName, function newCallback() {\n
+        _self.removeEventListener(eventName, newCallback);\n
+        callback.apply(null, arguments);\n
+    });\n
+};\n
+\n
+\n
+EventEmitter.setDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        handlers = this._defaultHandlers = {_disabled_: {}};\n
+    \n
+    if (handlers[eventName]) {\n
+        var old = handlers[eventName];\n
+        var disabled = handlers._disabled_[eventName];\n
+        if (!disabled)\n
+            handlers._disabled_[eventName] = disabled = [];\n
+        disabled.push(old);\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1) \n
+            disabled.splice(i, 1);\n
+    }\n
+    handlers[eventName] = callback;\n
+};\n
+EventEmitter.removeDefaultHandler = function(eventName, callback) {\n
+    var handlers = this._defaultHandlers\n
+    if (!handlers)\n
+        return;\n
+    var disabled = handlers._disabled_[eventName];\n
+    \n
+    if (handlers[eventName] == callback) {\n
+        var old = handlers[eventName];\n
+        if (disabled)\n
+            this.setDefaultHandler(eventName, disabled.pop());\n
+    } else if (disabled) {\n
+        var i = disabled.indexOf(callback);\n
+        if (i != -1)\n
+            disabled.splice(i, 1);\n
+    }\n
+};\n
+\n
+EventEmitter.on =\n
+EventEmitter.addEventListener = function(eventName, callback, capturing) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        listeners = this._eventRegistry[eventName] = [];\n
+\n
+    if (listeners.indexOf(callback) == -1)\n
+        listeners[capturing ? "unshift" : "push"](callback);\n
+    return callback;\n
+};\n
+\n
+EventEmitter.off =\n
+EventEmitter.removeListener =\n
+EventEmitter.removeEventListener = function(eventName, callback) {\n
+    this._eventRegistry = this._eventRegistry || {};\n
+\n
+    var listeners = this._eventRegistry[eventName];\n
+    if (!listeners)\n
+        return;\n
+\n
+    var index = listeners.indexOf(callback);\n
+    if (index !== -1)\n
+        listeners.splice(index, 1);\n
+};\n
+\n
+EventEmitter.removeAllListeners = function(eventName) {\n
+    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n
+};\n
+\n
+exports.EventEmitter = EventEmitter;\n
+\n
+});\n
+\n
 define(\'ace/range\', [\'require\', \'exports\', \'module\' ], function(require, exports, module) {\n
 \n
 var comparePoints = function(p1, p2) {\n
@@ -1749,29 +1765,25 @@ var oop = require("./lib/oop");\n
 var EventEmitter = require("./lib/event_emitter").EventEmitter;\n
 \n
 var Anchor = exports.Anchor = function(doc, row, column) {\n
-    this.document = doc;\n
-\n
+    this.$onChange = this.onChange.bind(this);\n
+    this.attach(doc);\n
+    \n
     if (typeof column == "undefined")\n
         this.setPosition(row.row, row.column);\n
     else\n
         this.setPosition(row, column);\n
-\n
-    this.$onChange = this.onChange.bind(this);\n
-    doc.on("change", this.$onChange);\n
 };\n
 \n
 (function() {\n
 \n
     oop.implement(this, EventEmitter);\n
-\n
     this.getPosition = function() {\n
         return this.$clipPositionToDocument(this.row, this.column);\n
     };\n
-\n
     this.getDocument = function() {\n
         return this.document;\n
     };\n
-\n
+    this.$insertRight = false;\n
     this.onChange = function(e) {\n
         var delta = e.data;\n
         var range = delta.range;\n
@@ -1792,7 +1804,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         if (delta.action === "insertText") {\n
             if (start.row === row && start.column <= column) {\n
-                if (start.row === end.row) {\n
+                if (start.column === column && this.$insertRight) {\n
+                } else if (start.row === end.row) {\n
                     column += end.column - start.column;\n
                 } else {\n
                     column -= start.column;\n
@@ -1833,7 +1846,6 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
 \n
         this.setPosition(row, column, true);\n
     };\n
-\n
     this.setPosition = function(row, column, noClip) {\n
         var pos;\n
         if (noClip) {\n
@@ -1860,10 +1872,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {\n
             value: pos\n
         });\n
     };\n
-\n
     this.detach = function() {\n
         this.document.removeEventListener("change", this.$onChange);\n
     };\n
+    this.attach = function(doc) {\n
+        this.document = doc || this.document;\n
+        this.document.on("change", this.$onChange);\n
+    };\n
     this.$clipPositionToDocument = function(row, column) {\n
         var pos = {};\n
 \n
@@ -3631,7 +3646,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
       try_PositionalVar();\n
     }\n
     lookahead1W(122);               // S^WS | \'(:\' | \'in\' | \'score\'\n
-    if (l1 == 228)                  // \'score\'\n
+    if (l1 == 228)      
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="3" aka="AAAAAAAAAAM=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+            // \'score\'\n
     {\n
       try_FTScoreVar();\n
     }\n
@@ -5651,7 +5689,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
     switch (lk)\n
     {\n
     case 87812:                     // \'validate\' \'lax\'\n
-    case 123140:                    // \'validate\' \'strict\'\n
+    case 123140:           
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="4" aka="AAAAAAAAAAQ=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+         // \'validate\' \'strict\'\n
     case 129284:                    // \'validate\' \'type\'\n
     case 141572:                    // \'validate\' \'{\'\n
       try_ValidateExpr();\n
@@ -7141,7 +7202,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
     case 67768:                     // \'namespace\' \'exit\'\n
     case 67800:                     // \'processing-instruction\' \'exit\'\n
     case 68178:                     // \'attribute\' \'external\'\n
-    case 68217:                     // \'element\' \'external\'\n
+    case 68217:                     // \'element\' \'e
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="5" aka="AAAAAAAAAAU=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+xternal\'\n
     case 68280:                     // \'namespace\' \'external\'\n
     case 68312:                     // \'processing-instruction\' \'external\'\n
     case 68690:                     // \'attribute\' \'first\'\n
@@ -8276,7 +8360,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
     case 119890:                    // \'attribute\' \'sliding\'\n
     case 119929:                    // \'element\' \'sliding\'\n
     case 119992:                    // \'namespace\' \'sliding\'\n
-    case 120024:                    // \'processing-instruction\' \'sliding\'\n
+    case 120024:            
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="6" aka="AAAAAAAAAAY=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+        // \'processing-instruction\' \'sliding\'\n
     case 120402:                    // \'attribute\' \'some\'\n
     case 120441:                    // \'element\' \'some\'\n
     case 120504:                    // \'namespace\' \'some\'\n
@@ -10351,7 +10458,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
   {\n
     eventHandler.startNonterminal("JSONItemTest", e0);\n
     shift(167);                     // \'json-item\'\n
-    lookahead1W(22);                // S^WS | \'(\' | \'(:\'\n
+    lookahead1W(22);                // S^WS | \'(\' | 
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="7" aka="AAAAAAAAAAc=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+\'(:\'\n
     shift(34);                      // \'(\'\n
     lookahead1W(23);                // S^WS | \'(:\' | \')\'\n
     shift(37);                      // \')\'\n
@@ -12507,7 +12637,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
     default:\n
       shiftT(188);                  // \'no\'\n
       lookahead1W(74);              // S^WS | \'(:\' | \'stemming\'\n
-      shiftT(238);                  // \'stemming\'\n
+ 
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="8" aka="AAAAAAAAAAg=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+     shiftT(238);                  // \'stemming\'\n
     }\n
   }\n
 \n
@@ -14401,7 +14554,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
       shift(184);                   // \'namespace\'\n
       break;\n
     case 185:                       // \'namespace-node\'\n
-      shift(185);                   // \'namespace-node\'\n
+      shift(185);                   // \'na
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAk=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="9" aka="AAAAAAAAAAk=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+mespace-node\'\n
       break;\n
     case 191:                       // \'node\'\n
       shift(191);                   // \'node\'\n
@@ -15844,7 +16020,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
        && lk != 27244               // \'declare\' \';\'\n
        && lk != 27245               // \'default\' \';\'\n
        && lk != 27246               // \'delete\' \';\'\n
-       && lk != 27247               // \'descendant\' \';\'\n
+       && lk != 27247           
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAo=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="10" aka="AAAAAAAAAAo=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+    // \'descendant\' \';\'\n
        && lk != 27248               // \'descendant-or-self\' \';\'\n
        && lk != 27249               // \'descending\' \';\'\n
        && lk != 27254               // \'div\' \';\'\n
@@ -17140,7 +17339,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
      || lk == 60960                 // \'%\' \'document\'\n
      || lk == 61204                 // \'{\' \'document\'\n
      || lk == 61471                 // \'$\' \'document-node\'\n
-     || lk == 61472                 // \'%\' \'document-node\'\n
+   
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAs=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="11" aka="AAAAAAAAAAs=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+  || lk == 61472                 // \'%\' \'document-node\'\n
      || lk == 61716                 // \'{\' \'document-node\'\n
      || lk == 61983                 // \'$\' \'element\'\n
      || lk == 61984                 // \'%\' \'element\'\n
@@ -18593,7 +18815,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
        && lk != 140379)             // \'catch\' \'xquery\'\n
       {\n
         break;\n
-      }\n
+  
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAw=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="12" aka="AAAAAAAAAAw=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+    }\n
     }\n
     eventHandler.endNonterminal("TryCatchStatement", e0);\n
   }\n
@@ -20265,7 +20510,30 @@ define(\'ace/mode/xquery/JSONParseTreeHandler\', [\'require\', \'exports\', \'mo
     case 17542:                     // \'first\' \'(\'\n
     case 17543:                     // \'following\' \'(\'\n
     case 17544:                     // \'following-sibling\' \'(\'\n
-    case 17545:                     // \'for\' \'(\'\n
+    case 17545:   
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAA0=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="13" aka="AAAAAAAAAA0=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+                  // \'for\' \'(\'\n
     case 17549:                     // \'ft-option\' \'(\'\n
     case 17554:                     // \'ge\' \'(\'\n
     case 17556:                     // \'group\' \'(\'\n
@@ -21555,7 +21823,106 @@ XQueryParser.INITIAL =\n
 ];\n
 \n
 XQueryParser.TRANSITION =\n
-[ 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22007, 18176, 18196, 18196, 18196, 18203, 18196, 18196, 18196, 18196, 18230, 18196, 18196, 18196, 18196, 18219, 18196, 18180, 18246, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 18411, 20907, 20920, 20932, 20944, 22539, 18416, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 37625, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 21008, 21032, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21632, 21055, 23546, 23546, 23546, 21178, 23546, 23546, 23916, 42362, 21241, 23546, 23546, 23546, 23546, 19298, 47203, 21077, 21110, 23546, 23546, 23546, 35799, 23546, 23546, 21194, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 21229, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21358, 21323, 23546, 23546, 23546, 26152, 23546, 23546, 27593, 23546, 21369, 29482, 21257, 21282, 21273, 21304, 21317, 21346, 20967, 23546, 23546, 23546, 28947, 23546, 23546, 21385, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 20711, 21423, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 21446, 26048, 18745, 18766, 18771, 20561, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23540, 23546, 23546, 23546, 25880, 23545, 23546, 31245, 23546, 21468, 23534, 21504, 23546, 21511, 23546, 21527, 21539, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 21567, 23546, 23546, 23546, 31874, 23546, 23546, 21586, 23546, 23546, 21608, 21620, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 35211, 23546, 23546, 23546, 23546, 23546, 23546, 23424, 21648, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 21681, 18544, 18567, 18590, 50977, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21736, 21705, 23546, 23546, 23546, 44539, 23546, 23546, 24265, 25689, 25607, 23546, 23546, 23546, 23546, 26450, 47502, 21724, 21752, 23546, 23546, 23546, 35799, 23546, 23546, 21783, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 20237, 21819, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21551, 21857, 21913, 21913, 21913, 21864, 21908, 21913, 21918, 21967, 21842, 21949, 21880, 21961, 21896, 21934, 21983, 21995, 20967, 23546, 23546, 23546, 26225, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 22023, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 28636, 23546, 23546, 23546, 25912, 50946, 23546, 50080, 50952, 21369, 28635, 23546, 22054, 22060, 22076, 22111, 22121, 22137, 23546, 23546, 23546, 30755, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 22183, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 27655, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 51066, 39748, 22869, 22242, 22228, 22245, 22261, 22277, 22288, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 20285, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 18648, 40763, 24585, 22304, 22324, 22304, 22338, 24585, 22308, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 22361, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 22386, 23546, 23546, 23546, 25841, 18403, 23546, 19576, 22382, 44281, 22402, 22429, 22434, 22434, 22450, 22385, 22413, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22473, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 25653, 22498, 22518, 22498, 22532, 25653, 22502, 22555, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27132, 23546, 42897, 23546, 44844, 38626, 22584, 22361, 37471, 23546, 23546, 23546, 23546, 22587, 47563, 46856, 47563, 47563, 22603, 35356, 22824, 22824, 34828, 22804, 22621, 22804, 22804, 33187, 36943, 23546, 23546, 23546, 23546, 23546, 26071, 23546, 22641, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 43701, 32739, 23546, 23546, 23546, 23546, 23546, 29474, 22702, 23546, 33124, 44563, 47563, 47563, 47563, 47564, 22719, 35350, 22824, 22764, 22824, 22767, 35689, 22783, 22804, 22803, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 27587, 23546, 23546, 47562, 46826, 47563, 47563, 27195, 22821, 42846, 22824, 22824, 22824, 30376, 22804, 22841, 22804, 22804, 29883, 33199, 23546, 23546, 21430, 23546, 49502, 48973, 47563, 47563, 36153, 45209, 22824, 22824, 39816, 27834, 22804, 22804, 43796, 30403, 39964, 23546, 23546, 22861, 23546, 47560, 22885, 47563, 23113, 22903, 22824, 33078, 22920, 22804, 38116, 23546, 23546, 22937, 29174, 22980, 47563, 34384, 42527, 22825, 23019, 22804, 31964, 47447, 46606, 23083, 36624, 23105, 32340, 30673, 23131, 36549, 23164, 40907, 43074, 23200, 23229, 23275, 36645, 36686, 33550, 48975, 23107, 30672, 23141, 39417, 23313, 23334, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 24855, 21369, 23546, 23546, 23546, 23546, 23546, 20980, 20992, 23383, 23546, 23546, 23546, 35799, 23546, 23546, 23420, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 23440, 27132, 23546, 23546, 23546, 44844, 23546, 23546, 18368, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 22603, 22824, 22824, 22824, 34828, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 26071, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23485, 23546, 23546, 23546, 26606, 23546, 23546, 23546, 23546, 21369, 28080, 23505, 23528, 23563, 23575, 28081, 23512, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 30821, 23546, 37478, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23598, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23184, 21369, 23546, 23546, 23546, 23546, 23546, 22653, 22665, 23615, 23546, 23546, 23546, 35799, 23546, 23546, 23644, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 23664, 27132, 23546, 23546, 23546, 44844, 23546, 23546, 23688, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 22603, 22824, 22824, 22824, 34828, 22804, 22804, 22804, 22804, 39677, 48779, 23733, 23546, 23546, 23546, 23546, 34921, 23753, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 23777, 48792, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 41753, 22821, 22824, 22824, 22824, 22824, 44122, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 34866, 22821, 22824, 22824, 22824, 22824, 23826, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 39721, 23546, 23546, 23546, 30797, 25982, 23546, 23546, 23849, 21369, 20313, 44188, 23887, 23893, 23909, 23546, 49114, 23932, 23546, 23546, 23546, 36603, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 24187, 24465, 24820, 25200, 24258, 18282, 18849, 18305, 23964, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 23993, 24116, 24017, 24046, 24001, 24088, 25090, 24132, 24812, 24103, 24159, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 24182, 25436, 24884, 24206, 24190, 24890, 24819, 24363, 24227, 24819, 24414, 24143, 25214, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 24243, 24030, 25425, 24281, 24706, 24308, 24337, 24350, 24389, 24405, 24517, 24423, 25208, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 24439, 19364, 24455, 25063, 24489, 24505, 24533, 25266, 24373, 24545, 24561, 24577, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 19809, 24679, 24601, 25048, 19406, 24473, 24617, 25251, 25017, 24736, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 24633, 24673, 24695, 24722, 24779, 24801, 24836, 23977, 20842, 20016, 18679, 20827, 20042, 24871, 24906, 24935, 24951, 25006, 25411, 25295, 20159, 20175, 20206, 25033, 24292, 25079, 25281, 25106, 20376, 20392, 19394, 24919, 24657, 20462, 19676, 24211, 24785, 32258, 19353, 24647, 24966, 20473, 24060, 25136, 20616, 25172, 25188, 25236, 24072, 25311, 25362, 25396, 25452, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 21328, 23546, 23546, 23546, 25841, 25477, 23546, 23546, 25472, 32915, 25493, 25501, 25501, 25501, 25517, 21330, 25540, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 25581, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20499, 25597, 18792, 18808, 18830, 23628, 18814, 25623, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 21016, 25645, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 25669, 25705, 25721, 19477, 25754, 19498, 25737, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 18708, 21452, 19692, 19708, 20143, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 50535, 23259, 25770, 25770, 25770, 25779, 21123, 21135, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 25220, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 25802, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21147, 20888, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 22959, 25825, 25825, 25825, 25834, 20891, 22964, 25857, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 27140, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 25873, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25552, 25561, 23546, 23546, 23546, 26852, 23546, 23546, 23546, 23546, 21369, 33245, 25896, 25896, 25896, 25905, 36950, 33250, 25928, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 22366, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 25964, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 25998, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 26099, 23546, 23546, 23546, 23546, 25841, 21661, 23546, 23546, 21094, 43925, 23546, 23546, 23546, 21665, 26069, 21092, 26087, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 31389, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 26115, 26145, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 23546, 43987, 26168, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 26285, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 26302, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 26321, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 19867, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 26341, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 26341, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 23049, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26364, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 19293, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 31312, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 37937, 26399, 26410, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 26426, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 26445, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 41698, 26466, 26486, 26508, 26520, 41701, 26470, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 38227, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 26543, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 23546, 23546, 23424, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 28554, 23546, 26577, 26583, 26599, 47449, 44239, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 26622, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 26638, 20392, 51127, 20418, 50802, 26654, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 27306, 23546, 23546, 23546, 26527, 26683, 26714, 28322, 26699, 26731, 50814, 50823, 26775, 26789, 26801, 26817, 26829, 26204, 26845, 23599, 23546, 25326, 21171, 35898, 34903, 26868, 26909, 26948, 33311, 26979, 26959, 26995, 27011, 45967, 27047, 27063, 27101, 27117, 34536, 27156, 23546, 23546, 44844, 41240, 34846, 23546, 42415, 27173, 27664, 23546, 42356, 28101, 47563, 47563, 47563, 27192, 27418, 22824, 22824, 42533, 43762, 22804, 22804, 22804, 27211, 27231, 36943, 23546, 44839, 40944, 23546, 27267, 27287, 46640, 23546, 27304, 35519, 43402, 27322, 27344, 47563, 47563, 27380, 27403, 27436, 31453, 22824, 33011, 27464, 27493, 27533, 27556, 22804, 38069, 35418, 30315, 27573, 26241, 27609, 23546, 44532, 27629, 39107, 50620, 23546, 45009, 27646, 31107, 27698, 47563, 27746, 27765, 23297, 27785, 27825, 36368, 22824, 27859, 48139, 23833, 27991, 44504, 49256, 22804, 43572, 23672, 27877, 42988, 25683, 23546, 27893, 27913, 46094, 23546, 21213, 44018, 47563, 30489, 32462, 27941, 34820, 22824, 45399, 49012, 28821, 27978, 22804, 22804, 28014, 28034, 49064, 28072, 35792, 28097, 51046, 28117, 50856, 22994, 28137, 47563, 41728, 28206, 28229, 22824, 41433, 28267, 28290, 22804, 34572, 28320, 28338, 23546, 23546, 39715, 47560, 28358, 45550, 23113, 28379, 35308, 33078, 28399, 36714, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 41649, 28419, 28455, 40472, 38341, 28471, 38828, 40452, 28791, 24756, 33030, 27540, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 28526, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 34078, 28545, 23546, 28652, 28658, 28674, 28690, 28701, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 26963, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22605, 35842, 45303, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 46230, 50621, 28718, 23546, 28717, 23546, 48975, 47563, 47563, 47563, 27769, 28735, 22823, 22824, 22824, 22824, 49361, 49439, 22804, 22804, 22804, 22804, 28781, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 18289, 23546, 23546, 44779, 49528, 23546, 36898, 47563, 47563, 47563, 40417, 28807, 22824, 22824, 22824, 50340, 31197, 28844, 22804, 22804, 22804, 28863, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 21205, 28900, 28924, 28940, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 28963, 23546, 23546, 26527, 23546, 28992, 23546, 29010, 36977, 29029, 29038, 29054, 29069, 29081, 29097, 29109, 26204, 23546, 23546, 33645, 49739, 23546, 28529, 23546, 23546, 31365, 23546, 23546, 23546, 35995, 23546, 29125, 31167, 22824, 29149, 40337, 48749, 32108, 23546, 29172, 23546, 44844, 29190, 42384, 23546, 31347, 50774, 29209, 23546, 25948, 29214, 29230, 29291, 47563, 47563, 29309, 29325, 22824, 22824, 45608, 49036, 29349, 22804, 22804, 39677, 36943, 30220, 23546, 23546, 47099, 23546, 22095, 50621, 37205, 27682, 23546, 23546, 48975, 28152, 40051, 47563, 29366, 37135, 45217, 46920, 46953, 36665, 22824, 49439, 49901, 29385, 29404, 34563, 22804, 29885, 40883, 26241, 23546, 23546, 47600, 23546, 23546, 29423, 23546, 29445, 23546, 48976, 47563, 47563, 47563, 44406, 47564, 22821, 22824, 22824, 49328, 42575, 22767, 35849, 22804, 22804, 39288, 28274, 50448, 23672, 29464, 23546, 23546, 23546, 29498, 42828, 23546, 23546, 47562, 47563, 47563, 46820, 29369, 22821, 22824, 22824, 37856, 22824, 28821, 22804, 22804, 30184, 22804, 29883, 33199, 23546, 23546, 29517, 23546, 47519, 29538, 47563, 46768, 47563, 41728, 22824, 49353, 22824, 41433, 22804, 41641, 22804, 27843, 29565, 23546, 23546, 23546, 29581, 33988, 49629, 29610, 50265, 49148, 29627, 30732, 37573, 29644, 31970, 23546, 23546, 28626, 22586, 47563, 47563, 29661, 22824, 47375, 22804, 22804, 29679, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 45087, 23089, 29701, 47077, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 27251, 29717, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 21570, 23546, 23546, 26527, 23546, 29745, 24166, 23546, 32508, 29764, 29773, 29789, 29803, 29812, 29828, 29839, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 34673, 34671, 23546, 38486, 38493, 29855, 28213, 35842, 29875, 43066, 27800, 23546, 40629, 29901, 44844, 23546, 29926, 30774, 23546, 23546, 41541, 20026, 29946, 29989, 29293, 38320, 30005, 40270, 30031, 42116, 30052, 30082, 30100, 49972, 39453, 30135, 41942, 39677, 36943, 23546, 23546, 23546, 42078, 23546, 30162, 50621, 23546, 23546, 23546, 39564, 48975, 47563, 47563, 47563, 48721, 37135, 22823, 22824, 22824, 22824, 42777, 49439, 22804, 22804, 22804, 22804, 30182, 30146, 30200, 30236, 23546, 23546, 23546, 30252, 30271, 50620, 23546, 23546, 45468, 23469, 31420, 34156, 47563, 47563, 45201, 30292, 30331, 30348, 22824, 22824, 30365, 29156, 29407, 22804, 22804, 22804, 30399, 23672, 23807, 23546, 23546, 23546, 23546, 45523, 28572, 23546, 33872, 47563, 47563, 30419, 29369, 30438, 22824, 22824, 48645, 22824, 31904, 22804, 22804, 50360, 22804, 30539, 33199, 49920, 23546, 30462, 23546, 50724, 48973, 36270, 47563, 30480, 41728, 35391, 22824, 30505, 41433, 50493, 22804, 30530, 30403, 47447, 49732, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23251, 23546, 22586, 47563, 47563, 30555, 22824, 36108, 22804, 22804, 30575, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 30597, 46609, 47561, 23111, 30673, 39296, 30622, 30648, 30668, 30689, 19013, 30707, 30727, 30748, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23547, 30771, 23546, 26527, 25156, 30790, 23546, 30813, 24321, 30837, 30846, 30862, 30876, 30888, 30904, 30915, 26204, 22703, 30931, 26561, 35799, 30978, 26921, 26341, 27925, 30994, 31013, 31032, 31061, 31045, 31097, 31131, 31147, 31183, 31227, 31261, 31277, 39237, 39476, 31293, 33748, 31328, 22212, 31363, 31381, 41158, 23546, 23546, 40033, 23546, 22587, 32449, 31405, 47817, 28510, 31441, 31475, 46890, 31498, 30304, 31538, 22625, 36744, 47681, 39677, 36943, 23698, 29973, 31554, 29930, 31590, 23708, 31634, 39997, 31661, 48812, 31689, 31711, 31727, 31763, 31798, 31814, 29245, 31850, 40093, 31890, 34721, 31940, 35662, 31956, 31986, 27076, 32035, 32066, 32093, 32133, 26241, 50755, 23546, 43683, 23546, 32169, 19239, 32192, 32249, 22951, 24750, 43255, 32274, 47563, 32292, 45560, 22821, 32317, 22824, 42593, 48588, 50230, 35849, 32356, 22804, 45665, 32384, 32405, 32421, 23807, 25150, 32478, 32497, 47176, 23546, 32524, 45835, 36145, 40407, 31425, 32550, 44054, 32586, 34739, 22824, 32631, 32657, 30066, 33080, 32683, 47042, 40501, 29883, 33199, 23546, 45717, 33237, 23546, 23546, 32701, 31115, 42955, 32563, 41728, 45894, 41614, 32608, 41433, 33712, 42499, 35727, 30403, 47447, 28590, 32719, 48060, 32755, 32790, 42232, 33671, 32806, 37745, 39609, 32837, 40736, 33730, 32892, 32931, 32953, 19435, 22586, 32974, 48106, 28046, 33009, 33027, 33047, 48381, 35461, 47447, 40617, 22585, 47563, 50257, 22824, 33074, 36473, 36549, 33096, 40786, 36807, 32667, 39296, 33119, 43227, 48451, 49953, 33140, 24763, 23318, 45645, 33156, 33172, 33217, 47559, 33030, 30691, 33266, 33282, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 33306, 23546, 26527, 33327, 33345, 25456, 24849, 33370, 33400, 23546, 33386, 33428, 33437, 33453, 33464, 26204, 23546, 23546, 33480, 35799, 23546, 23546, 23546, 23546, 27288, 23546, 23546, 34477, 23546, 34484, 31605, 33499, 33519, 43660, 33545, 33568, 27800, 23546, 33621, 23546, 44844, 33621, 23546, 23546, 30997, 23546, 33640, 34051, 23546, 22587, 33661, 47563, 47563, 47563, 33687, 22824, 22824, 22824, 43762, 33703, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 33746, 48975, 47563, 47563, 47563, 43863, 37135, 22823, 22824, 22824, 22824, 34733, 49439, 22804, 22804, 22804, 22804, 33764, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 20258, 23546, 48976, 47563, 47563, 46759, 47563, 47564, 22821, 22824, 22824, 37850, 22824, 22767, 35849, 22804, 22804, 33781, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 43159, 23546, 47562, 47563, 47563, 31773, 29369, 22821, 22824, 22824, 49239, 22824, 28821, 22804, 22804, 22804, 33801, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 33820, 23546, 23546, 22586, 44762, 47563, 23109, 33840, 22825, 34299, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 23335, 32233, 42307, 22729, 33859, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 32176, 23546, 23546, 41552, 33893, 33902, 33918, 33924, 33940, 33956, 33967, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 37894, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 28765, 41920, 23546, 23546, 44844, 23546, 23546, 23546, 39585, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 43177, 23546, 23546, 45738, 48975, 47563, 47563, 47563, 47563, 37135, 41960, 22824, 22824, 22824, 22824, 47410, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 20340, 23546, 23178, 20358, 23546, 23546, 20360, 33983, 47563, 47563, 34004, 47563, 47564, 22821, 22824, 36824, 22824, 22824, 22767, 35849, 22804, 33785, 22804, 22804, 29879, 34024, 23546, 23546, 23546, 34050, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 32147, 47539, 23546, 48973, 47563, 47563, 39206, 45209, 22824, 22824, 43898, 27834, 22804, 22804, 34943, 30403, 47447, 34067, 47158, 34094, 23546, 34121, 32984, 34141, 34177, 43533, 34196, 34244, 36447, 34263, 31970, 28608, 23546, 34315, 34336, 34355, 34372, 28875, 33605, 34412, 34436, 34454, 31964, 47447, 46606, 43054, 32993, 34501, 34521, 30673, 34552, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 43326, 34588, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 41690, 23546, 26286, 34628, 23546, 23546, 23546, 34692, 23546, 34693, 23546, 23546, 34656, 34689, 40521, 22887, 37164, 34396, 43815, 34709, 34755, 23546, 23546, 29501, 44844, 26383, 30255, 23546, 23546, 41921, 23546, 23546, 23546, 22587, 47563, 47563, 32276, 47563, 27418, 22824, 22824, 35655, 43762, 22804, 22804, 35850, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 34780, 43953, 48975, 47563, 47563, 47563, 47563, 29859, 22823, 22824, 22824, 22824, 22824, 30446, 22804, 22804, 22804, 22804, 22804, 34799, 33201, 23546, 34844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 42714, 48976, 34862, 47563, 47563, 47563, 47564, 34882, 22824, 22824, 22824, 22824, 22767, 30383, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 34898, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 49594, 27195, 22821, 22824, 22824, 22824, 49007, 30376, 22804, 22804, 22804, 28251, 29883, 33199, 23546, 23546, 45156, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 28617, 23546, 48860, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 48020, 34919, 46606, 50168, 47563, 35289, 22824, 34937, 22804, 34959, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 26217, 23546, 26527, 28994, 29429, 32937, 21397, 21407, 19607, 19616, 34984, 34999, 35011, 35027, 35038, 26204, 23546, 23546, 23546, 21159, 35548, 23546, 23546, 29013, 35054, 32876, 23546, 35263, 35074, 35112, 39498, 35166, 47961, 27448, 49402, 46199, 35202, 23546, 23546, 23546, 38910, 23546, 47123, 35227, 23546, 23546, 23546, 35244, 44990, 22587, 44754, 35279, 47563, 35324, 35372, 48187, 22824, 29333, 35407, 49176, 35434, 22804, 35477, 39677, 36943, 23546, 35515, 50019, 41319, 42187, 35535, 23546, 19253, 43384, 35575, 35592, 35612, 35186, 47563, 42920, 37391, 20600, 22823, 35386, 22824, 40181, 35635, 35678, 29350, 22804, 33765, 35713, 35750, 48433, 33201, 23546, 23546, 23546, 23546, 35766, 20349, 35815, 44388, 23546, 23546, 40380, 47253, 47563, 47563, 41209, 36250, 35833, 43893, 22824, 22824, 48653, 43541, 43789, 35866, 22804, 22804, 31917, 36853, 33195, 23546, 19730, 35885, 35914, 32534, 35930, 35957, 45488, 36011, 28363, 36030, 36050, 36074, 36103, 39870, 50408, 42260, 32597, 45635, 22804, 36124, 36169, 36204, 27085, 31863, 36220, 46659, 44955, 21826, 38142, 32958, 36266, 47872, 36286, 36321, 36366, 36384, 36409, 36435, 36471, 36489, 36514, 36540, 36572, 23546, 23546, 18340, 36595, 30632, 36619, 36640, 39370, 36661, 36681, 36702, 36740, 36760, 31970, 23546, 36781, 18841, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 34034, 46606, 22585, 31741, 36801, 36823, 36840, 38424, 36549, 46609, 36869, 23111, 30673, 39296, 36886, 35338, 36933, 36966, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 42313, 47646, 36993, 39426, 42307, 22729, 23448, 37021, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 39988, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 50028, 21708, 39996, 40225, 24990, 37071, 37082, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 31016, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 27420, 22824, 43762, 22804, 22804, 48012, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 25524, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 37098, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 37115, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 37134, 47563, 47563, 47563, 47564, 37151, 22824, 22824, 22824, 22824, 22767, 28828, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 41164, 23546, 26527, 23546, 34764, 23546, 19155, 37185, 37221, 37234, 37250, 37256, 37272, 37288, 37299, 26204, 23546, 37315, 23546, 35799, 23546, 43426, 26746, 23546, 23546, 37335, 23546, 32153, 42194, 37334, 37351, 37380, 37407, 37443, 40833, 37430, 32821, 37459, 23546, 23546, 34612, 23546, 23546, 40581, 34220, 23546, 41122, 29193, 49795, 34228, 47262, 37494, 29549, 41774, 37514, 42784, 22904, 45886, 37530, 38036, 37570, 36188, 37589, 23034, 37618, 28342, 23546, 23546, 23546, 23546, 50126, 23546, 23546, 23546, 23546, 23546, 48975, 28498, 44484, 47563, 28434, 44023, 37641, 37671, 39810, 30349, 22824, 39853, 47704, 29645, 22804, 49383, 22804, 37657, 33201, 23546, 23546, 50909, 37693, 23546, 32019, 38379, 23546, 23546, 23546, 48976, 47563, 47563, 46474, 32220, 37710, 22821, 22824, 22824, 49321, 37734, 37761, 35849, 22804, 22804, 37788, 37809, 29879, 33195, 23546, 37872, 23546, 23546, 37889, 23546, 23546, 23546, 47562, 27357, 47563, 47563, 27195, 22821, 40293, 22824, 22824, 22824, 30376, 34247, 22804, 22804, 22804, 29883, 33199, 37910, 31075, 23546, 37928, 47744, 48973, 37953, 47563, 47563, 37979, 38003, 22824, 22824, 38027, 38061, 22804, 22804, 38085, 47447, 23404, 23546, 28599, 23546, 47560, 31782, 47563, 23113, 38011, 22824, 33078, 33721, 22804, 31970, 23546, 21592, 23546, 22586, 47563, 50097, 23109, 22824, 40810, 22804, 22804, 38110, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 33290, 45056, 38132, 38158, 38179, 33552, 39426, 27505, 38215, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23648, 23546, 26527, 23546, 26305, 23546, 23546, 29594, 20530, 20539, 38250, 38264, 38273, 38289, 38300, 26364, 23546, 23948, 23546, 35799, 23546, 34320, 23546, 23546, 23546, 23948, 23546, 35554, 36579, 23947, 35559, 38316, 33588, 36393, 38336, 43066, 27800, 23546, 23546, 38357, 44844, 23546, 39344, 42555, 23546, 39071, 23546, 23546, 38375, 41192, 48530, 47563, 47812, 38395, 28750, 22824, 42121, 31482, 43762, 38449, 22804, 38419, 38440, 32050, 38473, 38509, 46688, 34783, 23546, 23546, 23546, 23546, 23546, 38530, 23546, 23546, 48975, 47883, 38550, 42949, 47563, 37135, 22823, 38568, 30084, 22824, 22824, 49439, 42031, 34293, 41837, 22804, 22804, 29885, 33201, 23546, 38929, 23546, 38602, 23546, 44369, 37873, 23791, 38621, 23546, 48976, 27031, 38642, 47563, 38659, 47564, 38683, 47916, 22824, 22824, 38702, 33843, 35849, 39277, 22804, 33804, 38724, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 36556, 23546, 23546, 23546, 23546, 47560, 38744, 47563, 30559, 22824, 22824, 46066, 22804, 22804, 31970, 23546, 23546, 49685, 22586, 47563, 47563, 23109, 47427, 22825, 22804, 35452, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 38761, 47561, 38782, 38802, 43621, 23464, 38824, 38844, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 38045, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23810, 23546, 46101, 23546, 29522, 38860, 33103, 38895, 38945, 38984, 38970, 38989, 38954, 39005, 39016, 26204, 23546, 24981, 39032, 39052, 39135, 26183, 26715, 27157, 23546, 39087, 39123, 35972, 23871, 39151, 32436, 39187, 39222, 39262, 39312, 39360, 27800, 27271, 23546, 23546, 40856, 29748, 35256, 26269, 47340, 39386, 28121, 33483, 41086, 39406, 48539, 39200, 45029, 47563, 29260, 30036, 22824, 47369, 43762, 41883, 39448, 22787, 22804, 32852, 39469, 27673, 33624, 23546, 39492, 23546, 23546, 30166, 23546, 19760, 23546, 25974, 48975, 39514, 47563, 47563, 47563, 37135, 37987, 39541, 30332, 22824, 22824, 49439, 34278, 22804, 48403, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 49277, 23546, 23546, 39561, 44662, 39580, 20000, 47563, 47563, 38745, 47563, 41583, 39601, 22824, 22824, 42751, 22824, 39625, 36344, 22804, 22804, 49650, 22804, 39663, 33195, 39390, 39701, 21803, 40964, 23546, 28563, 39737, 39764, 42864, 39780, 30015, 27711, 27195, 22821, 39796, 39832, 37838, 39869, 30376, 37543, 39886, 39910, 39936, 47724, 39958, 49087, 33227, 48840, 39980, 40013, 20680, 50204, 40049, 40067, 40083, 45419, 22824, 40109, 40125, 36765, 22804, 40151, 40167, 47447, 40217, 23546, 23546, 19121, 40241, 48114, 40263, 48445, 44596, 40286, 40309, 42808, 40330, 30581, 40353, 23546, 23546, 40374, 28485, 40396, 27517, 40433, 40468, 40722, 40488, 31964, 30114, 48477, 40517, 36058, 24761, 45115, 30673, 40537, 36549, 40555, 19020, 29663, 30673, 40603, 40652, 40668, 40708, 40752, 40779, 40802, 40826, 40849, 24756, 33030, 33551, 47559, 33030, 33552, 40872, 40899, 22729, 23448, 40923, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 40939, 26527, 23546, 35150, 40960, 23546, 26932, 40980, 40989, 41005, 41019, 41028, 41044, 41055, 26204, 41071, 27176, 35142, 41110, 22748, 41145, 23546, 41180, 29961, 41225, 35127, 41274, 41299, 41335, 41350, 41366, 41401, 41487, 41458, 41474, 41503, 23546, 18442, 27630, 46235, 23546, 41314, 19147, 41528, 40358, 23546, 23546, 45375, 22587, 47563, 36909, 41568, 47891, 27418, 38686, 27953, 41607, 41630, 22804, 23213, 41665, 46983, 39677, 36943, 23546, 45937, 23546, 37118, 23546, 39337, 41681, 33824, 35058, 38605, 23546, 41717, 41752, 28167, 41769, 47563, 43475, 41790, 42050, 41800, 22824, 22824, 41816, 41853, 50302, 41874, 22804, 49204, 29885, 47656, 41907, 23546, 38879, 36785, 23546, 23546, 23546, 23546, 23546, 39036, 48976, 47563, 46791, 34008, 47563, 47564, 22821, 22824, 44589, 46895, 22824, 22767, 35849, 22804, 41937, 38457, 22804, 29879, 33195, 23546, 23546, 49550, 23546, 45766, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 32301, 41958, 22824, 22824, 22824, 46046, 28243, 22804, 22804, 22804, 22804, 41977, 33199, 20951, 42005, 23546, 23546, 23546, 44350, 47563, 31827, 47563, 41591, 22824, 49433, 22824, 28884, 22804, 42026, 22804, 30403, 31211, 23546, 23546, 23546, 23546, 27328, 40247, 47563, 27241, 38708, 22824, 42285, 31924, 22804, 29685, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 22739, 46606, 49667, 46712, 38403, 42047, 44103, 22804, 44463, 42066, 42221, 42103, 42137, 42175, 42210, 42248, 42276, 42301, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 35697, 39426, 36136, 22729, 23448, 42329, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 26377, 26527, 23546, 23546, 42378, 33354, 42400, 20758, 23546, 26429, 42436, 42448, 42464, 42475, 26204, 23546, 23546, 25120, 35799, 23546, 23546, 23546, 31573, 31305, 23546, 23546, 31567, 25118, 23546, 48973, 37963, 23115, 42491, 47011, 42515, 27800, 23546, 42549, 23546, 44844, 23546, 38766, 18352, 23546, 39064, 23546, 23546, 22159, 22587, 48548, 38163, 45793, 48521, 47316, 42571, 42591, 47404, 42609, 44147, 39942, 22845, 35499, 47057, 42343, 42636, 23546, 42657, 23546, 42010, 42641, 26759, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 36917, 47563, 37135, 22823, 22824, 22824, 42693, 22824, 49439, 22804, 22804, 28847, 22804, 22804, 29885, 45066, 44270, 23546, 42713, 23546, 23546, 26553, 42677, 42730, 31574, 23546, 48976, 47563, 48931, 47563, 47563, 47564, 42748, 22824, 42767, 22824, 22824, 34180, 35849, 22804, 42800, 22804, 22804, 29879, 33195, 23546, 44983, 23546, 23546, 23546, 23546, 42824, 23546, 47562, 47563, 36034, 47563, 27749, 22821, 22824, 22824, 42844, 22824, 48373, 22804, 22804, 38192, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 18259, 23546, 23546, 42862, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 39325, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 48281, 42880, 42913, 28181, 33529, 39296, 42936, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 38514, 23546, 23546, 23546, 44073, 44076, 50916, 44069, 36233, 42971, 33598, 40201, 40539, 43066, 29275, 42987, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 43004, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 43023, 22824, 22824, 22824, 22824, 43497, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 30422, 47563, 23109, 38579, 22825, 32685, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 22195, 38234, 23546, 23546, 22088, 23546, 31645, 43040, 31695, 43090, 43103, 43112, 43128, 43139, 26204, 23546, 31341, 32732, 35799, 43366, 43155, 43175, 36087, 40692, 50768, 31673, 43193, 32904, 31522, 31081, 43243, 43271, 43287, 43315, 43342, 40683, 23546, 23546, 23546, 45381, 43358, 40568, 43382, 43400, 43418, 23546, 23546, 30119, 43208, 47563, 43442, 27364, 43462, 43491, 28908, 22824, 43513, 43557, 22804, 43588, 41858, 43607, 43637, 43676, 23546, 23546, 23546, 18266, 35576, 23546, 23546, 43699, 43717, 43736, 20331, 32703, 47563, 41378, 47563, 46720, 41989, 43754, 29628, 22824, 22824, 43651, 43778, 43812, 46171, 22804, 44212, 43831, 43879, 33201, 23546, 23546, 45346, 23546, 43914, 43941, 23546, 27809, 23863, 43976, 44003, 47563, 48620, 44039, 35181, 49990, 44092, 22824, 45449, 39545, 44119, 42697, 44138, 22804, 44163, 27998, 44211, 35734, 33195, 39171, 23546, 23546, 23067, 44228, 32012, 23546, 44255, 36870, 46433, 23003, 47563, 27195, 22821, 44297, 46134, 22824, 22824, 30376, 39647, 22804, 44322, 22804, 41442, 44340, 23546, 44366, 44385, 23546, 23546, 34339, 44404, 47563, 47563, 44422, 22824, 22824, 22824, 44438, 22804, 22804, 22804, 44454, 47447, 48298, 23546, 23546, 23546, 44479, 47563, 47563, 46130, 22824, 22824, 44500, 22804, 22804, 44520, 23546, 40027, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 38094, 49704, 44555, 44579, 44612, 44650, 23464, 24759, 33031, 33550, 44685, 30652, 34420, 36724, 24756, 33030, 33551, 47559, 33030, 45310, 44716, 44744, 32641, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 25786, 26527, 44778, 28976, 18999, 44795, 44824, 44860, 44808, 44885, 44899, 44911, 44927, 44938, 26204, 44954, 40587, 23546, 44971, 23546, 23546, 43960, 23546, 50132, 23546, 45006, 35089, 26325, 35096, 32207, 45025, 45045, 44306, 45082, 45103, 27800, 35987, 37200, 44669, 44844, 34640, 23546, 23546, 23546, 23546, 45137, 45172, 23546, 19324, 45188, 43446, 47563, 47563, 45233, 45249, 45268, 22824, 43762, 45291, 40314, 22804, 22804, 39677, 36943, 37912, 23546, 23546, 45326, 45362, 23546, 23546, 23546, 23546, 23546, 37055, 48975, 48512, 31834, 47563, 47563, 46028, 22823, 45397, 45415, 22824, 22824, 36333, 38728, 44324, 22804, 22804, 22804, 45435, 33201, 23546, 23546, 26251, 43720, 23546, 45465, 26758, 45484, 45504, 23546, 45539, 47563, 47563, 47285, 43856, 45576, 45600, 22824, 22824, 47994, 48169, 45624, 45661, 22804, 22804, 42152, 45681, 29879, 45697, 45713, 45733, 23546, 25942, 23546, 23546, 30214, 45754, 47562, 47563, 27730, 45789, 27195, 22821, 22824, 47619, 47969, 22824, 30376, 22804, 22804, 45809, 22804, 29883, 33199, 23546, 21039, 23546, 49467, 37049, 48973, 47563, 45851, 48716, 45584, 47934, 22824, 45868, 48003, 35869, 22804, 45910, 30403, 47447, 23546, 48332, 18869, 22345, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 32000, 21288, 23546, 45931, 45953, 47563, 37498, 23109, 22824, 40444, 22804, 34438, 36455, 45997, 44634, 19558, 46021, 50382, 46044, 28056, 22804, 34468, 46609, 35619, 30711, 46062, 46082, 23464, 24759, 33031, 33550, 19538, 36296, 49945, 23141, 46117, 38586, 45823, 48503, 46150, 46187, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23737, 26527, 23546, 23546, 34968, 23546, 46215, 26881, 26893, 46251, 46267, 46279, 46295, 46306, 26204, 46322, 23241, 25565, 35799, 25341, 42889, 46340, 22204, 44869, 46352, 46368, 46377, 46393, 46349, 46420, 46455, 46490, 46547, 46518, 46534, 32867, 46005, 19766, 34600, 44844, 46563, 23546, 26188, 46580, 41258, 46596, 46625, 46675, 46736, 46784, 46807, 46842, 38552, 46877, 45877, 46911, 46944, 36419, 46977, 46999, 47027, 27557, 39677, 37035, 47093, 47115, 35228, 23546, 47139, 47174, 23546, 47766, 23546, 49770, 47192, 20591, 47219, 47244, 47278, 38643, 47301, 41736, 47356, 47391, 47426, 31459, 49439, 36524, 39920, 40135, 22804, 35492, 33058, 47443, 23546, 20251, 43007, 37694, 47465, 46324, 47491, 47518, 23546, 47535, 47555, 39525, 47841, 47563, 34125, 47580, 47616, 47635, 39844, 22824, 37169, 48362, 35849, 47672, 47697, 22804, 41891, 47720, 33195, 23058, 47740, 23546, 45516, 47760, 23546, 47782, 18627, 47798, 50186, 47833, 47857, 27195, 47907, 47932, 47950, 47985, 48036, 39636, 46165, 37602, 50472, 50517, 37554, 27477, 48056, 18311, 23546, 35780, 48076, 48095, 44700, 47563, 47563, 48130, 48155, 37677, 22824, 48203, 48236, 49183, 22804, 48272, 47447, 18372, 48297, 48314, 48330, 41202, 45981, 33877, 34811, 48348, 48040, 48397, 48419, 37793, 31970, 48467, 23546, 23546, 48493, 46466, 31618, 34505, 49612, 47069, 35443, 43299, 48564, 28304, 47475, 19993, 48611, 37364, 48636, 48669, 43591, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 44177, 29729, 48685, 36498, 48701, 45275, 48737, 39426, 42307, 22729, 39685, 48765, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 48828, 23546, 23546, 48856, 23546, 35941, 30944, 30953, 48876, 30953, 30962, 48892, 48903, 26204, 23546, 23546, 23546, 40636, 23546, 26348, 23546, 23546, 23546, 23546, 26345, 23546, 38923, 23546, 48973, 48919, 48178, 48947, 38808, 37005, 31513, 38873, 23546, 23546, 44844, 23546, 23546, 27897, 48963, 23546, 23546, 23546, 23546, 48971, 46750, 47563, 47563, 34356, 48992, 22824, 22824, 22824, 36305, 49028, 22804, 22804, 22804, 49052, 44728, 49080, 23546, 49103, 45341, 23546, 23546, 42732, 48802, 47595, 38359, 35596, 48975, 47563, 49130, 41385, 43221, 47228, 22823, 48595, 46928, 41415, 49146, 49164, 22804, 49199, 49220, 45915, 29388, 37824, 33201, 23546, 25346, 23546, 26261, 23546, 23546, 23546, 49474, 23546, 23546, 48976, 33503, 47563, 47563, 47563, 47564, 49236, 37414, 22824, 22824, 22824, 22767, 49255, 36180, 22804, 22804, 22804, 29879, 33195, 49272, 23546, 49293, 23546, 23546, 23546, 23546, 28581, 36243, 47563, 47563, 47563, 27195, 49311, 22824, 22824, 22824, 22824, 37772, 22804, 22804, 22804, 22804, 29883, 46502, 23546, 23546, 50321, 46564, 23546, 30276, 23289, 47563, 47563, 37718, 49344, 22824, 22824, 30514, 49377, 22804, 22804, 42620, 47447, 39101, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 46439, 24761, 43524, 30673, 49399, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 49418, 45121, 44624, 47559, 33030, 33552, 39426, 32368, 49455, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 49490, 49547, 33412, 49525, 23546, 34105, 23546, 33409, 49544, 42420, 41283, 49566, 49577, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 49593, 35299, 27962, 22805, 43066, 27800, 23546, 33329, 27613, 44844, 23546, 23546, 23546, 23546, 23546, 32481, 23546, 23546, 22587, 32570, 47563, 46861, 47563, 27418, 49610, 22824, 32331, 43762, 42159, 22804, 27215, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 37318, 23546, 23546, 23546, 20322, 23546, 48975, 47563, 47563, 49628, 47563, 37135, 22823, 22824, 32615, 22824, 22824, 49439, 22804, 22804, 49645, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 49666, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 49683, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 49701, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 49720, 23546, 50953, 23546, 25809, 49755, 49786, 23546, 49811, 49825, 49837, 49853, 49864, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 27387, 22824, 49893, 38199, 49880, 34211, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 42672, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 49917, 23546, 23546, 23546, 22167, 47563, 47563, 47563, 47563, 47564, 49936, 22824, 22824, 22824, 22824, 22767, 49969, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 45149, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 49988, 47563, 50006, 22821, 22824, 48578, 22824, 41424, 30376, 22804, 39894, 22804, 32389, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 26445, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 41512, 50052, 50063, 26204, 23546, 23546, 23546, 35799, 50079, 30464, 23546, 23546, 23546, 23546, 32774, 23546, 41129, 32770, 46701, 50096, 40191, 28190, 22805, 43066, 27800, 23546, 23546, 23546, 50113, 28719, 34485, 45773, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 29611, 47563, 27026, 27418, 22824, 35645, 28383, 43762, 22804, 22921, 22804, 48250, 39677, 50148, 50164, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 41250, 23546, 23546, 23546, 48976, 47563, 47563, 50184, 47563, 45852, 22821, 22824, 38786, 22824, 22824, 45252, 35849, 22804, 48256, 22804, 22804, 29879, 33195, 48079, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 50202, 47563, 47563, 27195, 22821, 50220, 22824, 22824, 22824, 30376, 48220, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 21798, 23546, 23546, 35799, 23546, 23546, 46652, 23546, 23546, 23546, 23546, 46656, 23546, 23546, 50246, 28439, 22824, 50294, 36350, 50281, 47331, 23546, 29448, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 35817, 22587, 47563, 47563, 47563, 27723, 27418, 22824, 22824, 27861, 43762, 22804, 22804, 22804, 48212, 39677, 36943, 23546, 50318, 23546, 23546, 23546, 23546, 23546, 23546, 37099, 23546, 23546, 48975, 38667, 47563, 36014, 47563, 37135, 22823, 50337, 22824, 46961, 22824, 49439, 28018, 22804, 22804, 50356, 22804, 29885, 33201, 23546, 43738, 23546, 23546, 23546, 23546, 23546, 38534, 23546, 23546, 48976, 47563, 50376, 47563, 47563, 47564, 50398, 41961, 50424, 22824, 22824, 22767, 50443, 28403, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 21488, 23546, 47562, 47563, 31747, 47563, 34161, 22821, 22824, 43024, 22824, 22824, 50464, 22804, 22804, 50488, 22804, 43844, 33199, 23546, 23546, 18921, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 31241, 23546, 23546, 39165, 23546, 29133, 47563, 47563, 33578, 22824, 22824, 50509, 22804, 22804, 31970, 23546, 49295, 23546, 22586, 47563, 31161, 23109, 50427, 22825, 22804, 41830, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 21483, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 46404, 21767, 21765, 32117, 22038, 50563, 21058, 21061, 50533, 22036, 50551, 50579, 50591, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 50607, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50637, 19916, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 50655, 18544, 18567, 18590, 19934, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 22150, 23546, 21369, 20766, 50679, 50692, 50708, 50717, 49509, 50740, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23761, 23546, 23546, 23758, 25629, 19208, 50639, 19926, 50639, 50790, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 42087, 23546, 23546, 23546, 23546, 22568, 29910, 50839, 50872, 50878, 50849, 23148, 50894, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 50932, 23546, 23546, 22686, 23546, 23546, 23546, 22682, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 50969, 18544, 18567, 18590, 21689, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 23546, 23546, 23489, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27132, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 22603, 22824, 22824, 22824, 34828, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22457, 23546, 23546, 22482, 50993, 50998, 50998, 51019, 22480, 51014, 51035, 23546, 23546, 23546, 23546, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 51062, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 50655, 18544, 18567, 18590, 19934, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 51082, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 51098, 20392, 51127, 20418, 50802, 51114, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 94503, 94503, 90406, 90406, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 1, 12290, 3, 0, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 362, 94503, 90406, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 0, 94503, 90406, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 69632, 73728, 94503, 94503, 94503, 94503, 94503, 65536, 94503, 0, 2183168, 0, 0, 0, 90406, 94503, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 2985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, 0, 0, 0, 0, 0, 1637, 0, 0, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2904064, 2908160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2751, 0, 0, 0, 0, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 362, 362, 0, 0, 0, 0, 0, 0, 2997, 0, 0, 0, 0, 3001, 0, 0, 0, 0, 0, 0, 1186, 0, 0, 0, 1191, 0, 0, 0, 0, 1107, 0, 0, 0, 2138112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2978, 0, 0, 0, 2424832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2625536, 0, 0, 0, 0, 0, 172032, 0, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 1, 12290, 3, 0, 2699264, 2715648, 0, 0, 2772992, 2805760, 2830336, 0, 2863104, 2920448, 0, 0, 0, 0, 0, 0, 0, 1114, 0, 0, 0, 0, 1118, 0, 0, 1121, 0, 2805760, 2920448, 0, 0, 0, 0, 0, 2920448, 0, 0, 0, 0, 0, 0, 0, 2732032, 0, 2179072, 2179072, 2179072, 2424832, 2433024, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2625536, 2805760, 2179072, 2830336, 2179072, 2179072, 2863104, 2179072, 2179072, 2179072, 2920448, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2801664, 2813952, 2179072, 2838528, 2179072, 2179072, 2179072, 2179072, 2179072, 0, 914, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2625536, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2625536, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2699264, 2125824, 2715648, 2125824, 2723840, 2125824, 2732032, 2772992, 2125824, 2125824, 2125824, 2723840, 2125824, 2732032, 2772992, 2125824, 2125824, 2125824, 2805760, 2125824, 2830336, 2125824, 2125824, 2863104, 2125824, 2125824, 2125824, 2125824, 2920448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2920448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3117056, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3207168, 2125824, 2125824, 2179072, 2125824, 2125824, 2125824, 2125824, 2457600, 2125824, 2125824, 2125824, 2125824, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2375680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 0, 0, 0, 0, 0, 0, 2408448, 0, 0, 2584576, 0, 0, 0, 0, 2838528, 0, 0, 2838528, 0, 0, 0, 0, 0, 2469888, 2506752, 2756608, 0, 0, 2580480, 0, 0, 0, 2396160, 2400256, 2412544, 0, 0, 2838528, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2408448, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 914, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 0, 2125824, 2125824, 2125824, 2408448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 2502656, 0, 0, 3010560, 2125824, 2125824, 2125824, 2125824, 2125824, 2662400, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2801664, 2813952, 2125824, 2838528, 2125824, 2801664, 2813952, 2125824, 2838528, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3125248, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2461696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2600960, 0, 2674688, 0, 2768896, 2777088, 2781184, 0, 2822144, 0, 0, 2883584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3055616, 0, 0, 0, 3080192, 3100672, 3104768, 0, 0, 0, 0, 3186688, 0, 0, 0, 0, 0, 0, 0, 3182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2732032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3133440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3003, 3004, 0, 2719744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3014656, 3207168, 0, 2691072, 0, 0, 0, 0, 0, 2818048, 2846720, 0, 2916352, 0, 0, 3002368, 0, 0, 3022848, 0, 0, 0, 0, 0, 2871296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2766, 0, 0, 0, 0, 0, 3215360, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2494464, 2179072, 2179072, 2514944, 2179072, 2179072, 2461696, 2465792, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2523136, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2699264, 2179072, 2715648, 2179072, 2723840, 2179072, 2732032, 2772992, 2179072, 2179072, 3100672, 2179072, 2179072, 3133440, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3207168, 2179072, 0, 0, 0, 0, 391, 392, 0, 393, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 3504, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3399, 540, 540, 0, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2461696, 2465792, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2523136, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2600960, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2641920, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2719744, 2125824, 2125824, 2125824, 2125824, 2125824, 2768896, 2777088, 2768896, 2777088, 2125824, 2797568, 2822144, 2125824, 2125824, 2125824, 2883584, 2125824, 2912256, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3133440, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3207168, 2125824, 0, 0, 0, 0, 0, 0, 3011, 0, 0, 0, 0, 0, 0, 3018, 0, 0, 0, 0, 2605056, 0, 0, 0, 0, 2887680, 0, 2924544, 0, 0, 0, 0, 0, 0, 0, 1135, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3162112, 3170304, 0, 0, 3219456, 3035136, 0, 0, 0, 0, 0, 3072000, 2650112, 2179072, 2179072, 2179072, 2707456, 2179072, 2736128, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2887680, 2179072, 2179072, 2543616, 2547712, 2179072, 2179072, 2596864, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2584576, 0, 0, 2809856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3088384, 0, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 2112, 0, 0, 0, 0, 0, 1680, 1681, 0, 1683, 0, 0, 0, 0, 0, 0, 0, 540, 561, 540, 561, 540, 540, 561, 540, 585, 0, 0, 2576384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2420736, 0, 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 3121152, 3141632, 0, 0, 0, 2924544, 0, 2682880, 0, 0, 0, 0, 0, 0, 0, 1242, 1272, 1273, 0, 1242, 0, 540, 540, 540, 3112960, 2387968, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2453504, 2179072, 2473984, 2482176, 2179072, 2179072, 2179072, 2179072, 2179072, 3010560, 2179072, 2179072, 2126737, 2126737, 2503569, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2532241, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2605969, 2126737, 2924544, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3035136, 2179072, 2179072, 3072000, 2179072, 2179072, 2179072, 3137536, 2126737, 2126737, 2499473, 2126737, 2126737, 2126737, 2556817, 2565009, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3224465, 0, 0, 2126810, 2126810, 2126810, 2126810, 2126810, 2446298, 2126810, 3121152, 2179072, 2179072, 3141632, 2179072, 2179072, 2179072, 3170304, 2179072, 2179072, 3190784, 3194880, 2179072, 0, 0, 0, 0, 0, 0, 3181, 0, 0, 0, 3184, 3185, 3186, 0, 0, 3189, 3194880, 2125824, 0, 0, 0, 0, 0, 0, 2387968, 2125824, 2125824, 2420736, 2125824, 2125824, 2125824, 2125824, 2125824, 2453504, 2125824, 2473984, 2482176, 2125824, 2125824, 2125824, 2605056, 2125824, 2629632, 2125824, 2125824, 2650112, 2125824, 2125824, 2125824, 2707456, 2125824, 2736128, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3035136, 2125824, 2125824, 3072000, 2125824, 2125824, 3121152, 2125824, 2125824, 3141632, 2125824, 2125824, 2125824, 3170304, 2125824, 2125824, 3190784, 2125824, 3170304, 2125824, 2125824, 3190784, 3194880, 2125824, 2125824, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 3112960, 3219456, 2125824, 2125824, 3112960, 3219456, 2125824, 2125824, 3112960, 3219456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3507, 540, 540, 540, 540, 540, 540, 0, 3145728, 0, 3203072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3314, 0, 540, 0, 3067904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172032, 0, 0, 0, 0, 2895872, 0, 0, 0, 2445312, 0, 2842624, 0, 0, 0, 2637824, 0, 0, 0, 0, 432, 0, 0, 0, 329, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 0, 0, 0, 2621440, 0, 3182592, 2899968, 0, 2961408, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2592768, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2445312, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2551808, 2179072, 2179072, 2179072, 2179072, 2179072, 3117056, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2126737, 2637824, 2125824, 2125824, 2125824, 2125824, 2727936, 2752512, 2125824, 2125824, 2125824, 2125824, 2842624, 2846720, 2125824, 2895872, 2916352, 2125824, 2125824, 2945024, 2125824, 2125824, 2994176, 2125824, 3002368, 2125824, 2125824, 3022848, 2125824, 3067904, 3084288, 3096576, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2442, 2443, 0, 0, 2446, 0, 0, 0, 0, 0, 2928640, 0, 0, 0, 3059712, 0, 2543616, 2666496, 0, 2633728, 0, 0, 0, 0, 0, 1697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 0, 2494464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3211264, 2179072, 2928640, 2179072, 2179072, 2179072, 2998272, 2179072, 2179072, 2179072, 2179072, 3059712, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 0, 0, 2126737, 2126737, 2126737, 2126737, 2126737, 2446225, 2126737, 2179072, 3178496, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2494464, 2125824, 2125824, 2514944, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 2510848, 2514944, 0, 0, 2547712, 2596864, 0, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 2113, 0, 2125824, 2543616, 2547712, 2125824, 2125824, 2596864, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 2125824, 2125824, 2125824, 2408448, 2125824, 2928640, 2125824, 2125824, 2125824, 2998272, 2125824, 2125824, 2125824, 2125824, 3059712, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 2125824, 2126811, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 2125824, 2125824, 2125824, 2125824, 2424832, 2125824, 3178496, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2494464, 2125824, 2125824, 2514944, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 2125824, 3178496, 2125824, 2179072, 2125824, 2125824, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2441216, 0, 0, 0, 0, 0, 0, 3311, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 2165, 540, 540, 540, 540, 0, 0, 0, 2740224, 0, 0, 0, 0, 0, 2793472, 0, 0, 0, 0, 0, 0, 0, 1244, 0, 0, 0, 0, 1247, 0, 1194, 0, 2646016, 2179072, 2179072, 2695168, 2756608, 2179072, 2179072, 2179072, 2932736, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3039232, 2179072, 3063808, 2179072, 2179072, 2179072, 2179072, 3129344, 2179072, 2179072, 3153920, 3166208, 3174400, 2396160, 2400256, 2125824, 2125824, 2441216, 2125824, 2469888, 2125824, 2125824, 2125824, 2519040, 2125824, 2125824, 2125824, 2125824, 2588672, 2125824, 2519040, 2125824, 2125824, 2125824, 2125824, 2588672, 2125824, 2613248, 2646016, 2125824, 2125824, 2695168, 2756608, 2125824, 2125824, 2125824, 2125824, 2932736, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2932736, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3129344, 2125824, 2125824, 3153920, 3166208, 3174400, 2396160, 2125824, 2125824, 3129344, 2125824, 2125824, 3153920, 3166208, 3174400, 2125824, 2506752, 2506752, 2506752, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 987, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 3176, 0, 0, 0, 0, 2953216, 0, 0, 2826240, 3158016, 2437120, 0, 2785280, 0, 0, 0, 2428928, 0, 3018752, 2764800, 2572288, 0, 0, 3051520, 2179072, 2179072, 2637824, 2179072, 2179072, 2179072, 2179072, 2727936, 2752512, 2179072, 2179072, 2179072, 2842624, 2846720, 2179072, 2916352, 2428928, 2437120, 2179072, 2486272, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2654208, 2678784, 2760704, 2764800, 2854912, 2969600, 2179072, 3006464, 2179072, 3018752, 2179072, 2179072, 2179072, 3149824, 2125824, 2428928, 2437120, 2125824, 2486272, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 2043, 2044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2140, 0, 0, 0, 0, 0, 0, 2125824, 3018752, 2125824, 2125824, 2125824, 3149824, 2125824, 2428928, 2437120, 2125824, 2486272, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 24576, 987, 2125824, 2125824, 2125824, 2125824, 2424832, 2125824, 3149824, 2125824, 2179072, 3051520, 2125824, 3051520, 2125824, 3051520, 0, 2490368, 2498560, 0, 0, 0, 0, 0, 0, 304, 0, 204800, 0, 0, 0, 0, 0, 0, 0, 0, 1713, 0, 0, 0, 0, 0, 0, 0, 0, 1727, 0, 0, 0, 0, 0, 0, 0, 0, 2068, 0, 0, 0, 0, 0, 0, 0, 0, 2095, 0, 0, 0, 0, 0, 0, 0, 0, 2107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2875392, 0, 0, 0, 3176, 0, 0, 2834432, 0, 3227648, 2568192, 0, 0, 0, 0, 2564096, 0, 2940928, 2179072, 2179072, 2498560, 2179072, 2179072, 2179072, 2555904, 2564096, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3137536, 2125824, 2125824, 2498560, 2125824, 2125824, 2125824, 2555904, 2564096, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 2125824, 2179072, 2416640, 2125824, 2125824, 2179072, 2179072, 2125824, 2125824, 0, 2486272, 0, 0, 0, 0, 0, 2678784, 2854912, 3006464, 0, 3108864, 3198976, 0, 0, 2748416, 2879488, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2592768, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2125824, 2125824, 2125824, 2125824, 3010560, 2125824, 2125824, 2125824, 2125824, 2502656, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 296, 0, 0, 0, 296, 0, 297, 0, 0, 0, 2125824, 2125824, 2125824, 3010560, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 2592768, 0, 0, 0, 0, 433, 0, 0, 0, 453, 469, 469, 469, 469, 469, 469, 469, 469, 469, 479, 469, 469, 469, 469, 469, 469, 2125824, 2125824, 2125824, 2125824, 2592768, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 1918, 2125824, 2125824, 2125824, 2408448, 2125824, 2592768, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2449408, 0, 2535424, 3031040, 0, 0, 0, 0, 0, 1734, 0, 1736, 1710, 540, 540, 540, 540, 540, 540, 540, 540, 1816, 1818, 540, 540, 540, 540, 540, 1360, 0, 2859008, 0, 0, 2179072, 2449408, 2179072, 2535424, 2179072, 2609152, 2179072, 2859008, 2179072, 2179072, 2179072, 3031040, 2125824, 2449408, 2125824, 2535424, 2125824, 2609152, 2125824, 2859008, 2125824, 2125824, 2125824, 3031040, 2125824, 2449408, 2125824, 2535424, 2125824, 2609152, 2125824, 2859008, 2125824, 2125824, 2125824, 3031040, 2125824, 2527232, 0, 0, 0, 0, 0, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2804, 540, 540, 540, 540, 2527232, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2527232, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2527232, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 1080, 1084, 0, 0, 1088, 2125824, 2125824, 2125824, 2125824, 3092480, 0, 0, 0, 0, 3026944, 2404352, 2179072, 2179072, 2179072, 2179072, 3026944, 2404352, 2125824, 2125824, 2125824, 2125824, 3026944, 2404352, 2125824, 2125824, 2125824, 2125824, 3026944, 2539520, 0, 2949120, 0, 0, 0, 0, 434, 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, 457, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 2179072, 2658304, 2973696, 2179072, 2125824, 2658304, 2973696, 2125824, 2125824, 2658304, 2973696, 2125824, 2711552, 0, 2560000, 2179072, 2179072, 2945024, 2179072, 2179072, 2994176, 2179072, 3002368, 2179072, 2179072, 3022848, 2179072, 3067904, 3084288, 3096576, 2179072, 2179072, 2600960, 2179072, 2179072, 2179072, 2179072, 2641920, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2719744, 2179072, 2179072, 2441216, 2179072, 2469888, 2179072, 2179072, 2179072, 2519040, 2179072, 2179072, 2179072, 2179072, 2588672, 2179072, 2613248, 2703360, 0, 0, 0, 0, 2977792, 0, 0, 3047424, 3129344, 0, 2981888, 2396160, 0, 3153920, 2560000, 2125824, 2560000, 2125824, 0, 2179072, 2125824, 2125824, 0, 2179072, 2125824, 2125824, 0, 2179072, 2125824, 2125824, 2125824, 2457600, 2179072, 2179072, 2179072, 2179072, 2457600, 2125824, 2125824, 2125824, 2985984, 2985984, 2985984, 2985984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249856, 0, 0, 0, 0, 0, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 458, 458, 111050, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 458, 111050, 111050, 111050, 111050, 111050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2738, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 184723, 184931, 184931, 184931, 0, 184931, 184931, 184931, 184931, 184931, 0, 0, 0, 0, 0, 184931, 0, 184931, 1, 12290, 3, 78112, 1059, 0, 0, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 296, 0, 297, 0, 2125824, 1059, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2750, 0, 0, 0, 0, 2755, 0, 300, 118784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 300, 300, 300, 300, 0, 0, 0, 0, 0, 300, 0, 300, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 33403, 297, 0, 2134016, 49791, 301, 0, 0, 0, 0, 0, 0, 225889, 225889, 225889, 225889, 225740, 225889, 225889, 225889, 225889, 225889, 225740, 225740, 225740, 225740, 225740, 225906, 225740, 225906, 1, 12290, 3, 0, 0, 0, 0, 249856, 0, 0, 0, 249856, 0, 0, 0, 0, 0, 0, 697, 698, 0, 362, 362, 362, 0, 0, 0, 0, 0, 0, 711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 296, 0, 0, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 57344, 0, 0, 0, 0, 0, 0, 0, 3506, 0, 540, 540, 540, 540, 540, 540, 540, 2530, 540, 540, 540, 540, 540, 540, 540, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 296, 0, 0, 0, 300, 0, 0, 0, 300, 119195, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 0, 0, 0, 0, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3166, 3167, 0, 0, 0, 0, 0, 122880, 0, 122880, 122880, 122880, 0, 0, 0, 0, 0, 122880, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 122880, 122880, 122880, 122880, 0, 122880, 0, 2105629, 12290, 3, 0, 0, 291, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 746, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 69632, 73728, 0, 416, 416, 0, 0, 65536, 416, 1092, 0, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2765, 0, 0, 0, 0, 0, 1824, 2125824, 2125824, 2125824, 2408448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2551808, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 131072, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2507, 0, 0, 0, 0, 0, 131072, 0, 0, 131072, 131072, 0, 0, 0, 0, 0, 0, 131072, 0, 131072, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131072, 0, 131072, 131072, 131072, 131072, 0, 131072, 131072, 131072, 131072, 131072, 0, 0, 0, 0, 0, 131072, 0, 131072, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 135168, 135168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 321, 0, 0, 0, 135168, 0, 0, 135168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3174, 0, 0, 0, 0, 0, 0, 0, 135168, 135168, 135168, 135168, 135168, 135168, 135168, 0, 135168, 135168, 135168, 135168, 135168, 0, 0, 0, 0, 0, 135168, 0, 135168, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118784, 296, 0, 2183168, 0, 0, 0, 0, 0, 636, 637, 0, 2134016, 640, 641, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 1361, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 986, 2125824, 2125824, 2125824, 2125824, 2424832, 0, 301, 139264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 331, 301, 301, 301, 301, 0, 0, 0, 0, 0, 301, 0, 301, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 297, 0, 2183168, 0, 0, 0, 0, 0, 296, 33406, 0, 2134016, 300, 49794, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61440, 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2455, 0, 0, 0, 0, 0, 301, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2779, 0, 0, 0, 0, 0, 298, 298, 143728, 298, 298, 298, 143728, 69632, 73728, 298, 298, 143658, 298, 298, 65536, 298, 298, 0, 0, 298, 298, 143658, 298, 298, 298, 298, 298, 298, 298, 298, 298, 363, 298, 0, 143658, 298, 298, 298, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 298, 298, 298, 298, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 298, 298, 298, 143658, 368, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 143658, 298, 298, 143658, 298, 298, 143658, 143658, 143658, 143658, 143658, 143658, 298, 0, 298, 0, 298, 298, 298, 143658, 298, 298, 298, 298, 298, 298, 298, 298, 298, 143658, 298, 143658, 143658, 143658, 143658, 298, 298, 143658, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 143728, 298, 298, 298, 298, 298, 298, 298, 143658, 143658, 143658, 143658, 143658, 143658, 143728, 143658, 143728, 143728, 143728, 143728, 143728, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 90406, 90406, 90406, 90406, 0, 94503, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 2200252, 2200252, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 0, 155648, 155648, 0, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 0, 0, 0, 0, 155648, 0, 0, 0, 0, 0, 0, 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1663, 0, 0, 0, 0, 0, 0, 0, 0, 155648, 0, 0, 155648, 0, 0, 0, 0, 0, 0, 0, 155648, 0, 0, 0, 155648, 155648, 0, 155648, 155648, 0, 12290, 3, 0, 0, 2183168, 126976, 0, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 1146880, 0, 1146880, 0, 0, 0, 0, 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, 0, 0, 540, 2163, 540, 540, 540, 540, 540, 540, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 345, 346, 347, 0, 0, 0, 0, 0, 0, 0, 757, 0, 0, 0, 0, 0, 0, 0, 0, 1156, 0, 0, 0, 0, 0, 0, 0, 159744, 159744, 159744, 0, 0, 159744, 0, 0, 0, 0, 0, 0, 0, 0, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 163840, 159744, 159744, 159744, 163840, 159744, 159744, 159744, 159744, 159744, 0, 0, 0, 0, 0, 0, 0, 0, 25160, 0, 0, 159744, 0, 0, 0, 0, 25160, 25160, 25160, 159744, 25160, 25160, 25160, 25160, 25160, 159744, 159744, 159744, 159744, 25160, 159744, 25160, 1, 12290, 3, 0, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 1, 12290, 3, 0, 167936, 167936, 167936, 0, 0, 167936, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3015, 0, 0, 0, 0, 0, 0, 0, 0, 2138112, 1183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262144, 0, 0, 0, 0, 172032, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172032, 0, 0, 0, 0, 0, 0, 172032, 172032, 0, 172032, 0, 0, 172032, 0, 172032, 0, 172032, 0, 0, 0, 0, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 1, 12290, 3, 0, 172032, 0, 172032, 172032, 0, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106496, 0, 0, 0, 0, 0, 1, 286, 3, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106496, 0, 106496, 0, 0, 0, 0, 106496, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 1, 0, 3, 78112, 176128, 176128, 176128, 0, 0, 176128, 0, 0, 0, 0, 0, 0, 0, 0, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111050, 0, 0, 0, 0, 0, 78112, 290, 0, 634, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 1159168, 414, 414, 0, 0, 0, 0, 0, 414, 0, 1164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 0, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 959, 561, 585, 585, 585, 1490, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1498, 585, 585, 0, 0, 229376, 0, 0, 0, 0, 0, 0, 0, 0, 1686, 0, 0, 0, 0, 0, 0, 404, 404, 404, 404, 0, 404, 404, 404, 404, 404, 0, 0, 0, 0, 0, 404, 0, 404, 1, 12290, 3, 78112, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1155072, 0, 0, 0, 0, 0, 0, 0, 2131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 658, 0, 0, 0, 561, 561, 561, 561, 561, 561, 2250, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 0, 0, 0, 0, 0, 0, 3295, 0, 0, 0, 0, 0, 0, 0, 712, 0, 0, 0, 716, 0, 0, 719, 0, 561, 561, 2287, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 585, 585, 585, 2347, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1514, 585, 585, 2372, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 2671, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1515, 585, 585, 0, 0, 0, 2994, 0, 0, 0, 2998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 540, 3035, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 910, 540, 3075, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1417, 3116, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1501, 0, 0, 3178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3187, 0, 0, 0, 0, 0, 2046, 0, 2149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 1, 12290, 3, 0, 540, 540, 540, 3203, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3211, 540, 540, 540, 540, 540, 2813, 540, 540, 2817, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2555, 540, 540, 540, 540, 540, 540, 3255, 585, 585, 585, 3258, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3266, 585, 561, 0, 1287, 585, 1467, 1376, 540, 540, 1339, 540, 540, 561, 561, 1430, 561, 0, 585, 585, 585, 585, 585, 288, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 2427, 0, 0, 0, 0, 0, 0, 0, 0, 2465, 0, 0, 2468, 0, 0, 0, 0, 0, 0, 0, 0, 3309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 3508, 540, 3509, 540, 540, 540, 3326, 3327, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 961, 561, 585, 585, 585, 3361, 585, 585, 585, 585, 3362, 3363, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 3387, 0, 0, 0, 0, 0, 2092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 561, 3416, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 3425, 585, 585, 585, 585, 585, 585, 1492, 585, 585, 585, 585, 585, 585, 585, 1499, 585, 585, 585, 585, 3431, 585, 585, 585, 585, 3435, 540, 561, 585, 0, 0, 0, 0, 0, 0, 665, 0, 0, 668, 0, 0, 0, 0, 0, 0, 0, 3172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 3450, 540, 540, 540, 540, 540, 2814, 540, 2816, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2233, 540, 540, 540, 540, 540, 0, 561, 561, 561, 3573, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 3538, 585, 585, 3585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 3627, 561, 561, 585, 585, 0, 540, 561, 585, 0, 540, 561, 585, 0, 540, 561, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2662400, 0, 2813952, 78112, 290, 0, 0, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 2473984, 2478080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2134756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12290, 3, 0, 0, 0, 188416, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 540, 540, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 2169, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12290, 3, 78112, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 0, 192971, 0, 1, 12290, 3, 0, 192971, 192971, 192971, 0, 0, 192971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 0, 192971, 192971, 192971, 192971, 192971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2801664, 0, 0, 0, 0, 2142208, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 674, 78112, 290, 0, 0, 0, 0, 0, 296, 297, 0, 299, 300, 301, 0, 0, 0, 0, 0, 0, 2797568, 0, 0, 0, 0, 0, 0, 0, 2850816, 2867200, 0, 0, 740, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 740, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 2029, 0, 2031, 0, 0, 0, 0, 740, 1184, 0, 0, 0, 0, 1188, 0, 0, 0, 0, 0, 0, 0, 1583, 0, 1585, 0, 0, 0, 0, 0, 0, 0, 1661, 1662, 0, 0, 0, 0, 0, 0, 0, 0, 2727936, 0, 0, 0, 3084288, 0, 0, 0, 0, 0, 0, 1577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, 352, 353, 354, 0, 0, 0, 1188, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1150976, 0, 0, 0, 0, 0, 0, 561, 561, 585, 585, 585, 585, 1559, 2029, 0, 0, 0, 0, 1565, 2031, 0, 0, 0, 0, 0, 2120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 2033, 0, 2035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, 337, 338, 561, 561, 2323, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2339, 585, 585, 2342, 0, 304, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 2136, 0, 2138, 0, 0, 0, 0, 0, 0, 0, 0, 791, 817, 0, 817, 812, 0, 0, 0, 0, 0, 0, 204800, 204800, 0, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 205104, 204800, 204800, 205103, 205104, 204800, 205103, 205103, 204800, 204800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 2183801, 0, 0, 0, 0, 0, 296, 297, 151552, 2134016, 300, 301, 0, 212992, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 0, 2200253, 0, 0, 0, 0, 0, 0, 2932736, 2965504, 0, 0, 3076096, 0, 0, 2695168, 3174400, 2646016, 0, 914, 2126737, 2126737, 2126737, 2126737, 2425745, 2433937, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 0, 0, 987, 2126810, 2126810, 2126810, 2126810, 2425818, 2724753, 2126737, 2732945, 2773905, 2126737, 2126737, 2126737, 2806673, 2126737, 2831249, 2126737, 2126737, 2864017, 2126737, 2126737, 2126737, 2126737, 2126737, 2524049, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2601873, 2126737, 2126737, 2921361, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3117969, 2126737, 2126737, 2126737, 2126737, 2593681, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126810, 2126810, 2126810, 2126810, 3093393, 0, 0, 0, 0, 3026944, 2404352, 2179072, 2179072, 2179072, 2179072, 3026944, 2434010, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2626522, 2126810, 2126737, 0, 2179072, 2126810, 2126810, 2126737, 2457600, 2179072, 2179072, 2179072, 2179072, 2458513, 2126737, 2126737, 2126737, 2126737, 2126737, 2626449, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2700177, 2126737, 2716561, 2126737, 2806746, 2126810, 2831322, 2126810, 2126810, 2864090, 2126810, 2126810, 2126810, 2126810, 2921434, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 2179072, 2126810, 2126810, 2126737, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2458586, 2126810, 2126810, 2126810, 2126810, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 395, 0, 0, 0, 321, 0, 0, 2126737, 2126737, 2126737, 2409361, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3126161, 2126737, 2126737, 2126737, 2802577, 2814865, 2126737, 2839441, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126810, 2126810, 2126810, 2126810, 2126810, 2663386, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2802650, 2814938, 2126810, 2839514, 0, 0, 0, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2462609, 2466705, 2126737, 0, 2126810, 2126810, 2126810, 2126810, 2126810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 2769809, 2778001, 2126737, 2798481, 2823057, 2126737, 2126737, 2126737, 2884497, 2126737, 2913169, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2655121, 2679697, 2761617, 2765713, 2786193, 2855825, 2970513, 2126737, 3007377, 2126737, 3134353, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3208081, 2126737, 0, 0, 0, 0, 0, 325, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2462682, 2466778, 2126810, 2126810, 2126810, 2524122, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2601946, 2126810, 2126810, 2126810, 2585562, 2126810, 2126810, 2126810, 2126810, 2126810, 2618330, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2888666, 2126810, 2126810, 2925530, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2642906, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2720730, 2126810, 2126810, 2126810, 2126810, 2126810, 2769882, 2778074, 2126810, 2798554, 2823130, 2126810, 2126810, 2126810, 2884570, 2126810, 2913242, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3126234, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3208154, 2126810, 2126737, 2179072, 2126810, 2126810, 2126737, 0, 0, 0, 2388881, 2126737, 2126737, 2421649, 2126737, 2126737, 2126737, 2126737, 2126737, 2454417, 2126737, 2474897, 2483089, 2630545, 2126737, 2126737, 2651025, 2126737, 2126737, 2126737, 2708369, 2126737, 2737041, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 985, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2552794, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 2126737, 3072913, 2126737, 2126737, 3122065, 2126737, 2126737, 3142545, 2126737, 2126737, 2126737, 3171217, 2126737, 2126737, 3191697, 3195793, 2126737, 0, 0, 0, 0, 0, 0, 2388954, 2126810, 2126810, 2421722, 2126810, 2126810, 2126810, 2126810, 2126810, 3040218, 2126810, 3064794, 2126810, 2126810, 2126810, 2126810, 3101658, 2126810, 2126810, 3134426, 2126810, 2454490, 2126810, 2474970, 2483162, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2532314, 2126810, 2126810, 2126810, 2126810, 3036122, 2126810, 2126810, 3072986, 2126810, 2126810, 3122138, 2126810, 2126810, 3142618, 2126810, 2126810, 2126810, 3171290, 2126810, 2126810, 3191770, 3195866, 2126810, 2126737, 2179072, 2126810, 2126810, 2126737, 2179072, 2179072, 3112960, 3219456, 2126737, 2126737, 3113873, 3220369, 2126810, 2126810, 3113946, 3220442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 2638737, 2126737, 2126737, 2126737, 2126737, 2728849, 2753425, 2126737, 2126737, 2126737, 2126737, 2843537, 2847633, 2126737, 2896785, 2917265, 2638810, 2126810, 2126810, 2126810, 2126810, 2728922, 2753498, 2126810, 2126810, 2126810, 2126810, 2843610, 2847706, 2126810, 2896858, 2917338, 2179072, 3178496, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2495377, 2126737, 2126737, 2515857, 2126737, 2126737, 2126737, 2126737, 3011473, 2126737, 2126737, 2126810, 2126810, 2503642, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3138522, 2126737, 2940928, 2941841, 2941914, 0, 0, 0, 0, 2126737, 2544529, 2548625, 2126737, 2126737, 2597777, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2552721, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2929553, 2126737, 2126737, 2126737, 2999185, 2126737, 2126737, 2126737, 2126737, 3060625, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3040145, 2126737, 3064721, 2126737, 2126737, 2126737, 2126737, 3101585, 2126737, 2126737, 3179409, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2495450, 2126810, 2126810, 2515930, 2126810, 2126810, 0, 0, 0, 0, 0, 0, 2510848, 2514944, 0, 0, 2547712, 2596864, 0, 0, 0, 0, 0, 2160, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 3525, 561, 2126810, 2544602, 2548698, 2126810, 2126810, 2597850, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 0, 2502656, 0, 0, 3010560, 2126810, 2929626, 2126810, 2126810, 2126810, 2999258, 2126810, 2126810, 2126810, 2126810, 3060698, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3118042, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 2126810, 3179482, 2126737, 2179072, 2126810, 2126737, 2179072, 2179072, 2126737, 2126737, 2126810, 2126810, 2441216, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 3129344, 2179072, 2179072, 3153920, 3166208, 3174400, 2397073, 2401169, 2126737, 2126737, 2442129, 2126737, 2470801, 2126737, 2126737, 2126737, 2126737, 2126737, 2663313, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 0, 0, 2126810, 2126810, 2126810, 2409434, 2519953, 2126737, 2126737, 2126737, 2126737, 2589585, 2126737, 2614161, 2646929, 2126737, 2126737, 2696081, 2757521, 2126737, 2126737, 2126737, 2126737, 2126737, 3138449, 2126810, 2126810, 2499546, 2126810, 2126810, 2126810, 2556890, 2565082, 2126810, 2126810, 2126737, 2933649, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3130257, 2126737, 2126737, 3154833, 3167121, 3175313, 2397146, 2401242, 2126810, 2126810, 2442202, 2126810, 2470874, 2126810, 2126810, 2126810, 2520026, 2126810, 2126810, 2126810, 2126810, 2589658, 2126810, 2126810, 2126810, 3011546, 2126810, 2126810, 2126737, 0, 0, 0, 0, 0, 0, 0, 2592768, 0, 0, 0, 0, 663, 0, 0, 666, 667, 0, 0, 0, 0, 0, 0, 0, 540, 571, 540, 571, 540, 540, 571, 540, 595, 2614234, 2647002, 2126810, 2126810, 2696154, 2757594, 2126810, 2126810, 2126810, 2126810, 2933722, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3224538, 2126737, 2179072, 2417626, 2126810, 2126737, 2179072, 2179072, 2126737, 2126737, 2854912, 2969600, 2179072, 3006464, 2179072, 3018752, 2179072, 2179072, 2179072, 3149824, 2126737, 2429841, 2438033, 2126737, 2487185, 2126737, 2126737, 2945937, 2126737, 2126737, 2995089, 2126737, 3003281, 2126737, 2126737, 3023761, 2126737, 3068817, 3085201, 3097489, 2126737, 2126737, 2888593, 2126737, 2126737, 2925457, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3036049, 2126737, 3019665, 2126737, 2126737, 2126737, 3150737, 2126810, 2429914, 2438106, 2126810, 2487258, 2126810, 2126810, 2126810, 2126810, 2126810, 2700250, 2126810, 2716634, 2126810, 2724826, 2126810, 2733018, 2773978, 2126810, 2126810, 2126810, 2126810, 3150810, 2126737, 2179072, 3051520, 2126737, 3052433, 2126810, 3052506, 0, 2490368, 2498560, 0, 0, 0, 0, 0, 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2126810, 2593754, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 2449408, 0, 2535424, 3031040, 0, 0, 0, 0, 0, 2439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 369, 0, 0, 370, 0, 0, 2126737, 2450321, 2126737, 2536337, 2126737, 2610065, 2126737, 2859921, 2126737, 2126737, 2126737, 3031953, 2126810, 2450394, 2126810, 2536410, 2126810, 2610138, 2126810, 2859994, 2126810, 2126810, 2126810, 3032026, 2126737, 2527232, 0, 0, 0, 0, 0, 2179072, 2126810, 2126810, 2126737, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2126737, 2126810, 2126810, 2126810, 2126810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237568, 0, 0, 0, 0, 2527232, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2528145, 2126737, 2126737, 2126737, 2126737, 2126737, 2126810, 2528218, 2126810, 2126810, 2946010, 2126810, 2126810, 2995162, 2126810, 3003354, 2126810, 2126810, 3023834, 2126810, 3068890, 3085274, 3097562, 2126810, 2126810, 2126810, 2606042, 2126810, 2630618, 2126810, 2126810, 2651098, 2126810, 2126810, 2126810, 2708442, 2126810, 2737114, 2126810, 2126810, 2126810, 2655194, 2679770, 2761690, 2765786, 2786266, 2855898, 2970586, 2126810, 3007450, 2126810, 3019738, 2126810, 2126810, 0, 2486272, 0, 0, 0, 0, 0, 2678784, 2854912, 3006464, 0, 3108864, 3198976, 0, 2405265, 2126737, 2126737, 2126737, 2126737, 3027857, 2405338, 2126810, 2126810, 2126810, 2126810, 3027930, 2539520, 0, 2949120, 0, 0, 0, 0, 695, 0, 0, 0, 0, 362, 362, 362, 0, 0, 704, 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2049, 0, 0, 0, 0, 2179072, 2658304, 2973696, 2179072, 2126737, 2659217, 2974609, 2126737, 2126810, 2659290, 2974682, 2126810, 2711552, 0, 2560000, 2179072, 2179072, 3125248, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2560913, 2126737, 2560986, 2126810, 0, 2179072, 2126737, 2126810, 0, 2179072, 2126737, 2126810, 0, 2179072, 2126737, 2126810, 2126810, 3130330, 2126810, 2126810, 3154906, 3167194, 3175386, 2126737, 2506752, 2507738, 2507665, 2179072, 2179072, 2126737, 2126737, 2126737, 2642833, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2720657, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2585489, 2126737, 2126737, 2126737, 2126737, 2126737, 2618257, 2126737, 2985984, 2985984, 2986897, 2986970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, 221184, 221184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 221184, 0, 0, 221184, 221184, 221184, 0, 0, 0, 0, 0, 0, 221184, 0, 0, 0, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 1, 12290, 3, 0, 0, 0, 0, 0, 253952, 0, 0, 0, 253952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 687, 688, 0, 0, 0, 0, 0, 98304, 0, 0, 0, 53248, 0, 0, 0, 0, 0, 2662400, 0, 2813952, 297, 0, 300, 0, 0, 0, 300, 0, 301, 0, 0, 0, 301, 0, 0, 0, 301, 69632, 139679, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 3133440, 0, 98304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 300, 0, 301, 0, 0, 0, 2473984, 2478080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 3121152, 2179072, 2179072, 3141632, 2179072, 2179072, 2179072, 3170304, 2179072, 2179072, 3190784, 3194880, 2179072, 914, 0, 0, 0, 0, 0, 2451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 301, 0, 0, 0, 0, 0, 914, 0, 2387968, 2125824, 2125824, 2420736, 2125824, 2125824, 2125824, 2125824, 2125824, 2453504, 2125824, 2473984, 2482176, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2531328, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2605056, 2125824, 3194880, 2125824, 987, 0, 0, 0, 987, 0, 2387968, 2125824, 2125824, 2420736, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2887680, 2125824, 2125824, 2924544, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3035136, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, 349, 350, 0, 0, 0, 0, 2125824, 237568, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 358, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 217088, 2125824, 241664, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 131072, 131072, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 155648, 0, 0, 2183168, 0, 0, 270336, 0, 0, 296, 297, 0, 2134016, 300, 301, 200704, 0, 0, 0, 0, 0, 2462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1261, 0, 0, 0, 0, 0, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 180224, 0, 0, 0, 0, 0, 0, 0, 1726, 0, 0, 0, 0, 0, 0, 0, 0, 304, 304, 304, 0, 0, 0, 0, 0, 0, 2748416, 2879488, 0, 20480, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2768896, 2777088, 2797568, 2822144, 2179072, 2179072, 2179072, 2883584, 2912256, 2179072, 2179072, 2179072, 2179072, 2179072, 2617344, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2662400, 2179072, 2179072, 2179072, 2179072, 2179072, 3010560, 2179072, 2179072, 2125824, 2125824, 2502656, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2584576, 2125824, 2125824, 2125824, 2125824, 2125824, 2617344, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2142208, 0, 0, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12290, 2113823, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 293, 0, 0, 245760, 0, 0, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3039232, 2125824, 3063808, 2125824, 2125824, 2125824, 2125824, 3100672, 2125824, 2125824, 3133440, 2125824, 245760, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 122880, 122880, 0, 0, 274432, 274432, 274432, 274432, 0, 0, 0, 0, 0, 274432, 0, 274432, 1, 12290, 3, 0, 0, 0, 0, 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1192, 0, 1195, 0, 0, 78112, 290, 0, 0, 0, 0, 0, 296, 297, 0, 0, 300, 301, 0, 0, 0, 0, 0, 328, 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2200252, 2200252, 2200252, 0, 0, 0, 0, 0, 0, 0, 2033, 0, 0, 0, 0, 0, 2035, 0, 0, 0, 0, 0, 0, 0, 2055, 0, 2056, 0, 0, 0, 0, 0, 0, 0, 2067, 0, 0, 0, 0, 0, 0, 0, 0, 1187, 0, 0, 0, 0, 0, 0, 1104, 2483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 690, 0, 0, 2993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 335, 0, 0, 0, 0, 1679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 694, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 730, 0, 0, 0, 0, 0, 0, 78456, 290, 0, 0, 0, 0, 0, 296, 297, 0, 0, 300, 301, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, 0, 562, 562, 562, 562, 562, 562, 562, 586, 586, 586, 540, 586, 586, 586, 586, 586, 562, 562, 540, 562, 586, 562, 586, 1, 12290, 3, 78112, 0, 0, 2771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 521, 521, 1, 12290, 3, 78113, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 1, 12290, 3, 0, 282624, 282624, 282624, 0, 0, 282624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3178496, 2670592, 0, 2744320, 0, 0, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 0, 282624, 282624, 282624, 282624, 282624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 290, 0, 0, 0, 0, 3176, 0, 0, 2740224, 0, 0, 0, 0, 0, 2793472, 0, 0, 0, 0, 0, 0, 0, 2094, 0, 0, 0, 0, 0, 0, 0, 0, 683, 684, 685, 0, 0, 0, 689, 0, 0, 0, 0, 286720, 286720, 0, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 302, 0, 0, 0, 0, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 3301, 0, 0, 0, 0, 2953216, 0, 0, 2826240, 2875392, 0, 0, 0, 3381, 0, 0, 2834432, 0, 3227648, 2568192, 0, 0, 0, 0, 2564096, 0, 2748416, 2879488, 0, 3381, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2531328, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2605056, 2179072, 2629632, 2179072, 2179072, 0, 0, 0, 306, 0, 0, 0, 0, 0, 305, 0, 305, 306, 0, 305, 305, 0, 0, 0, 305, 305, 306, 306, 0, 0, 0, 0, 0, 0, 305, 405, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, 0, 306, 410, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 742, 0, 0, 0, 0, 742, 0, 748, 0, 0, 0, 0, 0, 0, 1192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 462, 462, 488, 488, 462, 488, 488, 488, 488, 488, 488, 488, 513, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 533, 488, 488, 488, 488, 488, 541, 563, 541, 563, 541, 541, 563, 541, 587, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 541, 613, 613, 613, 613, 613, 587, 563, 563, 541, 563, 587, 563, 587, 1, 12290, 3, 78112, 0, 0, 645, 0, 0, 648, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 253952, 0, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, 0, 0, 0, 353, 0, 351, 0, 472, 472, 472, 472, 472, 472, 472, 477, 472, 472, 472, 472, 472, 472, 472, 472, 472, 477, 472, 0, 768, 0, 0, 772, 0, 0, 0, 0, 0, 0, 781, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 731, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 343, 342, 65536, 341, 0, 788, 0, 0, 0, 0, 792, 0, 0, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 782, 0, 0, 0, 0, 736, 0, 796, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 820, 0, 0, 648, 0, 0, 0, 0, 0, 837, 792, 0, 0, 0, 0, 0, 841, 842, 792, 792, 0, 0, 0, 0, 792, 736, 792, 0, 540, 540, 851, 855, 540, 540, 540, 540, 1345, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2181, 540, 540, 540, 540, 561, 561, 561, 921, 925, 561, 561, 561, 561, 561, 561, 951, 561, 956, 561, 963, 561, 966, 561, 561, 980, 561, 561, 0, 585, 585, 585, 994, 998, 585, 585, 585, 585, 585, 585, 1963, 1964, 1966, 585, 585, 585, 585, 585, 585, 585, 561, 2713, 585, 2715, 2716, 540, 540, 540, 540, 585, 585, 585, 1024, 585, 1029, 585, 1036, 585, 1039, 585, 585, 1053, 585, 585, 966, 0, 0, 0, 855, 585, 998, 925, 851, 1065, 894, 540, 540, 921, 1070, 966, 561, 0, 585, 585, 585, 585, 585, 78112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114688, 0, 241664, 258048, 0, 0, 0, 1093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 766, 0, 0, 1214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, 673, 0, 540, 540, 1342, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 0, 585, 585, 585, 1524, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1517, 585, 585, 585, 1433, 0, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 3070, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 0, 0, 0, 3662, 0, 0, 0, 1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1103, 1104, 1105, 1106, 1654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 785, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 306, 0, 1732, 0, 0, 1733, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 3030, 540, 540, 540, 540, 540, 540, 540, 1745, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1758, 540, 540, 540, 540, 540, 540, 2540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1329, 540, 540, 540, 540, 540, 540, 540, 540, 1795, 540, 540, 1798, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 900, 540, 540, 540, 540, 540, 540, 1810, 540, 540, 540, 540, 540, 1815, 540, 540, 540, 540, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1416, 561, 1825, 561, 561, 561, 561, 1831, 561, 561, 561, 561, 561, 1837, 561, 561, 561, 561, 561, 983, 561, 0, 585, 585, 585, 585, 585, 1002, 585, 1010, 561, 1892, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1904, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 2726, 0, 0, 2729, 2730, 561, 561, 1909, 561, 561, 561, 561, 561, 561, 561, 26027, 1919, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 540, 3649, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 3231, 3232, 561, 1925, 585, 585, 585, 585, 585, 1931, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 3596, 1944, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1540, 561, 561, 2025, 585, 585, 585, 0, 2029, 0, 0, 0, 0, 0, 2031, 0, 0, 0, 0, 0, 2487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 2041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1132, 0, 0, 0, 2075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1135, 0, 2145, 0, 0, 0, 2143, 0, 0, 2150, 0, 0, 0, 0, 0, 0, 0, 0, 159744, 0, 0, 0, 0, 0, 0, 0, 0, 1234, 0, 0, 0, 0, 0, 0, 0, 0, 1584, 0, 0, 0, 0, 0, 0, 0, 0, 1700, 0, 0, 0, 0, 1705, 0, 0, 540, 540, 2171, 540, 540, 2174, 540, 540, 540, 540, 540, 540, 2182, 540, 540, 540, 540, 540, 540, 2568, 540, 540, 540, 540, 2572, 540, 540, 540, 540, 540, 540, 1347, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2556, 540, 540, 540, 540, 540, 540, 540, 2201, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 2242, 540, 540, 540, 2214, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1805, 540, 540, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2254, 561, 0, 585, 585, 585, 585, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 2123, 0, 2125, 2126, 0, 0, 0, 0, 561, 2257, 561, 561, 561, 561, 561, 561, 2265, 561, 561, 561, 561, 561, 561, 561, 0, 0, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 2952, 561, 2954, 561, 2299, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1438, 561, 2033, 0, 2035, 0, 0, 2426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2434, 0, 0, 0, 2475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1193, 0, 0, 0, 0, 2484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2493, 0, 0, 0, 0, 0, 0, 756, 0, 0, 0, 0, 0, 0, 763, 0, 0, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 2592, 561, 561, 561, 561, 561, 1408, 561, 561, 1412, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 1008, 585, 2656, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2664, 585, 585, 585, 585, 585, 585, 2350, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2379, 585, 585, 585, 585, 585, 585, 585, 585, 2699, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1940, 585, 585, 2708, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 540, 540, 561, 561, 561, 3229, 561, 561, 561, 561, 561, 561, 585, 585, 585, 3352, 585, 585, 585, 3355, 585, 585, 2731, 0, 0, 0, 0, 0, 0, 2736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 0, 0, 0, 2759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1234, 540, 540, 540, 0, 0, 0, 2788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1238, 0, 0, 0, 540, 540, 540, 2826, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2833, 540, 540, 540, 540, 1748, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1760, 540, 540, 540, 540, 1765, 540, 540, 540, 540, 540, 540, 540, 540, 1772, 540, 540, 540, 540, 561, 3406, 561, 561, 3408, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 1009, 585, 561, 561, 561, 2860, 561, 561, 2864, 561, 561, 561, 561, 561, 561, 561, 561, 561, 944, 561, 561, 561, 561, 561, 561, 561, 2873, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2881, 561, 561, 0, 0, 0, 2649, 0, 1920, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2703, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2908, 585, 585, 2912, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2393, 2394, 585, 585, 585, 585, 585, 2921, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2929, 585, 585, 0, 0, 0, 3292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3297, 2955, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 305, 0, 0, 0, 2970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1588, 1589, 0, 0, 540, 540, 540, 540, 3036, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2546, 540, 540, 540, 561, 561, 561, 3076, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1436, 561, 561, 561, 585, 585, 585, 3117, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2356, 585, 2358, 0, 0, 0, 0, 3176, 3442, 0, 3444, 0, 0, 0, 0, 0, 540, 3451, 540, 540, 540, 540, 1796, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 905, 540, 540, 540, 540, 3453, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 561, 3466, 561, 3468, 0, 0, 3501, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 3510, 540, 540, 540, 540, 540, 3204, 3205, 540, 540, 540, 540, 3209, 3210, 540, 540, 540, 540, 540, 1749, 1750, 540, 540, 540, 540, 1757, 540, 540, 540, 540, 540, 540, 1346, 540, 540, 540, 540, 540, 540, 1356, 540, 540, 307, 308, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 286720, 0, 0, 0, 0, 0, 0, 0, 0, 2490, 0, 0, 0, 0, 0, 0, 0, 0, 2504, 0, 0, 0, 0, 0, 0, 0, 0, 2517, 0, 0, 0, 0, 0, 0, 0, 0, 2975, 0, 0, 0, 0, 0, 0, 0, 0, 2999, 0, 0, 0, 0, 0, 0, 0, 0, 3164, 0, 0, 0, 0, 0, 0, 0, 0, 3173, 0, 0, 0, 0, 0, 0, 0, 0, 3183, 0, 0, 0, 0, 0, 0, 0, 0, 155648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 449, 418, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 532, 449, 532, 532, 532, 449, 532, 532, 532, 532, 449, 542, 564, 542, 564, 542, 542, 564, 542, 588, 564, 564, 564, 564, 564, 564, 564, 588, 588, 588, 542, 588, 588, 588, 588, 588, 564, 564, 616, 621, 588, 621, 627, 1, 12290, 3, 78112, 0, 1677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1163, 540, 540, 540, 1811, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1377, 561, 0, 585, 585, 585, 585, 585, 78112, 1079, 0, 0, 1082, 1086, 0, 0, 1090, 585, 585, 585, 1993, 585, 585, 585, 585, 585, 1999, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 3551, 0, 3553, 0, 0, 0, 0, 0, 561, 561, 561, 561, 561, 2589, 561, 561, 561, 561, 2593, 561, 561, 0, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2338, 585, 585, 585, 585, 585, 585, 585, 2657, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1971, 585, 585, 585, 2709, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 540, 540, 561, 561, 3228, 561, 561, 561, 561, 561, 561, 561, 0, 0, 585, 2900, 585, 585, 585, 585, 585, 540, 3514, 540, 3516, 540, 540, 3518, 540, 561, 561, 561, 561, 561, 561, 561, 561, 1396, 1398, 561, 561, 561, 561, 561, 561, 3527, 561, 3529, 561, 561, 3531, 561, 585, 585, 585, 585, 585, 585, 585, 585, 3540, 585, 3542, 585, 585, 3544, 585, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 362, 0, 0, 0, 147456, 0, 0, 0, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 365, 0, 382, 0, 348, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 764, 0, 0, 420, 428, 419, 428, 0, 310, 428, 441, 450, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 484, 489, 489, 500, 489, 489, 489, 489, 489, 489, 489, 489, 515, 515, 528, 528, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 515, 529, 529, 529, 529, 529, 543, 565, 543, 565, 543, 543, 565, 543, 589, 565, 565, 565, 565, 565, 565, 565, 589, 589, 589, 612, 589, 589, 589, 589, 589, 614, 615, 615, 612, 615, 614, 615, 614, 1, 12290, 3, 78112, 0, 702, 0, 0, 0, 0, 0, 702, 0, 0, 0, 540, 540, 540, 540, 540, 3028, 540, 540, 540, 540, 540, 540, 540, 561, 967, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 2337, 585, 585, 585, 585, 2341, 585, 0, 1108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 3200, 0, 1150, 1108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, 1228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1240, 0, 0, 540, 540, 1276, 1278, 540, 540, 540, 540, 540, 540, 540, 540, 1292, 540, 1297, 540, 540, 1301, 540, 540, 540, 540, 1812, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1823, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1378, 561, 0, 585, 585, 585, 585, 585, 78112, 1079, 0, 0, 1083, 1087, 0, 0, 1091, 540, 1304, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1302, 540, 1360, 914, 561, 561, 1364, 561, 1367, 561, 561, 561, 561, 561, 561, 561, 561, 1381, 561, 1386, 561, 561, 1390, 561, 561, 1393, 561, 561, 561, 561, 561, 561, 561, 561, 1431, 561, 561, 1435, 561, 561, 561, 561, 1484, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1942, 540, 1793, 1794, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 2584, 0, 585, 585, 1946, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2005, 585, 585, 585, 1959, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2357, 585, 2102, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 379, 381, 0, 0, 0, 0, 0, 2133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1119, 0, 0, 2033, 0, 2035, 0, 0, 0, 0, 0, 0, 2428, 0, 0, 0, 0, 0, 0, 0, 2122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 122880, 122880, 122880, 122880, 122880, 0, 0, 2474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1133, 0, 0, 0, 0, 0, 0, 2760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 384, 0, 0, 2799, 0, 0, 0, 0, 0, 0, 0, 2803, 540, 540, 540, 540, 540, 540, 540, 1326, 540, 540, 540, 540, 540, 540, 540, 1339, 585, 2956, 0, 0, 0, 0, 0, 2962, 0, 0, 0, 0, 0, 0, 0, 2966, 0, 0, 0, 3008, 0, 0, 0, 0, 0, 0, 0, 0, 3017, 0, 0, 0, 0, 0, 383, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 3048, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1320, 3089, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1858, 3130, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1957, 540, 3225, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3414, 585, 585, 585, 3281, 585, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 3157, 3513, 540, 540, 540, 540, 540, 540, 540, 561, 3521, 561, 3522, 561, 561, 561, 3526, 540, 540, 540, 3664, 561, 561, 561, 3666, 585, 585, 585, 3668, 0, 0, 540, 540, 540, 3560, 540, 540, 540, 540, 540, 540, 540, 540, 3568, 561, 321, 321, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1161, 0, 0, 0, 0, 371, 0, 430, 436, 0, 442, 451, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 490, 490, 501, 490, 490, 490, 490, 490, 490, 490, 490, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 544, 566, 544, 566, 544, 544, 566, 544, 590, 566, 566, 566, 566, 566, 566, 566, 590, 590, 590, 544, 590, 590, 590, 590, 590, 566, 566, 544, 566, 590, 566, 590, 1, 12290, 3, 78112, 540, 540, 540, 874, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1822, 540, 1360, 585, 1017, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 1122, 0, 1124, 1125, 0, 0, 0, 1127, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 0, 1159168, 0, 0, 0, 0, 1159168, 0, 0, 1166, 1167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1634, 0, 0, 0, 1113, 0, 1253, 0, 0, 0, 0, 0, 1128, 0, 0, 0, 0, 0, 1236, 0, 0, 0, 0, 773, 774, 0, 0, 778, 779, 0, 675, 0, 0, 0, 0, 0, 0, 1598, 0, 0, 0, 0, 0, 0, 0, 0, 1605, 0, 0, 1268, 1127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 1277, 540, 540, 540, 1323, 540, 540, 1325, 540, 540, 1328, 540, 540, 540, 540, 540, 540, 540, 540, 2554, 540, 540, 540, 540, 540, 540, 2560, 1360, 914, 561, 561, 1365, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1400, 561, 561, 561, 561, 561, 561, 1404, 561, 561, 561, 561, 561, 561, 561, 1413, 561, 561, 1415, 561, 561, 0, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 2655, 561, 1419, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1874, 561, 561, 561, 1443, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 1456, 585, 585, 0, 0, 3291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1262, 0, 0, 0, 1266, 585, 585, 585, 1504, 585, 585, 1506, 585, 585, 585, 1510, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 2020, 561, 561, 0, 0, 0, 1657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1675, 0, 0, 0, 585, 1991, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2695, 561, 2024, 585, 585, 585, 2028, 0, 2029, 0, 0, 0, 0, 0, 2031, 0, 0, 0, 0, 0, 2502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1586, 1587, 0, 0, 0, 0, 0, 0, 0, 2033, 0, 0, 0, 0, 0, 2035, 0, 0, 0, 0, 0, 2038, 0, 0, 2077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1177, 0, 0, 0, 0, 0, 0, 2091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 2807, 540, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 2252, 561, 561, 561, 561, 561, 1447, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 2017, 540, 540, 540, 2021, 561, 2256, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1875, 2272, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1890, 561, 561, 561, 2314, 561, 2316, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2340, 585, 585, 585, 2399, 585, 2401, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 540, 540, 2564, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3212, 540, 0, 0, 0, 561, 561, 561, 561, 2588, 561, 561, 561, 561, 561, 561, 561, 561, 1916, 561, 26027, 0, 585, 585, 585, 585, 0, 2757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, 2834, 540, 540, 540, 540, 540, 540, 540, 2840, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2571, 540, 540, 540, 540, 540, 540, 2882, 561, 561, 561, 561, 561, 561, 561, 2888, 561, 561, 561, 561, 561, 561, 561, 0, 0, 585, 585, 585, 2902, 585, 585, 585, 2930, 585, 585, 585, 585, 585, 585, 585, 2936, 585, 585, 585, 585, 585, 585, 585, 561, 540, 2714, 585, 561, 540, 540, 540, 540, 540, 540, 3226, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3074, 585, 585, 585, 585, 3282, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 3156, 0, 585, 585, 3369, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 2617344, 0, 0, 0, 0, 0, 2789376, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 3445, 0, 0, 0, 0, 540, 540, 540, 540, 3027, 540, 540, 540, 540, 3031, 540, 540, 540, 540, 540, 540, 3456, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3524, 561, 561, 561, 561, 3471, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3486, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 3626, 540, 540, 540, 3515, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3413, 561, 561, 3528, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3113, 585, 585, 585, 3541, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 208896, 0, 0, 0, 0, 323, 324, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1194, 1196, 0, 0, 0, 0, 322, 370, 325, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 322, 0, 0, 369, 369, 399, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 322, 452, 465, 465, 465, 465, 465, 465, 465, 478, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 491, 491, 465, 491, 491, 506, 508, 491, 491, 506, 491, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 534, 517, 517, 517, 517, 517, 545, 567, 545, 567, 545, 545, 567, 545, 591, 567, 567, 567, 567, 567, 567, 567, 591, 591, 591, 545, 591, 591, 591, 591, 591, 567, 567, 545, 567, 591, 567, 591, 1, 12290, 3, 78112, 659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 670, 671, 0, 0, 0, 0, 0, 439, 0, 0, 0, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 557, 580, 557, 580, 557, 557, 580, 557, 604, 0, 0, 707, 708, 0, 0, 0, 0, 0, 714, 0, 0, 0, 718, 0, 720, 0, 769, 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1209, 0, 0, 787, 0, 789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1224, 0, 0, 0, 801, 0, 806, 0, 809, 0, 0, 0, 0, 806, 809, 0, 0, 0, 809, 0, 707, 0, 0, 826, 0, 0, 0, 0, 0, 826, 826, 829, 809, 806, 0, 0, 0, 0, 0, 0, 0, 789, 0, 801, 0, 818, 0, 0, 0, 0, 0, 2745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 811, 540, 540, 854, 540, 540, 0, 0, 0, 789, 0, 0, 0, 0, 0, 838, 0, 0, 0, 0, 0, 0, 0, 2142, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2819, 540, 540, 540, 540, 540, 0, 0, 0, 787, 0, 0, 0, 838, 818, 838, 0, 540, 540, 852, 540, 858, 540, 540, 871, 540, 881, 540, 886, 540, 540, 893, 896, 901, 540, 909, 540, 540, 540, 540, 540, 3215, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 895, 540, 540, 540, 540, 540, 561, 561, 561, 922, 561, 928, 561, 561, 941, 561, 561, 952, 561, 957, 561, 561, 0, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 585, 2653, 585, 585, 0, 0, 2959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2965, 0, 965, 968, 973, 561, 981, 561, 561, 0, 585, 585, 585, 995, 585, 1001, 585, 585, 0, 2958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131072, 131072, 0, 0, 1014, 585, 585, 1025, 585, 1030, 585, 585, 1038, 1041, 1046, 585, 1054, 585, 585, 968, 0, 0, 0, 540, 585, 585, 561, 852, 540, 1066, 901, 540, 922, 561, 1071, 973, 0, 0, 0, 1110, 0, 0, 0, 0, 0, 0, 0, 1117, 0, 0, 0, 0, 0, 0, 775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1205, 0, 0, 0, 0, 0, 0, 0, 1137, 1138, 0, 0, 0, 0, 1142, 0, 0, 0, 362, 362, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1206, 0, 0, 0, 0, 0, 0, 1165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 784, 0, 0, 0, 1182, 741, 0, 0, 0, 1134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245760, 0, 0, 0, 0, 0, 0, 1303, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1318, 540, 540, 540, 540, 2173, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2558, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1372, 561, 561, 561, 561, 561, 1850, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1902, 1903, 561, 561, 561, 561, 561, 561, 1387, 561, 561, 561, 1392, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1432, 561, 561, 561, 561, 561, 1439, 561, 561, 561, 1421, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1437, 561, 0, 585, 585, 585, 1049, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 836, 0, 0, 0, 0, 0, 0, 811, 0, 585, 585, 585, 585, 1463, 585, 585, 585, 585, 585, 585, 1478, 585, 585, 585, 1483, 0, 0, 1608, 1609, 1610, 0, 1612, 1613, 0, 0, 0, 0, 1618, 0, 0, 0, 0, 0, 679, 751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2144, 0, 0, 1640, 0, 0, 1643, 0, 1645, 0, 0, 0, 0, 0, 1651, 1652, 0, 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, 540, 846, 540, 540, 540, 540, 540, 540, 3216, 540, 540, 540, 540, 540, 3221, 540, 3223, 540, 0, 1668, 0, 0, 1670, 0, 0, 0, 0, 1672, 1673, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 347, 345, 65536, 0, 1692, 0, 0, 0, 0, 0, 1698, 1699, 0, 1701, 1702, 1703, 0, 0, 0, 0, 0, 0, 810, 811, 0, 0, 0, 0, 811, 0, 0, 0, 1719, 0, 0, 0, 1723, 1724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 0, 0, 1715, 0, 0, 0, 1735, 1585, 1585, 1737, 540, 1739, 540, 1740, 540, 1742, 540, 540, 540, 1746, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1759, 540, 540, 540, 540, 540, 3318, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2557, 540, 540, 540, 540, 540, 540, 1763, 540, 540, 540, 540, 1767, 540, 1769, 540, 540, 540, 540, 540, 540, 540, 540, 2570, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3041, 540, 540, 540, 540, 540, 540, 540, 540, 1777, 1778, 1780, 540, 540, 540, 540, 540, 540, 1787, 1788, 540, 540, 1791, 1792, 540, 540, 540, 540, 540, 540, 540, 1800, 540, 540, 540, 1804, 540, 540, 540, 540, 540, 540, 2829, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1770, 540, 540, 540, 540, 540, 0, 1828, 561, 1830, 561, 561, 1832, 561, 1834, 561, 561, 561, 1838, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 2725, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 135168, 135168, 0, 0, 65536, 135168, 1859, 561, 1861, 561, 561, 561, 561, 561, 561, 561, 561, 1869, 1870, 1872, 561, 561, 0, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 2652, 585, 585, 585, 585, 585, 585, 2390, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3124, 585, 585, 585, 585, 585, 561, 561, 561, 1894, 561, 561, 561, 1898, 561, 561, 561, 561, 561, 561, 561, 1906, 585, 1926, 585, 1928, 585, 585, 585, 1932, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 585, 1945, 585, 585, 585, 585, 1949, 585, 585, 585, 585, 1953, 585, 1955, 585, 585, 561, 3146, 3147, 3148, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 2488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2096, 0, 0, 0, 0, 0, 0, 1974, 1975, 1976, 585, 585, 1979, 1980, 585, 585, 585, 585, 585, 585, 585, 1988, 585, 561, 0, 1288, 585, 1468, 1377, 540, 540, 540, 1549, 540, 561, 561, 561, 1553, 585, 585, 1992, 585, 585, 585, 585, 585, 585, 585, 2000, 585, 585, 585, 585, 585, 561, 561, 540, 561, 585, 561, 585, 1, 12290, 3, 78112, 585, 585, 585, 585, 2011, 561, 540, 2014, 585, 561, 1792, 540, 2019, 540, 1886, 561, 0, 585, 585, 1040, 585, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 1134592, 0, 0, 0, 0, 2023, 561, 1980, 585, 2027, 585, 0, 2029, 0, 0, 0, 0, 0, 2031, 0, 0, 0, 0, 0, 2761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 0, 0, 0, 0, 0, 2089, 0, 0, 0, 0, 2093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2119, 0, 2121, 0, 0, 0, 0, 0, 0, 0, 2129, 0, 0, 0, 0, 786, 0, 805, 0, 0, 0, 0, 540, 849, 540, 540, 540, 540, 540, 2216, 540, 540, 540, 540, 540, 540, 2221, 540, 540, 540, 540, 540, 540, 3633, 561, 561, 561, 561, 561, 561, 3639, 585, 585, 0, 0, 0, 2134, 0, 0, 0, 0, 2139, 0, 0, 0, 0, 0, 0, 0, 0, 2990080, 2179072, 2179072, 2502656, 2179072, 2179072, 2179072, 2179072, 540, 2187, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1337, 540, 2211, 2212, 540, 540, 540, 540, 540, 540, 2219, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2582, 540, 540, 540, 0, 0, 0, 561, 561, 2258, 561, 2260, 561, 561, 561, 561, 561, 561, 2268, 561, 2270, 561, 561, 561, 561, 1426, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3343, 561, 561, 561, 561, 3344, 3345, 561, 561, 2343, 585, 2345, 585, 585, 585, 585, 585, 585, 2353, 585, 2355, 585, 585, 585, 585, 561, 0, 0, 0, 3648, 0, 540, 540, 540, 540, 3652, 540, 585, 585, 585, 585, 2389, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2705, 585, 585, 585, 585, 585, 585, 585, 2402, 585, 585, 2405, 2406, 585, 585, 561, 2177, 585, 2345, 2260, 540, 2414, 540, 540, 561, 2418, 561, 561, 585, 2422, 585, 585, 2029, 0, 2031, 0, 0, 0, 0, 795, 663, 844, 0, 0, 0, 0, 540, 848, 540, 540, 540, 540, 540, 1283, 540, 540, 540, 540, 540, 540, 1298, 540, 540, 540, 540, 540, 540, 2580, 540, 540, 540, 540, 540, 540, 0, 2584, 0, 0, 0, 2450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1239, 0, 0, 0, 2459, 0, 0, 0, 0, 0, 2464, 0, 2466, 2467, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 371, 0, 65536, 0, 0, 2498, 0, 0, 0, 0, 0, 0, 0, 2505, 0, 0, 0, 0, 0, 0, 0, 2479, 0, 0, 0, 2481, 0, 0, 0, 0, 2561, 540, 540, 540, 2566, 540, 540, 540, 540, 540, 540, 540, 2573, 540, 540, 540, 540, 540, 540, 2838, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1296, 540, 540, 540, 540, 540, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 2591, 561, 561, 561, 561, 561, 561, 2640, 561, 561, 561, 2643, 561, 561, 561, 561, 561, 561, 2886, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1867, 561, 561, 561, 561, 561, 561, 2621, 561, 561, 561, 561, 2625, 561, 561, 561, 2630, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 0, 3661, 0, 0, 561, 2637, 561, 561, 561, 561, 561, 561, 561, 2642, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3427, 585, 2669, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3267, 2797, 2798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 1741, 540, 0, 0, 2982, 2983, 0, 2984, 0, 2986, 0, 0, 0, 0, 2988, 0, 0, 0, 0, 0, 680, 681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2047, 0, 0, 0, 0, 0, 0, 0, 0, 3007, 0, 0, 2988, 0, 0, 3013, 3014, 0, 3016, 0, 0, 3019, 0, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, 3022, 540, 540, 540, 540, 540, 540, 3029, 540, 540, 540, 540, 540, 3033, 3062, 540, 561, 561, 561, 561, 561, 561, 3069, 561, 561, 561, 561, 561, 3073, 561, 0, 585, 585, 1042, 585, 585, 288, 1079, 0, 0, 1082, 1086, 0, 0, 1090, 3103, 561, 585, 585, 585, 585, 585, 585, 3110, 585, 585, 585, 585, 585, 3114, 585, 561, 0, 1543, 585, 1545, 1546, 540, 540, 1548, 540, 540, 561, 561, 1552, 561, 0, 585, 585, 1044, 585, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 794, 0, 0, 0, 0, 0, 0, 0, 798, 3144, 585, 561, 540, 585, 561, 540, 3150, 561, 3152, 585, 3154, 0, 0, 0, 0, 0, 0, 825, 0, 819, 0, 664, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 221184, 0, 0, 0, 0, 65536, 0, 0, 0, 3160, 0, 0, 3163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 2806, 540, 540, 540, 3202, 540, 540, 540, 540, 540, 540, 540, 3207, 540, 540, 540, 540, 540, 540, 540, 540, 3040, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3322, 540, 540, 540, 540, 540, 540, 561, 3234, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1889, 561, 3245, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 3257, 585, 585, 585, 585, 585, 585, 585, 3262, 585, 585, 585, 585, 585, 561, 2013, 585, 2015, 2016, 540, 2018, 540, 540, 561, 2022, 561, 561, 561, 3349, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2667, 0, 3378, 3379, 0, 3176, 0, 3383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 0, 0, 384, 0, 0, 0, 3441, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 2167, 540, 540, 0, 0, 0, 0, 3503, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 3512, 0, 0, 3557, 3558, 3559, 540, 540, 540, 3562, 540, 3564, 540, 540, 540, 540, 3569, 3570, 3571, 561, 561, 561, 3574, 561, 3576, 561, 561, 561, 561, 3581, 3582, 3583, 585, 561, 1203, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 585, 3586, 585, 3588, 585, 585, 585, 585, 3593, 0, 0, 0, 0, 0, 0, 0, 2747, 2748, 2749, 0, 0, 0, 0, 0, 0, 0, 2763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 1, 12290, 0, 0, 540, 3628, 540, 540, 540, 3632, 561, 561, 3634, 561, 561, 561, 3638, 585, 585, 3640, 585, 585, 585, 3644, 561, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 3563, 540, 3565, 540, 540, 540, 561, 0, 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 674, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1120, 0, 0, 0, 0, 366, 0, 0, 0, 374, 376, 0, 0, 0, 0, 0, 0, 0, 344, 0, 402, 0, 0, 0, 0, 0, 402, 0, 0, 409, 0, 0, 0, 409, 69632, 73728, 0, 366, 366, 0, 421, 65536, 366, 0, 0, 366, 421, 498, 502, 498, 498, 507, 498, 498, 498, 507, 498, 421, 421, 327, 421, 0, 0, 421, 0, 421, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 546, 568, 546, 568, 546, 546, 568, 546, 592, 568, 568, 568, 568, 568, 568, 568, 592, 592, 592, 546, 592, 592, 592, 592, 592, 568, 568, 546, 568, 592, 568, 592, 1, 12290, 3, 78112, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1248, 0, 0, 540, 540, 540, 875, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2183, 540, 540, 561, 561, 915, 561, 561, 561, 561, 561, 561, 945, 561, 561, 561, 561, 561, 561, 585, 3421, 585, 585, 3423, 585, 585, 585, 585, 585, 585, 1018, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 540, 0, 0, 0, 540, 988, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3068, 561, 561, 561, 561, 561, 561, 561, 561, 932, 561, 561, 946, 561, 561, 561, 561, 561, 561, 934, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3240, 561, 561, 561, 561, 561, 561, 0, 0, 1109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1604, 0, 0, 0, 0, 1229, 0, 1109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 0, 0, 0, 540, 540, 540, 1281, 540, 540, 540, 540, 540, 1293, 540, 540, 540, 540, 540, 540, 540, 540, 3054, 3056, 540, 540, 540, 3059, 540, 3061, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 1370, 561, 561, 561, 561, 561, 1382, 585, 585, 1461, 585, 585, 585, 585, 585, 1473, 585, 585, 585, 585, 585, 585, 585, 585, 2914, 585, 585, 585, 585, 585, 585, 585, 585, 3122, 585, 585, 585, 585, 585, 585, 585, 585, 3136, 3138, 585, 585, 585, 3141, 585, 3143, 0, 1720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134, 0, 1990, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1972, 585, 585, 585, 2373, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2370, 585, 585, 585, 585, 2698, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2383, 585, 0, 0, 0, 3161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0, 0, 561, 561, 3235, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 2325, 0, 3663, 540, 540, 540, 3665, 561, 561, 561, 3667, 585, 585, 585, 0, 0, 540, 540, 540, 2526, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3058, 540, 540, 540, 422, 422, 0, 422, 431, 0, 422, 0, 422, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 492, 492, 466, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 547, 569, 547, 569, 547, 547, 569, 547, 593, 569, 569, 569, 569, 569, 569, 569, 593, 593, 593, 547, 593, 593, 593, 593, 593, 569, 569, 547, 569, 593, 569, 593, 1, 12290, 3, 78112, 0, 0, 0, 0, 2159, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3032, 540, 540, 540, 540, 540, 2202, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2208, 540, 540, 2413, 540, 540, 540, 2417, 561, 561, 561, 2421, 585, 585, 585, 0, 0, 0, 0, 3293, 0, 0, 0, 0, 0, 3296, 0, 0, 0, 2458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1250, 2967, 0, 0, 0, 2971, 0, 0, 0, 0, 0, 2977, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 418, 0, 65536, 0, 0, 2992, 0, 0, 2995, 0, 0, 0, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 367, 367, 0, 0, 65536, 367, 0, 0, 0, 3023, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2222, 540, 540, 540, 540, 3049, 540, 540, 540, 540, 540, 540, 540, 540, 3057, 540, 540, 3060, 540, 540, 540, 540, 2189, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2583, 0, 0, 0, 540, 540, 3063, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 2326, 0, 561, 561, 3090, 561, 561, 561, 561, 561, 561, 561, 561, 3098, 561, 561, 3101, 561, 0, 585, 585, 1045, 585, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 1102, 1101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 1275, 540, 561, 561, 3104, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2666, 585, 585, 585, 3131, 585, 585, 585, 585, 585, 585, 585, 585, 3139, 585, 585, 3142, 585, 585, 585, 585, 585, 1930, 585, 585, 585, 585, 585, 585, 585, 585, 1941, 585, 585, 585, 585, 585, 1948, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3263, 585, 585, 585, 585, 0, 0, 0, 0, 3179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 732, 0, 0, 0, 0, 0, 0, 3192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 2808, 3201, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1359, 540, 3213, 540, 540, 540, 540, 540, 540, 540, 3218, 540, 3220, 540, 540, 540, 540, 540, 540, 561, 3227, 561, 561, 561, 3230, 561, 561, 561, 561, 561, 982, 561, 0, 585, 585, 585, 585, 999, 585, 585, 585, 561, 561, 3246, 561, 3248, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 3537, 585, 585, 585, 585, 3256, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3278, 585, 585, 3268, 585, 585, 585, 585, 585, 585, 585, 585, 3274, 585, 3276, 585, 585, 561, 3370, 540, 3371, 561, 3372, 585, 0, 0, 0, 0, 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1179, 540, 540, 3328, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3233, 561, 561, 561, 561, 3340, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3346, 561, 0, 994, 1075, 1039, 585, 585, 78112, 1079, 0, 0, 1081, 1085, 0, 0, 1089, 3358, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3364, 585, 585, 585, 585, 585, 585, 585, 1981, 1982, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 2951, 540, 2953, 561, 561, 561, 3654, 3655, 561, 561, 585, 585, 3658, 3659, 585, 585, 0, 0, 0, 0, 0, 0, 1126, 0, 0, 0, 1130, 1131, 0, 0, 0, 0, 0, 0, 1141, 0, 1143, 0, 0, 362, 362, 0, 0, 0, 691, 0, 0, 0, 0, 696, 0, 0, 0, 362, 362, 362, 0, 0, 0, 0, 0, 0, 1154, 0, 0, 0, 0, 0, 1160, 0, 1162, 0, 758, 0, 0, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 758, 758, 0, 0, 0, 0, 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 856, 585, 999, 926, 540, 540, 540, 540, 910, 561, 561, 561, 561, 561, 1880, 1881, 1882, 561, 561, 1885, 1886, 561, 561, 561, 561, 561, 1896, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2603, 561, 2605, 561, 561, 561, 982, 0, 585, 585, 585, 585, 1055, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 375, 0, 378, 0, 0, 0, 378, 0, 0, 0, 0, 1709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1619, 0, 0, 585, 585, 585, 2010, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 561, 3066, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2600, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 987, 585, 585, 585, 585, 585, 0, 2039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1178, 0, 540, 540, 540, 2172, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2238, 2584, 0, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2255, 0, 0, 0, 0, 2461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 747, 0, 0, 0, 0, 3288, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1184, 1184, 561, 561, 561, 561, 3350, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2939, 585, 585, 585, 585, 3368, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 394, 0, 0, 467, 467, 485, 493, 493, 485, 493, 493, 493, 493, 493, 493, 493, 493, 518, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 535, 526, 526, 526, 526, 526, 548, 570, 548, 570, 548, 548, 570, 548, 594, 570, 570, 570, 570, 570, 570, 570, 594, 594, 594, 548, 594, 594, 594, 594, 594, 570, 570, 548, 570, 594, 570, 594, 1, 12290, 3, 78112, 767, 0, 0, 771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1704, 0, 0, 0, 821, 0, 0, 0, 798, 0, 0, 821, 0, 0, 0, 0, 0, 821, 821, 0, 0, 0, 0, 805, 0, 0, 786, 0, 0, 0, 0, 805, 0, 0, 0, 0, 0, 0, 0, 805, 0, 0, 0, 0, 0, 798, 0, 0, 0, 0, 0, 0, 839, 794, 0, 0, 839, 0, 0, 0, 0, 808, 0, 0, 692, 0, 0, 672, 0, 692, 0, 813, 675, 676, 0, 0, 0, 0, 0, 682, 0, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 540, 867, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 911, 540, 540, 540, 540, 2215, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1756, 540, 540, 540, 540, 983, 0, 585, 585, 585, 1077, 1056, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 412, 412, 0, 0, 0, 0, 0, 412, 0, 1180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1621, 0, 0, 1241, 0, 0, 0, 0, 0, 0, 0, 0, 1246, 0, 0, 0, 0, 0, 0, 1170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 816, 0, 0, 0, 0, 0, 0, 540, 1305, 540, 540, 540, 540, 540, 540, 540, 1313, 540, 540, 540, 540, 540, 540, 540, 540, 3332, 540, 561, 561, 561, 561, 561, 561, 935, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3094, 561, 3096, 561, 561, 561, 561, 561, 561, 1340, 540, 540, 1344, 540, 540, 540, 540, 540, 1350, 540, 540, 540, 1357, 540, 540, 540, 540, 540, 3458, 540, 3460, 3461, 540, 3463, 540, 561, 561, 561, 561, 561, 2262, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1399, 561, 561, 561, 561, 561, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1375, 561, 561, 561, 561, 1848, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2868, 561, 561, 561, 561, 561, 1441, 561, 561, 561, 1448, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 585, 585, 1998, 585, 585, 585, 585, 585, 2003, 585, 585, 1485, 585, 585, 585, 585, 585, 585, 585, 1493, 585, 585, 585, 585, 585, 585, 585, 585, 3261, 585, 585, 585, 585, 585, 585, 585, 585, 3272, 585, 585, 585, 585, 585, 585, 585, 585, 3283, 540, 585, 561, 540, 540, 561, 561, 585, 1522, 585, 585, 1526, 585, 585, 585, 585, 585, 1532, 585, 585, 585, 1539, 585, 585, 585, 585, 585, 1996, 1997, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1531, 585, 585, 585, 585, 585, 585, 0, 0, 0, 1595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1716, 0, 0, 0, 0, 0, 1656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 0, 710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 1708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1653, 0, 0, 0, 1722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1729, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3398, 540, 3400, 540, 561, 561, 1893, 561, 561, 561, 561, 561, 561, 1901, 561, 561, 561, 561, 561, 561, 1410, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1428, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1917, 26027, 0, 1922, 585, 1924, 585, 561, 561, 561, 1910, 1912, 561, 561, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 585, 585, 2335, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 3622, 0, 3624, 0, 0, 540, 585, 585, 585, 585, 1978, 585, 585, 585, 585, 585, 585, 585, 585, 1987, 585, 585, 585, 585, 585, 585, 2934, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2407, 561, 540, 585, 585, 561, 585, 585, 585, 585, 1995, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2004, 2006, 0, 0, 0, 2078, 0, 0, 0, 2081, 0, 0, 0, 0, 0, 2087, 0, 0, 0, 0, 0, 2774, 0, 0, 0, 2778, 0, 2780, 0, 0, 0, 0, 0, 0, 2746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 362, 0, 0, 0, 0, 0, 2103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1265, 0, 0, 0, 0, 561, 561, 561, 561, 561, 2249, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1519, 585, 585, 2346, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2919, 585, 2448, 0, 0, 0, 0, 0, 0, 0, 0, 2453, 0, 0, 2456, 0, 0, 0, 0, 0, 726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 736, 0, 0, 0, 2460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2471, 0, 0, 0, 2485, 2486, 0, 0, 2489, 0, 0, 2492, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 417, 417, 0, 0, 65536, 417, 0, 0, 2499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2510, 0, 0, 0, 0, 815, 0, 812, 795, 0, 0, 817, 0, 667, 0, 791, 0, 0, 0, 0, 1096, 0, 0, 1098, 0, 0, 0, 0, 0, 0, 0, 0, 827, 0, 0, 0, 0, 0, 0, 0, 0, 540, 2524, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1789, 540, 540, 540, 540, 540, 2551, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2559, 540, 540, 2562, 540, 540, 540, 540, 540, 540, 2569, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3323, 540, 540, 540, 540, 540, 540, 2576, 540, 540, 540, 2579, 540, 540, 540, 540, 540, 540, 540, 0, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, 765, 0, 0, 0, 0, 561, 2586, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3254, 561, 561, 561, 585, 585, 585, 585, 585, 2672, 585, 585, 585, 585, 585, 585, 2677, 585, 585, 585, 585, 561, 0, 3646, 0, 0, 0, 540, 540, 540, 540, 540, 540, 2529, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2842, 540, 540, 540, 540, 540, 585, 585, 585, 2683, 585, 585, 585, 585, 585, 585, 2690, 585, 585, 585, 585, 585, 585, 585, 2351, 585, 585, 585, 585, 585, 585, 585, 585, 1508, 585, 585, 585, 585, 585, 585, 585, 585, 2697, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2704, 585, 585, 585, 2707, 0, 0, 0, 0, 2735, 0, 0, 0, 0, 0, 0, 0, 2739, 0, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 2528, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2234, 540, 540, 540, 540, 0, 540, 540, 540, 2811, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2821, 540, 540, 540, 540, 540, 2836, 540, 540, 540, 2839, 540, 2841, 540, 540, 540, 540, 540, 540, 540, 540, 3520, 561, 561, 561, 561, 561, 561, 561, 1450, 26027, 1360, 987, 585, 585, 585, 585, 585, 2845, 540, 540, 540, 540, 540, 540, 0, 0, 561, 561, 2853, 561, 561, 561, 561, 561, 1913, 561, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 2333, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1050, 585, 585, 585, 585, 561, 561, 2858, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2284, 561, 561, 561, 2874, 2875, 561, 561, 561, 561, 2878, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 1005, 585, 561, 561, 561, 2884, 561, 561, 561, 2887, 561, 2889, 561, 561, 561, 561, 561, 561, 1449, 561, 26027, 1360, 987, 1453, 585, 585, 585, 585, 2893, 561, 561, 561, 561, 561, 561, 0, 0, 585, 585, 2901, 585, 585, 585, 585, 585, 585, 585, 3121, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 540, 3285, 561, 3287, 585, 2906, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3367, 585, 585, 2922, 2923, 585, 585, 585, 585, 2926, 585, 585, 585, 585, 585, 585, 585, 585, 3592, 561, 0, 0, 0, 0, 3595, 0, 585, 585, 585, 2932, 585, 585, 585, 2935, 585, 2937, 585, 585, 585, 585, 585, 585, 585, 1933, 585, 585, 585, 585, 1939, 585, 585, 585, 2941, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 2963, 0, 0, 0, 0, 0, 585, 585, 2957, 0, 0, 2960, 2961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 3009, 0, 0, 3012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2200253, 151552, 2200253, 0, 0, 0, 151552, 540, 540, 540, 540, 3037, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3325, 540, 540, 540, 540, 540, 540, 540, 3051, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3465, 561, 561, 561, 561, 561, 561, 3077, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1887, 1888, 561, 561, 561, 561, 561, 561, 3092, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3480, 585, 585, 585, 585, 561, 561, 585, 585, 585, 585, 3108, 585, 585, 585, 585, 3112, 585, 585, 585, 585, 585, 585, 585, 3135, 585, 3137, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 3552, 0, 0, 0, 585, 585, 585, 3118, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1512, 585, 585, 585, 585, 585, 585, 585, 3133, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2917, 585, 585, 2920, 0, 0, 3168, 3169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2071, 0, 0, 0, 540, 540, 540, 540, 3329, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3412, 561, 561, 3336, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2285, 3347, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 3354, 585, 585, 585, 585, 585, 585, 2404, 585, 585, 585, 585, 561, 2178, 585, 2346, 2261, 3389, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2534, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 3447, 3448, 0, 540, 540, 540, 540, 2527, 540, 540, 540, 540, 2531, 540, 540, 540, 540, 540, 540, 540, 1312, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1784, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 3473, 561, 3475, 3476, 561, 3478, 561, 585, 585, 585, 585, 585, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254413, 0, 0, 0, 0, 0, 585, 585, 585, 3488, 585, 3490, 3491, 585, 3493, 585, 3495, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 313, 314, 314, 419, 420, 65536, 427, 585, 585, 3617, 585, 3618, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 540, 585, 585, 561, 540, 540, 540, 904, 540, 561, 561, 561, 976, 561, 561, 585, 585, 3673, 3674, 3675, 3676, 0, 540, 561, 585, 0, 540, 561, 585, 585, 585, 585, 585, 1079, 0, 0, 1563, 0, 0, 0, 1569, 0, 0, 0, 0, 0, 2789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1591, 0, 0, 0, 0, 0, 571, 571, 571, 571, 571, 571, 571, 595, 595, 595, 540, 595, 595, 595, 595, 595, 571, 571, 540, 571, 595, 571, 595, 1, 12290, 3, 78112, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1707, 0, 0, 2040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, 2170, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2253, 561, 561, 561, 561, 926, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2307, 561, 561, 561, 2310, 400, 0, 0, 0, 0, 378, 0, 69632, 73728, 0, 0, 0, 0, 423, 65536, 0, 0, 0, 0, 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1687, 0, 1689, 0, 0, 423, 423, 0, 423, 0, 437, 423, 0, 423, 468, 468, 468, 475, 468, 468, 468, 468, 468, 468, 468, 468, 475, 468, 468, 468, 468, 468, 468, 468, 468, 482, 468, 494, 494, 468, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 537, 549, 572, 549, 572, 549, 549, 572, 549, 596, 572, 572, 572, 572, 572, 572, 572, 596, 596, 596, 549, 596, 596, 596, 596, 596, 572, 572, 549, 572, 596, 572, 596, 1, 12290, 3, 78112, 0, 660, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1666, 0, 0, 830, 0, 0, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 729, 0, 742, 661, 0, 0, 0, 0, 0, 540, 847, 540, 540, 540, 540, 540, 540, 3330, 540, 540, 540, 561, 561, 561, 561, 561, 3335, 861, 540, 540, 540, 540, 540, 540, 540, 540, 540, 897, 540, 540, 540, 540, 540, 540, 540, 1799, 540, 540, 540, 540, 540, 540, 1807, 540, 561, 561, 916, 561, 561, 561, 931, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2266, 561, 561, 561, 561, 561, 561, 0, 0, 0, 540, 989, 585, 561, 540, 540, 897, 540, 540, 561, 561, 969, 561, 561, 561, 561, 561, 0, 585, 585, 989, 585, 585, 585, 1004, 585, 1094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1101, 1102, 0, 0, 0, 0, 0, 0, 1203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196608, 0, 0, 0, 0, 0, 540, 540, 540, 1308, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3222, 540, 540, 1360, 914, 561, 1363, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1376, 1383, 561, 561, 561, 1444, 561, 561, 561, 561, 26027, 1360, 987, 585, 1454, 585, 585, 585, 585, 585, 585, 2659, 585, 585, 2662, 2663, 585, 585, 585, 585, 585, 585, 585, 2712, 540, 585, 585, 561, 540, 540, 540, 540, 585, 585, 1488, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3128, 585, 1521, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1535, 585, 585, 585, 585, 585, 585, 2673, 585, 585, 585, 2676, 585, 585, 2678, 585, 2679, 561, 585, 585, 1521, 585, 585, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, 0, 0, 0, 0, 0, 0, 1826, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1841, 1842, 585, 585, 2009, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 561, 561, 1849, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2880, 561, 561, 561, 561, 561, 2063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2074, 540, 540, 2226, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 561, 561, 561, 2854, 561, 561, 561, 561, 561, 561, 2301, 561, 561, 561, 561, 561, 561, 2306, 561, 561, 561, 561, 561, 561, 3079, 561, 561, 561, 561, 561, 3085, 561, 561, 3088, 2311, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 2654, 585, 585, 585, 585, 585, 2374, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3140, 585, 585, 585, 585, 2386, 585, 585, 585, 585, 585, 585, 2391, 585, 585, 585, 585, 585, 2396, 585, 585, 585, 585, 585, 2012, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 561, 561, 2624, 561, 561, 561, 561, 561, 561, 2632, 561, 561, 561, 561, 561, 2288, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2631, 561, 561, 561, 561, 561, 2435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2114, 0, 0, 0, 0, 2476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 748, 0, 0, 0, 0, 0, 2732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1590, 1591, 0, 0, 0, 2772, 0, 0, 0, 0, 2777, 0, 0, 0, 0, 0, 0, 0, 540, 562, 540, 562, 540, 540, 562, 540, 586, 540, 540, 2810, 540, 540, 540, 540, 540, 540, 2818, 540, 540, 540, 540, 540, 540, 540, 889, 540, 540, 540, 540, 907, 540, 540, 540, 540, 540, 540, 540, 2849, 540, 540, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1836, 561, 561, 561, 561, 561, 2857, 561, 561, 561, 561, 561, 561, 2865, 561, 561, 561, 561, 561, 561, 561, 561, 3081, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2897, 561, 561, 0, 0, 585, 585, 585, 585, 585, 585, 585, 1467, 1474, 585, 585, 585, 585, 585, 585, 585, 585, 3621, 0, 0, 0, 0, 0, 0, 540, 2905, 585, 585, 585, 585, 585, 585, 2913, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1983, 585, 585, 1986, 585, 585, 585, 585, 585, 585, 585, 2945, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 3376, 0, 585, 3280, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 3155, 0, 0, 585, 585, 585, 3587, 585, 3589, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 0, 2791, 0, 0, 0, 2793, 0, 0, 0, 0, 0, 0, 0, 0, 3600, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1314, 540, 540, 540, 540, 3607, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3614, 585, 585, 585, 585, 585, 585, 2686, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1045, 585, 585, 585, 585, 585, 972, 561, 3653, 561, 561, 561, 561, 585, 3657, 585, 585, 585, 585, 0, 0, 0, 0, 0, 0, 1204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 290, 0, 0, 0, 345, 469, 469, 469, 453, 453, 469, 453, 453, 453, 453, 453, 453, 453, 453, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 550, 573, 550, 573, 550, 550, 573, 550, 597, 573, 573, 573, 573, 573, 573, 573, 597, 597, 597, 550, 597, 597, 597, 597, 597, 573, 573, 550, 573, 597, 573, 597, 1, 12290, 3, 78112, 862, 540, 540, 876, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1315, 540, 540, 540, 585, 1019, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 3498, 0, 0, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1607, 0, 0, 0, 0, 1254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2111, 0, 0, 0, 540, 1341, 540, 540, 540, 540, 540, 1348, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3333, 561, 561, 561, 561, 561, 585, 585, 585, 585, 1505, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3365, 585, 585, 585, 585, 585, 1523, 585, 585, 585, 585, 585, 1530, 585, 585, 585, 585, 585, 585, 585, 1468, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2378, 585, 585, 585, 585, 585, 585, 561, 585, 585, 585, 1557, 585, 1079, 0, 1561, 0, 0, 0, 1567, 0, 0, 0, 0, 0, 803, 0, 0, 0, 0, 0, 0, 0, 803, 0, 0, 0, 0, 540, 540, 540, 540, 540, 1573, 0, 0, 0, 1579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 749, 0, 0, 0, 0, 0, 0, 0, 1695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2127, 0, 0, 0, 540, 1762, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1358, 540, 1843, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1854, 561, 561, 561, 561, 561, 561, 3239, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3578, 561, 561, 585, 585, 585, 585, 0, 2064, 2065, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1717, 0, 0, 0, 0, 0, 0, 2135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, 0, 2186, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1808, 540, 540, 2213, 540, 540, 540, 540, 2218, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1754, 540, 540, 540, 540, 540, 540, 2240, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1401, 561, 561, 2298, 561, 561, 561, 561, 2303, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3083, 561, 561, 561, 561, 561, 585, 585, 585, 2388, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1938, 585, 585, 585, 3034, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2210, 0, 0, 0, 3380, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1175, 0, 0, 0, 0, 540, 540, 3404, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2282, 561, 561, 561, 561, 561, 561, 561, 3419, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1049, 585, 585, 585, 585, 561, 540, 3454, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 3523, 561, 561, 561, 3469, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 3484, 385, 387, 337, 0, 0, 0, 0, 0, 0, 336, 0, 0, 337, 0, 0, 0, 0, 0, 1097, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2057, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 1139, 1140, 0, 0, 0, 0, 0, 362, 362, 0, 0, 0, 0, 0, 703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 438, 0, 444, 0, 470, 470, 470, 470, 470, 470, 470, 551, 574, 551, 574, 551, 551, 574, 551, 598, 480, 470, 470, 470, 499, 476, 499, 499, 499, 499, 499, 499, 499, 499, 470, 470, 476, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 480, 470, 481, 480, 470, 470, 470, 470, 574, 574, 574, 574, 574, 574, 574, 598, 598, 598, 551, 598, 598, 598, 598, 598, 574, 574, 551, 574, 598, 574, 598, 1, 12290, 3, 78112, 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2153, 0, 0, 0, 0, 0, 693, 0, 0, 0, 0, 0, 0, 362, 362, 362, 0, 0, 0, 0, 0, 0, 1217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1220, 0, 0, 1223, 0, 0, 0, 0, 0, 0, 663, 0, 791, 0, 0, 0, 0, 0, 0, 0, 795, 0, 0, 0, 0, 0, 2972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2097, 0, 2099, 0, 0, 0, 0, 0, 804, 0, 0, 0, 0, 0, 812, 0, 0, 0, 0, 706, 0, 0, 0, 0, 0, 0, 0, 0, 715, 0, 717, 0, 0, 0, 831, 0, 0, 0, 663, 834, 0, 791, 0, 0, 0, 0, 0, 840, 0, 0, 0, 0, 0, 2996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2429, 2430, 0, 0, 0, 0, 863, 540, 540, 877, 540, 540, 540, 888, 540, 540, 540, 540, 906, 540, 540, 540, 540, 540, 1311, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2843, 540, 540, 540, 540, 561, 561, 917, 561, 561, 561, 933, 561, 561, 947, 561, 561, 561, 561, 960, 561, 0, 995, 585, 1076, 1046, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 2686976, 2736128, 0, 0, 2531328, 2707456, 0, 3190784, 561, 561, 561, 978, 561, 561, 561, 0, 585, 585, 990, 585, 585, 585, 1006, 585, 585, 585, 585, 585, 2349, 585, 585, 585, 585, 2354, 585, 585, 585, 585, 585, 585, 585, 2377, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 561, 585, 0, 0, 0, 0, 585, 1020, 585, 585, 585, 585, 1033, 585, 585, 585, 585, 1051, 585, 585, 585, 561, 540, 585, 561, 3149, 540, 3151, 561, 3153, 585, 0, 0, 0, 0, 0, 0, 1660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 990, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 3067, 561, 561, 561, 561, 3071, 561, 561, 561, 561, 0, 0, 0, 1215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2431, 0, 2433, 0, 1238, 0, 0, 0, 0, 1270, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 3561, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 540, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1491, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1495, 585, 585, 585, 585, 561, 585, 585, 1556, 585, 585, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1100, 0, 0, 0, 0, 0, 0, 1622, 0, 0, 1625, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 839, 540, 540, 540, 540, 859, 540, 1744, 540, 540, 540, 540, 540, 540, 540, 540, 1755, 540, 540, 540, 540, 540, 540, 540, 2176, 540, 540, 2180, 540, 540, 540, 2184, 540, 561, 561, 561, 1847, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2294, 561, 561, 561, 0, 0, 2117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1730, 0, 0, 0, 0, 0, 0, 2148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1207, 0, 0, 0, 0, 0, 0, 0, 561, 561, 561, 561, 2248, 561, 561, 561, 561, 561, 561, 561, 561, 3095, 3097, 561, 561, 561, 3100, 561, 3102, 561, 561, 2313, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 0, 0, 0, 585, 585, 2651, 585, 585, 585, 585, 585, 585, 585, 2660, 585, 585, 585, 585, 585, 2665, 585, 585, 2398, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 2410, 585, 561, 0, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 0, 3669, 540, 3670, 0, 2436, 0, 0, 0, 0, 0, 0, 2441, 0, 0, 0, 2444, 2445, 0, 0, 0, 0, 0, 3010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 304, 0, 0, 0, 0, 2497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2506, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 163840, 0, 0, 0, 0, 65536, 0, 2512, 0, 0, 0, 0, 2515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2523, 540, 2536, 2537, 540, 540, 540, 540, 540, 2542, 540, 2544, 540, 540, 540, 540, 2548, 561, 2595, 561, 561, 2598, 2599, 561, 561, 561, 561, 561, 2604, 561, 2606, 561, 561, 561, 561, 1863, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2890, 561, 561, 561, 561, 561, 561, 561, 2610, 561, 561, 561, 561, 561, 561, 561, 561, 2616, 561, 561, 561, 561, 561, 2276, 561, 561, 2279, 561, 561, 561, 561, 561, 561, 561, 1915, 561, 561, 26027, 1920, 585, 585, 585, 585, 2636, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2608, 2668, 585, 2670, 585, 585, 585, 585, 2674, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2675, 585, 585, 585, 585, 585, 585, 2680, 585, 585, 585, 585, 585, 585, 585, 585, 2688, 585, 585, 585, 585, 585, 585, 585, 1950, 585, 585, 585, 585, 1954, 585, 585, 585, 2696, 585, 585, 585, 585, 2700, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1494, 585, 585, 585, 585, 585, 561, 2720, 561, 561, 585, 2722, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2964, 0, 0, 0, 0, 2770, 0, 0, 0, 2773, 0, 0, 2776, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1691, 0, 2786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2795, 0, 0, 0, 0, 0, 3171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1245, 0, 0, 0, 0, 0, 540, 2825, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1773, 540, 540, 2835, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2844, 540, 540, 2847, 540, 540, 2850, 540, 0, 0, 2851, 561, 561, 561, 561, 561, 561, 1851, 561, 561, 561, 561, 1855, 561, 561, 561, 561, 561, 2883, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2892, 561, 561, 2895, 561, 561, 2898, 561, 0, 0, 2899, 585, 585, 585, 585, 585, 585, 585, 1965, 585, 585, 585, 1970, 585, 585, 585, 585, 585, 2931, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2940, 585, 585, 2943, 585, 585, 2946, 585, 561, 2948, 585, 2949, 2950, 540, 540, 561, 561, 561, 561, 1878, 561, 561, 561, 561, 1884, 561, 561, 561, 561, 561, 561, 936, 561, 561, 561, 561, 561, 561, 561, 561, 561, 984, 0, 585, 585, 585, 585, 585, 585, 1007, 585, 0, 2968, 2969, 0, 0, 0, 0, 2974, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 331, 331, 0, 0, 0, 0, 3020, 0, 0, 540, 540, 3025, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3043, 540, 540, 540, 540, 540, 540, 540, 3050, 540, 540, 3052, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1352, 540, 540, 540, 540, 540, 561, 561, 561, 3091, 561, 561, 3093, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2602, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 3106, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1496, 585, 585, 585, 1500, 585, 585, 585, 3132, 585, 585, 3134, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1040, 585, 585, 585, 585, 585, 967, 3158, 0, 0, 0, 3162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1222, 0, 0, 1225, 0, 3190, 0, 0, 3193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 2166, 540, 540, 540, 540, 540, 3214, 540, 540, 540, 540, 540, 540, 540, 3219, 540, 540, 540, 540, 540, 540, 540, 2541, 540, 2543, 540, 540, 540, 540, 540, 540, 540, 540, 2581, 540, 540, 540, 540, 0, 2584, 0, 561, 561, 561, 3236, 3237, 561, 561, 561, 561, 561, 3241, 561, 561, 561, 561, 561, 561, 3250, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 3536, 585, 585, 585, 585, 561, 561, 561, 3247, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 3481, 585, 3483, 585, 585, 585, 585, 3269, 585, 585, 585, 585, 585, 585, 585, 585, 3275, 585, 585, 585, 585, 585, 585, 2701, 585, 585, 585, 585, 585, 585, 585, 2706, 585, 0, 0, 3308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 856, 540, 585, 3359, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1057, 561, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 3386, 0, 0, 0, 0, 0, 1169, 0, 1171, 0, 0, 0, 0, 1176, 0, 0, 0, 0, 0, 1185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, 0, 0, 0, 0, 0, 585, 3429, 585, 585, 585, 585, 585, 585, 561, 540, 561, 585, 0, 3437, 0, 0, 0, 0, 0, 3300, 0, 3176, 3302, 0, 0, 3305, 0, 0, 0, 0, 0, 0, 1113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 362, 0, 703, 0, 0, 3440, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 3452, 540, 540, 540, 540, 3457, 540, 540, 540, 540, 3462, 540, 540, 561, 561, 3467, 561, 0, 997, 1037, 585, 1048, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 776, 0, 0, 0, 0, 0, 783, 0, 0, 561, 561, 561, 3472, 561, 561, 561, 561, 3477, 561, 561, 585, 585, 3482, 585, 585, 585, 585, 585, 585, 3259, 3260, 585, 585, 585, 585, 3264, 3265, 585, 585, 585, 585, 585, 585, 3120, 585, 585, 585, 585, 585, 3126, 585, 585, 3129, 585, 585, 3487, 585, 585, 585, 585, 3492, 585, 585, 561, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 167936, 0, 0, 0, 0, 65536, 0, 3499, 0, 0, 0, 0, 0, 3505, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3397, 540, 540, 540, 540, 540, 540, 540, 540, 3517, 540, 540, 3519, 561, 561, 561, 561, 561, 561, 561, 561, 3252, 561, 561, 561, 561, 561, 561, 585, 561, 561, 561, 3530, 561, 561, 3532, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1042, 585, 585, 585, 585, 585, 969, 585, 585, 3543, 585, 585, 3545, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1144, 0, 362, 362, 0, 1147, 0, 540, 540, 3629, 3630, 540, 540, 561, 561, 561, 3635, 3636, 561, 561, 585, 585, 585, 585, 0, 2029, 0, 0, 0, 0, 0, 2031, 0, 0, 3641, 3642, 585, 585, 561, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 3395, 540, 540, 540, 540, 540, 540, 3401, 561, 561, 585, 585, 0, 540, 561, 585, 0, 540, 561, 585, 3681, 3682, 3683, 3684, 339, 340, 341, 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1617, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2469, 0, 2470, 0, 342, 342, 343, 342, 0, 341, 342, 445, 454, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 486, 495, 495, 503, 495, 505, 495, 495, 505, 505, 495, 505, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 552, 575, 552, 575, 552, 552, 575, 552, 599, 575, 575, 575, 575, 575, 575, 575, 599, 599, 599, 552, 599, 599, 599, 599, 599, 575, 575, 552, 575, 599, 575, 599, 1, 12290, 3, 78112, 0, 0, 0, 646, 0, 0, 0, 0, 651, 652, 653, 654, 655, 656, 657, 0, 0, 0, 0, 1144, 0, 0, 1259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2957312, 0, 0, 0, 0, 0, 0, 0, 692, 0, 0, 0, 0, 0, 0, 699, 362, 362, 362, 0, 0, 0, 0, 0, 0, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, 800, 0, 0, 0, 0, 721, 0, 723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 733, 0, 0, 0, 0, 0, 1202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, 646, 752, 753, 754, 0, 0, 0, 0, 0, 760, 761, 0, 0, 0, 0, 0, 0, 1271, 0, 0, 0, 0, 0, 0, 540, 540, 540, 3026, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2220, 540, 540, 540, 540, 540, 0, 761, 0, 0, 790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 797, 0, 0, 0, 0, 1152, 0, 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, 0, 2106, 0, 0, 0, 0, 0, 0, 0, 0, 1219, 0, 0, 0, 0, 0, 0, 0, 723, 0, 692, 814, 0, 0, 0, 0, 761, 0, 0, 0, 0, 0, 0, 0, 558, 581, 558, 581, 558, 558, 581, 558, 605, 0, 754, 823, 824, 0, 0, 0, 0, 0, 0, 754, 0, 0, 828, 699, 0, 0, 0, 0, 1168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, 0, 0, 0, 0, 833, 0, 0, 0, 835, 0, 0, 0, 692, 699, 0, 0, 692, 833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 692, 540, 540, 853, 857, 860, 540, 868, 540, 540, 882, 884, 887, 540, 540, 540, 898, 902, 540, 540, 540, 540, 540, 540, 1766, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1786, 540, 540, 540, 540, 540, 561, 561, 561, 923, 927, 930, 561, 938, 561, 561, 561, 953, 955, 958, 561, 561, 561, 561, 1879, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2641, 561, 561, 561, 561, 561, 561, 561, 561, 2648, 0, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 2717, 540, 540, 540, 585, 585, 585, 1026, 1028, 1031, 585, 585, 585, 1043, 1047, 585, 585, 585, 585, 970, 0, 0, 0, 1060, 585, 1062, 1063, 853, 540, 898, 902, 1068, 923, 561, 970, 974, 561, 561, 561, 561, 0, 585, 585, 585, 996, 1000, 1003, 585, 1011, 1073, 0, 996, 585, 1043, 1047, 1078, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 560, 583, 560, 583, 560, 560, 583, 560, 607, 0, 0, 1199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1208, 0, 0, 0, 0, 0, 1231, 0, 0, 0, 0, 1236, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 422, 65536, 0, 540, 1322, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1331, 540, 540, 1338, 540, 540, 540, 540, 2228, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 561, 2852, 561, 561, 561, 561, 561, 561, 561, 561, 1422, 561, 561, 1429, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2879, 561, 561, 561, 561, 561, 561, 561, 1442, 561, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 585, 585, 2925, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 561, 585, 3436, 0, 3438, 0, 585, 1503, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1513, 585, 585, 1520, 1667, 0, 1669, 0, 0, 0, 1671, 0, 748, 0, 0, 0, 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 0, 0, 1602, 0, 0, 0, 0, 0, 0, 540, 1738, 540, 540, 540, 540, 540, 540, 540, 2584, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1839, 561, 561, 561, 1743, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2238, 540, 1776, 540, 540, 1781, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1353, 540, 540, 540, 540, 0, 561, 1829, 561, 561, 561, 561, 561, 561, 1835, 561, 561, 561, 561, 561, 561, 1864, 561, 561, 561, 1868, 561, 561, 1873, 561, 561, 1907, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 0, 585, 1923, 585, 585, 585, 585, 585, 585, 3270, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1968, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1929, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1511, 585, 585, 585, 585, 585, 1958, 585, 585, 585, 1962, 585, 585, 1967, 585, 585, 585, 585, 585, 585, 585, 1469, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2392, 585, 585, 585, 2395, 585, 585, 0, 1086, 0, 0, 0, 2034, 0, 1090, 0, 0, 0, 2036, 0, 1094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1226, 585, 585, 585, 585, 2362, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1534, 585, 585, 585, 585, 2585, 0, 1826, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2271, 585, 585, 585, 2710, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 540, 540, 1814, 540, 540, 540, 540, 1820, 540, 540, 540, 1360, 0, 0, 0, 0, 2744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1649, 0, 0, 0, 0, 585, 585, 585, 585, 2924, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1937, 585, 585, 585, 585, 561, 561, 3338, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1857, 561, 561, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 3385, 0, 0, 0, 0, 0, 0, 1628, 1629, 1630, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 362, 0, 0, 0, 0, 0, 0, 3402, 540, 540, 540, 561, 561, 561, 3407, 561, 561, 561, 561, 3411, 561, 561, 561, 561, 1391, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1414, 561, 561, 561, 561, 561, 561, 3417, 561, 561, 561, 585, 585, 585, 3422, 585, 585, 585, 585, 3426, 585, 585, 585, 585, 585, 2375, 2376, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1476, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3432, 585, 585, 585, 561, 540, 561, 585, 0, 0, 0, 0, 0, 0, 1644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 3446, 0, 0, 0, 540, 540, 540, 3392, 540, 540, 540, 540, 3396, 540, 540, 540, 540, 540, 540, 540, 3039, 540, 540, 540, 540, 540, 3045, 540, 540, 540, 540, 3455, 540, 540, 540, 3459, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 2626, 561, 561, 561, 561, 561, 561, 2633, 561, 561, 561, 561, 3470, 561, 561, 561, 3474, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 3111, 585, 585, 585, 585, 585, 585, 3485, 585, 585, 585, 3489, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 3603, 540, 3604, 540, 540, 540, 561, 561, 585, 585, 0, 540, 561, 585, 3677, 3678, 3679, 3680, 0, 540, 561, 585, 585, 585, 585, 585, 1079, 0, 1562, 0, 0, 0, 1568, 0, 0, 0, 0, 0, 1256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 300, 0, 0, 0, 0, 386, 0, 0, 0, 390, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1174, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 344, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 1201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 521, 521, 521, 521, 0, 0, 0, 0, 0, 0, 0, 0, 521, 521, 521, 521, 521, 521, 521, 553, 576, 553, 576, 553, 553, 576, 553, 600, 576, 576, 576, 576, 576, 576, 576, 600, 600, 600, 553, 600, 600, 600, 600, 600, 576, 576, 617, 622, 600, 622, 628, 1, 12290, 3, 78112, 561, 561, 561, 979, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2927, 585, 585, 585, 585, 585, 585, 0, 0, 0, 540, 1061, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3238, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1433, 561, 561, 561, 561, 561, 1107, 0, 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1190, 0, 0, 0, 0, 0, 561, 561, 561, 1389, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2308, 2309, 561, 561, 561, 1403, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2296, 2297, 1440, 561, 561, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 585, 585, 2947, 540, 585, 585, 561, 540, 540, 561, 561, 1574, 0, 0, 0, 1580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1664, 0, 0, 0, 0, 1606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1620, 0, 0, 0, 0, 1216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2110, 0, 0, 0, 0, 561, 561, 561, 1877, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2322, 0, 0, 0, 2052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2155, 0, 2116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1676, 0, 2241, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2295, 561, 561, 561, 561, 2274, 561, 561, 561, 561, 2278, 561, 2280, 561, 561, 561, 561, 561, 561, 1897, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1397, 561, 561, 561, 561, 561, 561, 2359, 585, 585, 585, 585, 2363, 585, 2365, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3123, 585, 3125, 585, 585, 585, 585, 0, 0, 0, 2500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2494, 2495, 0, 0, 561, 2622, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2607, 561, 0, 3021, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2533, 540, 0, 0, 0, 0, 3176, 3382, 0, 0, 3384, 0, 0, 0, 0, 0, 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 3391, 540, 540, 3393, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1785, 540, 540, 540, 1790, 540, 0, 0, 0, 0, 3176, 0, 3443, 0, 0, 0, 0, 0, 3449, 540, 540, 540, 540, 540, 1782, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2832, 540, 540, 540, 540, 864, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 912, 1095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2447, 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2060, 0, 0, 1827, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2620, 345, 345, 347, 345, 0, 0, 345, 0, 345, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 3310, 0, 0, 3312, 0, 0, 0, 0, 0, 0, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 3410, 561, 561, 561, 561, 561, 0, 0, 0, 345, 345, 347, 345, 345, 345, 345, 345, 345, 512, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 554, 577, 554, 577, 554, 554, 577, 554, 601, 577, 577, 577, 577, 577, 577, 577, 601, 601, 601, 554, 601, 601, 601, 601, 601, 577, 577, 554, 577, 601, 577, 601, 1, 12290, 3, 78112, 0, 722, 0, 724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2508, 0, 0, 0, 0, 739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1690, 0, 0, 0, 811, 0, 0, 810, 0, 0, 0, 0, 0, 755, 0, 0, 819, 0, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 0, 0, 1181, 540, 540, 540, 540, 540, 1797, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3464, 561, 561, 561, 561, 540, 540, 872, 540, 540, 540, 540, 890, 892, 540, 540, 903, 540, 540, 540, 540, 540, 540, 2175, 540, 2177, 540, 540, 540, 540, 540, 540, 2185, 561, 561, 918, 924, 561, 561, 561, 561, 942, 561, 561, 561, 561, 561, 962, 964, 561, 561, 975, 561, 561, 561, 561, 0, 585, 585, 991, 997, 585, 585, 585, 585, 585, 585, 585, 3271, 585, 585, 585, 585, 585, 585, 3277, 585, 1015, 585, 585, 585, 585, 585, 1035, 1037, 585, 585, 1048, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 540, 540, 3650, 3651, 540, 540, 0, 0, 0, 540, 991, 585, 561, 854, 892, 540, 903, 540, 924, 964, 561, 975, 0, 0, 0, 1151, 0, 1153, 0, 1155, 0, 0, 0, 0, 0, 0, 0, 0, 713, 0, 0, 0, 0, 0, 0, 0, 0, 1181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1731, 0, 1212, 1213, 0, 0, 0, 0, 0, 1218, 0, 0, 0, 0, 0, 0, 0, 0, 729, 0, 0, 0, 0, 0, 0, 0, 540, 540, 1307, 1309, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1316, 540, 540, 1319, 540, 540, 1343, 540, 540, 540, 540, 540, 540, 540, 540, 1354, 1355, 540, 540, 540, 540, 540, 1813, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 1360, 914, 561, 561, 561, 1366, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 1921, 585, 585, 585, 585, 561, 561, 1420, 561, 561, 561, 561, 561, 561, 561, 1434, 561, 561, 561, 561, 561, 561, 3342, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3080, 561, 561, 561, 561, 561, 561, 561, 561, 2319, 561, 561, 561, 561, 0, 0, 0, 561, 561, 561, 1445, 1446, 561, 561, 561, 26027, 1360, 987, 585, 585, 585, 1457, 585, 585, 585, 585, 585, 2403, 585, 585, 585, 585, 585, 561, 2409, 585, 2411, 2412, 585, 1487, 1489, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3366, 585, 585, 585, 585, 1525, 585, 585, 585, 585, 585, 585, 585, 585, 1536, 1537, 585, 585, 585, 585, 585, 585, 3434, 585, 561, 540, 561, 585, 0, 0, 0, 3439, 585, 1542, 0, 540, 585, 585, 561, 540, 1547, 540, 540, 1550, 561, 1551, 561, 561, 561, 561, 1895, 561, 561, 561, 1900, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 988, 585, 585, 585, 585, 585, 1554, 585, 1555, 585, 585, 1558, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2069, 0, 0, 0, 0, 2073, 0, 0, 1678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2037, 0, 0, 0, 1694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2072, 0, 0, 0, 1637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2051, 0, 0, 561, 561, 561, 561, 561, 561, 1833, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 561, 1908, 561, 561, 561, 561, 1914, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 585, 2334, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2938, 585, 585, 585, 585, 585, 585, 585, 1927, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1055, 585, 561, 585, 585, 585, 1994, 585, 585, 585, 585, 585, 585, 585, 585, 2002, 585, 585, 585, 585, 585, 585, 2711, 561, 540, 585, 585, 561, 540, 540, 540, 540, 540, 540, 2217, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1802, 540, 540, 540, 540, 540, 585, 2008, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 561, 561, 2261, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2891, 561, 561, 561, 561, 0, 2076, 0, 0, 0, 0, 0, 0, 0, 0, 2084, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 266240, 0, 0, 0, 0, 65536, 0, 2088, 0, 0, 2090, 0, 0, 0, 0, 0, 0, 0, 2098, 0, 0, 0, 0, 0, 0, 1725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 2146, 0, 0, 0, 2146, 0, 0, 2151, 2152, 0, 0, 0, 0, 0, 0, 0, 274432, 274432, 274432, 0, 274432, 274432, 274432, 274432, 274432, 2156, 0, 0, 0, 0, 0, 0, 0, 2162, 540, 540, 540, 540, 540, 2168, 540, 540, 540, 540, 2538, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1821, 540, 540, 1360, 540, 2200, 540, 2203, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2209, 540, 540, 540, 540, 2578, 540, 540, 540, 540, 540, 540, 540, 540, 0, 2584, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 0, 0, 0, 2244, 561, 561, 561, 561, 561, 561, 2251, 561, 561, 561, 561, 561, 561, 3351, 585, 585, 585, 585, 585, 585, 585, 3356, 585, 561, 561, 2300, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2323, 0, 0, 0, 2329, 585, 585, 585, 585, 585, 585, 2336, 585, 585, 585, 585, 585, 585, 585, 1470, 585, 585, 585, 585, 1480, 585, 585, 585, 585, 585, 2360, 585, 585, 585, 585, 585, 585, 2366, 585, 2368, 585, 2371, 585, 585, 585, 585, 585, 585, 3546, 0, 0, 3549, 3550, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2912256, 0, 3207168, 2465792, 0, 0, 2385, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1989, 2472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2480, 0, 0, 0, 0, 0, 0, 0, 286720, 286720, 0, 286720, 286720, 1, 12290, 3, 0, 0, 0, 0, 0, 2514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2522, 0, 0, 0, 0, 1575, 0, 0, 0, 0, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 172032, 0, 0, 0, 0, 65536, 0, 561, 561, 2596, 561, 561, 561, 561, 561, 2601, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 992, 585, 585, 585, 585, 585, 585, 2681, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1956, 585, 2719, 561, 561, 561, 2721, 585, 585, 585, 2723, 2724, 0, 0, 0, 0, 0, 0, 0, 2801, 0, 0, 0, 540, 2805, 540, 540, 540, 2742, 0, 2743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2100, 0, 0, 0, 0, 2758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2128, 0, 0, 540, 2809, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2223, 2224, 540, 2846, 540, 540, 540, 540, 540, 0, 0, 561, 561, 561, 561, 2855, 561, 2856, 561, 2894, 561, 561, 561, 561, 561, 0, 0, 585, 585, 585, 585, 2903, 585, 2904, 585, 2942, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 3374, 0, 0, 3377, 0, 0, 0, 540, 3024, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1771, 540, 540, 540, 540, 561, 561, 585, 3105, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2369, 585, 585, 585, 585, 585, 3145, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 2066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 297, 0, 0, 0, 0, 0, 0, 0, 3390, 540, 540, 540, 540, 3394, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2179, 540, 540, 540, 540, 540, 540, 540, 3403, 540, 540, 3405, 561, 561, 561, 561, 3409, 561, 561, 561, 561, 561, 561, 2277, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3082, 561, 3084, 561, 561, 561, 561, 561, 561, 561, 3418, 561, 561, 3420, 585, 585, 585, 585, 3424, 585, 585, 585, 585, 585, 585, 585, 3591, 585, 561, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 3303, 0, 0, 0, 0, 3307, 0, 585, 585, 585, 585, 585, 3433, 585, 585, 561, 540, 561, 585, 0, 0, 0, 0, 0, 0, 2137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1129, 0, 0, 0, 0, 0, 0, 0, 3500, 0, 3502, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 3511, 540, 540, 540, 540, 2812, 540, 2815, 540, 540, 540, 540, 2820, 540, 540, 540, 2823, 540, 540, 540, 540, 3631, 540, 561, 561, 561, 561, 561, 3637, 561, 585, 585, 585, 585, 585, 1079, 0, 0, 0, 1564, 0, 0, 0, 1570, 0, 585, 585, 3643, 585, 561, 3645, 0, 3647, 0, 0, 540, 540, 540, 540, 540, 540, 540, 1286, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3208, 540, 540, 540, 540, 540, 365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2496, 398, 0, 0, 0, 0, 0, 365, 373, 401, 0, 0, 0, 0, 0, 365, 0, 0, 393, 0, 0, 0, 0, 348, 0, 0, 365, 0, 393, 0, 406, 408, 0, 0, 365, 373, 0, 69632, 73728, 0, 0, 0, 0, 424, 65536, 0, 0, 0, 0, 1596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 0, 0, 0, 424, 424, 0, 424, 0, 408, 424, 447, 455, 0, 0, 0, 0, 0, 0, 0, 777, 0, 0, 0, 0, 0, 0, 0, 644, 0, 406, 0, 496, 496, 0, 496, 496, 496, 496, 496, 496, 496, 496, 522, 522, 522, 522, 455, 455, 455, 530, 455, 531, 455, 455, 522, 536, 522, 522, 522, 522, 538, 555, 578, 555, 578, 555, 555, 578, 555, 602, 578, 578, 578, 608, 608, 608, 578, 602, 602, 602, 555, 602, 602, 602, 602, 602, 578, 578, 618, 623, 602, 623, 629, 1, 12290, 3, 78112, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2769, 0, 0, 0, 694, 0, 0, 0, 0, 0, 362, 362, 362, 0, 0, 0, 0, 0, 0, 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1260, 0, 0, 0, 0, 0, 0, 0, 0, 805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2142, 2143, 0, 540, 540, 540, 878, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1332, 540, 540, 540, 561, 561, 919, 561, 561, 561, 561, 561, 561, 948, 950, 561, 561, 561, 561, 561, 561, 3575, 561, 3577, 561, 561, 561, 585, 585, 585, 585, 0, 0, 1563, 0, 0, 0, 0, 0, 1569, 0, 585, 1021, 1023, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 3496, 0, 3497, 0, 0, 0, 0, 0, 540, 992, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3341, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3579, 561, 585, 585, 585, 585, 0, 0, 0, 1098, 1230, 0, 0, 0, 0, 0, 0, 1237, 0, 0, 0, 0, 0, 0, 2452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1242, 1251, 540, 540, 1280, 540, 540, 540, 1284, 540, 540, 1295, 540, 540, 1299, 540, 540, 540, 540, 540, 2229, 540, 2231, 540, 540, 540, 540, 540, 540, 540, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1840, 561, 561, 1360, 914, 561, 561, 561, 561, 561, 561, 1369, 561, 561, 561, 1373, 561, 561, 1384, 561, 561, 1388, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2324, 0, 0, 561, 561, 1405, 561, 561, 561, 1409, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3612, 3613, 561, 585, 585, 585, 585, 585, 1460, 585, 585, 585, 1464, 585, 585, 1475, 585, 585, 1479, 585, 585, 585, 585, 585, 585, 1032, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 3625, 0, 540, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1636, 0, 0, 0, 0, 1626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2058, 2059, 0, 2061, 2062, 1638, 0, 0, 0, 1642, 0, 0, 0, 1646, 0, 0, 0, 1650, 0, 0, 0, 0, 0, 1257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1145, 362, 362, 0, 0, 1148, 561, 1844, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2635, 561, 561, 561, 561, 1862, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2869, 561, 561, 2872, 2007, 585, 585, 585, 585, 561, 1752, 585, 1938, 1844, 540, 540, 540, 540, 561, 561, 561, 561, 2275, 561, 561, 561, 561, 561, 561, 2281, 561, 2283, 561, 2286, 0, 0, 2056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2154, 0, 0, 0, 0, 0, 2118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2520, 0, 0, 0, 0, 2132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2141, 0, 0, 0, 0, 0, 0, 2463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2158, 0, 0, 2161, 0, 540, 540, 2164, 540, 540, 540, 540, 540, 540, 540, 3053, 540, 3055, 540, 540, 540, 540, 540, 540, 540, 540, 2232, 540, 540, 2235, 2236, 540, 540, 0, 540, 540, 540, 2227, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 2242, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 561, 561, 2246, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 1455, 585, 1458, 561, 2312, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 0, 0, 0, 585, 2650, 585, 585, 585, 585, 585, 585, 561, 3547, 3548, 0, 0, 0, 0, 0, 0, 3554, 0, 585, 585, 2331, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2381, 2382, 585, 585, 585, 585, 2387, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2397, 540, 540, 2415, 2416, 561, 561, 2419, 2420, 585, 585, 2423, 2424, 0, 1563, 0, 1569, 0, 1575, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2752, 0, 0, 0, 0, 0, 0, 0, 2438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1728, 0, 0, 0, 0, 0, 2513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2519, 0, 0, 0, 0, 0, 0, 2478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1189, 0, 0, 0, 0, 0, 0, 540, 540, 540, 2565, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1333, 540, 540, 540, 585, 585, 2682, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2693, 585, 585, 585, 585, 585, 585, 3590, 585, 585, 561, 0, 3594, 0, 0, 0, 0, 0, 0, 2516, 2466, 0, 0, 0, 0, 0, 2521, 0, 0, 2824, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2239, 561, 561, 561, 561, 2885, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1395, 561, 561, 561, 561, 561, 561, 561, 561, 1430, 561, 561, 561, 561, 561, 561, 561, 561, 2866, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 2933, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1985, 585, 585, 585, 585, 0, 3177, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1601, 1602, 0, 0, 0, 0, 0, 0, 0, 0, 3194, 0, 0, 0, 0, 0, 0, 3197, 0, 3199, 540, 540, 540, 540, 880, 540, 885, 540, 891, 540, 894, 540, 540, 908, 540, 540, 540, 540, 540, 3038, 540, 540, 540, 540, 540, 540, 540, 540, 3046, 540, 585, 3289, 3290, 0, 0, 0, 0, 3294, 0, 0, 0, 0, 0, 0, 0, 0, 1099, 0, 0, 0, 0, 0, 0, 0, 540, 540, 3316, 540, 540, 540, 3319, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1819, 540, 540, 540, 540, 1360, 561, 3337, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2646, 561, 3415, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3115, 3428, 585, 3430, 585, 585, 585, 585, 585, 561, 540, 561, 585, 0, 0, 0, 0, 0, 0, 2503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 336, 290, 0, 0, 0, 0, 3555, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3566, 540, 540, 561, 3064, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2617, 561, 561, 561, 561, 561, 3608, 561, 3609, 561, 561, 561, 561, 561, 561, 561, 585, 585, 3615, 585, 585, 585, 585, 585, 2658, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1952, 585, 585, 585, 585, 585, 3616, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 540, 585, 585, 561, 540, 540, 540, 1067, 911, 561, 561, 561, 1072, 407, 353, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 1658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 1146, 0, 0, 472, 483, 472, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 523, 523, 527, 527, 527, 527, 472, 472, 472, 472, 472, 477, 472, 472, 527, 523, 527, 527, 527, 527, 539, 556, 579, 556, 579, 556, 556, 579, 556, 603, 579, 579, 579, 579, 579, 579, 579, 603, 603, 603, 556, 603, 603, 603, 603, 603, 579, 579, 619, 624, 603, 624, 630, 1, 12290, 3, 78112, 0, 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2101, 0, 738, 0, 0, 0, 644, 738, 0, 744, 745, 644, 0, 0, 0, 0, 0, 0, 0, 0, 793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 802, 0, 807, 0, 0, 0, 0, 0, 0, 807, 0, 0, 0, 0, 0, 644, 0, 0, 0, 802, 0, 807, 0, 793, 0, 822, 0, 0, 0, 665, 0, 0, 0, 0, 822, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 362, 0, 0, 0, 1134592, 0, 0, 0, 793, 793, 0, 644, 0, 0, 793, 807, 845, 0, 540, 850, 540, 540, 540, 540, 540, 2539, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3324, 540, 540, 540, 540, 540, 869, 873, 879, 883, 540, 540, 540, 540, 540, 899, 540, 540, 540, 540, 540, 540, 540, 3206, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2205, 540, 540, 540, 540, 540, 540, 561, 561, 920, 561, 561, 561, 561, 939, 943, 949, 561, 954, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 0, 0, 2728, 0, 0, 1016, 1022, 585, 1027, 585, 585, 585, 585, 585, 1044, 585, 585, 585, 585, 585, 1058, 0, 0, 0, 540, 993, 585, 561, 540, 540, 899, 540, 540, 561, 561, 971, 561, 561, 561, 561, 561, 0, 585, 585, 993, 585, 585, 585, 585, 1012, 1149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2784, 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1211, 1227, 0, 0, 1099, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1249, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 1674, 0, 0, 0, 0, 0, 0, 743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2753, 2754, 0, 1252, 1200, 0, 1233, 1255, 0, 1258, 0, 0, 0, 0, 0, 1130, 0, 0, 0, 0, 0, 1597, 0, 0, 0, 1600, 0, 0, 1603, 0, 0, 0, 0, 0, 843, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 3320, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1801, 540, 540, 540, 1806, 540, 540, 0, 1267, 0, 0, 0, 0, 0, 1267, 0, 0, 1149, 1267, 0, 1274, 540, 540, 540, 540, 1282, 540, 540, 540, 1291, 540, 540, 540, 540, 540, 540, 540, 540, 2204, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2830, 540, 540, 540, 540, 540, 540, 540, 1279, 540, 540, 540, 540, 1285, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2194, 540, 540, 540, 540, 540, 540, 1306, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1317, 540, 540, 540, 540, 540, 2567, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2545, 540, 540, 540, 540, 1321, 540, 540, 540, 540, 540, 540, 540, 1327, 540, 540, 540, 1334, 1336, 540, 540, 540, 540, 1310, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1335, 540, 540, 540, 1360, 914, 1362, 561, 561, 561, 561, 1368, 561, 561, 561, 561, 1374, 561, 561, 561, 561, 1407, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2293, 561, 561, 561, 561, 561, 561, 1406, 561, 561, 561, 561, 1411, 561, 561, 561, 561, 561, 561, 561, 561, 1852, 561, 561, 561, 561, 561, 561, 561, 561, 1866, 561, 561, 561, 561, 561, 561, 561, 1418, 561, 561, 561, 1425, 1427, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1865, 561, 561, 561, 561, 561, 561, 561, 561, 1883, 561, 561, 561, 561, 561, 561, 561, 1459, 585, 585, 585, 585, 1465, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1533, 585, 585, 585, 585, 585, 1486, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1497, 585, 585, 585, 585, 585, 585, 1034, 585, 585, 585, 585, 1052, 585, 585, 585, 561, 1502, 585, 585, 585, 585, 585, 585, 585, 585, 1509, 585, 585, 585, 1516, 1518, 585, 585, 585, 585, 585, 2685, 585, 585, 585, 585, 2689, 585, 585, 585, 2694, 585, 561, 0, 1290, 1544, 1470, 1379, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3249, 561, 3251, 561, 561, 561, 561, 561, 561, 561, 585, 3534, 585, 3535, 585, 585, 585, 3539, 585, 0, 1575, 0, 0, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, 0, 0, 0, 1592, 1593, 0, 0, 0, 0, 0, 1599, 0, 0, 0, 0, 0, 0, 0, 0, 1172, 0, 0, 0, 0, 0, 0, 0, 0, 1639, 0, 0, 0, 0, 0, 0, 0, 1647, 1648, 0, 0, 0, 0, 0, 0, 0, 2387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2987, 0, 0, 0, 0, 0, 2990, 0, 1655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2482, 0, 0, 0, 1721, 0, 0, 0, 0, 0, 0, 0, 1718, 0, 0, 0, 0, 0, 0, 300, 300, 300, 300, 0, 300, 300, 300, 300, 300, 540, 540, 540, 1747, 540, 540, 540, 540, 1753, 540, 540, 540, 540, 540, 540, 540, 540, 1817, 540, 540, 540, 540, 540, 540, 1360, 540, 540, 540, 1764, 540, 540, 540, 540, 1768, 540, 540, 540, 540, 540, 540, 540, 540, 2178, 540, 540, 540, 540, 540, 540, 540, 540, 1287, 1294, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1779, 540, 540, 1783, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2206, 2207, 540, 540, 540, 540, 1809, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1379, 561, 0, 1074, 585, 585, 1050, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 1106, 0, 0, 0, 0, 0, 0, 1210, 0, 561, 1845, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1856, 561, 561, 561, 561, 1423, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3253, 561, 561, 561, 561, 585, 561, 1860, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1871, 561, 561, 561, 561, 1424, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 1920, 585, 585, 585, 585, 1876, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3244, 561, 561, 585, 2026, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286720, 0, 0, 0, 0, 2079, 2080, 0, 0, 2082, 2083, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 3306, 0, 0, 0, 0, 0, 0, 2105, 0, 0, 0, 0, 2108, 2109, 0, 0, 0, 0, 0, 0, 301, 301, 301, 301, 0, 301, 301, 301, 301, 301, 2115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2796, 0, 0, 0, 2147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2781, 0, 0, 0, 0, 0, 2157, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 540, 2225, 540, 540, 540, 540, 2230, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2070, 0, 0, 0, 0, 0, 2242, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2618, 561, 561, 561, 561, 561, 2259, 561, 561, 2263, 561, 561, 561, 2267, 561, 561, 561, 561, 561, 561, 3610, 561, 3611, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 2030, 0, 1082, 0, 0, 0, 2032, 585, 2344, 585, 585, 2348, 585, 585, 585, 2352, 585, 585, 585, 585, 585, 585, 585, 1528, 585, 585, 585, 585, 585, 585, 1538, 585, 585, 585, 585, 2361, 585, 585, 2364, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1935, 1936, 585, 585, 585, 585, 1943, 585, 585, 2400, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 2718, 540, 540, 0, 0, 0, 2437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2794, 0, 0, 0, 0, 2473, 0, 0, 0, 2477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2511, 0, 540, 540, 2525, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2532, 540, 540, 540, 540, 1324, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1330, 540, 540, 540, 540, 540, 540, 2550, 540, 540, 2552, 540, 2553, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2193, 540, 540, 2196, 540, 540, 540, 540, 2563, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2574, 540, 540, 540, 540, 2827, 2828, 540, 540, 540, 540, 2831, 540, 540, 540, 540, 540, 540, 540, 1751, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1351, 540, 540, 540, 540, 540, 540, 0, 0, 0, 561, 561, 2587, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2264, 561, 561, 561, 561, 2269, 561, 561, 561, 2594, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2871, 561, 561, 2609, 561, 561, 561, 2612, 561, 561, 2614, 561, 2615, 561, 561, 561, 561, 561, 929, 561, 937, 561, 561, 561, 561, 561, 561, 561, 561, 2629, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2623, 561, 561, 2627, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2290, 2291, 561, 561, 561, 561, 561, 561, 561, 0, 2327, 585, 585, 585, 585, 585, 585, 585, 1507, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 3284, 540, 3286, 561, 561, 561, 561, 2638, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3099, 561, 561, 561, 0, 0, 2733, 2734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3002, 0, 0, 0, 2785, 0, 2787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2432, 0, 0, 0, 0, 0, 0, 2800, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 3217, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3042, 540, 3044, 540, 540, 540, 540, 540, 540, 2848, 540, 540, 540, 0, 0, 561, 561, 561, 561, 561, 561, 561, 2318, 561, 561, 561, 561, 561, 0, 0, 0, 561, 561, 2859, 561, 2862, 561, 561, 561, 561, 2867, 561, 561, 561, 2870, 561, 561, 561, 561, 2302, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 940, 561, 561, 561, 561, 561, 561, 561, 561, 1394, 561, 561, 561, 561, 561, 561, 561, 1402, 561, 561, 561, 2896, 561, 561, 561, 0, 0, 585, 585, 585, 585, 585, 585, 585, 1529, 585, 585, 585, 585, 585, 585, 585, 585, 2661, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2907, 585, 2910, 585, 585, 585, 585, 2915, 585, 585, 585, 2918, 585, 585, 585, 585, 585, 1527, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2367, 585, 585, 585, 585, 585, 585, 585, 585, 2944, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 585, 585, 3373, 0, 0, 0, 3375, 0, 0, 2980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2979, 2991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3005, 0, 3006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2989, 0, 561, 561, 561, 561, 3078, 561, 561, 561, 561, 561, 561, 561, 561, 3086, 561, 561, 561, 561, 2315, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 2327, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3273, 585, 585, 585, 585, 585, 585, 561, 561, 585, 585, 585, 3107, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1969, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3119, 585, 585, 585, 585, 585, 585, 585, 585, 3127, 585, 585, 585, 585, 585, 1901, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 3065, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3479, 585, 585, 585, 585, 585, 0, 3159, 0, 0, 0, 0, 0, 0, 0, 3165, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 3304, 0, 0, 0, 0, 0, 0, 3191, 0, 0, 0, 0, 0, 0, 3195, 3196, 0, 0, 0, 0, 540, 540, 3601, 540, 3602, 540, 540, 540, 540, 540, 540, 540, 540, 1752, 540, 540, 540, 540, 540, 540, 540, 540, 1349, 540, 540, 540, 540, 540, 540, 540, 540, 1288, 540, 540, 540, 540, 540, 540, 540, 540, 1289, 540, 540, 540, 540, 540, 540, 540, 540, 1290, 540, 540, 540, 540, 1300, 540, 540, 3279, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 561, 561, 2611, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2304, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1853, 561, 561, 561, 561, 561, 561, 540, 540, 540, 540, 3317, 540, 540, 540, 3321, 540, 540, 540, 540, 540, 540, 540, 540, 2192, 540, 540, 540, 540, 540, 540, 2198, 561, 561, 561, 3339, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2628, 561, 561, 561, 561, 561, 561, 561, 561, 2305, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3348, 561, 561, 561, 585, 585, 585, 585, 585, 3353, 585, 585, 585, 3357, 561, 561, 3572, 561, 561, 561, 561, 561, 561, 561, 561, 3580, 585, 585, 585, 3584, 3597, 0, 3598, 3599, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3605, 3606, 540, 540, 540, 540, 2837, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1803, 540, 540, 540, 540, 585, 585, 585, 585, 585, 3619, 3620, 585, 561, 0, 0, 3623, 0, 0, 0, 540, 585, 585, 561, 540, 540, 895, 540, 540, 561, 561, 967, 561, 561, 3671, 585, 3672, 0, 540, 561, 585, 0, 540, 561, 585, 0, 540, 561, 585, 585, 585, 585, 585, 1079, 1559, 0, 0, 0, 1565, 0, 0, 0, 1571, 2033, 0, 0, 0, 0, 1577, 2035, 0, 0, 0, 0, 0, 0, 0, 1682, 0, 1684, 0, 0, 0, 0, 0, 0, 0, 1712, 0, 0, 1715, 0, 0, 0, 0, 0, 355, 356, 0, 0, 0, 0, 0, 0, 0, 362, 0, 290, 0, 0, 0, 0, 0, 0, 2762, 0, 0, 0, 0, 0, 0, 0, 2768, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3198, 0, 540, 540, 473, 473, 487, 0, 0, 487, 356, 356, 356, 509, 356, 356, 356, 356, 473, 473, 580, 580, 580, 580, 580, 580, 580, 604, 604, 604, 557, 604, 604, 604, 604, 604, 580, 580, 557, 580, 604, 580, 604, 1, 12290, 3, 78112, 540, 870, 540, 540, 540, 540, 540, 540, 540, 540, 540, 904, 540, 540, 540, 540, 540, 540, 2191, 540, 540, 540, 540, 2195, 540, 2197, 540, 540, 561, 561, 976, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 1013, 1197, 0, 0, 0, 0, 0, 0, 0, 1197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 1371, 561, 561, 561, 1380, 561, 561, 561, 561, 2639, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2644, 561, 561, 561, 561, 585, 585, 585, 1462, 585, 585, 585, 1471, 585, 585, 585, 585, 585, 585, 585, 585, 1472, 585, 1477, 585, 585, 1481, 585, 585, 1541, 561, 0, 1291, 585, 1471, 1380, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 0, 2727, 0, 0, 0, 0, 0, 1576, 0, 0, 0, 1582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2737, 0, 0, 0, 0, 0, 2741, 0, 1607, 0, 0, 0, 0, 0, 0, 0, 1615, 1616, 0, 0, 0, 0, 0, 0, 303, 204800, 204800, 0, 205103, 204800, 1, 12290, 3, 0, 1761, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1774, 1891, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3087, 561, 561, 561, 561, 1911, 561, 561, 561, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 585, 585, 1466, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2928, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1947, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2001, 585, 585, 585, 585, 585, 585, 585, 1960, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1973, 0, 0, 2243, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2634, 561, 561, 2328, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2384, 0, 0, 0, 0, 2425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2085, 2086, 0, 0, 0, 0, 2449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3175, 0, 0, 0, 0, 561, 561, 561, 561, 561, 561, 2590, 561, 561, 561, 561, 561, 561, 2289, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2292, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2861, 561, 2863, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2877, 561, 561, 561, 561, 561, 561, 561, 561, 1899, 561, 561, 561, 561, 561, 1905, 561, 585, 585, 585, 2909, 585, 2911, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1984, 585, 585, 585, 585, 585, 585, 585, 3360, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1056, 585, 561, 0, 3556, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3567, 540, 561, 561, 561, 561, 2876, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 561, 561, 561, 561, 3656, 561, 585, 585, 585, 585, 3660, 585, 0, 0, 0, 0, 0, 0, 2775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2124, 0, 0, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 362, 0, 290, 0, 0, 0, 0, 0, 0, 2790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1147354, 0, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2509, 0, 0, 357, 0, 367, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2457, 0, 0, 581, 581, 581, 581, 581, 581, 581, 605, 605, 605, 558, 605, 605, 605, 605, 605, 581, 581, 558, 581, 605, 581, 605, 1, 12290, 3, 78112, 865, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2575, 1385, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3243, 561, 1775, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3047, 585, 585, 585, 585, 1961, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2380, 585, 585, 585, 585, 2756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3315, 0, 2981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3188, 0, 3298, 0, 3299, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3388, 0, 0, 0, 0, 358, 359, 360, 361, 0, 0, 362, 0, 290, 0, 0, 0, 0, 0, 0, 2973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 362, 702, 0, 0, 0, 0, 359, 0, 358, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 425, 65536, 0, 0, 0, 0, 1710, 1711, 0, 0, 0, 1714, 0, 0, 0, 0, 0, 1718, 425, 425, 0, 425, 0, 359, 425, 0, 456, 0, 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, 0, 1263, 1264, 0, 0, 0, 0, 0, 497, 497, 0, 504, 504, 504, 504, 510, 511, 504, 504, 524, 524, 524, 524, 456, 456, 456, 456, 456, 456, 456, 456, 524, 524, 524, 524, 524, 524, 524, 559, 582, 559, 582, 559, 559, 582, 559, 606, 582, 582, 582, 582, 582, 582, 582, 606, 606, 606, 559, 606, 606, 606, 606, 606, 582, 582, 620, 625, 606, 625, 631, 1, 12290, 3, 78112, 0, 0, 0, 540, 585, 585, 561, 540, 540, 900, 540, 540, 561, 561, 972, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 1934, 585, 585, 585, 585, 585, 585, 585, 0, 0, 2104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2740, 0, 0, 0, 0, 0, 561, 2245, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3533, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3494, 561, 0, 0, 0, 0, 0, 0, 585, 2330, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1482, 585, 585, 540, 2549, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2237, 0, 540, 540, 2577, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 0, 0, 0, 1611, 0, 0, 1614, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2891776, 0, 0, 0, 0, 0, 2392064, 583, 583, 583, 583, 583, 583, 583, 607, 607, 607, 560, 607, 607, 607, 607, 607, 583, 583, 560, 583, 607, 583, 607, 1, 12290, 3, 78112, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155648, 866, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3224, 1136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 0, 0, 0, 0, 0, 1659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 780, 0, 0, 0, 0, 786, 561, 585, 585, 585, 585, 585, 1079, 1560, 0, 0, 0, 1566, 0, 0, 0, 1572, 0, 0, 0, 1578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3313, 0, 0, 540, 2199, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2547, 540, 2535, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2822, 540, 561, 561, 561, 2597, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2317, 561, 561, 2320, 2321, 561, 561, 0, 0, 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 743, 540, 540, 540, 540, 540, 540, 540, 3331, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3072, 561, 561, 561, 0, 0, 0, 540, 585, 585, 561, 1064, 540, 540, 905, 540, 1069, 561, 561, 977, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 1951, 585, 585, 585, 585, 585, 585, 585, 0, 0, 1594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2767, 0, 0, 561, 561, 1846, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2645, 561, 561, 585, 585, 585, 1977, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2692, 585, 585, 585, 540, 540, 540, 2188, 540, 2190, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 3334, 561, 561, 0, 0, 0, 561, 561, 561, 2247, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2613, 561, 561, 561, 561, 561, 561, 561, 2619, 561, 561, 2273, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3242, 561, 561, 0, 585, 585, 585, 2332, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2408, 540, 585, 585, 561, 561, 2647, 0, 0, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 2687, 585, 585, 2691, 585, 585, 585, 585, 585, 585, 585, 585, 2684, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2916, 585, 585, 585, 585, 561, 561, 585, 585, 585, 585, 585, 3109, 585, 585, 585, 585, 585, 585, 585, 585, 2702, 585, 585, 585, 585, 585, 585, 585, 0, 1134592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225706, 0, 0, 1134592, 0, 0, 0, 1134592, 1134592, 0, 0, 1134592, 0, 0, 1134592, 0, 1134592, 0, 0, 0, 1134592, 1135005, 1135005, 0, 0, 0, 0, 0, 1135005, 0, 1134592, 1134592, 0, 0, 0, 0, 1135202, 1135202, 1135202, 1135202, 1134592, 1135202, 1135202, 1135202, 1135202, 1135202, 0, 1134592, 1134592, 1134592, 1134592, 1135202, 1134592, 1135202, 1, 12290, 3, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 1138688, 0, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2125824, 2126738, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 987, 2125824, 2125824, 2125824, 2125824, 2424832, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 457, 457, 1147354, 457, 457, 457, 457, 457, 457, 457, 457, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2792, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 1147354, 1147354, 1147354, 1147405, 1147405, 1147354, 1147405, 1147405, 1, 12290, 3, 0, 0, 0, 0, 2042, 0, 0, 2045, 2046, 0, 0, 0, 2050, 0, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1221, 0, 0, 0, 0, 0, 0, 1142784, 0, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3137536, 2125824, 2940928, 2940928, 2940928, 0, 0, 0, 0, 0, 0, 305, 440, 448, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 1159168, 0, 0, 1159168, 0, 1159168, 1159168, 0, 1159168, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2802, 0, 540, 540, 540, 540, 540, 1159168, 1159168, 0, 1159168, 1159168, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 0, 1159168, 1159168, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1, 12290, 3, 0, 0, 0, 0, 2053, 0, 2054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 799, 0, 799, 0, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1163264, 0, 0, 0, 0, 0, 155648, 155648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 913, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 1452, 2125824, 2125824, 2125824, 2125824, 2424832, 106496, 0, 106496, 106496, 0, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 0, 0, 106496, 0, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2782, 2783, 0, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163840, 0, 0, 0, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 0, 0, 0, 0, 0, 2953216, 0, 0, 2826240, 2875392, 0, 0, 0, 0, 0, 0, 2834432, 0, 3227648, 2568192, 0, 0, 0, 0, 2564096, 0, 2748416, 2879488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 3137536, 2125824, 2125824, 2498560, 2125824, 2125824, 2125824, 2555904, 2564096, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2654208, 2678784, 2760704, 2764800, 2785280, 2854912, 2969600, 2125824, 3006464, 2125824, 3018752, 2125824, 2125824\n
+[ 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22007, 18176, 18196, 18196, 18196, 18203, 18196, 18196, 18196, 18196, 18230, 18196, 18196, 18196, 18196, 18219, 18196, 18180, 18246, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 18411, 20907, 20920, 20932, 20944, 22539, 18416, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 37625, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 21008, 21032, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21632, 21055, 23546, 23546, 23546, 21178, 23546, 23546, 23916, 42362, 21241, 23546, 23546, 23546, 23546, 19298, 47203, 21077, 21110, 23546, 23546, 23546, 35799, 23546, 23546, 21194, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 21229, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21358, 21323, 23546, 23546, 23546, 26152, 23546, 23546, 27593, 23546, 21369, 29482, 21257, 21282, 21273, 21304, 21317, 21346, 20967, 23546, 23546, 23546, 28947, 23546, 23546, 21385, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 20711, 21423, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 21446, 26048, 18745, 18766, 18771, 20561, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23540, 23546, 23546, 23546, 25880, 23545, 23546, 31245, 23546, 21468, 23534, 21504, 23546, 21511, 23546, 21527, 21539, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 196
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAA4=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="14" aka="AAAAAAAAAA4=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>32, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 21567, 23546, 23546, 23546, 31874, 23546, 23546, 21586, 23546, 23546, 21608, 21620, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 35211, 23546, 23546, 23546, 23546, 23546, 23546, 23424, 21648, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 21681, 18544, 18567, 18590, 50977, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21736, 21705, 23546, 23546, 23546, 44539, 23546, 23546, 24265, 25689, 25607, 23546, 23546, 23546, 23546, 26450, 47502, 21724, 21752, 23546, 23546, 23546, 35799, 23546, 23546, 21783, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 20237, 21819, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21551, 21857, 21913, 21913, 21913, 21864, 21908, 21913, 21918, 21967, 21842, 21949, 21880, 21961, 21896, 21934, 21983, 21995, 20967, 23546, 23546, 23546, 26225, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 22023, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 28636, 23546, 23546, 23546, 25912, 50946, 23546, 50080, 50952, 21369, 28635, 23546, 22054, 22060, 22076, 22111, 22121, 22137, 23546, 23546, 23546, 30755, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 22183, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 27655, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 51066, 39748, 22869, 22242, 22228, 22245, 22261, 22277, 22288, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 20285, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 18648, 40763, 24585, 22304, 22324, 22304, 22338, 24585, 22308, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 22361, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 22386, 23546, 23546, 23546, 25841, 18403, 23546, 19576, 22382, 44281, 22402, 22429, 22434, 22434, 22450, 22385, 22413, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22473, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 25653, 22498, 22518, 22498, 22532, 25653, 22502, 22555, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27132, 23546, 42897, 23546, 44844, 38626, 22584, 22361, 37471, 23546, 23546, 23546, 23546, 22587, 47563, 46856, 47563, 47563, 22603, 35356, 22824, 22824, 34828, 22804, 22621, 22804, 22804, 33187, 36943, 23546, 23546, 23546, 23546, 23546, 26071, 23546, 22641, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 43701, 32739, 23546, 23546, 23546, 23546, 23546, 29474, 22702, 23546, 33124, 44563, 47563, 47563, 47563, 47564, 22719, 35350, 22824, 22764, 22824, 22767, 35689, 22783, 22804, 22803, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 27587, 23546, 23546, 47562, 46826, 47563, 47563, 27195, 22821, 42846, 22824, 22824, 22824, 30376, 22804, 22841, 22804, 22804, 29883, 33199, 23546, 23546, 21430, 23546, 49502, 48973, 47563, 47563, 36153, 45209, 22824, 22824, 39816, 27834, 22804, 22804, 43796, 30403, 39964, 23546, 23546, 22861, 23546, 47560, 22885, 47563, 23113, 22903, 22824, 33078, 22920, 22804, 38116, 23546, 23546, 22937, 29174, 22980, 47563, 34384, 42527, 22825, 23019, 22804, 31964, 47447, 46606, 23083, 36624, 23105, 32340, 30673, 23131, 36549, 23164, 40907, 43074, 23200, 23229, 23275, 36645, 36686, 33550, 48975, 23107, 30672, 23141, 39417, 23313, 23334, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 24855, 21369, 23546, 23546, 23546, 23546, 23546, 20980, 20992, 23383, 23546, 23546, 23546, 35799, 23546, 23546, 23420, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 23440, 27132, 23546, 23546, 23546, 44844, 23546, 23546, 18368, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 22603, 22824, 22824, 22824, 34828, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 26071, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23485, 23546, 23546, 23546, 26606, 23546, 23546, 23546, 23546, 21369, 28080, 23505, 23528, 23563, 23575, 28081, 23512, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 30821, 23546, 37478, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23598, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23184, 21369, 23546, 23546, 23546, 23546, 23546, 22653, 22665, 23615, 23546, 23546, 23546, 35799, 23546, 23546, 23644, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 23664, 27132, 23546, 23546, 23546, 44844, 23546, 23546, 23688, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 22603, 22824, 22824, 22824, 34828, 22804, 22804, 22804, 22804, 39677, 48779, 23733, 23546, 23546, 23546, 23546, 34921, 23753, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 23777, 48792, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 41753, 22821, 22824, 22824, 22824, 22824, 44122, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 34866, 22821, 22824, 22824, 22824, 22824, 23826, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 39721, 23546, 23546, 23546, 30797, 25982, 23546, 23546, 23849, 21369, 20313, 44188, 23887, 23893, 23909, 23546, 49114, 23932, 23546, 23546, 23546, 36603, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 24187, 24465, 24820, 25200, 24258, 18282, 18849, 18305, 23964, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 23993, 24116, 24017, 24046, 24001, 24088, 25090, 24132, 24812, 24103, 24159, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 24182, 25436, 24884, 24206, 24190, 24890, 24819, 24363, 24227, 24819, 24414, 24143, 25214, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 24243, 24030, 25425, 24281, 24706, 24308, 24337, 24350, 24389, 24405, 24517, 24423, 25208, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 24439, 19364, 24455, 25063, 24489, 24505, 24533, 25266, 24373, 24545, 24561, 24577, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 19809, 24679, 24601, 25048, 19406, 24473, 24617, 25251, 25017, 24736, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 24633, 24673, 24695, 24722, 24779, 24801, 24836, 23977, 20842, 20016, 18679, 20827, 20042, 24871, 24906, 24935, 24951, 25006, 25411, 25295, 20159, 20175, 20206, 25033, 24292, 25079, 25281, 25106, 20376, 20392, 19394, 24919, 24657, 20462, 19676, 24211, 24785, 32258, 19353, 24647, 24966, 20473, 24060, 25136, 20616, 25172, 25188, 25236, 24072, 25311, 25362, 25396, 25452, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 21328, 23546, 23546, 23546, 25841, 25477, 23546, 23546, 25472, 32915, 25493, 25501, 25501, 25501, 25517, 21330, 25540, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 25581, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20499, 25597, 18792, 18808, 18830, 23628, 18814, 25623, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 21016, 25645, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 25669, 25705, 25721, 19477, 25754, 19498, 25737, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 18708, 21452, 19692, 19708, 20143, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 50535, 23259, 25770, 25770, 25770, 25779, 21123, 21135, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 25220, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 25802, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21147, 20888, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 22959, 25825, 25825, 25825, 25834, 20891, 22964, 25857, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 27140, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 25873, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25552, 25561, 23546, 23546, 23546, 26852, 23546, 23546, 23546, 23546, 21369, 33245, 25896, 25896, 25896, 25905, 36950, 33250, 25928, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 22366, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 25964, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 25998, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 26099, 23546, 23546, 23546, 23546, 25841, 21661, 23546, 23546, 21094, 43925, 23546, 23546, 23546, 21665, 26069, 21092, 26087, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 31389, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 26115, 26145, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 23546, 43987, 26168, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 26285, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 26302, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 26321, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 19867, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 26341, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 26341, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 29369, 22821, 22824, 22824, 22824, 22824, 28821, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 23049, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26364, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 19293, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 31312, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 37937, 26399, 26410, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 26426, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 26445, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 41698, 26466, 26486, 26508, 26520, 41701, 26470, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 38227, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 26543, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 23546, 23546, 23424, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 28554, 23546, 26577, 26583, 26599, 47449, 44239, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 26622, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 26638, 20392, 51127, 20418, 50802, 26654, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 27306, 23546, 23546, 23546, 26527, 26683, 26714, 28322, 26699, 26731, 50814, 50823, 26775, 26789, 26801, 26817, 26829, 26204, 26845, 23599, 23546, 25326, 21171, 35898, 34903, 26868, 26909, 26948, 33311, 26979, 26959, 26995, 27011, 45967, 27047, 27063, 27101, 27117, 34536, 27156, 23546, 23546, 44844, 41240, 34846, 23546, 42415, 27173, 27664, 23546, 42356, 28101, 47563, 47563, 47563, 27192, 27418, 22824, 22824, 42533, 43762, 22804, 22804, 22804, 27211, 27231, 36943, 23546, 44839, 40944, 23546, 27267, 27287, 46640, 23546, 27304, 35519, 43402, 27322, 27344, 47563, 47563, 27380, 27403, 27436, 31453, 22824, 33011, 27464, 27493, 27533, 27556, 22804, 38069, 35418, 30315, 27573, 26241, 27609, 23546, 44532, 27629, 39107, 50620, 23546, 45009, 27646, 31107, 27698, 47563, 27746, 27765, 23297, 27785, 27825, 36368, 22824, 27859, 48139, 23833, 27991, 44504, 49256, 22804, 43572, 23672, 27877, 42988, 25683, 23546, 27893, 27913, 46094, 23546, 21213, 44018, 47563, 30489, 32462, 27941, 34820, 22824, 45399, 49012, 28821, 27978, 22804, 22804, 28014, 28034, 49064, 28072, 35792, 28097, 51046, 28117, 50856, 22994, 28137, 47563, 41728, 28206, 28229, 22824, 41433, 28267, 28290, 22804, 34572, 28320, 28338, 23546, 23546, 39715, 47560, 28358, 45550, 23113, 28379, 35308, 33078, 28399, 36714, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 41649, 28419, 28455, 40472, 38341, 28471, 38828, 40452, 28791, 24756, 33030, 27540, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 28526, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 34078, 28545, 23546, 28652, 28658, 28674, 28690, 28701, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 26963, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22605, 35842, 45303, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 46230, 50621, 28718, 23546, 28717, 23546, 48975, 47563, 47563, 47563, 27769, 28735, 22823, 22824, 22824, 22824, 49361, 49439, 22804, 22804, 22804, 22804, 28781, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 23672, 23807, 23546, 18289, 23546, 23546, 44779, 49528, 23546, 36898, 47563, 47563, 47563, 40417, 28807, 22824, 22824, 22824, 50340, 31197, 28844, 22804, 22804, 22804, 28863, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 21205, 28900, 28924, 28940, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 28963, 23546, 23546, 26527, 23546, 28992, 23546, 29010, 36977, 29029, 29038, 29054, 29069, 29081, 29097, 29109, 26204, 23546, 23546, 33645, 49739, 23546, 28529, 23546, 23546, 31365, 23546, 23546, 23546, 35995, 23546, 29125, 31167, 22824, 29149, 40337, 48749, 32108, 23546, 29172, 23546, 44844, 29190, 42384, 23546, 31347</string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAA8=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="15" aka="AAAAAAAAAA8=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>, 50774, 29209, 23546, 25948, 29214, 29230, 29291, 47563, 47563, 29309, 29325, 22824, 22824, 45608, 49036, 29349, 22804, 22804, 39677, 36943, 30220, 23546, 23546, 47099, 23546, 22095, 50621, 37205, 27682, 23546, 23546, 48975, 28152, 40051, 47563, 29366, 37135, 45217, 46920, 46953, 36665, 22824, 49439, 49901, 29385, 29404, 34563, 22804, 29885, 40883, 26241, 23546, 23546, 47600, 23546, 23546, 29423, 23546, 29445, 23546, 48976, 47563, 47563, 47563, 44406, 47564, 22821, 22824, 22824, 49328, 42575, 22767, 35849, 22804, 22804, 39288, 28274, 50448, 23672, 29464, 23546, 23546, 23546, 29498, 42828, 23546, 23546, 47562, 47563, 47563, 46820, 29369, 22821, 22824, 22824, 37856, 22824, 28821, 22804, 22804, 30184, 22804, 29883, 33199, 23546, 23546, 29517, 23546, 47519, 29538, 47563, 46768, 47563, 41728, 22824, 49353, 22824, 41433, 22804, 41641, 22804, 27843, 29565, 23546, 23546, 23546, 29581, 33988, 49629, 29610, 50265, 49148, 29627, 30732, 37573, 29644, 31970, 23546, 23546, 28626, 22586, 47563, 47563, 29661, 22824, 47375, 22804, 22804, 29679, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 45087, 23089, 29701, 47077, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 27251, 29717, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 21570, 23546, 23546, 26527, 23546, 29745, 24166, 23546, 32508, 29764, 29773, 29789, 29803, 29812, 29828, 29839, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 34673, 34671, 23546, 38486, 38493, 29855, 28213, 35842, 29875, 43066, 27800, 23546, 40629, 29901, 44844, 23546, 29926, 30774, 23546, 23546, 41541, 20026, 29946, 29989, 29293, 38320, 30005, 40270, 30031, 42116, 30052, 30082, 30100, 49972, 39453, 30135, 41942, 39677, 36943, 23546, 23546, 23546, 42078, 23546, 30162, 50621, 23546, 23546, 23546, 39564, 48975, 47563, 47563, 47563, 48721, 37135, 22823, 22824, 22824, 22824, 42777, 49439, 22804, 22804, 22804, 22804, 30182, 30146, 30200, 30236, 23546, 23546, 23546, 30252, 30271, 50620, 23546, 23546, 45468, 23469, 31420, 34156, 47563, 47563, 45201, 30292, 30331, 30348, 22824, 22824, 30365, 29156, 29407, 22804, 22804, 22804, 30399, 23672, 23807, 23546, 23546, 23546, 23546, 45523, 28572, 23546, 33872, 47563, 47563, 30419, 29369, 30438, 22824, 22824, 48645, 22824, 31904, 22804, 22804, 50360, 22804, 30539, 33199, 49920, 23546, 30462, 23546, 50724, 48973, 36270, 47563, 30480, 41728, 35391, 22824, 30505, 41433, 50493, 22804, 30530, 30403, 47447, 49732, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23251, 23546, 22586, 47563, 47563, 30555, 22824, 36108, 22804, 22804, 30575, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 30597, 46609, 47561, 23111, 30673, 39296, 30622, 30648, 30668, 30689, 19013, 30707, 30727, 30748, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23547, 30771, 23546, 26527, 25156, 30790, 23546, 30813, 24321, 30837, 30846, 30862, 30876, 30888, 30904, 30915, 26204, 22703, 30931, 26561, 35799, 30978, 26921, 26341, 27925, 30994, 31013, 31032, 31061, 31045, 31097, 31131, 31147, 31183, 31227, 31261, 31277, 39237, 39476, 31293, 33748, 31328, 22212, 31363, 31381, 41158, 23546, 23546, 40033, 23546, 22587, 32449, 31405, 47817, 28510, 31441, 31475, 46890, 31498, 30304, 31538, 22625, 36744, 47681, 39677, 36943, 23698, 29973, 31554, 29930, 31590, 23708, 31634, 39997, 31661, 48812, 31689, 31711, 31727, 31763, 31798, 31814, 29245, 31850, 40093, 31890, 34721, 31940, 35662, 31956, 31986, 27076, 32035, 32066, 32093, 32133, 26241, 50755, 23546, 43683, 23546, 32169, 19239, 32192, 32249, 22951, 24750, 43255, 32274, 47563, 32292, 45560, 22821, 32317, 22824, 42593, 48588, 50230, 35849, 32356, 22804, 45665, 32384, 32405, 32421, 23807, 25150, 32478, 32497, 47176, 23546, 32524, 45835, 36145, 40407, 31425, 32550, 44054, 32586, 34739, 22824, 32631, 32657, 30066, 33080, 32683, 47042, 40501, 29883, 33199, 23546, 45717, 33237, 23546, 23546, 32701, 31115, 42955, 32563, 41728, 45894, 41614, 32608, 41433, 33712, 42499, 35727, 30403, 47447, 28590, 32719, 48060, 32755, 32790, 42232, 33671, 32806, 37745, 39609, 32837, 40736, 33730, 32892, 32931, 32953, 19435, 22586, 32974, 48106, 28046, 33009, 33027, 33047, 48381, 35461, 47447, 40617, 22585, 47563, 50257, 22824, 33074, 36473, 36549, 33096, 40786, 36807, 32667, 39296, 33119, 43227, 48451, 49953, 33140, 24763, 23318, 45645, 33156, 33172, 33217, 47559, 33030, 30691, 33266, 33282, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 33306, 23546, 26527, 33327, 33345, 25456, 24849, 33370, 33400, 23546, 33386, 33428, 33437, 33453, 33464, 26204, 23546, 23546, 33480, 35799, 23546, 23546, 23546, 23546, 27288, 23546, 23546, 34477, 23546, 34484, 31605, 33499, 33519, 43660, 33545, 33568, 27800, 23546, 33621, 23546, 44844, 33621, 23546, 23546, 30997, 23546, 33640, 34051, 23546, 22587, 33661, 47563, 47563, 47563, 33687, 22824, 22824, 22824, 43762, 33703, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 50621, 23546, 23546, 23546, 33746, 48975, 47563, 47563, 47563, 43863, 37135, 22823, 22824, 22824, 22824, 34733, 49439, 22804, 22804, 22804, 22804, 33764, 29885, 40883, 26241, 23546, 23546, 23546, 23546, 23546, 50620, 23546, 20258, 23546, 48976, 47563, 47563, 46759, 47563, 47564, 22821, 22824, 22824, 37850, 22824, 22767, 35849, 22804, 22804, 33781, 22804, 29879, 23672, 23807, 23546, 23546, 23546, 23546, 23546, 43159, 23546, 47562, 47563, 47563, 31773, 29369, 22821, 22824, 22824, 49239, 22824, 28821, 22804, 22804, 22804, 33801, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 41728, 22824, 22824, 22824, 41433, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 33820, 23546, 23546, 22586, 44762, 47563, 23109, 33840, 22825, 34299, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 23335, 32233, 42307, 22729, 33859, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 32176, 23546, 23546, 41552, 33893, 33902, 33918, 33924, 33940, 33956, 33967, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 37894, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 28765, 41920, 23546, 23546, 44844, 23546, 23546, 23546, 39585, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 43177, 23546, 23546, 45738, 48975, 47563, 47563, 47563, 47563, 37135, 41960, 22824, 22824, 22824, 22824, 47410, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 20340, 23546, 23178, 20358, 23546, 23546, 20360, 33983, 47563, 47563, 34004, 47563, 47564, 22821, 22824, 36824, 22824, 22824, 22767, 35849, 22804, 33785, 22804, 22804, 29879, 34024, 23546, 23546, 23546, 34050, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 32147, 47539, 23546, 48973, 47563, 47563, 39206, 45209, 22824, 22824, 43898, 27834, 22804, 22804, 34943, 30403, 47447, 34067, 47158, 34094, 23546, 34121, 32984, 34141, 34177, 43533, 34196, 34244, 36447, 34263, 31970, 28608, 23546, 34315, 34336, 34355, 34372, 28875, 33605, 34412, 34436, 34454, 31964, 47447, 46606, 43054, 32993, 34501, 34521, 30673, 34552, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 43326, 34588, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 41690, 23546, 26286, 34628, 23546, 23546, 23546, 34692, 23546, 34693, 23546, 23546, 34656, 34689, 40521, 22887, 37164, 34396, 43815, 34709, 34755, 23546, 23546, 29501, 44844, 26383, 30255, 23546, 23546, 41921, 23546, 23546, 23546, 22587, 47563, 47563, 32276, 47563, 27418, 22824, 22824, 35655, 43762, 22804, 22804, 35850, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 34780, 43953, 48975, 47563, 47563, 47563, 47563, 29859, 22823, 22824, 22824, 22824, 22824, 30446, 22804, 22804, 22804, 22804, 22804, 34799, 33201, 23546, 34844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 42714, 48976, 34862, 47563, 47563, 47563, 47564, 34882, 22824, 22824, 22824, 22824, 22767, 30383, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 34898, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 49594, 27195, 22821, 22824, 22824, 22824, 49007, 30376, 22804, 22804, 22804, 28251, 29883, 33199, 23546, 23546, 45156, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 28617, 23546, 48860, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 48020, 34919, 46606, 50168, 47563, 35289, 22824, 34937, 22804, 34959, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 26217, 23546, 26527, 28994, 29429, 32937, 21397, 21407, 19607, 19616, 34984, 34999, 35011, 35027, 35038, 26204, 23546, 23546, 23546, 21159, 35548, 23546, 23546, 29013, 35054, 32876, 23546, 35263, 35074, 35112, 39498, 35166, 47961, 27448, 49402, 46199, 35202, 23546, 23546, 23546, 38910, 23546, 47123, 35227, 23546, 23546, 23546, 35244, 44990, 22587, 44754, 35279, 47563, 35324, 35372, 48187, 22824, 29333, 35407, 49176, 35434, 22804, 35477, 39677, 36943, 23546, 35515, 50019, 41319, 42187, 35535, 23546, 19253, 43384, 35575, 35592, 35612, 35186, 47563, 42920, 37391, 20600, 22823, 35386, 22824, 40181, 35635, 35678, 29350, 22804, 33765, 35713, 35750, 48433, 33201, 23546, 23546, 23546, 23546, 35766, 20349, 35815, 44388, 23546, 23546, 40380, 47253, 47563, 47563, 41209, 36250, 35833, 43893, 22824, 22824, 48653, 43541, 43789, 35866, 22804, 22804, 31917, 36853, 33195, 23546, 19730, 35885, 35914, 32534, 35930, 35957, 45488, 36011, 28363, 36030, 36050, 36074, 36103, 39870, 50408, 42260, 32597, 45635, 22804, 36124, 36169, 36204, 27085, 31863, 36220, 46659, 44955, 21826, 38142, 32958, 36266, 47872, 36286, 36321, 36366, 36384, 36409, 36435, 36471, 36489, 36514, 36540, 36572, 23546, 23546, 18340, 36595, 30632, 36619, 36640, 39370, 36661, 36681, 36702, 36740, 36760, 31970, 23546, 36781, 18841, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 34034, 46606, 22585, 31741, 36801, 36823, 36840, 38424, 36549, 46609, 36869, 23111, 30673, 39296, 36886, 35338, 36933, 36966, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 42313, 47646, 36993, 39426, 42307, 22729, 23448, 37021, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 39988, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 50028, 21708, 39996, 40225, 24990, 37071, 37082, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 31016, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 27420, 22824, 43762, 22804, 22804, 48012, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 25524, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 37098, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 37115, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 37134, 47563, 47563, 47563, 47564, 37151, 22824, 22824, 22824, 22824, 22767, 28828, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 41164, 23546, 26527, 23546, 34764, 23546, 19155, 37185, 37221, 37234, 37250, 37256, 37272, 37288, 37299, 26204, 23546, 37315, 23546, 35799, 23546, 43426, 26746, 23546, 23546, 37335, 23546, 32153, 42194, 37334, 37351, 37380, 37407, 37443, 40833, 37430, 32821, 37459, 23546, 23546, 34612, 23546, 23546, 40581, 34220, 23546, 41122, 29193, 49795, 34228, 47262, 37494, 29549, 41774, 37514, 42784, 22904, 45886, 37530, 38036, 37570, 36188, 37589, 23034, 37618, 28342, 23546, 23546, 23546, 23546, 50126, 23546, 23546, 23546, 23546, 23546, 48975, 28498, 44484, 47563, 28434, 44023, 37641, 37671, 39810, 30349, 22824, 39853, 47704, 29645, 22804, 49383, 22804, 37657, 33201, 23546, 23546, 50909, 37693, 23546, 32019, 38379, 23546, 23546, 23546, 48976, 47563, 47563, 46474, 32220, 37710, 22821, 22824, 22824, 49321, 37734, 37761, 35849, 22804, 22804, 37788, 37809, 29879, 33195, 23546, 37872, 23546, 23546, 37889, 23546, 23546, 23546, 47562, 27357, 47563, 47563, 27195, 22821, 40293, 22824, 22824, 22824, 30376, 34247, 22804, 22804, 22804, 29883, 33199, 37910, 31075, 23546, 37928, 47744, 48973, 37953, 47563, 47563, 37979, 38003, 22824, 22824, 38027, 38061, 22804, 22804, 38085, 47447, 23404, 23546, 28599, 23546, 47560, 31782, 47563, 23113, 38011, 22824, 33078, 33721, 22804, 31970, 23546, 21592, 23546, 22586, 47563, 50097, 23109, 22824, 40810, 22804, 22804, 38110, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 33290, 45056, 38132, 38158, 38179, 33552, 39426, 27505, 38215, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23648, 23546, 26527, 23546, 26305, 23546, 23546, 29594, 20530, 20539, 38250, 38264, 38273, 38289, 38300, 26364, 23546, 23948, 23546, 35799, 23546, 34320, 23546, 23546, 23546, 23948, 23546, 35554, 36579, 23947, 35559, 38316, 33588, 36393, 38336, 43066, 27800, 23546, 23546, 38357, 44844, 23546, 39344, 42555, 23546, 39071, 23546, 23546, 38375, 41192, 48530, 47563, 47812, 38395, 28750, 22824, 42121, 31482, 43762, 38449, 22804, 38419, 38440, 32050, 38473, 38509, 46688, 34783, 23546, 23546, 23546, 23546, 23546, 38530, 23546, 23546, 48975, 47883, 38550, 42949, 47563, 37135, 22823, 38568, 30084, 22824, 22824, 49439, 42031, 34293, 41837, 22804, 22804, 29885, 33201, 23546, 38929, 23546, 38602, 23546, 44369, 37873, 23791, 38621, 23546, 48976, 27031, 38642, 47563, 38659, 47564, 38683, 47916, 22824, 22824, 38702, 33843, 35849, 39277, 22804, 33804, 38724, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 36556, 23546, 23546, 23546, 23546, 47560, 38744, 47563, 30559, 22824, 22824, 46066, 22804, 22804, 31970, 23546, 23546, 49685, 22586, 47563, 47563, 23109, 47427, 22825, 22804, 35452, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 38761, 47561, 38782, 38802, 43621, 23464, 38824, 38844, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 38045, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23810, 23546, 46101, 23546, 29522, 38860, 33103, 38895, 38945, 38984, 38970, 38989, 38954, 39005, 39016, 26204, 23546, 24981, 39032, 39052, 39135, 26183, 26715, 27157, 23546, 39087, 39123, 35972, 23871, 39151, 32436, 39187, 39222, 39262, 39312, 39360, 27800, 27271, 23546, 23546, 40856, 29748, 35256, 26269, 47340, 39386, 28121, 33483, 41086, 39406, 48539, 39200, 45029, 47563, 29260, 30036, 22824, 47369, 43762, 41883, 39448, 22787, 22804, 32852, 39469, 27673, 33624, 23546, 39492, 23546, 23546, 30166, 23546, 19760, 23546, 25974, 48975, 39514, 47563, 47563, 47563, 37135, 37987, 39541, 30332, 22824, 22824, 49439, 34278, 22804, 48403, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 49277, 23546, 23546, 39561, 44662, 39580, 20000, 47563, 47563, 38745, 47563, 41583, 39601, 22824, 22824, 42751, 22824, 39625, 36344, 22804, 22804, 49650, 22804, 39663, 33195, 39390, 39701, 21803, 40964, 23546, 28563, 39737, 39764, 42864, 39780, 30015, 27711, 27195, 22821, 39796, 39832, 37838, 39869, 30376, 37543, 39886, 39910, 39936, 47724, 39958, 49087, 33227, 48840, 39980, 40013, 20680, 50204, 40049, 40067, 40083, 45419, 22824, 40109, 40125, 36765, 22804, 40151, 40167, 47447, 40217, 23546, 23546, 19121, 40241, 48114, 40263, 48445, 44596, 40286, 40309, 42808, 40330, 30581, 40353, 23546, 23546, 40374, 28485, 40396, 27517, 40433, 40468, 40722, 40488, 31964, 30114, 48477, 40517, 36058, 24761, 45115, 30673, 40537, 36549, 40555, 19020, 29663, 30673, 40603, 40652, 40668, 40708, 40752, 40779, 40802, 40826, 40849, 24756, 33030, 33551, 47559, 33030, 33552, 40872, 40899, 22729, 23448, 40923, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 40939, 26527, 23546, 35150, 40960, 23546, 26932, 40980, 40989, 41005, 41019, 41028, 41044, 41055, 26204, 41071, 27176, 35142, 41110, 22748, 41145, 23546, 41180, 29961, 41225, 35127, 41274, 41299, 41335, 41350, 41366, 41401, 41487, 41458, 41474, 41503, 23546, 18442, 27630, 46235, 23546, 41314, 19147, 41528, 40358, 23546, 23546, 45375, 22587, 47563, 36909, 41568, 47891, 27418, 38686, 27953, 41607, 41630, 22804, 23213, 41665, 46983, 39677, 36943, 23546, 45937, 23546, 37118, 23546, 39337, 41681, 33824, 35058, 38605, 23546, 41717, 41752, 28167, 41769, 47563, 43475, 41790, 42050, 41800, 22824, 22824, 41816, 41853, 50302, 41874, 22804, 49204, 29885, 47656, 41907, 23546, 38879, 36785, 23546, 23546, 23546, 23546, 23546, 39036, 48976, 47563, 46791, 34008, 47563, 47564, 22821, 22824, 44589, 46895, 22824, 22767, 35849, 22804, 41937, 38457, 22804, 29879, 33195, 23546, 23546, 49550, 23546, 45766, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 32301, 41958, 22824, 22824, 22824, 46046, 28243, 22804, 22804, 22804, 22804, 41977, 33199, 20951, 42005, 23546, 23546, 23546, 44350, 47563, 31827, 47563, 41591, 22824, 49433, 22824, 28884, 22804, 42026, 22804, 30403, 31211, 23546, 23546, 23546, 23546, 27328, 40247, 47563, 27241, 38708, 22824, 42285, 31924, 22804, 29685, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 22739, 46606, 49667, 46712, 38403, 42047, 44103, 22804, 44463, 42066, 42221, 42103, 42137, 42175, 42210, 42248, 42276, 42301, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 35697, 39426, 36136, 22729, 23448, 42329, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 26377, 26527, 23546, 23546, 42378, 33354, 42400, 20758, 23546, 26429, 42436, 42448, 42464, 42475, 26204, 23546, 23546, 25120, 35799, 23546, 23546, 23546, 31573, 31305, 23546, 23546, 31567, 25118, 23546, 48973, 37963, 23115, 42491, 47011, 42515, 27800, 23546, 42549, 23546, 44844, 23546, 38766, 18352, 23546, 39064, 23546, 23546, 22159, 22587, 48548, 38163, 45793, 48521, 47316, 42571, 42591, 47404, 42609, 44147, 39942, 22845, 35499, 47057, 42343, 42636, 23546, 42657, 23546, 42010, 42641, 26759, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 36917, 47563, 37135, 22823, 22824, 22824, 42693, 22824, 49439, 22804, 22804, 28847, 22804, 22804, 29885, 45066, 44270, 23546, 42713, 23546, 23546, 26553, 42677, 42730, 31574, 23546, 48976, 47563, 48931, 47563, 47563, 47564, 42748, 22824, 42767, 22824, 22824, 34180, 35849, 22804, 42800, 22804, 22804, 29879, 33195, 23546, 44983, 23546, 23546, 23546, 23546, 42824, 23546, 47562, 47563, 36034, 47563, 27749, 22821, 22824, 22824, 42844, 22824, 48373, 22804, 22804, 38192, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 18259, 23546, 23546, 42862, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 39325, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 48281, 42880, 42913, 28181, 33529, 39296, 42936, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 38514, 23546, 23546, 23546, 44073, 44076, 50916, 44069, 36233, 42971, 33598, 40201, 40539, 43066, 29275, 42987, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 43004, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 43023, 22824, 22824, 22824, 22824, 43497, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 30422, 47563, 23109, 38579, 22825, 32685, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 22195, 38234, 23546, 23546, 22088, 23546, 31645, 43040, 31695, 43090, 43103, 43112, 43128, 43139, 26204, 23546, 31341, 32732, 35799, 43366, 43155, 43175, 36087, 40692, 50768, 31673, 43193, 32904, 31522, 31081, 43243, 43271, 43287, 43315, 43342, 40683, 23546, 23546, 23546, 45381, 43358, 40568, 43382, 43400, 43418, 23546, 23546, 30119, 43208, 47563, 43442, 27364, 43462, 43491, 28908, 22824, 43513, 43557, 22804, 43588, 41858, 43607, 43637, 43676, 23546, 23546, 23546, 18266, 35576, 23546, 23546, 43699, 43717, 43736, 20331, 32703, 47563, 41378, 47563, 46720, 41989, 43754, 29628, 22824, 22824, 43651, 43778, 43812, 46171, 22804, 44212, 43831, 43879, 33201, 23546, 23546, 45346, 23546, 43914, 43941, 23546, 27809, 23863, 43976, 44003, 47563, 48620, 44039, 35181, 49990, 44092, 22824, 45449, 39545, 44119, 42697, 44138, 22804, 44163, 27998, 44211, 35734, 33195, 39171, 23546, 23546, 23067, 44228, 32012, 23546, 44255, 36870, 46433, 23003, 47563, 27195, 22821, 44297, 46134, 22824, 22824, 30376, 39647, 22804, 44322, 22804, 41442, 44340, 23546, 44366, 44385, 23546, 23546, 34339, 44404, 47563, 47563, 44422, 22824, 22824, 22824, 44438, 22804, 22804, 22804, 44454, 47447, 48298, 23546, 23546, 23546, 44479, 47563, 47563, 46130, 22824, 22824, 44500, 22804, 22804, 44520, 23546, 40027, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 38094, 49704, 44555, 44579, 44612, 44650, 23464, 24759, 33031, 33550, 44685, 30652, 34420, 36724, 24756, 33030, 33551, 47559, 33030, 45310, 44716, 44744, 32641, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 25786, 26527, 44778, 28976, 18999, 44795, 44824, 44860, 44808, 44885, 44899, 44911, 44927, 44938, 26204, 44954, 40587, 23546, 44971, 23546, 23546, 43960, 23546, 50132, 23546, 45006, 35089, 26325, 35096, 32207, 45025, 45045, 44306, 45082, 45103, 27800, 35987, 37200, 44669, 44844, 34640, 23546, 23546, 23546, 23546, 45137, 45172, 23546, 19324, 45188, 43446, 47563, 47563, 45233, 45249, 45268, 22824, 43762, 45291, 40314, 22804, 22804, 39677, 36943, 37912, 23546, 23546, 45326, 45362, 23546, 23546, 23546, 23546, 23546, 37055, 48975, 48512, 31834, 47563, 47563, 46028, 22823, 45397, 45415, 22824, 22824, 36333, 38728, 44324, 22804, 22804, 22804, 45435, 33201, 23546, 23546, 26251, 43720, 23546, 45465, 26758, 45484, 45504, 23546, 45539, 47563, 47563, 47285, 43856, 45576, 45600, 22824, 22824, 47994, 48169, 45624, 45661, 22804, 22804, 42152, 45681, 29879, 45697, 45713, 45733, 23546, 25942, 23546, 23546, 30214, 45754, 47562, 47563, 27730, 45789, 27195, 22821, 22824, 47619, 47969, 22824, 30376, 22804, 22804, 45809, 22804, 29883, 33199, 23546, 21039, 23546, 49467, 37049, 48973, 47563, 45851, 48716, 45584, 47934, 22824, 45868, 48003, 35869, 22804, 45910, 30403, 47447, 23546, 48332, 18869, 22345, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 32000, 21288, 23546, 45931, 45953, 47563, 37498, 23109, 22824, 40444, 22804, 34438, 36455, 45997, 44634, 19558, 46021, 50382, 46044, 28056, 22804, 34468, 46609, 35619, 30711, 46062, 46082, 23464, 24759, 33031, 33550, 19538, 36296, 49945, 23141, 46117, 38586, 45823, 48503, 46150, 46187, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23737, 26527, 23546, 23546, 34968, 23546, 46215, 26881, 26893, 46251, 46267, 46279, 46295, 46306, 26204, 46322, 23241, 25565, 35799, 25341, 42889, 46340, 22204, 44869, 46352, 46368, 46377, 46393, 46349, 46420, 46455, 46490, 46547, 46518, 46534, 32867, 46005, 19766, 34600, 44844, 46563, 23546, 26188, 46580, 41258, 46596, 46625, 46675, 46736, 46784, 46807, 46842, 38552, 46877, 45877, 46911, 46944, 36419, 46977, 46999, 47027, 27557, 39677, 37035, 47093, 47115, 35228, 23546, 47139, 47174, 23546, 47766, 23546, 49770, 47192, 20591, 47219, 47244, 47278, 38643, 47301, 41736, 47356, 47391, 47426, 31459, 49439, 36524, 39920, 40135, 22804, 35492, 33058, 47443, 23546, 20251, 43007, 37694, 47465, 46324, 47491, 47518, 23546, 47535, 47555, 39525, 47841, 47563, 34125, 47580, 47616, 47635, 39844, 22824, 37169, 48362, 35849, 47672, 47697, 22804, 41891, 47720, 33195, 23058, 47740, 23546, 45516, 47760, 23546, 47782, 18627, 47798, 50186, 47833, 47857, 27195, 47907, 47932, 47950, 47985, 48036, 39636, 46165, 37602, 50472, 50517, 37554, 27477, 48056, 18311, 23546, 35780, 48076, 48095, 44700, 47563, 47563, 48130, 48155, 37677, 22824, 48203, 48236, 49183, 22804, 48272, 47447, 18372, 48297, 48314, 48330, 41202, 45981, 33877, 34811, 48348, 48040, 48397, 48419, 37793, 31970, 48467, 23546, 23546, 48493, 46466, 31618, 34505, 49612, 47069, 35443, 43299, 48564, 28304, 47475, 19993, 48611, 37364, 48636, 48669, 43591, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 44177, 29729, 48685, 36498, 48701, 45275, 48737, 39426, 42307, 22729, 39685, 48765, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 48828, 23546, 23546, 48856, 23546, 35941, 30944, 30953, 48876, 30953, 30962, 48892, 48903, 26204, 23546, 23546, 23546, 40636, 23546, 26348, 23546, 23546, 23546, 23546, 26345, 23546, 38923, 23546, 48973, 48919, 48178, 48947, 38808, 37005, 31513, 38873, 23546, 23546, 44844, 23546, 23546, 27897, 48963, 23546, 23546, 23546, 23546, 48971, 46750, 47563, 47563, 34356, 48992, 22824, 22824, 22824, 36305, 49028, 22804, 22804, 22804, 49052, 44728, 49080, 23546, 49103, 45341, 23546, 23546, 42732, 48802, 47595, 38359, 35596, 48975, 47563, 49130, 41385, 43221, 47228, 22823, 48595, 46928, 41415, 49146, 49164, 22804, 49199, 49220, 45915, 29388, 37824, 33201, 23546, 25346, 23546, 26261, 23546, 23546, 23546, 49474, 23546, 23546, 48976, 33503, 47563, 47563, 47563, 47564, 49236, 37414, 22824, 22824, 22824, 22767, 49255, 36180, 22804, 22804, 22804, 29879, 33195, 49272, 23546, 49293, 23546, 23546, 23546, 23546, 28581, 36243, 47563, 47563, 47563, 27195, 49311, 22824, 22824, 22824, 22824, 37772, 22804, 22804, 22804, 22804, 29883, 46502, 23546, 23546, 50321, 46564, 23546, 30276, 23289, 47563, 47563, 37718, 49344, 22824, 22824, 30514, 49377, 22804, 22804, 42620, 47447, 39101, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 46439, 24761, 43524, 30673, 49399, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 49418, 45121, 44624, 47559, 33030, 33552, 39426, 32368, 49455, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 49490, 49547, 33412, 49525, 23546, 34105, 23546, 33409, 49544, 42420, 41283, 49566, 49577, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 49593, 35299, 27962, 22805, 43066, 27800, 23546, 33329, 27613, 44844, 23546, 23546, 23546, 23546, 23546, 32481, 23546, 23546, 22587, 32570, 47563, 46861, 47563, 27418, 49610, 22824, 32331, 43762, 42159, 22804, 27215, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 37318, 23546, 23546, 23546, 20322, 23546, 48975, 47563, 47563, 49628, 47563, 37135, 22823, 22824, 32615, 22824, 22824, 49439, 22804, 22804, 49645, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 49666, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 49683, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 49701, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 49720, 23546, 50953, 23546, 25809, 49755, 49786, 23546, 49811, 49825, 49837, 49853, 49864, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 27387, 22824, 49893, 38199, 49880, 34211, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 42672, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 49917, 23546, 23546, 23546, 22167, 47563, 47563, 47563, 47563, 47564, 49936, 22824, 22824, 22824, 22824, 22767, 49969, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 45149, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 49988, 47563, 50006, 22821, 22824, 48578, 22824, 41424, 30376, 22804, 39894, 22804, 32389, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 26445, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 41512, 50052, 50063, 26204, 23546, 23546, 23546, 35799, 50079, 30464, 23546, 23546, 23546, 23546, 32774, 23546, 41129, 32770, 46701, 50096, 40191, 28190, 22805, 43066, 27800, 23546, 23546, 23546, 50113, 28719, 34485, 45773, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 29611, 47563, 27026, 27418, 22824, 35645, 28383, 43762, 22804, 22921, 22804, 48250, 39677, 50148, 50164, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 41250, 23546, 23546, 23546, 48976, 47563, 47563, 50184, 47563, 45852, 22821, 22824, 38786, 22824, 22824, 45252, 35849, 22804, 48256, 22804, 22804, 29879, 33195, 48079, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 50202, 47563, 47563, 27195, 22821, 50220, 22824, 22824, 22824, 30376, 48220, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 21798, 23546, 23546, 35799, 23546, 23546, 46652, 23546, 23546, 23546, 23546, 46656, 23546, 23546, 50246, 28439, 22824, 50294, 36350, 50281, 47331, 23546, 29448, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 35817, 22587, 47563, 47563, 47563, 27723, 27418, 22824, 22824, 27861, 43762, 22804, 22804, 22804, 48212, 39677, 36943, 23546, 50318, 23546, 23546, 23546, 23546, 23546, 23546, 37099, 23546, 23546, 48975, 38667, 47563, 36014, 47563, 37135, 22823, 50337, 22824, 46961, 22824, 49439, 28018, 22804, 22804, 50356, 22804, 29885, 33201, 23546, 43738, 23546, 23546, 23546, 23546, 23546, 38534, 23546, 23546, 48976, 47563, 50376, 47563, 47563, 47564, 50398, 41961, 50424, 22824, 22824, 22767, 50443, 28403, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 21488, 23546, 47562, 47563, 31747, 47563, 34161, 22821, 22824, 43024, 22824, 22824, 50464, 22804, 22804, 50488, 22804, 43844, 33199, 23546, 23546, 18921, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 31241, 23546, 23546, 39165, 23546, 29133, 47563, 47563, 33578, 22824, 22824, 50509, 22804, 22804, 31970, 23546, 49295, 23546, 22586, 47563, 31161, 23109, 50427, 22825, 22804, 41830, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22677, 23546, 23546, 23546, 23546, 26527, 23546, 23546, 23546, 23546, 21369, 21483, 23546, 23546, 23546, 19262, 39432, 32077, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27800, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 27418, 22824, 22824, 22824, 43762, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 46404, 21767, 21765, 32117, 22038, 50563, 21058, 21061, 50533, 22036, 50551, 50579, 50591, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 50607, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50637, 19916, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 50655, 18544, 18567, 18590, 19934, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 22150, 23546, 21369, 20766, 50679, 50692, 50708, 50717, 49509, 50740, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 51042, 23546, 23546, 23546, 23761, 23546, 23546, 23758, 25629, 19208, 50639, 19926, 50639, 50790, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 18521, 18544, 18567, 18590, 50663, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 42087, 23546, 23546, 23546, 23546, 22568, 29910, 50839, 50872, 50878, 50849, 23148, 50894, 20967, 23546, 23546, 23546, 35799, 23546, 23546, 50932, 23546, 23546, 22686, 23546, 23546, 23546, 22682, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 18327, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 50969, 18544, 18567, 18590, 21689, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 20159, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 20376, 20392, 51127, 20418, 50802, 20462, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 21089, 23546, 23546, 23546, 23546, 25841, 23546, 23546, 23546, 23546, 21369, 23546, 23546, 23546, 23546, 23546, 23546, 23489, 26204, 23546, 23546, 23546, 35799, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 22824, 35842, 22805, 43066, 27132, 23546, 23546, 23546, 44844, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22587, 47563, 47563, 47563, 47563, 22603, 22824, 22824, 22824, 34828, 22804, 22804, 22804, 22804, 39677, 36943, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48975, 47563, 47563, 47563, 47563, 37135, 22823, 22824, 22824, 22824, 22824, 49439, 22804, 22804, 22804, 22804, 22804, 29885, 33201, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 48976, 47563, 47563, 47563, 47563, 47564, 22821, 22824, 22824, 22824, 22824, 22767, 35849, 22804, 22804, 22804, 22804, 29879, 33195, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 47562, 47563, 47563, 47563, 27195, 22821, 22824, 22824, 22824, 22824, 30376, 22804, 22804, 22804, 22804, 29883, 33199, 23546, 23546, 23546, 23546, 23546, 48973, 47563, 47563, 47563, 45209, 22824, 22824, 22824, 27834, 22804, 22804, 22804, 30403, 47447, 23546, 23546, 23546, 23546, 47560, 47563, 47563, 23113, 22824, 22824, 33078, 22804, 22804, 31970, 23546, 23546, 23546, 22586, 47563, 47563, 23109, 22824, 22825, 22804, 22804, 31964, 47447, 46606, 22585, 47563, 24761, 22824, 30673, 22804, 36549, 46609, 47561, 23111, 30673, 39296, 23464, 24759, 33031, 33550, 48975, 23107, 30672, 23141, 24756, 33030, 33551, 47559, 33030, 33552, 39426, 42307, 22729, 23448, 23351, 23363, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 22457, 23546, 23546, 22482, 50993, 50998, 50998, 51019, 22480, 51014, 51035, 23546, 23546, 23546, 23546, 23546, 23546, 51042, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 25629, 19208, 50639, 19926, 50639, 20660, 19723, 18282, 18849, 18305, 51062, 23546, 23546, 18368, 23546, 18915, 18388, 18432, 18458, 18463, 18479, 18968, 18495, 19670, 50655, 18544, 18567, 18590, 19934, 18528, 18551, 18574, 18597, 20868, 18620, 23546, 30606, 23546, 23546, 23546, 23582, 23367, 18643, 23546, 18664, 50036, 18695, 19209, 26024, 18505, 19208, 25377, 18724, 26048, 18745, 18766, 18771, 19889, 50639, 26053, 18750, 50639, 18776, 19839, 20674, 23546, 18792, 18808, 18830, 23628, 18814, 18865, 23546, 44195, 18885, 18937, 18958, 20812, 26011, 20051, 18984, 19036, 19054, 19072, 19090, 26127, 19108, 19038, 19056, 19074, 19092, 26129, 18604, 20668, 23396, 19137, 19171, 19225, 39246, 19278, 47150, 19314, 19340, 26667, 19186, 19380, 19422, 19456, 25721, 19477, 25754, 19498, 19451, 25716, 19472, 25749, 19493, 19514, 19530, 18900, 19554, 23717, 19574, 19592, 19632, 19657, 20190, 20797, 20402, 21452, 19692, 19708, 19964, 21452, 19692, 19708, 20432, 19853, 26492, 19746, 41094, 19782, 18942, 19201, 19798, 19825, 19883, 19905, 19950, 19883, 19905, 19980, 23977, 20842, 20016, 18679, 20827, 20042, 20067, 20090, 20113, 20074, 20097, 20129, 20446, 51082, 20175, 20206, 20222, 51139, 20274, 51143, 20301, 51098, 20392, 51127, 20418, 50802, 51114, 25380, 50639, 18729, 32258, 26037, 20489, 20515, 19641, 20555, 20577, 20616, 20632, 20648, 20696, 20727, 20743, 20782, 20858, 20884, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 23546, 94503, 94503, 90406, 90406, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 1, 12290, 3, 0, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 362, 94503, 90406, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 0, 94503, 90406, 94503, 94503, 94503, 94503, 94503, 94503, 94503, 69632, 73728, 94503, 94503, 94503, 94503, 94503, 65536, 94503, 0, 2183168, 0, 0, 0, 90406, 94503, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 2985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, 0, 0, 0, 0, 0, 1637, 0, 0, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2904064, 2908160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2751, 0, 0, 0, 0, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 362, 362, 0, 0, 0, 0, 0, 0, 2997, 0, 0, 0, 0, 3001, 0, 0, 0, 0, 0, 0, 1186, 0, 0, 0, 1191, 0, 0, 0, 0, 1107, 0, 0, 0, 2138112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2978, 0, 0, 0, 2424832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2625536, 0, 0, 0, 0, 0, 172032, 0, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 1, 12290, 3, 0, 2699264, 2715648, 0, 0, 2772992, 2805760, 2830336, 0, 2863104, 2920448, 0, 0, 0, 0, 0, 0, 0, 1114, 0, 0, 0, 0, 1118, 0, 0, 1121, 0, 2805760, 2920448, 0, 0, 0, 0, 0, 2920448, 0, 0, 0, 0, 0, 0, 0, 2732032, 0, 2179072, 2179072, 2179072, 2424832, 2433024, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2625536, 2805760, 2179072, 2830336, 2179072, 2179072, 2863104, 2179072, 2179072, 2179072, 2920448, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2801664, 2813952, 2179072, 2838528, 2179072, 2179072, 2179072, 2179072, 2179072, 0, 914, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2625536, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2625536, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2699264, 2125824, 2715648, 2125824, 2723840, 2125824, 2732032, 2772992, 2125824, 2125824, 2125824, 2723840, 2125824, 2732032, 2772992, 2125824, 2125824, 2125824, 2805760, 2125824, 2830336, 2125824, 2125824, 2863104, 2125824, 2125824, 2125824, 2125824, 2920448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2920448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3117056, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3207168, 2125824, 2125824, 2179072, 2125824, 2125824, 2125824, 2125824, 2457600, 2125824, 2125824, 2125824, 2125824, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2375680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 0, 0, 0, 0, 0, 0, 2408448, 0, 0, 2584576, 0, 0, 0, 0, 2838528, 0, 0, 2838528, 0, 0, 0, 0, 0, 2469888, 2506752, 2756608, 0, 0, 2580480, 0, 0, 0, 2396160, 2400256, 2412544, 0, 0, 2838528, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2408448, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 914, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 0, 2125824, 2125824, 2125824, 2408448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 2502656, 0, 0, 3010560, 2125824, 2125824, 2125824, 2125824, 2125824, 2662400, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2801664, 2813952, 2125824, 2838528, 2125824, 2801664, 2813952, 2125824, 2838528, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3125248, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2461696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2600960, 0, 2674688, 0, 2768896, 2777088, 2781184, 0, 2822144, 0, 0, 2883584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3055616, 0, 0, 0, 3080192, 3100672, 3104768, 0, 0, 0, 0, 3186688, 0, 0, 0, 0, 0, 0, 0, 3182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2732032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3133440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3003, 3004, 0, 2719744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3014656, 3207168, 0, 2691072, 0, 0, 0, 0, 0, 2818048, 2846720, 0, 2916352, 0, 0, 3002368, 0, 0, 3022848, 0, 0, 0, 0, 0, 2871296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2766, 0, 0, 0, 0, 0, 3215360, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2494464, 2179072, 2179072, 2514944, 2179072, 2179072, 2461696, 2465792, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2523136, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2699264, 2179072, 2715648, 2179072, 2723840, 2179072, 2732032, 2772992, 2179072, 2179072, 3100672, 2179072, 2179072, 3133440, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3207168, 2179072, 0, 0, 0, 0, 391, 392, 0, 393, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 3504, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3399, 540, 540, 0, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2461696, 2465792, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2523136, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2600960, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2641920, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2719744, 2125824, 2125824, 2125824, 2125824, 2125824, 2768896, 2777088, 2768896, 2777088, 2125824, 2797568, 2822144, 2125824, 2125824, 2125824, 2883584, 2125824, 2912256, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3133440, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3207168, 2125824, 0, 0, 0, 0, 0, 0, 3011, 0, 0, 0, 0, 0, 0, 3018, 0, 0, 0, 0, 2605056, 0, 0, 0, 0, 2887680, 0, 2924544, 0, 0, 0, 0, 0, 0, 0, 1135, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3162112, 3170304, 0, 0, 3219456, 3035136, 0, 0, 0, 0, 0, 3072000, 2650112, 2179072, 2179072, 2179072, 2707456, 2179072, 2736128, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2887680, 2179072, 2179072, 2543616, 2547712, 2179072, 2179072, 2596864, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2584576, 0, 0, 2809856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3088384, 0, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 2112, 0, 0, 0, 0, 0, 1680, 1681, 0, 1683, 0, 0, 0, 0, 0, 0, 0, 540, 561, 540, 561, 540, 540, 561, 540, 585, 0, 0, 2576384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2420736, 0, 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 3121152, 3141632, 0, 0, 0, 2924544, 0, 2682880, 0, 0, 0, 0, 0, 0, 0, 1242, 1272, 1273, 0, 1242, 0, 540, 540, 540, 3112960, 2387968, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2453504, 2179072, 2473984, 2482176, 2179072, 2179072, 2179072, 2179072, 2179072, 3010560, 2179072, 2179072, 2126737, 2126737, 2503569, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2532241, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2605969, 2126737, 2924544, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3035136, 2179072, 2179072, 3072000, 2179072, 2179072, 2179072, 3137536, 2126737, 2126737, 2499473, 2126737, 2126737, 2126737, 2556817, 2565009, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3224465, 0, 0, 2126810, 2126810, 2126810, 2126810, 2126810, 2446298, 2126810, 3121152, 2179072, 2179072, 3141632, 2179072, 2179072, 2179072, 3170304, 2179072, 2179072, 3190784, 3194880, 2179072, 0, 0, 0, 0, 0, 0, 3181, 0, 0, 0, 3184, 3185, 3186, 0, 0, 3189, 3194880, 2125824, 0, 0, 0, 0, 0, 0, 2387968, 2125824, 2125824, 2420736, 2125824, 2125824, 2125824, 2125824, 2125824, 2453504, 2125824, 2473984, 2482176, 2125824, 2125824, 2125824, 2605056, 2125824, 2629632, 2125824, 2125824, 2650112, 2125824, 2125824, 2125824, 2707456, 2125824, 2736128, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3035136, 2125824, 2125824, 3072000, 2125824, 2125824, 3121152, 2125824, 2125824, 3141632, 2125824, 2125824, 2125824, 3170304, 2125824, 2125824, 3190784, 2125824, 3170304, 2125824, 2125824, 3190784, 3194880, 2125824, 2125824, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 3112960, 3219456, 2125824, 2125824, 3112960, 3219456, 2125824, 2125824, 3112960, 3219456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3507, 540, 540, 540, 540, 540, 540, 0, 3145728, 0, 3203072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3314, 0, 540, 0, 3067904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172032, 0, 0, 0, 0, 2895872, 0, 0, 0, 2445312, 0, 2842624, 0, 0, 0, 2637824, 0, 0, 0, 0, 432, 0, 0, 0, 329, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 0, 0, 0, 2621440, 0, 3182592, 2899968, 0, 2961408, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2592768, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2445312, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2551808, 2179072, 2179072, 2179072, 2179072, 2179072, 3117056, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2126737, 2637824, 2125824, 2125824, 2125824, 2125824, 2727936, 2752512, 2125824, 2125824, 2125824, 2125824, 2842624, 2846720, 2125824, 2895872, 2916352, 2125824, 2125824, 2945024, 2125824, 2125824, 2994176, 2125824, 3002368, 2125824, 2125824, 3022848, 2125824, 3067904, 3084288, 3096576, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2442, 2443, 0, 0, 2446, 0, 0, 0, 0, 0, 2928640, 0, 0, 0, 3059712, 0, 2543616, 2666496, 0, 2633728, 0, 0, 0, 0, 0, 1697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 0, 2494464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3211264, 2179072, 2928640, 2179072, 2179072, 2179072, 2998272, 2179072, 2179072, 2179072, 2179072, 3059712, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 0, 0, 2126737, 2126737, 2126737, 2126737, 2126737, 2446225, 2126737, 2179072, 3178496, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2494464, 2125824, 2125824, 2514944, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 2510848, 2514944, 0, 0, 2547712, 2596864, 0, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 2113, 0, 2125824, 2543616, 2547712, 2125824, 2125824, 2596864, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 2125824, 2125824, 2125824, 2408448, 2125824, 2928640, 2125824, 2125824, 2125824, 2998272, 2125824, 2125824, 2125824, 2125824, 3059712, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 2125824, 2126811, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 2125824, 2125824, 2125824, 2125824, 2424832, 2125824, 3178496, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2494464, 2125824, 2125824, 2514944, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 2125824, 3178496, 2125824, 2179072, 2125824, 2125824, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2441216, 0, 0, 0, 0, 0, 0, 3311, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 2165, 540, 540, 540, 540, 0, 0, 0, 2740224, 0, 0, 0, 0, 0, 2793472, 0, 0, 0, 0, 0, 0, 0, 1244, 0, 0, 0, 0, 1247, 0, 1194, 0, 2646016, 2179072, 2179072, 2695168, 2756608, 2179072, 2179072, 2179072, 2932736, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3039232, 2179072, 3063808, 2179072, 2179072, 2179072, 2179072, 3129344, 2179072, 2179072, 3153920, 3166208, 3174400, 2396160, 2400256, 2125824, 2125824, 2441216, 2125824, 2469888, 2125824, 2125824, 2125824, 2519040, 2125824, 2125824, 2125824, 2125824, 2588672, 2125824, 2519040, 2125824, 2125824, 2125824, 2125824, 2588672, 2125824, 2613248, 2646016, 2125824, 2125824, 2695168, 2756608, 2125824, 2125824, 2125824, 2125824, 2932736, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2932736, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3129344, 2125824, 2125824, 3153920, 3166208, 3174400, 2396160, 2125824, 2125824, 3129344, 2125824, 2125824, 3153920, 3166208, 3174400, 2125824, 2506752, 2506752, 2506752, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 987, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 3176, 0, 0, 0, 0, 2953216, 0, 0, 2826240, 3158016, 2437120, 0, 2785280, 0, 0, 0, 2428928, 0, 3018752, 2764800, 2572288, 0, 0, 3051520, 2179072, 2179072, 2637824, 2179072, 2179072, 2179072, 2179072, 2727936, 2752512, 2179072, 2179072, 2179072, 2842624, 2846720, 2179072, 2916352, 2428928, 2437120, 2179072, 2486272, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2654208, 2678784, 2760704, 2764800, 2854912, 2969600, 2179072, 3006464, 2179072, 3018752, 2179072, 2179072, 2179072, 3149824, 2125824, 2428928, 2437120, 2125824, 2486272, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 2043, 2044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2140, 0, 0, 0, 0, 0, 0, 2125824, 3018752, 2125824, 2125824, 2125824, 3149824, 2125824, 2428928, 2437120, 2125824, 2486272, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 24576, 987, 2125824, 2125824, 2125824, 2125824, 2424832, 2125824, 3149824, 2125824, 2179072, 3051520, 2125824, 3051520, 2125824, 3051520, 0, 2490368, 2498</string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAABA=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="16" aka="AAAAAAAAABA=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>560, 0, 0, 0, 0, 0, 0, 304, 0, 204800, 0, 0, 0, 0, 0, 0, 0, 0, 1713, 0, 0, 0, 0, 0, 0, 0, 0, 1727, 0, 0, 0, 0, 0, 0, 0, 0, 2068, 0, 0, 0, 0, 0, 0, 0, 0, 2095, 0, 0, 0, 0, 0, 0, 0, 0, 2107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2875392, 0, 0, 0, 3176, 0, 0, 2834432, 0, 3227648, 2568192, 0, 0, 0, 0, 2564096, 0, 2940928, 2179072, 2179072, 2498560, 2179072, 2179072, 2179072, 2555904, 2564096, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3137536, 2125824, 2125824, 2498560, 2125824, 2125824, 2125824, 2555904, 2564096, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 2125824, 2179072, 2416640, 2125824, 2125824, 2179072, 2179072, 2125824, 2125824, 0, 2486272, 0, 0, 0, 0, 0, 2678784, 2854912, 3006464, 0, 3108864, 3198976, 0, 0, 2748416, 2879488, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2592768, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2125824, 2125824, 2125824, 2125824, 3010560, 2125824, 2125824, 2125824, 2125824, 2502656, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 296, 0, 0, 0, 296, 0, 297, 0, 0, 0, 2125824, 2125824, 2125824, 3010560, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 2592768, 0, 0, 0, 0, 433, 0, 0, 0, 453, 469, 469, 469, 469, 469, 469, 469, 469, 469, 479, 469, 469, 469, 469, 469, 469, 2125824, 2125824, 2125824, 2125824, 2592768, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 1918, 2125824, 2125824, 2125824, 2408448, 2125824, 2592768, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2449408, 0, 2535424, 3031040, 0, 0, 0, 0, 0, 1734, 0, 1736, 1710, 540, 540, 540, 540, 540, 540, 540, 540, 1816, 1818, 540, 540, 540, 540, 540, 1360, 0, 2859008, 0, 0, 2179072, 2449408, 2179072, 2535424, 2179072, 2609152, 2179072, 2859008, 2179072, 2179072, 2179072, 3031040, 2125824, 2449408, 2125824, 2535424, 2125824, 2609152, 2125824, 2859008, 2125824, 2125824, 2125824, 3031040, 2125824, 2449408, 2125824, 2535424, 2125824, 2609152, 2125824, 2859008, 2125824, 2125824, 2125824, 3031040, 2125824, 2527232, 0, 0, 0, 0, 0, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2804, 540, 540, 540, 540, 2527232, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2527232, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2527232, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 1080, 1084, 0, 0, 1088, 2125824, 2125824, 2125824, 2125824, 3092480, 0, 0, 0, 0, 3026944, 2404352, 2179072, 2179072, 2179072, 2179072, 3026944, 2404352, 2125824, 2125824, 2125824, 2125824, 3026944, 2404352, 2125824, 2125824, 2125824, 2125824, 3026944, 2539520, 0, 2949120, 0, 0, 0, 0, 434, 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, 457, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 2179072, 2658304, 2973696, 2179072, 2125824, 2658304, 2973696, 2125824, 2125824, 2658304, 2973696, 2125824, 2711552, 0, 2560000, 2179072, 2179072, 2945024, 2179072, 2179072, 2994176, 2179072, 3002368, 2179072, 2179072, 3022848, 2179072, 3067904, 3084288, 3096576, 2179072, 2179072, 2600960, 2179072, 2179072, 2179072, 2179072, 2641920, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2719744, 2179072, 2179072, 2441216, 2179072, 2469888, 2179072, 2179072, 2179072, 2519040, 2179072, 2179072, 2179072, 2179072, 2588672, 2179072, 2613248, 2703360, 0, 0, 0, 0, 2977792, 0, 0, 3047424, 3129344, 0, 2981888, 2396160, 0, 3153920, 2560000, 2125824, 2560000, 2125824, 0, 2179072, 2125824, 2125824, 0, 2179072, 2125824, 2125824, 0, 2179072, 2125824, 2125824, 2125824, 2457600, 2179072, 2179072, 2179072, 2179072, 2457600, 2125824, 2125824, 2125824, 2985984, 2985984, 2985984, 2985984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249856, 0, 0, 0, 0, 0, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 458, 458, 111050, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 111050, 458, 111050, 111050, 111050, 111050, 111050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2738, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 184723, 184931, 184931, 184931, 0, 184931, 184931, 184931, 184931, 184931, 0, 0, 0, 0, 0, 184931, 0, 184931, 1, 12290, 3, 78112, 1059, 0, 0, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 296, 0, 297, 0, 2125824, 1059, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2750, 0, 0, 0, 0, 2755, 0, 300, 118784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 300, 300, 300, 300, 0, 0, 0, 0, 0, 300, 0, 300, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 33403, 297, 0, 2134016, 49791, 301, 0, 0, 0, 0, 0, 0, 225889, 225889, 225889, 225889, 225740, 225889, 225889, 225889, 225889, 225889, 225740, 225740, 225740, 225740, 225740, 225906, 225740, 225906, 1, 12290, 3, 0, 0, 0, 0, 249856, 0, 0, 0, 249856, 0, 0, 0, 0, 0, 0, 697, 698, 0, 362, 362, 362, 0, 0, 0, 0, 0, 0, 711, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 296, 0, 0, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 57344, 0, 0, 0, 0, 0, 0, 0, 3506, 0, 540, 540, 540, 540, 540, 540, 540, 2530, 540, 540, 540, 540, 540, 540, 540, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 296, 0, 0, 0, 300, 0, 0, 0, 300, 119195, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 0, 0, 0, 0, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3166, 3167, 0, 0, 0, 0, 0, 122880, 0, 122880, 122880, 122880, 0, 0, 0, 0, 0, 122880, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 122880, 122880, 122880, 122880, 0, 122880, 0, 2105629, 12290, 3, 0, 0, 291, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 746, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 69632, 73728, 0, 416, 416, 0, 0, 65536, 416, 1092, 0, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2765, 0, 0, 0, 0, 0, 1824, 2125824, 2125824, 2125824, 2408448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2551808, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 131072, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2507, 0, 0, 0, 0, 0, 131072, 0, 0, 131072, 131072, 0, 0, 0, 0, 0, 0, 131072, 0, 131072, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131072, 0, 131072, 131072, 131072, 131072, 0, 131072, 131072, 131072, 131072, 131072, 0, 0, 0, 0, 0, 131072, 0, 131072, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 135168, 135168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 321, 0, 0, 0, 135168, 0, 0, 135168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3174, 0, 0, 0, 0, 0, 0, 0, 135168, 135168, 135168, 135168, 135168, 135168, 135168, 0, 135168, 135168, 135168, 135168, 135168, 0, 0, 0, 0, 0, 135168, 0, 135168, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118784, 296, 0, 2183168, 0, 0, 0, 0, 0, 636, 637, 0, 2134016, 640, 641, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 1361, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 986, 2125824, 2125824, 2125824, 2125824, 2424832, 0, 301, 139264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 331, 301, 301, 301, 301, 0, 0, 0, 0, 0, 301, 0, 301, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 297, 0, 2183168, 0, 0, 0, 0, 0, 296, 33406, 0, 2134016, 300, 49794, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61440, 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2455, 0, 0, 0, 0, 0, 301, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2779, 0, 0, 0, 0, 0, 298, 298, 143728, 298, 298, 298, 143728, 69632, 73728, 298, 298, 143658, 298, 298, 65536, 298, 298, 0, 0, 298, 298, 143658, 298, 298, 298, 298, 298, 298, 298, 298, 298, 363, 298, 0, 143658, 298, 298, 298, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 298, 298, 298, 298, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 298, 298, 298, 143658, 368, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 143658, 298, 298, 143658, 298, 298, 143658, 143658, 143658, 143658, 143658, 143658, 298, 0, 298, 0, 298, 298, 298, 143658, 298, 298, 298, 298, 298, 298, 298, 298, 298, 143658, 298, 143658, 143658, 143658, 143658, 298, 298, 143658, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 143728, 298, 298, 298, 298, 298, 298, 298, 143658, 143658, 143658, 143658, 143658, 143658, 143728, 143658, 143728, 143728, 143728, 143728, 143728, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 143658, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 90406, 90406, 90406, 90406, 0, 94503, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 2200252, 2200252, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 0, 155648, 155648, 0, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 0, 0, 0, 0, 155648, 0, 0, 0, 0, 0, 0, 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1663, 0, 0, 0, 0, 0, 0, 0, 0, 155648, 0, 0, 155648, 0, 0, 0, 0, 0, 0, 0, 155648, 0, 0, 0, 155648, 155648, 0, 155648, 155648, 0, 12290, 3, 0, 0, 2183168, 126976, 0, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 1146880, 0, 1146880, 0, 0, 0, 0, 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, 0, 0, 540, 2163, 540, 540, 540, 540, 540, 540, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 345, 346, 347, 0, 0, 0, 0, 0, 0, 0, 757, 0, 0, 0, 0, 0, 0, 0, 0, 1156, 0, 0, 0, 0, 0, 0, 0, 159744, 159744, 159744, 0, 0, 159744, 0, 0, 0, 0, 0, 0, 0, 0, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 163840, 159744, 159744, 159744, 163840, 159744, 159744, 159744, 159744, 159744, 0, 0, 0, 0, 0, 0, 0, 0, 25160, 0, 0, 159744, 0, 0, 0, 0, 25160, 25160, 25160, 159744, 25160, 25160, 25160, 25160, 25160, 159744, 159744, 159744, 159744, 25160, 159744, 25160, 1, 12290, 3, 0, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 1, 12290, 3, 0, 167936, 167936, 167936, 0, 0, 167936, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3015, 0, 0, 0, 0, 0, 0, 0, 0, 2138112, 1183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262144, 0, 0, 0, 0, 172032, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172032, 0, 0, 0, 0, 0, 0, 172032, 172032, 0, 172032, 0, 0, 172032, 0, 172032, 0, 172032, 0, 0, 0, 0, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 1, 12290, 3, 0, 172032, 0, 172032, 172032, 0, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106496, 0, 0, 0, 0, 0, 1, 286, 3, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106496, 0, 106496, 0, 0, 0, 0, 106496, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 1, 0, 3, 78112, 176128, 176128, 176128, 0, 0, 176128, 0, 0, 0, 0, 0, 0, 0, 0, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111050, 0, 0, 0, 0, 0, 78112, 290, 0, 634, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 1159168, 414, 414, 0, 0, 0, 0, 0, 414, 0, 1164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 0, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 959, 561, 585, 585, 585, 1490, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1498, 585, 585, 0, 0, 229376, 0, 0, 0, 0, 0, 0, 0, 0, 1686, 0, 0, 0, 0, 0, 0, 404, 404, 404, 404, 0, 404, 404, 404, 404, 404, 0, 0, 0, 0, 0, 404, 0, 404, 1, 12290, 3, 78112, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1155072, 0, 0, 0, 0, 0, 0, 0, 2131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 658, 0, 0, 0, 561, 561, 561, 561, 561, 561, 2250, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 0, 0, 0, 0, 0, 0, 3295, 0, 0, 0, 0, 0, 0, 0, 712, 0, 0, 0, 716, 0, 0, 719, 0, 561, 561, 2287, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 585, 585, 585, 2347, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1514, 585, 585, 2372, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 2671, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1515, 585, 585, 0, 0, 0, 2994, 0, 0, 0, 2998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 540, 3035, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 910, 540, 3075, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1417, 3116, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1501, 0, 0, 3178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3187, 0, 0, 0, 0, 0, 2046, 0, 2149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 1, 12290, 3, 0, 540, 540, 540, 3203, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3211, 540, 540, 540, 540, 540, 2813, 540, 540, 2817, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2555, 540, 540, 540, 540, 540, 540, 3255, 585, 585, 585, 3258, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3266, 585, 561, 0, 1287, 585, 1467, 1376, 540, 540, 1339, 540, 540, 561, 561, 1430, 561, 0, 585, 585, 585, 585, 585, 288, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 2427, 0, 0, 0, 0, 0, 0, 0, 0, 2465, 0, 0, 2468, 0, 0, 0, 0, 0, 0, 0, 0, 3309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 3508, 540, 3509, 540, 540, 540, 3326, 3327, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 961, 561, 585, 585, 585, 3361, 585, 585, 585, 585, 3362, 3363, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 3387, 0, 0, 0, 0, 0, 2092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 561, 3416, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 3425, 585, 585, 585, 585, 585, 585, 1492, 585, 585, 585, 585, 585, 585, 585, 1499, 585, 585, 585, 585, 3431, 585, 585, 585, 585, 3435, 540, 561, 585, 0, 0, 0, 0, 0, 0, 665, 0, 0, 668, 0, 0, 0, 0, 0, 0, 0, 3172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 3450, 540, 540, 540, 540, 540, 2814, 540, 2816, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2233, 540, 540, 540, 540, 540, 0, 561, 561, 561, 3573, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 3538, 585, 585, 3585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 3627, 561, 561, 585, 585, 0, 540, 561, 585, 0, 540, 561, 585, 0, 540, 561, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2662400, 0, 2813952, 78112, 290, 0, 0, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 0, 0, 0, 0, 2473984, 2478080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2134756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12290, 3, 0, 0, 0, 188416, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 540, 540, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 2169, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12290, 3, 78112, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 0, 192971, 0, 1, 12290, 3, 0, 192971, 192971, 192971, 0, 0, 192971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 0, 192971, 192971, 192971, 192971, 192971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2801664, 0, 0, 0, 0, 2142208, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 674, 78112, 290, 0, 0, 0, 0, 0, 296, 297, 0, 299, 300, 301, 0, 0, 0, 0, 0, 0, 2797568, 0, 0, 0, 0, 0, 0, 0, 2850816, 2867200, 0, 0, 740, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 740, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 2029, 0, 2031, 0, 0, 0, 0, 740, 1184, 0, 0, 0, 0, 1188, 0, 0, 0, 0, 0, 0, 0, 1583, 0, 1585, 0, 0, 0, 0, 0, 0, 0, 1661, 1662, 0, 0, 0, 0, 0, 0, 0, 0, 2727936, 0, 0, 0, 3084288, 0, 0, 0, 0, 0, 0, 1577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, 352, 353, 354, 0, 0, 0, 1188, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1150976, 0, 0, 0, 0, 0, 0, 561, 561, 585, 585, 585, 585, 1559, 2029, 0, 0, 0, 0, 1565, 2031, 0, 0, 0, 0, 0, 2120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 2033, 0, 2035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, 337, 338, 561, 561, 2323, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2339, 585, 585, 2342, 0, 304, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 2136, 0, 2138, 0, 0, 0, 0, 0, 0, 0, 0, 791, 817, 0, 817, 812, 0, 0, 0, 0, 0, 0, 204800, 204800, 0, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 205104, 204800, 204800, 205103, 205104, 204800, 205103, 205103, 204800, 204800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 2183801, 0, 0, 0, 0, 0, 296, 297, 151552, 2134016, 300, 301, 0, 212992, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 0, 2200253, 0, 0, 0, 0, 0, 0, 2932736, 2965504, 0, 0, 3076096, 0, 0, 2695168, 3174400, 2646016, 0, 914, 2126737, 2126737, 2126737, 2126737, 2425745, 2433937, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 0, 0, 987, 2126810, 2126810, 2126810, 2126810, 2425818, 2724753, 2126737, 2732945, 2773905, 2126737, 2126737, 2126737, 2806673, 2126737, 2831249, 2126737, 2126737, 2864017, 2126737, 2126737, 2126737, 2126737, 2126737, 2524049, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2601873, 2126737, 2126737, 2921361, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3117969, 2126737, 2126737, 2126737, 2126737, 2593681, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126810, 2126810, 2126810, 2126810, 3093393, 0, 0, 0, 0, 3026944, 2404352, 2179072, 2179072, 2179072, 2179072, 3026944, 2434010, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2626522, 2126810, 2126737, 0, 2179072, 2126810, 2126810, 2126737, 2457600, 2179072, 2179072, 2179072, 2179072, 2458513, 2126737, 2126737, 2126737, 2126737, 2126737, 2626449, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2700177, 2126737, 2716561, 2126737, 2806746, 2126810, 2831322, 2126810, 2126810, 2864090, 2126810, 2126810, 2126810, 2126810, 2921434, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 2179072, 2126810, 2126810, 2126737, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2458586, 2126810, 2126810, 2126810, 2126810, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 395, 0, 0, 0, 321, 0, 0, 2126737, 2126737, 2126737, 2409361, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3126161, 2126737, 2126737, 2126737, 2802577, 2814865, 2126737, 2839441, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126810, 2126810, 2126810, 2126810, 2126810, 2663386, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2802650, 2814938, 2126810, 2839514, 0, 0, 0, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2462609, 2466705, 2126737, 0, 2126810, 2126810, 2126810, 2126810, 2126810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 2769809, 2778001, 2126737, 2798481, 2823057, 2126737, 2126737, 2126737, 2884497, 2126737, 2913169, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2655121, 2679697, 2761617, 2765713, 2786193, 2855825, 2970513, 2126737, 3007377, 2126737, 3134353, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3208081, 2126737, 0, 0, 0, 0, 0, 325, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2462682, 2466778, 2126810, 2126810, 2126810, 2524122, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2601946, 2126810, 2126810, 2126810, 2585562, 2126810, 2126810, 2126810, 2126810, 2126810, 2618330, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2888666, 2126810, 2126810, 2925530, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2642906, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2720730, 2126810, 2126810, 2126810, 2126810, 2126810, 2769882, 2778074, 2126810, 2798554, 2823130, 2126810, 2126810, 2126810, 2884570, 2126810, 2913242, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3126234, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3208154, 2126810, 2126737, 2179072, 2126810, 2126810, 2126737, 0, 0, 0, 2388881, 2126737, 2126737, 2421649, 2126737, 2126737, 2126737, 2126737, 2126737, 2454417, 2126737, 2474897, 2483089, 2630545, 2126737, 2126737, 2651025, 2126737, 2126737, 2126737, 2708369, 2126737, 2737041, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 985, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2552794, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 2126737, 3072913, 2126737, 2126737, 3122065, 2126737, 2126737, 3142545, 2126737, 2126737, 2126737, 3171217, 2126737, 2126737, 3191697, 3195793, 2126737, 0, 0, 0, 0, 0, 0, 2388954, 2126810, 2126810, 2421722, 2126810, 2126810, 2126810, 2126810, 2126810, 3040218, 2126810, 3064794, 2126810, 2126810, 2126810, 2126810, 3101658, 2126810, 2126810, 3134426, 2126810, 2454490, 2126810, 2474970, 2483162, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2532314, 2126810, 2126810, 2126810, 2126810, 3036122, 2126810, 2126810, 3072986, 2126810, 2126810, 3122138, 2126810, 2126810, 3142618, 2126810, 2126810, 2126810, 3171290, 2126810, 2126810, 3191770, 3195866, 2126810, 2126737, 2179072, 2126810, 2126810, 2126737, 2179072, 2179072, 3112960, 3219456, 2126737, 2126737, 3113873, 3220369, 2126810, 2126810, 3113946, 3220442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 2638737, 2126737, 2126737, 2126737, 2126737, 2728849, 2753425, 2126737, 2126737, 2126737, 2126737, 2843537, 2847633, 2126737, 2896785, 2917265, 2638810, 2126810, 2126810, 2126810, 2126810, 2728922, 2753498, 2126810, 2126810, 2126810, 2126810, 2843610, 2847706, 2126810, 2896858, 2917338, 2179072, 3178496, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2495377, 2126737, 2126737, 2515857, 2126737, 2126737, 2126737, 2126737, 3011473, 2126737, 2126737, 2126810, 2126810, 2503642, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3138522, 2126737, 2940928, 2941841, 2941914, 0, 0, 0, 0, 2126737, 2544529, 2548625, 2126737, 2126737, 2597777, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2552721, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2929553, 2126737, 2126737, 2126737, 2999185, 2126737, 2126737, 2126737, 2126737, 3060625, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3040145, 2126737, 3064721, 2126737, 2126737, 2126737, 2126737, 3101585, 2126737, 2126737, 3179409, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2495450, 2126810, 2126810, 2515930, 2126810, 2126810, 0, 0, 0, 0, 0, 0, 2510848, 2514944, 0, 0, 2547712, 2596864, 0, 0, 0, 0, 0, 2160, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 3525, 561, 2126810, 2544602, 2548698, 2126810, 2126810, 2597850, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 0, 2502656, 0, 0, 3010560, 2126810, 2929626, 2126810, 2126810, 2126810, 2999258, 2126810, 2126810, 2126810, 2126810, 3060698, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3118042, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 2126810, 3179482, 2126737, 2179072, 2126810, 2126737, 2179072, 2179072, 2126737, 2126737, 2126810, 2126810, 2441216, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 3129344, 2179072, 2179072, 3153920, 3166208, 3174400, 2397073, 2401169, 2126737, 2126737, 2442129, 2126737, 2470801, 2126737, 2126737, 2126737, 2126737, 2126737, 2663313, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 0, 0, 2126810, 2126810, 2126810, 2409434, 2519953, 2126737, 2126737, 2126737, 2126737, 2589585, 2126737, 2614161, 2646929, 2126737, 2126737, 2696081, 2757521, 2126737, 2126737, 2126737, 2126737, 2126737, 3138449, 2126810, 2126810, 2499546, 2126810, 2126810, 2126810, 2556890, 2565082, 2126810, 2126810, 2126737, 2933649, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3130257, 2126737, 2126737, 3154833, 3167121, 3175313, 2397146, 2401242, 2126810, 2126810, 2442202, 2126810, 2470874, 2126810, 2126810, 2126810, 2520026, 2126810, 2126810, 2126810, 2126810, 2589658, 2126810, 2126810, 2126810, 3011546, 2126810, 2126810, 2126737, 0, 0, 0, 0, 0, 0, 0, 2592768, 0, 0, 0, 0, 663, 0, 0, 666, 667, 0, 0, 0, 0, 0, 0, 0, 540, 571, 540, 571, 540, 540, 571, 540, 595, 2614234, 2647002, 2126810, 2126810, 2696154, 2757594, 2126810, 2126810, 2126810, 2126810, 2933722, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 3224538, 2126737, 2179072, 2417626, 2126810, 2126737, 2179072, 2179072, 2126737, 2126737, 2854912, 2969600, 2179072, 3006464, 2179072, 3018752, 2179072, 2179072, 2179072, 3149824, 2126737, 2429841, 2438033, 2126737, 2487185, 2126737, 2126737, 2945937, 2126737, 2126737, 2995089, 2126737, 3003281, 2126737, 2126737, 3023761, 2126737, 3068817, 3085201, 3097489, 2126737, 2126737, 2888593, 2126737, 2126737, 2925457, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3036049, 2126737, 3019665, 2126737, 2126737, 2126737, 3150737, 2126810, 2429914, 2438106, 2126810, 2487258, 2126810, 2126810, 2126810, 2126810, 2126810, 2700250, 2126810, 2716634, 2126810, 2724826, 2126810, 2733018, 2773978, 2126810, 2126810, 2126810, 2126810, 3150810, 2126737, 2179072, 3051520, 2126737, 3052433, 2126810, 3052506, 0, 2490368, 2498560, 0, 0, 0, 0, 0, 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2126810, 2593754, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126810, 2126737, 2449408, 0, 2535424, 3031040, 0, 0, 0, 0, 0, 2439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 369, 0, 0, 370, 0, 0, 2126737, 2450321, 2126737, 2536337, 2126737, 2610065, 2126737, 2859921, 2126737, 2126737, 2126737, 3031953, 2126810, 2450394, 2126810, 2536410, 2126810, 2610138, 2126810, 2859994, 2126810, 2126810, 2126810, 3032026, 2126737, 2527232, 0, 0, 0, 0, 0, 2179072, 2126810, 2126810, 2126737, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2126737, 2126810, 2126810, 2126810, 2126810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237568, 0, 0, 0, 0, 2527232, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2528145, 2126737, 2126737, 2126737, 2126737, 2126737, 2126810, 2528218, 2126810, 2126810, 2946010, 2126810, 2126810, 2995162, 2126810, 3003354, 2126810, 2126810, 3023834, 2126810, 3068890, 3085274, 3097562, 2126810, 2126810, 2126810, 2606042, 2126810, 2630618, 2126810, 2126810, 2651098, 2126810, 2126810, 2126810, 2708442, 2126810, 2737114, 2126810, 2126810, 2126810, 2655194, 2679770, 2761690, 2765786, 2786266, 2855898, 2970586, 2126810, 3007450, 2126810, 3019738, 2126810, 2126810, 0, 2486272, 0, 0, 0, 0, 0, 2678784, 2854912, 3006464, 0, 3108864, 3198976, 0, 2405265, 2126737, 2126737, 2126737, 2126737, 3027857, 2405338, 2126810, 2126810, 2126810, 2126810, 3027930, 2539520, 0, 2949120, 0, 0, 0, 0, 695, 0, 0, 0, 0, 362, 362, 362, 0, 0, 704, 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2049, 0, 0, 0, 0, 2179072, 2658304, 2973696, 2179072, 2126737, 2659217, 2974609, 2126737, 2126810, 2659290, 2974682, 2126810, 2711552, 0, 2560000, 2179072, 2179072, 3125248, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2560913, 2126737, 2560986, 2126810, 0, 2179072, 2126737, 2126810, 0, 2179072, 2126737, 2126810, 0, 2179072, 2126737, 2126810, 2126810, 3130330, 2126810, 2126810, 3154906, 3167194, 3175386, 2126737, 2506752, 2507738, 2507665, 2179072, 2179072, 2126737, 2126737, 2126737, 2642833, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2720657, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2585489, 2126737, 2126737, 2126737, 2126737, 2126737, 2618257, 2126737, 2985984, 2985984, 2986897, 2986970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, 221184, 221184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 221184, 0, 0, 221184, 221184, 221184, 0, 0, 0, 0, 0, 0, 221184, 0, 0, 0, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 1, 12290, 3, 0, 0, 0, 0, 0, 253952, 0, 0, 0, 253952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 687, 688, 0, 0, 0, 0, 0, 98304, 0, 0, 0, 53248, 0, 0, 0, 0, 0, 2662400, 0, 2813952, 297, 0, 300, 0, 0, 0, 300, 0, 301, 0, 0, 0, 301, 0, 0, 0, 301, 69632, 139679, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 3133440, 0, 98304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 300, 0, 301, 0, 0, 0, 2473984, 2478080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 3121152, 2179072, 2179072, 3141632, 2179072, 2179072, 2179072, 3170304, 2179072, 2179072, 3190784, 3194880, 2179072, 914, 0, 0, 0, 0, 0, 2451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 301, 0, 0, 0, 0, 0, 914, 0, 2387968, 2125824, 2125824, 2420736, 2125824, 2125824, 2125824, 2125824, 2125824, 2453504, 2125824, 2473984, 2482176, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2531328, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2605056, 2125824, 3194880, 2125824, 987, 0, 0, 0, 987, 0, 2387968, 2125824, 2125824, 2420736, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2887680, 2125824, 2125824, 2924544, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3035136, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 225740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 348, 349, 350, 0, 0, 0, 0, 2125824, 237568, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 0, 0, 358, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 296, 297, 0, 2134016, 300, 301, 0, 0, 217088, 2125824, 241664, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 131072, 131072, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 0, 0, 155648, 0, 0, 2183168, 0, 0, 270336, 0, 0, 296, 297, 0, 2134016, 300, 301, 200704, 0, 0, 0, 0, 0, 2462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1261, 0, 0, 0, 0, 0, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 180224, 0, 0, 0, 0, 0, 0, 0, 1726, 0, 0, 0, 0, 0, 0, 0, 0, 304, 304, 304, 0, 0, 0, 0, 0, 0, 2748416, 2879488, 0, 20480, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2768896, 2777088, 2797568, 2822144, 2179072, 2179072, 2179072, 2883584, 2912256, 2179072, 2179072, 2179072, 2179072, 2179072, 2617344, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2662400, 2179072, 2179072, 2179072, 2179072, 2179072, 3010560, 2179072, 2179072, 2125824, 2125824, 2502656, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2584576, 2125824, 2125824, 2125824, 2125824, 2125824, 2617344, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2142208, 0, 0, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12290, 2113823, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 293, 0, 0, 245760, 0, 0, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3039232, 2125824, 3063808, 2125824, 2125824, 2125824, 2125824, 3100672, 2125824, 2125824, 3133440, 2125824, 245760, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 0, 122880, 122880, 0, 0, 274432, 274432, 274432, 274432, 0, 0, 0, 0, 0, 274432, 0, 274432, 1, 12290, 3, 0, 0, 0, 0, 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1192, 0, 1195, 0, 0, 78112, 290, 0, 0, 0, 0, 0, 296, 297, 0, 0, 300, 301, 0, 0, 0, 0, 0, 328, 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2200252, 2200252, 2200252, 0, 0, 0, 0, 0, 0, 0, 2033, 0, 0, 0, 0, 0, 2035, 0, 0, 0, 0, 0, 0, 0, 2055, 0, 2056, 0, 0, 0, 0, 0, 0, 0, 2067, 0, 0, 0, 0, 0, 0, 0, 0, 1187, 0, 0, 0, 0, 0, 0, 1104, 2483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 690, 0, 0, 2993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 335, 0, 0, 0, 0, 1679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 694, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 730, 0, 0, 0, 0, 0, 0, 78456, 290, 0, 0, 0, 0, 0, 296, 297, 0, 0, 300, 301, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, 0, 562, 562, 562, 562, 562, 562, 562, 586, 586, 586, 540, 586, 586, 586, 586, 586, 562, 562, 540, 562, 586, 562, 586, 1, 12290, 3, 78112, 0, 0, 2771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 521, 521, 1, 12290, 3, 78113, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 1, 12290, 3, 0, 282624, 282624, 282624, 0, 0, 282624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3178496, 2670592, 0, 2744320, 0, 0, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 0, 282624, 282624, 282624, 282624, 282624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 290, 0, 0, 0, 0, 3176, 0, 0, 2740224, 0, 0, 0, 0, 0, 2793472, 0, 0, 0, 0, 0, 0, 0, 2094, 0, 0, 0, 0, 0, 0, 0, 0, 683, 684, 685, 0, 0, 0, 689, 0, 0, 0, 0, 286720, 286720, 0, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 302, 0, 0, 0, 0, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 3301, 0, 0, 0, 0, 2953216, 0, 0, 2826240, 2875392, 0, 0, 0, 3381, 0, 0, 2834432, 0, 3227648, 2568192, 0, 0, 0, 0, 2564096, 0, 2748416, 2879488, 0, 3381, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2531328, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2605056, 2179072, 2629632, 2179072, 2179072, 0, 0, 0, 306, 0, 0, 0, 0, 0, 305, 0, 305, 306, 0, 305, 305, 0, 0, 0, 305, 305, 306, 306, 0, 0, 0, 0, 0, 0, 305, 405, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, 0, 306, 410, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 742, 0, 0, 0, 0, 742, 0, 748, 0, 0, 0, 0, 0, 0, 1192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 462, 462, 488, 488, 462, 488, 488, 488, 488, 488, 488, 488, 513, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 533, 488, 488, 488, 488, 488, 541, 563, 541, 563, 541, 541, 563, 541, 587, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 541, 613, 613, 613, 613, 613, 587, 563, 563, 541, 563, 587, 563, 587, 1, 12290, 3, 78112, 0, 0, 645, 0, 0, 648, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 253952, 0, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, 0, 0, 0, 353, 0, 351, 0, 472, 472, 472, 472, 472, 472, 472, 477, 472, 472, 472, 472, 472, 472, 472, 472, 472, 477, 472, 0, 768, 0, 0, 772, 0, 0, 0, 0, 0, 0, 781, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 731, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 343, 342, 65536, 341, 0, 788, 0, 0, 0, 0, 792, 0, 0, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 782, 0, 0, 0, 0, 736, 0, 796, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 820, 0, 0, 648, 0, 0, 0, 0, 0, 837, 792, 0, 0, 0, 0, 0, 841, 842, 792, 792, 0, 0, 0, 0, 792, 736, 792, 0, 540, 540, 851, 855, 540, 540, 540, 540, 1345, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2181, 540, 540, 540, 540, 561, 561, 561, 921, 925, 561, 561, 561, 561, 561, 561, 951, 561, 956, 561, 963, 561, 966, 561, 561, 980, 561, 561, 0, 585, 585, 585, 994, 998, 585, 585, 585, 585, 585, 585, 1963, 1964, 1966, 585, 585, 585, 585, 585, 585, 585, 561, 2713, 585, 2715, 2716, 540, 540, 540, 540, 585, 585, 585, 1024, 585, 1029, 585, 1036, 585, 1039, 585, 585, 1053, 585, 585, 966, 0, 0, 0, 855, 585, 998, 925, 851, 1065, 894, 540, 540, 921, 1070, 966, 561, 0, 585, 585, 585, 585, 585, 78112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114688, 0, 241664, 258048, 0, 0, 0, 1093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 766, 0, 0, 1214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, 673, 0, 540, 540, 1342, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 0, 585, 585, 585, 1524, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1517, 585, 585, 585, 1433, 0, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 3070, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 0, 0, 0, 3662, 0, 0, 0, 1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1103, 1104, 1105, 1106, 1654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 785, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 306, 0, 1732, 0, 0, 1733, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 3030, 540, 540, 540, 540, 540, 540, 540, 1745, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1758, 540, 540, 540, 540, 540, 540, 2540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1329, 540, 540, 540, 540, 540, 540, 540, 540, 1795, 540, 540, 1798, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 900, 540, 540, 540, 540, 540, 540, 1810, 540, 540, 540, 540, 540, 1815, 540, 540, 540, 540, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1416, 561, 1825, 561, 561, 561, 561, 1831, 561, 561, 561, 561, 561, 1837, 561, 561, 561, 561, 561, 983, 561, 0, 585, 585, 585, 585, 585, 1002, 585, 1010, 561, 1892, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1904, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 2726, 0, 0, 2729, 2730, 561, 561, 1909, 561, 561, 561, 561, 561, 561, 561, 26027, 1919, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 540, 3649, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 3231, 3232, 561, 1925, 585, 585, 585, 585, 585, 1931, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 3596, 1944, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1540, 561, 561, 2025, 585, 585, 585, 0, 2029, 0, 0, 0, 0, 0, 2031, 0, 0, 0, 0, 0, 2487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 2041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1132, 0, 0, 0, 2075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1135, 0, 2145, 0, 0, 0, 2143, 0, 0, 2150, 0, 0, 0, 0, 0, 0, 0, 0, 159744, 0, 0, 0, 0, 0, 0, 0, 0, 1234, 0, 0, 0, 0, 0, 0, 0, 0, 1584, 0, 0, 0, 0, 0, 0, 0, 0, 1700, 0, 0, 0, 0, 1705, 0, 0, 540, 540, 2171, 540, 540, 2174, 540, 540, 540, 540, 540, 540, 2182, 540, 540, 540, 540, 540, 540, 2568, 540, 540, 540, 540, 2572, 540, 540, 540, 540, 540, 540, 1347, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2556, 540, 540, 540, 540, 540, 540, 540, 2201, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 2242, 540, 540, 540, 2214, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1805, 540, 540, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2254, 561, 0, 585, 585, 585, 585, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 2123, 0, 2125, 2126, 0, 0, 0, 0, 561, 2257, 561, 561, 561, 561, 561, 561, 2265, 561, 561, 561, 561, 561, 561, 561, 0, 0, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 2952, 561, 2954, 561, 2299, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1438, 561, 2033, 0, 2035, 0, 0, 2426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2434, 0, 0, 0, 2475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1193, 0, 0, 0, 0, 2484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2493, 0, 0, 0, 0, 0, 0, 756, 0, 0, 0, 0, 0, 0, 763, 0, 0, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 2592, 561, 561, 561, 561, 561, 1408, 561, 561, 1412, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 1008, 585, 2656, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2664, 585, 585, 585, 585, 585, 585, 2350, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2379, 585, 585, 585, 585, 585, 585, 585, 585, 2699, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1940, 585, 585, 2708, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 540, 540, 561, 561, 561, 3229, 561, 561, 561, 561, 561, 561, 585, 585, 585, 3352, 585, 585, 585, 3355, 585, 585, 2731, 0, 0, 0, 0, 0, 0, 2736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 192971, 0, 0, 0, 2759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1234, 540, 540, 540, 0, 0, 0, 2788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1238, 0, 0, 0, 540, 540, 540, 2826, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2833, 540, 540, 540, 540, 1748, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1760, 540, 540, 540, 540, 1765, 540, 540, 540, 540, 540, 540, 540, 540, 1772, 540, 540, 540, 540, 561, 3406, 561, 561, 3408, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 1009, 585, 561, 561, 561, 2860, 561, 561, 2864, 561, 561, 561, 561, 561, 561, 561, 561, 561, 944, 561, 561, 561, 561, 561, 561, 561, 2873, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2881, 561, 561, 0, 0, 0, 2649, 0, 1920, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2703, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2908, 585, 585, 2912, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2393, 2394, 585, 585, 585, 585, 585, 2921, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2929, 585, 585, 0, 0, 0, 3292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3297, 2955, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 305, 0, 0, 0, 2970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1588, 1589, 0, 0, 540, 540, 540, 540, 3036, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2546, 540, 540, 540, 561, 561, 561, 3076, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1436, 561, 561, 561, 585, 585, 585, 3117, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2356, 585, 2358, 0, 0, 0, 0, 3176, 3442, 0, 3444, 0, 0, 0, 0, 0, 540, 3451, 540, 540, 540, 540, 1796, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 905, 540, 540, 540, 540, 3453, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 561, 3466, 561, 3468, 0, 0, 3501, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 3510, 540, 540, 540, 540, 540, 3204, 3205, 540, 540, 540, 540, 3209, 3210, 540, 540, 540, 540, 540, 1749, 1750, 540, 540, 540, 540, 1757, 540, 540, 540, 540, 540, 540, 1346, 540, 540, 540, 540, 540, 540, 1356, 540, 540, 307, 308, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 286720, 0, 0, 0, 0, 0, 0, 0, 0, 2490, 0, 0, 0, 0, 0, 0, 0, 0, 2504, 0, 0, 0, 0, 0, 0, 0, 0, 2517, 0, 0, 0, 0, 0, 0, 0, 0, 2975, 0, 0, 0, 0, 0, 0, 0, 0, 2999, 0, 0, 0, 0, 0, 0, 0, 0, 3164, 0, 0, 0, 0, 0, 0, 0, 0, 3173, 0, 0, 0, 0, 0, 0, 0, 0, 3183, 0, 0, 0, 0, 0, 0, 0, 0, 155648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 449, 418, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 532, 449, 532, 532, 532, 449, 532, 532, 532, 532, 449, 542, 564, 542, 564, 542, 542, 564, 542, 588, 564, 564, 564, 564, 564, 564, 564, 588, 588, 588, 542, 588, 588, 588, 588, 588, 564, 564, 616, 621, 588, 621, 627, 1, 12290, 3, 78112, 0, 1677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1163, 540, 540, 540, 1811, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1377, 561, 0, 585, 585, 585, 585, 585, 78112, 1079, 0, 0, 1082, 1086, 0, 0, 1090, 585, 585, 585, 1993, 585, 585, 585, 585, 585, 1999, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 3551, 0, 3553, 0, 0, 0, 0, 0, 561, 561, 561, 561, 561, 2589, 561, 561, 561, 561, 2593, 561, 561, 0, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2338, 585, 585, 585, 585, 585, 585, 585, 2657, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1971, 585, 585, 585, 2709, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 540, 540, 561, 561, 3228, 561, 561, 561, 561, 561, 561, 561, 0, 0, 585, 2900, 585, 585, 585, 585, 585, 540, 3514, 540, 3516, 540, 540, 3518, 540, 561, 561, 561, 561, 561, 561, 561, 561, 1396, 1398, 561, 561, 561, 561, 561, 561, 3527, 561, 3529, 561, 561, 3531, 561, 585, 585, 585, 585, 585, 585, 585, 585, 3540, 585, 3542, 585, 585, 3544, 585, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 362, 0, 0, 0, 147456, 0, 0, 0, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 365, 0, 382, 0, 348, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 764, 0, 0, 420, 428, 419, 428, 0, 310, 428, 441, 450, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 484, 489, 489, 500, 489, 489, 489, 489, 489, 489, 489, 489, 515, 515, 528, 528, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 515, 529, 529, 529, 529, 529, 543, 565, 543, 565, 543, 543, 565, 543, 589, 565, 565, 565, 565, 565, 565, 565, 589, 589, 589, 612, 589, 589, 589, 589, 589, 614, 615, 615, 612, 615, 614, 615, 614, 1, 12290, 3, 78112, 0, 702, 0, 0, 0, 0, 0, 702, 0, 0, 0, 540, 540, 540, 540, 540, 3028, 540, 540, 540, 540, 540, 540, 540, 561, 967, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 2337, 585, 585, 585, 585, 2341, 585, 0, 1108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 3200, 0, 1150, 1108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, 1228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1240, 0, 0, 540, 540, 1276, 1278, 540, 540, 540, 540, 540, 540, 540, 540, 1292, 540, 1297, 540, 540, 1301, 540, 540, 540, 540, 1812, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1823, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1378, 561, 0, 585, 585, 585, 585, 585, 78112, 1079, 0, 0, 1083, 1087, 0, 0, 1091, 540, 1304, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1302, 540, 1360, 914, 561, 561, 1364, 561, 1367, 561, 561, 561, 561, 561, 561, 561, 561, 1381, 561, 1386, 561, 561, 1390, 561, 561, 1393, 561, 561, 561, 561, 561, 561, 561, 561, 1431, 561, 561, 1435, 561, 561, 561, 561, 1484, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1942, 540, 1793, 1794, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 2584, 0, 585, 585, 1946, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2005, 585, 585, 585, 1959, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2357, 585, 2102, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 379, 381, 0, 0, 0, 0, 0, 2133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1119, 0, 0, 2033, 0, 2035, 0, 0, 0, 0, 0, 0, 2428, 0, 0, 0, 0, 0, 0, 0, 2122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 122880, 122880, 122880, 122880, 122880, 0, 0, 2474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1133, 0, 0, 0, 0, 0, 0, 2760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 384, 0, 0, 2799, 0, 0, 0, 0, 0, 0, 0, 2803, 540, 540, 540, 540, 540, 540, 540, 1326, 540, 540, 540, 540, 540, 540, 540, 1339, 585, 2956, 0, 0, 0, 0, 0, 2962, 0, 0, 0, 0, 0, 0, 0, 2966, 0, 0, 0, 3008, 0, 0, 0, 0, 0, 0, 0, 0, 3017, 0, 0, 0, 0, 0, 383, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 3048, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1320, 3089, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1858, 3130, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1957, 540, 3225, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3414, 585, 585, 585, 3281, 585, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 3157, 3513, 540, 540, 540, 540, 540, 540, 540, 561, 3521, 561, 3522, 561, 561, 561, 3526, 540, 540, 540, 3664, 561, 561, 561, 3666, 585, 585, 585, 3668, 0, 0, 540, 540, 540, 3560, 540, 540, 540, 540, 540, 540, 540, 540, 3568, 561, 321, 321, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1161, 0, 0, 0, 0, 371, 0, 430, 436, 0, 442, 451, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 490, 490, 501, 490, 490, 490, 490, 490, 490, 490, 490, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 544, 566, 544, 566, 544, 544, 566, 544, 590, 566, 566, 566, 566, 566, 566, 566, 590, 590, 590, 544, 590, 590, 590, 590, 590, 566, 566, 544, 566, 590, 566, 590, 1, 12290, 3, 78112, 540, 540, 540, 874, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1822, 540, 1360, 585, 1017, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 1122, 0, 1124, 1125, 0, 0, 0, 1127, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 0, 1159168, 0, 0, 0, 0, 1159168, 0, 0, 1166, 1167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1634, 0, 0, 0, 1113, 0, 1253, 0, 0, 0, 0, 0, 1128, 0, 0, 0, 0, 0, 1236, 0, 0, 0, 0, 773, 774, 0, 0, 778, 779, 0, 675, 0, 0, 0, 0, 0, 0, 1598, 0, 0, 0, 0, 0, 0, 0, 0, 1605, 0, 0, 1268, 1127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 1277, 540, 540, 540, 1323, 540, 540, 1325, 540, 540, 1328, 540, 540, 540, 540, 540, 540, 540, 540, 2554, 540, 540, 540, 540, 540, 540, 2560, 1360, 914, 561, 561, 1365, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1400, 561, 561, 561, 561, 561, 561, 1404, 561, 561, 561, 561, 561, 561, 561, 1413, 561, 561, 1415, 561, 561, 0, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 2655, 561, 1419, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1874, 561, 561, 561, 1443, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 1456, 585, 585, 0, 0, 3291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1262, 0, 0, 0, 1266, 585, 585, 585, 1504, 585, 585, 1506, 585, 585, 585, 1510, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 2020, 561, 561, 0, 0, 0, 1657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1675, 0, 0, 0, 585, 1991, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2695, 561, 2024, 585, 585, 585, 2028, 0, 2029, 0, 0, 0, 0, 0, 2031, 0, 0, 0, 0, 0, 2502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1586, 1587, 0, 0, 0, 0, 0, 0, 0, 2033, 0, 0, 0, 0, 0, 2035, 0, 0, 0, 0, 0, 2038, 0, 0, 2077, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1177, 0, 0, 0, 0, 0, 0, 2091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 2807, 540, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 2252, 561, 561, 561, 561, 561, 1447, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 2017, 540, 540, 540, 2021, 561, 2256, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1875, 2272, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1890, 561, 561, 561, 2314, 561, 2316, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2340, 585, 585, 585, 2399, 585, 2401, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 540, 540, 2564, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3212, 540, 0, 0, 0, 561, 561, 561, 561, 2588, 561, 561, 561, 561, 561, 561, 561, 561, 1916, 561, 26027, 0, 585, 585, 585, 585, 0, 2757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, 2834, 540, 540, 540, 540, 540, 540, 540, 2840, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2571, 540, 540, 540, 540, 540, 540, 2882, 561, 561, 561, 561, 561, 561, 561, 2888, 561, 561, 561, 561, 561, 561, 561, 0, 0, 585, 585, 585, 2902, 585, 585, 585, 2930, 585, 585, 585, 585, 585, 585, 585, 2936, 585, 585, 585, 585, 585, 585, 585, 561, 540, 2714, 585, 561, 540, 540, 540, 540, 540, 540, 3226, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3074, 585, 585, 585, 585, 3282, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 3156, 0, 585, 585, 3369, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 2617344, 0, 0, 0, 0, 0, 2789376, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 3445, 0, 0, 0, 0, 540, 540, 540, 540, 3027, 540, 540, 540, 540, 3031, 540, 540, 540, 540, 540, 540, 3456, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3524, 561, 561, 561, 561, 3471, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3486, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 3626, 540, 540, 540, 3515, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3413, 561, 561, 3528, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3113, 585, 585, 585, 3541, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 208896, 0, 0, 0, 0, 323, 324, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1194, 1196, 0, 0, 0, 0, 322, 370, 325, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 322, 0, 0, 369, 369, 399, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 0, 0, 0, 322, 452, 465, 465, 465, 465, 465, 465, 465, 478, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 491, 491, 465, 491, 491, 506, 508, 491, 491, 506, 491, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 534, 517, 517, 517, 517, 517, 545, 567, 545, 567, 545, 545, 567, 545, 591, 567, 567, 567, 567, 567, 567, 567, 591, 591, 591, 545, 591, 591, 591, 591, 591, 567, 567, 545, 567, 591, 567, 591, 1, 12290, 3, 78112, 659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 670, 671, 0, 0, 0, 0, 0, 439, 0, 0, 0, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 557, 580, 557, 580, 557, 557, 580, 557, 604, 0, 0, 707, 708, 0, 0, 0, 0, 0, 714, 0, 0, 0, 718, 0, 720, 0, 769, 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1209, 0, 0, 787, 0, 789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1224, 0, 0, 0, 801, 0, 806, 0, 809, 0, 0, 0, 0, 806, 809, 0, 0, 0, 809, 0, 707, 0, 0, 826, 0, 0, 0, 0, 0, 826, 826, 829, 809, 806, 0, 0, 0, 0, 0, 0, 0, 789, 0, 801, 0, 818, 0, 0, 0, 0, 0, 2745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 811, 540, 540, 854, 540, 540, 0, 0, 0, 789, 0, 0, 0, 0, 0, 838, 0, 0, 0, 0, 0, 0, 0, 2142, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2819, 540, 540, 540, 540, 540, 0, 0, 0, 787, 0, 0, 0, 838, 818, 838, 0, 540, 540, 852, 540, 858, 540, 540, 871, 540, 881, 540, 886, 540, 540, 893, 896, 901, 540, 909, 540, 540, 540, 540, 540, 3215, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 895, 540, 540, 540, 540, 540, 561, 561, 561, 922, 561, 928, 561, 561, 941, 561, 561, 952, 561, 957, 561, 561, 0, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 585, 2653, 585, 585, 0, 0, 2959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2965, 0, 965, 968, 973, 561, 981, 561, 561, 0, 585, 585, 585, 995, 585, 1001, 585, 585, 0, 2958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131072, 131072, 0, 0, 1014, 585, 585, 1025, 585, 1030, 585, 585, 1038, 1041, 1046, 585, 1054, 585, 585, 968, 0, 0, 0, 540, 585, 585, 561, 852, 540, 1066, 901, 540, 922, 561, 1071, 973, 0, 0, 0, 1110, 0, 0, 0, 0, 0, 0, 0, 1117, 0, 0, 0, 0, 0, 0, 775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1205, 0, 0, 0, 0, 0, 0, 0, 1137, 1138, 0, 0, 0, 0, 1142, 0, 0, 0, 362, 362, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1206, 0, 0, 0, 0, 0, 0, 1165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 784, 0, 0, 0, 1182, 741, 0, 0, 0, 1134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245760, 0, 0, 0, 0, 0, 0, 1303, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1318, 540, 540, 540, 540, 2173, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2558, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1372, 561, 561, 561, 561, 561, 1850, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1902, 1903, 561, 561, 561, 561, 561, 561, 1387, 561, 561, 561, 1392, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1432, 561, 561, 561, 561, 561, 1439, 561, 561, 561, 1421, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1437, 561, 0, 585, 585, 585, 1049, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 836, 0, 0, 0, 0, 0, 0, 811, 0, 585, 585, 585, 585, 1463, 585, 585, 585, 585, 585, 585, 1478, 585, 585, 585, 1483, 0, 0, 1608, 1609, 1610, 0, 1612, 1613, 0, 0, 0, 0, 1618, 0, 0, 0, 0, 0, 679, 751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2144, 0, 0, 1640, 0, 0, 1643, 0, 1645, 0, 0, 0, 0, 0, 1651, 1652, 0, 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, 540, 846, 540, 540, 540, 540, 540, 540, 3216, 540, 540, 540, 540, 540, 3221, 540, 3223, 540, 0, 1668, 0, 0, 1670, 0, 0, 0, 0, 1672, 1673, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 347, 345, 65536, 0, 1692, 0, 0, 0, 0, 0, 1698, 1699, 0, 1701, 1702, 1703, 0, 0, 0, 0, 0, 0, 810, 811, 0, 0, 0, 0, 811, 0, 0, 0, 1719, 0, 0, 0, 1723, 1724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 0, 0, 1715, 0, 0, 0, 1735, 1585, 1585, 1737, 540, 1739, 540, 1740, 540, 1742, 540, 540, 540, 1746, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1759, 540, 540, 540, 540, 540, 3318, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2557, 540, 540, 540, 540, 540, 540, 1763, 540, 540, 540, 540, 1767, 540, 1769, 540, 540, 540, 540, 540, 540, 540, 540, 2570, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3041, 540, 540, 540, 540, 540, 540, 540, 540, 1777, 1778, 1780, 540, 540, 540, 540, 540, 540, 1787, 1788, 540, 540, 1791, 1792, 540, 540, 540, 540, 540, 540, 540, 1800, 540, 540, 540, 1804, 540, 540, 540, 540, 540, 540, 2829, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1770, 540, 540, 540, 540, 540, 0, 1828, 561, 1830, 561, 561, 1832, 561, 1834, 561, 561, 561, 1838, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 2725, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 135168, 135168, 0, 0, 65536, 135168, 1859, 561, 1861, 561, 561, 561, 561, 561, 561, 561, 561, 1869, 1870, 1872, 561, 561, 0, 2648, 0, 0, 0, 0, 585, 585, 585, 585, 2652, 585, 585, 585, 585, 585, 585, 2390, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3124, 585, 585, 585, 585, 585, 561, 561, 561, 1894, 561, 561, 561, 1898, 561, 561, 561, 561, 561, 561, 561, 1906, 585, 1926, 585, 1928, 585, 585, 585, 1932, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 585, 1945, 585, 585, 585, 585, 1949, 585, 585, 585, 585, 1953, 585, 1955, 585, 585, 561, 3146, 3147, 3148, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 2488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2096, 0, 0, 0, 0, 0, 0, 1974, 1975, 1976, 585, 585, 1979, 1980, 585, 585, 585, 585, 585, 585, 585, 1988, 585, 561, 0, 1288, 585, 1468, 1377, 540, 540, 540, 1549, 540, 561, 561, 561, 1553, 585, 585, 1992, 585, 585, 585, 585, 585, 585, 585, 2000, 585, 585, 585, 585, 585, 561, 561, 540, 561, 585, 561, 585, 1, 12290, 3, 78112, 585, 585, 585, 585, 2011, 561, 540, 2014, 585, 561, 1792, 540, 2019, 540, 1886, 561, 0, 585, 585, 1040, 585, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 1134592, 0, 0, 0, 0, 2023, 561, 1980, 585, 2027, 585, 0, 2029, 0, 0, 0, 0, 0, 2031, 0, 0, 0, 0, 0, 2761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 0, 0, 0, 0, 0, 2089, 0, 0, 0, 0, 2093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2119, 0, 2121, 0, 0, 0, 0, 0, 0, 0, 2129, 0, 0, 0, 0, 786, 0, 805, 0, 0, 0, 0, 540, 849, 540, 540, 540, 540, 540, 2216, 540, 540, 540, 540, 540, 540, 2221, 540, 540, 540, 540, 540, 540, 3633, 561, 561, 561, 561, 561, 561, 3639, 585, 585, 0, 0, 0, 2134, 0, 0, 0, 0, 2139, 0, 0, 0, 0, 0, 0, 0, 0, 2990080, 2179072, 2179072, 2502656, 2179072, 2179072, 2179072, 2179072, 540, 2187, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1337, 540, 2211, 2212, 540, 540, 540, 540, 540, 540, 2219, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2582, 540, 540, 540, 0, 0, 0, 561, 561, 2258, 561, 2260, 561, 561, 561, 561, 561, 561, 2268, 561, 2270, 561, 561, 561, 561, 1426, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3343, 561, 561, 561, 561, 3344, 3345, 561, 561, 2343, 585, 2345, 585, 585, 585, 585, 585, 585, 2353, 585, 2355, 585, 585, 585, 585, 561, 0, 0, 0, 3648, 0, 540, 540, 540, 540, 3652, 540, 585, 585, 585, 585, 2389, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2705, 585, 585, 585, 585, 585, 585, 585, 2402, 585, 585, 2405, 2406, 585, 585, 561, 2177, 585, 2345, 2260, 540, 2414, 540, 540, 561, 2418, 561, 561, 585, 2422, 585, 585, 2029, 0, 2031, 0, 0, 0, 0, 795, 663, 844, 0, 0, 0, 0, 540, 848, 540, 540, 540, 540, 540, 1283, 540, 540, 540, 540, 540, 540, 1298, 540, 540, 540, 540, 540, 540, 2580, 540, 540, 540, 540, 540, 540, 0, 2584, 0, 0, 0, 2450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1239, 0, 0, 0, 2459, 0, 0, 0, 0, 0, 2464, 0, 2466, 2467, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 371, 0, 65536, 0, 0, 2498, 0, 0, 0, 0, 0, 0, 0, 2505, 0, 0, 0, 0, 0, 0, 0, 2479, 0, 0, 0, 2481, 0, 0, 0, 0, 2561, 540, 540, 540, 2566, 540, 540, 540, 540, 540, 540, 540, 2573, 540, 540, 540, 540, 540, 540, 2838, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1296, 540, 540, 540, 540, 540, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 2591, 561, 561, 561, 561, 561, 561, 2640, 561, 561, 561, 2643, 561, 561, 561, 561, 561, 561, 2886, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1867, 561, 561, 561, 561, 561, 561, 2621, 561, 561, 561, 561, 2625, 561, 561, 561, 2630, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 0, 3661, 0, 0, 561, 2637, 561, 561, 561, 561, 561, 561, 561, 2642, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3427, 585, 2669, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3267, 2797, 2798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 1741, 540, 0, 0, 2982, 2983, 0, 2984, 0, 2986, 0, 0, 0, 0, 2988, 0, 0, 0, 0, 0, 680, 681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2047, 0, 0, 0, 0, 0, 0, 0, 0, 3007, 0, 0, 2988, 0, 0, 3013, 3014, 0, 3016, 0, 0, 3019, 0, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, 3022, 540, 540, 540, 540, 540, 540, 3029, 540, 540, 540, 540, 540, 3033, 3062, 540, 561, 561, 561, 561, 561, 561, 3069, 561, 561, 561, 561, 561, 3073, 561, 0, 585, 585, 1042, 585, 585, 288, 1079, 0, 0, 1082, 1086, 0, 0, 1090, 3103, 561, 585, 585, 585, 585, 585, 585, 3110, 585, 585, 585, 585, 585, 3114, 585, 561, 0, 1543, 585, 1545, 1546, 540, 540, 1548, 540, 540, 561, 561, 1552, 561, 0, 585, 585, 1044, 585, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 794, 0, 0, 0, 0, 0, 0, 0, 798, 3144, 585, 561, 540, 585, 561, 540, 3150, 561, 3152, 585, 3154, 0, 0, 0, 0, 0, 0, 825, 0, 819, 0, 664, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 221184, 0, 0, 0, 0, 65536, 0, 0, 0, 3160, 0, 0, 3163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 2806, 540, 540, 540, 3202, 540, 540, 540, 540, 540, 540, 540, 3207, 540, 540, 540, 540, 540, 540, 540, 540, 3040, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3322, 540, 540, 540, 540, 540, 540, 561, 3234, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1889, 561, 3245, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 3257, 585, 585, 585, 585, 585, 585, 585, 3262, 585, 585, 585, 585, 585, 561, 2013, 585, 2015, 2016, 540, 2018, 540, 540, 561, 2022, 561, 561, 561, 3349, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2667, 0, 3378, 3379, 0, 3176, 0, 3383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 0, 0, 384, 0, 0, 0, 3441, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 2167, 540, 540, 0, 0, 0, 0, 3503, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 3512, 0, 0, 3557, 3558, 3559, 540, 540, 540, 3562, 540, 3564, 540, 540, 540, 540, 3569, 3570, 3571, 561, 561, 561, 3574, 561, 3576, 561, 561, 561, 561, 3581, 3582, 3583, 585, 561, 1203, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, </string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAABE=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="17" aka="AAAAAAAAABE=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string>0, 585, 585, 3586, 585, 3588, 585, 585, 585, 585, 3593, 0, 0, 0, 0, 0, 0, 0, 2747, 2748, 2749, 0, 0, 0, 0, 0, 0, 0, 2763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 254413, 1, 12290, 0, 0, 540, 3628, 540, 540, 540, 3632, 561, 561, 3634, 561, 561, 561, 3638, 585, 585, 3640, 585, 585, 585, 3644, 561, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 3563, 540, 3565, 540, 540, 540, 561, 0, 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 674, 0, 0, 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1120, 0, 0, 0, 0, 366, 0, 0, 0, 374, 376, 0, 0, 0, 0, 0, 0, 0, 344, 0, 402, 0, 0, 0, 0, 0, 402, 0, 0, 409, 0, 0, 0, 409, 69632, 73728, 0, 366, 366, 0, 421, 65536, 366, 0, 0, 366, 421, 498, 502, 498, 498, 507, 498, 498, 498, 507, 498, 421, 421, 327, 421, 0, 0, 421, 0, 421, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 546, 568, 546, 568, 546, 546, 568, 546, 592, 568, 568, 568, 568, 568, 568, 568, 592, 592, 592, 546, 592, 592, 592, 592, 592, 568, 568, 546, 568, 592, 568, 592, 1, 12290, 3, 78112, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1248, 0, 0, 540, 540, 540, 875, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2183, 540, 540, 561, 561, 915, 561, 561, 561, 561, 561, 561, 945, 561, 561, 561, 561, 561, 561, 585, 3421, 585, 585, 3423, 585, 585, 585, 585, 585, 585, 1018, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 540, 0, 0, 0, 540, 988, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3068, 561, 561, 561, 561, 561, 561, 561, 561, 932, 561, 561, 946, 561, 561, 561, 561, 561, 561, 934, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3240, 561, 561, 561, 561, 561, 561, 0, 0, 1109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1604, 0, 0, 0, 0, 1229, 0, 1109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 0, 0, 0, 540, 540, 540, 1281, 540, 540, 540, 540, 540, 1293, 540, 540, 540, 540, 540, 540, 540, 540, 3054, 3056, 540, 540, 540, 3059, 540, 3061, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 1370, 561, 561, 561, 561, 561, 1382, 585, 585, 1461, 585, 585, 585, 585, 585, 1473, 585, 585, 585, 585, 585, 585, 585, 585, 2914, 585, 585, 585, 585, 585, 585, 585, 585, 3122, 585, 585, 585, 585, 585, 585, 585, 585, 3136, 3138, 585, 585, 585, 3141, 585, 3143, 0, 1720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134, 0, 1990, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1972, 585, 585, 585, 2373, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2370, 585, 585, 585, 585, 2698, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2383, 585, 0, 0, 0, 3161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0, 0, 561, 561, 3235, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 2325, 0, 3663, 540, 540, 540, 3665, 561, 561, 561, 3667, 585, 585, 585, 0, 0, 540, 540, 540, 2526, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3058, 540, 540, 540, 422, 422, 0, 422, 431, 0, 422, 0, 422, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 492, 492, 466, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 547, 569, 547, 569, 547, 547, 569, 547, 593, 569, 569, 569, 569, 569, 569, 569, 593, 593, 593, 547, 593, 593, 593, 593, 593, 569, 569, 547, 569, 593, 569, 593, 1, 12290, 3, 78112, 0, 0, 0, 0, 2159, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3032, 540, 540, 540, 540, 540, 2202, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2208, 540, 540, 2413, 540, 540, 540, 2417, 561, 561, 561, 2421, 585, 585, 585, 0, 0, 0, 0, 3293, 0, 0, 0, 0, 0, 3296, 0, 0, 0, 2458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1250, 2967, 0, 0, 0, 2971, 0, 0, 0, 0, 0, 2977, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 418, 0, 65536, 0, 0, 2992, 0, 0, 2995, 0, 0, 0, 0, 0, 3000, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 367, 367, 0, 0, 65536, 367, 0, 0, 0, 3023, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2222, 540, 540, 540, 540, 3049, 540, 540, 540, 540, 540, 540, 540, 540, 3057, 540, 540, 3060, 540, 540, 540, 540, 2189, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2583, 0, 0, 0, 540, 540, 3063, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 2326, 0, 561, 561, 3090, 561, 561, 561, 561, 561, 561, 561, 561, 3098, 561, 561, 3101, 561, 0, 585, 585, 1045, 585, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 1102, 1101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 1275, 540, 561, 561, 3104, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2666, 585, 585, 585, 3131, 585, 585, 585, 585, 585, 585, 585, 585, 3139, 585, 585, 3142, 585, 585, 585, 585, 585, 1930, 585, 585, 585, 585, 585, 585, 585, 585, 1941, 585, 585, 585, 585, 585, 1948, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3263, 585, 585, 585, 585, 0, 0, 0, 0, 3179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 732, 0, 0, 0, 0, 0, 0, 3192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 2808, 3201, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1359, 540, 3213, 540, 540, 540, 540, 540, 540, 540, 3218, 540, 3220, 540, 540, 540, 540, 540, 540, 561, 3227, 561, 561, 561, 3230, 561, 561, 561, 561, 561, 982, 561, 0, 585, 585, 585, 585, 999, 585, 585, 585, 561, 561, 3246, 561, 3248, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 3537, 585, 585, 585, 585, 3256, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3278, 585, 585, 3268, 585, 585, 585, 585, 585, 585, 585, 585, 3274, 585, 3276, 585, 585, 561, 3370, 540, 3371, 561, 3372, 585, 0, 0, 0, 0, 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1179, 540, 540, 3328, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3233, 561, 561, 561, 561, 3340, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3346, 561, 0, 994, 1075, 1039, 585, 585, 78112, 1079, 0, 0, 1081, 1085, 0, 0, 1089, 3358, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3364, 585, 585, 585, 585, 585, 585, 585, 1981, 1982, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 2951, 540, 2953, 561, 561, 561, 3654, 3655, 561, 561, 585, 585, 3658, 3659, 585, 585, 0, 0, 0, 0, 0, 0, 1126, 0, 0, 0, 1130, 1131, 0, 0, 0, 0, 0, 0, 1141, 0, 1143, 0, 0, 362, 362, 0, 0, 0, 691, 0, 0, 0, 0, 696, 0, 0, 0, 362, 362, 362, 0, 0, 0, 0, 0, 0, 1154, 0, 0, 0, 0, 0, 1160, 0, 1162, 0, 758, 0, 0, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 758, 758, 0, 0, 0, 0, 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 856, 585, 999, 926, 540, 540, 540, 540, 910, 561, 561, 561, 561, 561, 1880, 1881, 1882, 561, 561, 1885, 1886, 561, 561, 561, 561, 561, 1896, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2603, 561, 2605, 561, 561, 561, 982, 0, 585, 585, 585, 585, 1055, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 375, 0, 378, 0, 0, 0, 378, 0, 0, 0, 0, 1709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1619, 0, 0, 585, 585, 585, 2010, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 561, 3066, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2600, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 987, 585, 585, 585, 585, 585, 0, 2039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1178, 0, 540, 540, 540, 2172, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2238, 2584, 0, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2255, 0, 0, 0, 0, 2461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 747, 0, 0, 0, 0, 3288, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1184, 1184, 561, 561, 561, 561, 3350, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2939, 585, 585, 585, 585, 3368, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 394, 0, 0, 467, 467, 485, 493, 493, 485, 493, 493, 493, 493, 493, 493, 493, 493, 518, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 535, 526, 526, 526, 526, 526, 548, 570, 548, 570, 548, 548, 570, 548, 594, 570, 570, 570, 570, 570, 570, 570, 594, 594, 594, 548, 594, 594, 594, 594, 594, 570, 570, 548, 570, 594, 570, 594, 1, 12290, 3, 78112, 767, 0, 0, 771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1704, 0, 0, 0, 821, 0, 0, 0, 798, 0, 0, 821, 0, 0, 0, 0, 0, 821, 821, 0, 0, 0, 0, 805, 0, 0, 786, 0, 0, 0, 0, 805, 0, 0, 0, 0, 0, 0, 0, 805, 0, 0, 0, 0, 0, 798, 0, 0, 0, 0, 0, 0, 839, 794, 0, 0, 839, 0, 0, 0, 0, 808, 0, 0, 692, 0, 0, 672, 0, 692, 0, 813, 675, 676, 0, 0, 0, 0, 0, 682, 0, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 540, 867, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 911, 540, 540, 540, 540, 2215, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1756, 540, 540, 540, 540, 983, 0, 585, 585, 585, 1077, 1056, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 412, 412, 0, 0, 0, 0, 0, 412, 0, 1180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1621, 0, 0, 1241, 0, 0, 0, 0, 0, 0, 0, 0, 1246, 0, 0, 0, 0, 0, 0, 1170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 816, 0, 0, 0, 0, 0, 0, 540, 1305, 540, 540, 540, 540, 540, 540, 540, 1313, 540, 540, 540, 540, 540, 540, 540, 540, 3332, 540, 561, 561, 561, 561, 561, 561, 935, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3094, 561, 3096, 561, 561, 561, 561, 561, 561, 1340, 540, 540, 1344, 540, 540, 540, 540, 540, 1350, 540, 540, 540, 1357, 540, 540, 540, 540, 540, 3458, 540, 3460, 3461, 540, 3463, 540, 561, 561, 561, 561, 561, 2262, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1399, 561, 561, 561, 561, 561, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1375, 561, 561, 561, 561, 1848, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2868, 561, 561, 561, 561, 561, 1441, 561, 561, 561, 1448, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 585, 585, 1998, 585, 585, 585, 585, 585, 2003, 585, 585, 1485, 585, 585, 585, 585, 585, 585, 585, 1493, 585, 585, 585, 585, 585, 585, 585, 585, 3261, 585, 585, 585, 585, 585, 585, 585, 585, 3272, 585, 585, 585, 585, 585, 585, 585, 585, 3283, 540, 585, 561, 540, 540, 561, 561, 585, 1522, 585, 585, 1526, 585, 585, 585, 585, 585, 1532, 585, 585, 585, 1539, 585, 585, 585, 585, 585, 1996, 1997, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1531, 585, 585, 585, 585, 585, 585, 0, 0, 0, 1595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1716, 0, 0, 0, 0, 0, 1656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 0, 0, 0, 710, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 1708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1653, 0, 0, 0, 1722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1729, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3398, 540, 3400, 540, 561, 561, 1893, 561, 561, 561, 561, 561, 561, 1901, 561, 561, 561, 561, 561, 561, 1410, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1428, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1917, 26027, 0, 1922, 585, 1924, 585, 561, 561, 561, 1910, 1912, 561, 561, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 585, 585, 2335, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 3622, 0, 3624, 0, 0, 540, 585, 585, 585, 585, 1978, 585, 585, 585, 585, 585, 585, 585, 585, 1987, 585, 585, 585, 585, 585, 585, 2934, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2407, 561, 540, 585, 585, 561, 585, 585, 585, 585, 1995, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2004, 2006, 0, 0, 0, 2078, 0, 0, 0, 2081, 0, 0, 0, 0, 0, 2087, 0, 0, 0, 0, 0, 2774, 0, 0, 0, 2778, 0, 2780, 0, 0, 0, 0, 0, 0, 2746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 362, 0, 0, 0, 0, 0, 2103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1265, 0, 0, 0, 0, 561, 561, 561, 561, 561, 2249, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1519, 585, 585, 2346, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2919, 585, 2448, 0, 0, 0, 0, 0, 0, 0, 0, 2453, 0, 0, 2456, 0, 0, 0, 0, 0, 726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 736, 0, 0, 0, 2460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2471, 0, 0, 0, 2485, 2486, 0, 0, 2489, 0, 0, 2492, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 417, 417, 0, 0, 65536, 417, 0, 0, 2499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2510, 0, 0, 0, 0, 815, 0, 812, 795, 0, 0, 817, 0, 667, 0, 791, 0, 0, 0, 0, 1096, 0, 0, 1098, 0, 0, 0, 0, 0, 0, 0, 0, 827, 0, 0, 0, 0, 0, 0, 0, 0, 540, 2524, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1789, 540, 540, 540, 540, 540, 2551, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2559, 540, 540, 2562, 540, 540, 540, 540, 540, 540, 2569, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3323, 540, 540, 540, 540, 540, 540, 2576, 540, 540, 540, 2579, 540, 540, 540, 540, 540, 540, 540, 0, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, 765, 0, 0, 0, 0, 561, 2586, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3254, 561, 561, 561, 585, 585, 585, 585, 585, 2672, 585, 585, 585, 585, 585, 585, 2677, 585, 585, 585, 585, 561, 0, 3646, 0, 0, 0, 540, 540, 540, 540, 540, 540, 2529, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2842, 540, 540, 540, 540, 540, 585, 585, 585, 2683, 585, 585, 585, 585, 585, 585, 2690, 585, 585, 585, 585, 585, 585, 585, 2351, 585, 585, 585, 585, 585, 585, 585, 585, 1508, 585, 585, 585, 585, 585, 585, 585, 585, 2697, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2704, 585, 585, 585, 2707, 0, 0, 0, 0, 2735, 0, 0, 0, 0, 0, 0, 0, 2739, 0, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 2528, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2234, 540, 540, 540, 540, 0, 540, 540, 540, 2811, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2821, 540, 540, 540, 540, 540, 2836, 540, 540, 540, 2839, 540, 2841, 540, 540, 540, 540, 540, 540, 540, 540, 3520, 561, 561, 561, 561, 561, 561, 561, 1450, 26027, 1360, 987, 585, 585, 585, 585, 585, 2845, 540, 540, 540, 540, 540, 540, 0, 0, 561, 561, 2853, 561, 561, 561, 561, 561, 1913, 561, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 2333, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1050, 585, 585, 585, 585, 561, 561, 2858, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2284, 561, 561, 561, 2874, 2875, 561, 561, 561, 561, 2878, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 1005, 585, 561, 561, 561, 2884, 561, 561, 561, 2887, 561, 2889, 561, 561, 561, 561, 561, 561, 1449, 561, 26027, 1360, 987, 1453, 585, 585, 585, 585, 2893, 561, 561, 561, 561, 561, 561, 0, 0, 585, 585, 2901, 585, 585, 585, 585, 585, 585, 585, 3121, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 540, 3285, 561, 3287, 585, 2906, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3367, 585, 585, 2922, 2923, 585, 585, 585, 585, 2926, 585, 585, 585, 585, 585, 585, 585, 585, 3592, 561, 0, 0, 0, 0, 3595, 0, 585, 585, 585, 2932, 585, 585, 585, 2935, 585, 2937, 585, 585, 585, 585, 585, 585, 585, 1933, 585, 585, 585, 585, 1939, 585, 585, 585, 2941, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 2963, 0, 0, 0, 0, 0, 585, 585, 2957, 0, 0, 2960, 2961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 3009, 0, 0, 3012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2200253, 151552, 2200253, 0, 0, 0, 151552, 540, 540, 540, 540, 3037, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3325, 540, 540, 540, 540, 540, 540, 540, 3051, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3465, 561, 561, 561, 561, 561, 561, 3077, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1887, 1888, 561, 561, 561, 561, 561, 561, 3092, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3480, 585, 585, 585, 585, 561, 561, 585, 585, 585, 585, 3108, 585, 585, 585, 585, 3112, 585, 585, 585, 585, 585, 585, 585, 3135, 585, 3137, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 3552, 0, 0, 0, 585, 585, 585, 3118, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1512, 585, 585, 585, 585, 585, 585, 585, 3133, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2917, 585, 585, 2920, 0, 0, 3168, 3169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2071, 0, 0, 0, 540, 540, 540, 540, 3329, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3412, 561, 561, 3336, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2285, 3347, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 3354, 585, 585, 585, 585, 585, 585, 2404, 585, 585, 585, 585, 561, 2178, 585, 2346, 2261, 3389, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2534, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 3447, 3448, 0, 540, 540, 540, 540, 2527, 540, 540, 540, 540, 2531, 540, 540, 540, 540, 540, 540, 540, 1312, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1784, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 3473, 561, 3475, 3476, 561, 3478, 561, 585, 585, 585, 585, 585, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254413, 0, 0, 0, 0, 0, 585, 585, 585, 3488, 585, 3490, 3491, 585, 3493, 585, 3495, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 313, 314, 314, 419, 420, 65536, 427, 585, 585, 3617, 585, 3618, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 540, 585, 585, 561, 540, 540, 540, 904, 540, 561, 561, 561, 976, 561, 561, 585, 585, 3673, 3674, 3675, 3676, 0, 540, 561, 585, 0, 540, 561, 585, 585, 585, 585, 585, 1079, 0, 0, 1563, 0, 0, 0, 1569, 0, 0, 0, 0, 0, 2789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1591, 0, 0, 0, 0, 0, 571, 571, 571, 571, 571, 571, 571, 595, 595, 595, 540, 595, 595, 595, 595, 595, 571, 571, 540, 571, 595, 571, 595, 1, 12290, 3, 78112, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1707, 0, 0, 2040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, 2170, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 0, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2253, 561, 561, 561, 561, 926, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2307, 561, 561, 561, 2310, 400, 0, 0, 0, 0, 378, 0, 69632, 73728, 0, 0, 0, 0, 423, 65536, 0, 0, 0, 0, 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1687, 0, 1689, 0, 0, 423, 423, 0, 423, 0, 437, 423, 0, 423, 468, 468, 468, 475, 468, 468, 468, 468, 468, 468, 468, 468, 475, 468, 468, 468, 468, 468, 468, 468, 468, 482, 468, 494, 494, 468, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 537, 549, 572, 549, 572, 549, 549, 572, 549, 596, 572, 572, 572, 572, 572, 572, 572, 596, 596, 596, 549, 596, 596, 596, 596, 596, 572, 572, 549, 572, 596, 572, 596, 1, 12290, 3, 78112, 0, 660, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1666, 0, 0, 830, 0, 0, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 729, 0, 742, 661, 0, 0, 0, 0, 0, 540, 847, 540, 540, 540, 540, 540, 540, 3330, 540, 540, 540, 561, 561, 561, 561, 561, 3335, 861, 540, 540, 540, 540, 540, 540, 540, 540, 540, 897, 540, 540, 540, 540, 540, 540, 540, 1799, 540, 540, 540, 540, 540, 540, 1807, 540, 561, 561, 916, 561, 561, 561, 931, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2266, 561, 561, 561, 561, 561, 561, 0, 0, 0, 540, 989, 585, 561, 540, 540, 897, 540, 540, 561, 561, 969, 561, 561, 561, 561, 561, 0, 585, 585, 989, 585, 585, 585, 1004, 585, 1094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1101, 1102, 0, 0, 0, 0, 0, 0, 1203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196608, 0, 0, 0, 0, 0, 540, 540, 540, 1308, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3222, 540, 540, 1360, 914, 561, 1363, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1376, 1383, 561, 561, 561, 1444, 561, 561, 561, 561, 26027, 1360, 987, 585, 1454, 585, 585, 585, 585, 585, 585, 2659, 585, 585, 2662, 2663, 585, 585, 585, 585, 585, 585, 585, 2712, 540, 585, 585, 561, 540, 540, 540, 540, 585, 585, 1488, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3128, 585, 1521, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1535, 585, 585, 585, 585, 585, 585, 2673, 585, 585, 585, 2676, 585, 585, 2678, 585, 2679, 561, 585, 585, 1521, 585, 585, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, 0, 0, 0, 0, 0, 0, 1826, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1841, 1842, 585, 585, 2009, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 561, 561, 1849, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2880, 561, 561, 561, 561, 561, 2063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2074, 540, 540, 2226, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 561, 561, 561, 2854, 561, 561, 561, 561, 561, 561, 2301, 561, 561, 561, 561, 561, 561, 2306, 561, 561, 561, 561, 561, 561, 3079, 561, 561, 561, 561, 561, 3085, 561, 561, 3088, 2311, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 2654, 585, 585, 585, 585, 585, 2374, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3140, 585, 585, 585, 585, 2386, 585, 585, 585, 585, 585, 585, 2391, 585, 585, 585, 585, 585, 2396, 585, 585, 585, 585, 585, 2012, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 561, 561, 2624, 561, 561, 561, 561, 561, 561, 2632, 561, 561, 561, 561, 561, 2288, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2631, 561, 561, 561, 561, 561, 2435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2114, 0, 0, 0, 0, 2476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 748, 0, 0, 0, 0, 0, 2732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1590, 1591, 0, 0, 0, 2772, 0, 0, 0, 0, 2777, 0, 0, 0, 0, 0, 0, 0, 540, 562, 540, 562, 540, 540, 562, 540, 586, 540, 540, 2810, 540, 540, 540, 540, 540, 540, 2818, 540, 540, 540, 540, 540, 540, 540, 889, 540, 540, 540, 540, 907, 540, 540, 540, 540, 540, 540, 540, 2849, 540, 540, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1836, 561, 561, 561, 561, 561, 2857, 561, 561, 561, 561, 561, 561, 2865, 561, 561, 561, 561, 561, 561, 561, 561, 3081, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2897, 561, 561, 0, 0, 585, 585, 585, 585, 585, 585, 585, 1467, 1474, 585, 585, 585, 585, 585, 585, 585, 585, 3621, 0, 0, 0, 0, 0, 0, 540, 2905, 585, 585, 585, 585, 585, 585, 2913, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1983, 585, 585, 1986, 585, 585, 585, 585, 585, 585, 585, 2945, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 3376, 0, 585, 3280, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 3155, 0, 0, 585, 585, 585, 3587, 585, 3589, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 0, 2791, 0, 0, 0, 2793, 0, 0, 0, 0, 0, 0, 0, 0, 3600, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1314, 540, 540, 540, 540, 3607, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3614, 585, 585, 585, 585, 585, 585, 2686, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1045, 585, 585, 585, 585, 585, 972, 561, 3653, 561, 561, 561, 561, 585, 3657, 585, 585, 585, 585, 0, 0, 0, 0, 0, 0, 1204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 0, 290, 0, 0, 0, 345, 469, 469, 469, 453, 453, 469, 453, 453, 453, 453, 453, 453, 453, 453, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 550, 573, 550, 573, 550, 550, 573, 550, 597, 573, 573, 573, 573, 573, 573, 573, 597, 597, 597, 550, 597, 597, 597, 597, 597, 573, 573, 550, 573, 597, 573, 597, 1, 12290, 3, 78112, 862, 540, 540, 876, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1315, 540, 540, 540, 585, 1019, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 3498, 0, 0, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1607, 0, 0, 0, 0, 1254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2111, 0, 0, 0, 540, 1341, 540, 540, 540, 540, 540, 1348, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3333, 561, 561, 561, 561, 561, 585, 585, 585, 585, 1505, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3365, 585, 585, 585, 585, 585, 1523, 585, 585, 585, 585, 585, 1530, 585, 585, 585, 585, 585, 585, 585, 1468, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2378, 585, 585, 585, 585, 585, 585, 561, 585, 585, 585, 1557, 585, 1079, 0, 1561, 0, 0, 0, 1567, 0, 0, 0, 0, 0, 803, 0, 0, 0, 0, 0, 0, 0, 803, 0, 0, 0, 0, 540, 540, 540, 540, 540, 1573, 0, 0, 0, 1579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 749, 0, 0, 0, 0, 0, 0, 0, 1695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2127, 0, 0, 0, 540, 1762, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1358, 540, 1843, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1854, 561, 561, 561, 561, 561, 561, 3239, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3578, 561, 561, 585, 585, 585, 585, 0, 2064, 2065, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1717, 0, 0, 0, 0, 0, 0, 2135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, 0, 2186, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1808, 540, 540, 2213, 540, 540, 540, 540, 2218, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1754, 540, 540, 540, 540, 540, 540, 2240, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1401, 561, 561, 2298, 561, 561, 561, 561, 2303, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3083, 561, 561, 561, 561, 561, 585, 585, 585, 2388, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1938, 585, 585, 585, 3034, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2210, 0, 0, 0, 3380, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1175, 0, 0, 0, 0, 540, 540, 3404, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2282, 561, 561, 561, 561, 561, 561, 561, 3419, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1049, 585, 585, 585, 585, 561, 540, 3454, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 3523, 561, 561, 561, 3469, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 3484, 385, 387, 337, 0, 0, 0, 0, 0, 0, 336, 0, 0, 337, 0, 0, 0, 0, 0, 1097, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2057, 0, 0, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 1139, 1140, 0, 0, 0, 0, 0, 362, 362, 0, 0, 0, 0, 0, 703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 438, 0, 444, 0, 470, 470, 470, 470, 470, 470, 470, 551, 574, 551, 574, 551, 551, 574, 551, 598, 480, 470, 470, 470, 499, 476, 499, 499, 499, 499, 499, 499, 499, 499, 470, 470, 476, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 480, 470, 481, 480, 470, 470, 470, 470, 574, 574, 574, 574, 574, 574, 574, 598, 598, 598, 551, 598, 598, 598, 598, 598, 574, 574, 551, 574, 598, 574, 598, 1, 12290, 3, 78112, 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2153, 0, 0, 0, 0, 0, 693, 0, 0, 0, 0, 0, 0, 362, 362, 362, 0, 0, 0, 0, 0, 0, 1217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1220, 0, 0, 1223, 0, 0, 0, 0, 0, 0, 663, 0, 791, 0, 0, 0, 0, 0, 0, 0, 795, 0, 0, 0, 0, 0, 2972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2097, 0, 2099, 0, 0, 0, 0, 0, 804, 0, 0, 0, 0, 0, 812, 0, 0, 0, 0, 706, 0, 0, 0, 0, 0, 0, 0, 0, 715, 0, 717, 0, 0, 0, 831, 0, 0, 0, 663, 834, 0, 791, 0, 0, 0, 0, 0, 840, 0, 0, 0, 0, 0, 2996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2429, 2430, 0, 0, 0, 0, 863, 540, 540, 877, 540, 540, 540, 888, 540, 540, 540, 540, 906, 540, 540, 540, 540, 540, 1311, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2843, 540, 540, 540, 540, 561, 561, 917, 561, 561, 561, 933, 561, 561, 947, 561, 561, 561, 561, 960, 561, 0, 995, 585, 1076, 1046, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 2686976, 2736128, 0, 0, 2531328, 2707456, 0, 3190784, 561, 561, 561, 978, 561, 561, 561, 0, 585, 585, 990, 585, 585, 585, 1006, 585, 585, 585, 585, 585, 2349, 585, 585, 585, 585, 2354, 585, 585, 585, 585, 585, 585, 585, 2377, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 561, 585, 0, 0, 0, 0, 585, 1020, 585, 585, 585, 585, 1033, 585, 585, 585, 585, 1051, 585, 585, 585, 561, 540, 585, 561, 3149, 540, 3151, 561, 3153, 585, 0, 0, 0, 0, 0, 0, 1660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 990, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 3067, 561, 561, 561, 561, 3071, 561, 561, 561, 561, 0, 0, 0, 1215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2431, 0, 2433, 0, 1238, 0, 0, 0, 0, 1270, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 3561, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 540, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1491, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1495, 585, 585, 585, 585, 561, 585, 585, 1556, 585, 585, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1100, 0, 0, 0, 0, 0, 0, 1622, 0, 0, 1625, 0, 1627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 839, 540, 540, 540, 540, 859, 540, 1744, 540, 540, 540, 540, 540, 540, 540, 540, 1755, 540, 540, 540, 540, 540, 540, 540, 2176, 540, 540, 2180, 540, 540, 540, 2184, 540, 561, 561, 561, 1847, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2294, 561, 561, 561, 0, 0, 2117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1730, 0, 0, 0, 0, 0, 0, 2148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1207, 0, 0, 0, 0, 0, 0, 0, 561, 561, 561, 561, 2248, 561, 561, 561, 561, 561, 561, 561, 561, 3095, 3097, 561, 561, 561, 3100, 561, 3102, 561, 561, 2313, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 0, 0, 0, 585, 585, 2651, 585, 585, 585, 585, 585, 585, 585, 2660, 585, 585, 585, 585, 585, 2665, 585, 585, 2398, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 2410, 585, 561, 0, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 0, 3669, 540, 3670, 0, 2436, 0, 0, 0, 0, 0, 0, 2441, 0, 0, 0, 2444, 2445, 0, 0, 0, 0, 0, 3010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 304, 0, 0, 0, 0, 2497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2506, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 163840, 0, 0, 0, 0, 65536, 0, 2512, 0, 0, 0, 0, 2515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2523, 540, 2536, 2537, 540, 540, 540, 540, 540, 2542, 540, 2544, 540, 540, 540, 540, 2548, 561, 2595, 561, 561, 2598, 2599, 561, 561, 561, 561, 561, 2604, 561, 2606, 561, 561, 561, 561, 1863, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2890, 561, 561, 561, 561, 561, 561, 561, 2610, 561, 561, 561, 561, 561, 561, 561, 561, 2616, 561, 561, 561, 561, 561, 2276, 561, 561, 2279, 561, 561, 561, 561, 561, 561, 561, 1915, 561, 561, 26027, 1920, 585, 585, 585, 585, 2636, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2608, 2668, 585, 2670, 585, 585, 585, 585, 2674, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2675, 585, 585, 585, 585, 585, 585, 2680, 585, 585, 585, 585, 585, 585, 585, 585, 2688, 585, 585, 585, 585, 585, 585, 585, 1950, 585, 585, 585, 585, 1954, 585, 585, 585, 2696, 585, 585, 585, 585, 2700, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1494, 585, 585, 585, 585, 585, 561, 2720, 561, 561, 585, 2722, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2964, 0, 0, 0, 0, 2770, 0, 0, 0, 2773, 0, 0, 2776, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1691, 0, 2786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2795, 0, 0, 0, 0, 0, 3171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1245, 0, 0, 0, 0, 0, 540, 2825, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1773, 540, 540, 2835, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2844, 540, 540, 2847, 540, 540, 2850, 540, 0, 0, 2851, 561, 561, 561, 561, 561, 561, 1851, 561, 561, 561, 561, 1855, 561, 561, 561, 561, 561, 2883, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2892, 561, 561, 2895, 561, 561, 2898, 561, 0, 0, 2899, 585, 585, 585, 585, 585, 585, 585, 1965, 585, 585, 585, 1970, 585, 585, 585, 585, 585, 2931, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2940, 585, 585, 2943, 585, 585, 2946, 585, 561, 2948, 585, 2949, 2950, 540, 540, 561, 561, 561, 561, 1878, 561, 561, 561, 561, 1884, 561, 561, 561, 561, 561, 561, 936, 561, 561, 561, 561, 561, 561, 561, 561, 561, 984, 0, 585, 585, 585, 585, 585, 585, 1007, 585, 0, 2968, 2969, 0, 0, 0, 0, 2974, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 331, 331, 0, 0, 0, 0, 3020, 0, 0, 540, 540, 3025, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3043, 540, 540, 540, 540, 540, 540, 540, 3050, 540, 540, 3052, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1352, 540, 540, 540, 540, 540, 561, 561, 561, 3091, 561, 561, 3093, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2602, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 3106, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1496, 585, 585, 585, 1500, 585, 585, 585, 3132, 585, 585, 3134, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1040, 585, 585, 585, 585, 585, 967, 3158, 0, 0, 0, 3162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1222, 0, 0, 1225, 0, 3190, 0, 0, 3193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 2166, 540, 540, 540, 540, 540, 3214, 540, 540, 540, 540, 540, 540, 540, 3219, 540, 540, 540, 540, 540, 540, 540, 2541, 540, 2543, 540, 540, 540, 540, 540, 540, 540, 540, 2581, 540, 540, 540, 540, 0, 2584, 0, 561, 561, 561, 3236, 3237, 561, 561, 561, 561, 561, 3241, 561, 561, 561, 561, 561, 561, 3250, 561, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 3536, 585, 585, 585, 585, 561, 561, 561, 3247, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 585, 3481, 585, 3483, 585, 585, 585, 585, 3269, 585, 585, 585, 585, 585, 585, 585, 585, 3275, 585, 585, 585, 585, 585, 585, 2701, 585, 585, 585, 585, 585, 585, 585, 2706, 585, 0, 0, 3308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 856, 540, 585, 3359, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1057, 561, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 3386, 0, 0, 0, 0, 0, 1169, 0, 1171, 0, 0, 0, 0, 1176, 0, 0, 0, 0, 0, 1185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, 0, 0, 0, 0, 0, 585, 3429, 585, 585, 585, 585, 585, 585, 561, 540, 561, 585, 0, 3437, 0, 0, 0, 0, 0, 3300, 0, 3176, 3302, 0, 0, 3305, 0, 0, 0, 0, 0, 0, 1113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 362, 0, 703, 0, 0, 3440, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 3452, 540, 540, 540, 540, 3457, 540, 540, 540, 540, 3462, 540, 540, 561, 561, 3467, 561, 0, 997, 1037, 585, 1048, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 776, 0, 0, 0, 0, 0, 783, 0, 0, 561, 561, 561, 3472, 561, 561, 561, 561, 3477, 561, 561, 585, 585, 3482, 585, 585, 585, 585, 585, 585, 3259, 3260, 585, 585, 585, 585, 3264, 3265, 585, 585, 585, 585, 585, 585, 3120, 585, 585, 585, 585, 585, 3126, 585, 585, 3129, 585, 585, 3487, 585, 585, 585, 585, 3492, 585, 585, 561, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 167936, 0, 0, 0, 0, 65536, 0, 3499, 0, 0, 0, 0, 0, 3505, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3397, 540, 540, 540, 540, 540, 540, 540, 540, 3517, 540, 540, 3519, 561, 561, 561, 561, 561, 561, 561, 561, 3252, 561, 561, 561, 561, 561, 561, 585, 561, 561, 561, 3530, 561, 561, 3532, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1042, 585, 585, 585, 585, 585, 969, 585, 585, 3543, 585, 585, 3545, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1144, 0, 362, 362, 0, 1147, 0, 540, 540, 3629, 3630, 540, 540, 561, 561, 561, 3635, 3636, 561, 561, 585, 585, 585, 585, 0, 2029, 0, 0, 0, 0, 0, 2031, 0, 0, 3641, 3642, 585, 585, 561, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 3395, 540, 540, 540, 540, 540, 540, 3401, 561, 561, 585, 585, 0, 540, 561, 585, 0, 540, 561, 585, 3681, 3682, 3683, 3684, 339, 340, 341, 342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1617, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2469, 0, 2470, 0, 342, 342, 343, 342, 0, 341, 342, 445, 454, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 486, 495, 495, 503, 495, 505, 495, 495, 505, 505, 495, 505, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 552, 575, 552, 575, 552, 552, 575, 552, 599, 575, 575, 575, 575, 575, 575, 575, 599, 599, 599, 552, 599, 599, 599, 599, 599, 575, 575, 552, 575, 599, 575, 599, 1, 12290, 3, 78112, 0, 0, 0, 646, 0, 0, 0, 0, 651, 652, 653, 654, 655, 656, 657, 0, 0, 0, 0, 1144, 0, 0, 1259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2957312, 0, 0, 0, 0, 0, 0, 0, 692, 0, 0, 0, 0, 0, 0, 699, 362, 362, 362, 0, 0, 0, 0, 0, 0, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, 800, 0, 0, 0, 0, 721, 0, 723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 733, 0, 0, 0, 0, 0, 1202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, 646, 752, 753, 754, 0, 0, 0, 0, 0, 760, 761, 0, 0, 0, 0, 0, 0, 1271, 0, 0, 0, 0, 0, 0, 540, 540, 540, 3026, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2220, 540, 540, 540, 540, 540, 0, 761, 0, 0, 790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 797, 0, 0, 0, 0, 1152, 0, 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, 0, 2106, 0, 0, 0, 0, 0, 0, 0, 0, 1219, 0, 0, 0, 0, 0, 0, 0, 723, 0, 692, 814, 0, 0, 0, 0, 761, 0, 0, 0, 0, 0, 0, 0, 558, 581, 558, 581, 558, 558, 581, 558, 605, 0, 754, 823, 824, 0, 0, 0, 0, 0, 0, 754, 0, 0, 828, 699, 0, 0, 0, 0, 1168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, 0, 0, 0, 0, 833, 0, 0, 0, 835, 0, 0, 0, 692, 699, 0, 0, 692, 833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 692, 540, 540, 853, 857, 860, 540, 868, 540, 540, 882, 884, 887, 540, 540, 540, 898, 902, 540, 540, 540, 540, 540, 540, 1766, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1786, 540, 540, 540, 540, 540, 561, 561, 561, 923, 927, 930, 561, 938, 561, 561, 561, 953, 955, 958, 561, 561, 561, 561, 1879, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2641, 561, 561, 561, 561, 561, 561, 561, 561, 2648, 0, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 2717, 540, 540, 540, 585, 585, 585, 1026, 1028, 1031, 585, 585, 585, 1043, 1047, 585, 585, 585, 585, 970, 0, 0, 0, 1060, 585, 1062, 1063, 853, 540, 898, 902, 1068, 923, 561, 970, 974, 561, 561, 561, 561, 0, 585, 585, 585, 996, 1000, 1003, 585, 1011, 1073, 0, 996, 585, 1043, 1047, 1078, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 560, 583, 560, 583, 560, 560, 583, 560, 607, 0, 0, 1199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1208, 0, 0, 0, 0, 0, 1231, 0, 0, 0, 0, 1236, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 422, 65536, 0, 540, 1322, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1331, 540, 540, 1338, 540, 540, 540, 540, 2228, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 561, 2852, 561, 561, 561, 561, 561, 561, 561, 561, 1422, 561, 561, 1429, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2879, 561, 561, 561, 561, 561, 561, 561, 1442, 561, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 585, 585, 2925, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 561, 585, 3436, 0, 3438, 0, 585, 1503, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1513, 585, 585, 1520, 1667, 0, 1669, 0, 0, 0, 1671, 0, 748, 0, 0, 0, 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 0, 0, 1602, 0, 0, 0, 0, 0, 0, 540, 1738, 540, 540, 540, 540, 540, 540, 540, 2584, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1839, 561, 561, 561, 1743, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2238, 540, 1776, 540, 540, 1781, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1353, 540, 540, 540, 540, 0, 561, 1829, 561, 561, 561, 561, 561, 561, 1835, 561, 561, 561, 561, 561, 561, 1864, 561, 561, 561, 1868, 561, 561, 1873, 561, 561, 1907, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 0, 585, 1923, 585, 585, 585, 585, 585, 585, 3270, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1968, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1929, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1511, 585, 585, 585, 585, 585, 1958, 585, 585, 585, 1962, 585, 585, 1967, 585, 585, 585, 585, 585, 585, 585, 1469, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2392, 585, 585, 585, 2395, 585, 585, 0, 1086, 0, 0, 0, 2034, 0, 1090, 0, 0, 0, 2036, 0, 1094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1226, 585, 585, 585, 585, 2362, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1534, 585, 585, 585, 585, 2585, 0, 1826, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2271, 585, 585, 585, 2710, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 540, 540, 1814, 540, 540, 540, 540, 1820, 540, 540, 540, 1360, 0, 0, 0, 0, 2744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1649, 0, 0, 0, 0, 585, 585, 585, 585, 2924, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1937, 585, 585, 585, 585, 561, 561, 3338, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1857, 561, 561, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 3385, 0, 0, 0, 0, 0, 0, 1628, 1629, 1630, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 362, 0, 0, 0, 0, 0, 0, 3402, 540, 540, 540, 561, 561, 561, 3407, 561, 561, 561, 561, 3411, 561, 561, 561, 561, 1391, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1414, 561, 561, 561, 561, 561, 561, 3417, 561, 561, 561, 585, 585, 585, 3422, 585, 585, 585, 585, 3426, 585, 585, 585, 585, 585, 2375, 2376, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1476, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3432, 585, 585, 585, 561, 540, 561, 585, 0, 0, 0, 0, 0, 0, 1644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 3446, 0, 0, 0, 540, 540, 540, 3392, 540, 540, 540, 540, 3396, 540, 540, 540, 540, 540, 540, 540, 3039, 540, 540, 540, 540, 540, 3045, 540, 540, 540, 540, 3455, 540, 540, 540, 3459, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 2626, 561, 561, 561, 561, 561, 561, 2633, 561, 561, 561, 561, 3470, 561, 561, 561, 3474, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 3111, 585, 585, 585, 585, 585, 585, 3485, 585, 585, 585, 3489, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 3603, 540, 3604, 540, 540, 540, 561, 561, 585, 585, 0, 540, 561, 585, 3677, 3678, 3679, 3680, 0, 540, 561, 585, 585, 585, 585, 585, 1079, 0, 1562, 0, 0, 0, 1568, 0, 0, 0, 0, 0, 1256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 300, 0, 0, 0, 0, 386, 0, 0, 0, 390, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1174, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 344, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 1201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 521, 521, 521, 521, 0, 0, 0, 0, 0, 0, 0, 0, 521, 521, 521, 521, 521, 521, 521, 553, 576, 553, 576, 553, 553, 576, 553, 600, 576, 576, 576, 576, 576, 576, 576, 600, 600, 600, 553, 600, 600, 600, 600, 600, 576, 576, 617, 622, 600, 622, 628, 1, 12290, 3, 78112, 561, 561, 561, 979, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2927, 585, 585, 585, 585, 585, 585, 0, 0, 0, 540, 1061, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3238, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1433, 561, 561, 561, 561, 561, 1107, 0, 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1190, 0, 0, 0, 0, 0, 561, 561, 561, 1389, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2308, 2309, 561, 561, 561, 1403, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2296, 2297, 1440, 561, 561, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 585, 585, 2947, 540, 585, 585, 561, 540, 540, 561, 561, 1574, 0, 0, 0, 1580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1664, 0, 0, 0, 0, 1606, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1620, 0, 0, 0, 0, 1216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2110, 0, 0, 0, 0, 561, 561, 561, 1877, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2322, 0, 0, 0, 2052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2155, 0, 2116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1676, 0, 2241, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2295, 561, 561, 561, 561, 2274, 561, 561, 561, 561, 2278, 561, 2280, 561, 561, 561, 561, 561, 561, 1897, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1397, 561, 561, 561, 561, 561, 561, 2359, 585, 585, 585, 585, 2363, 585, 2365, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3123, 585, 3125, 585, 585, 585, 585, 0, 0, 0, 2500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2494, 2495, 0, 0, 561, 2622, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2607, 561, 0, 3021, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2533, 540, 0, 0, 0, 0, 3176, 3382, 0, 0, 3384, 0, 0, 0, 0, 0, 0, 0, 728, 0, 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 3391, 540, 540, 3393, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1785, 540, 540, 540, 1790, 540, 0, 0, 0, 0, 3176, 0, 3443, 0, 0, 0, 0, 0, 3449, 540, 540, 540, 540, 540, 1782, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2832, 540, 540, 540, 540, 864, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 912, 1095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2447, 0, 0, 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2060, 0, 0, 1827, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2620, 345, 345, 347, 345, 0, 0, 345, 0, 345, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 3310, 0, 0, 3312, 0, 0, 0, 0, 0, 0, 540, 585, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 561, 3410, 561, 561, 561, 561, 561, 0, 0, 0, 345, 345, 347, 345, 345, 345, 345, 345, 345, 512, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 554, 577, 554, 577, 554, 554, 577, 554, 601, 577, 577, 577, 577, 577, 577, 577, 601, 601, 601, 554, 601, 601, 601, 601, 601, 577, 577, 554, 577, 601, 577, 601, 1, 12290, 3, 78112, 0, 722, 0, 724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2508, 0, 0, 0, 0, 739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1690, 0, 0, 0, 811, 0, 0, 810, 0, 0, 0, 0, 0, 755, 0, 0, 819, 0, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 0, 0, 1181, 540, 540, 540, 540, 540, 1797, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3464, 561, 561, 561, 561, 540, 540, 872, 540, 540, 540, 540, 890, 892, 540, 540, 903, 540, 540, 540, 540, 540, 540, 2175, 540, 2177, 540, 540, 540, 540, 540, 540, 2185, 561, 561, 918, 924, 561, 561, 561, 561, 942, 561, 561, 561, 561, 561, 962, 964, 561, 561, 975, 561, 561, 561, 561, 0, 585, 585, 991, 997, 585, 585, 585, 585, 585, 585, 585, 3271, 585, 585, 585, 585, 585, 585, 3277, 585, 1015, 585, 585, 585, 585, 585, 1035, 1037, 585, 585, 1048, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 540, 540, 3650, 3651, 540, 540, 0, 0, 0, 540, 991, 585, 561, 854, 892, 540, 903, 540, 924, 964, 561, 975, 0, 0, 0, 1151, 0, 1153, 0, 1155, 0, 0, 0, 0, 0, 0, 0, 0, 713, 0, 0, 0, 0, 0, 0, 0, 0, 1181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1731, 0, 1212, 1213, 0, 0, 0, 0, 0, 1218, 0, 0, 0, 0, 0, 0, 0, 0, 729, 0, 0, 0, 0, 0, 0, 0, 540, 540, 1307, 1309, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1316, 540, 540, 1319, 540, 540, 1343, 540, 540, 540, 540, 540, 540, 540, 540, 1354, 1355, 540, 540, 540, 540, 540, 1813, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 1360, 914, 561, 561, 561, 1366, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 1921, 585, 585, 585, 585, 561, 561, 1420, 561, 561, 561, 561, 561, 561, 561, 1434, 561, 561, 561, 561, 561, 561, 3342, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3080, 561, 561, 561, 561, 561, 561, 561, 561, 2319, 561, 561, 561, 561, 0, 0, 0, 561, 561, 561, 1445, 1446, 561, 561, 561, 26027, 1360, 987, 585, 585, 585, 1457, 585, 585, 585, 585, 585, 2403, 585, 585, 585, 585, 585, 561, 2409, 585, 2411, 2412, 585, 1487, 1489, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3366, 585, 585, 585, 585, 1525, 585, 585, 585, 585, 585, 585, 585, 585, 1536, 1537, 585, 585, 585, 585, 585, 585, 3434, 585, 561, 540, 561, 585, 0, 0, 0, 3439, 585, 1542, 0, 540, 585, 585, 561, 540, 1547, 540, 540, 1550, 561, 1551, 561, 561, 561, 561, 1895, 561, 561, 561, 1900, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 988, 585, 585, 585, 585, 585, 1554, 585, 1555, 585, 585, 1558, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2069, 0, 0, 0, 0, 2073, 0, 0, 1678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2037, 0, 0, 0, 1694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2072, 0, 0, 0, 1637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2051, 0, 0, 561, 561, 561, 561, 561, 561, 1833, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 585, 585, 585, 561, 1908, 561, 561, 561, 561, 1914, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 585, 2334, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2938, 585, 585, 585, 585, 585, 585, 585, 1927, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1055, 585, 561, 585, 585, 585, 1994, 585, 585, 585, 585, 585, 585, 585, 585, 2002, 585, 585, 585, 585, 585, 585, 2711, 561, 540, 585, 585, 561, 540, 540, 540, 540, 540, 540, 2217, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1802, 540, 540, 540, 540, 540, 585, 2008, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 561, 561, 2261, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2891, 561, 561, 561, 561, 0, 2076, 0, 0, 0, 0, 0, 0, 0, 0, 2084, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 266240, 0, 0, 0, 0, 65536, 0, 2088, 0, 0, 2090, 0, 0, 0, 0, 0, 0, 0, 2098, 0, 0, 0, 0, 0, 0, 1725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 2146, 0, 0, 0, 2146, 0, 0, 2151, 2152, 0, 0, 0, 0, 0, 0, 0, 274432, 274432, 274432, 0, 274432, 274432, 274432, 274432, 274432, 2156, 0, 0, 0, 0, 0, 0, 0, 2162, 540, 540, 540, 540, 540, 2168, 540, 540, 540, 540, 2538, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1821, 540, 540, 1360, 540, 2200, 540, 2203, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2209, 540, 540, 540, 540, 2578, 540, 540, 540, 540, 540, 540, 540, 540, 0, 2584, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 0, 0, 0, 2244, 561, 561, 561, 561, 561, 561, 2251, 561, 561, 561, 561, 561, 561, 3351, 585, 585, 585, 585, 585, 585, 585, 3356, 585, 561, 561, 2300, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2323, 0, 0, 0, 2329, 585, 585, 585, 585, 585, 585, 2336, 585, 585, 585, 585, 585, 585, 585, 1470, 585, 585, 585, 585, 1480, 585, 585, 585, 585, 585, 2360, 585, 585, 585, 585, 585, 585, 2366, 585, 2368, 585, 2371, 585, 585, 585, 585, 585, 585, 3546, 0, 0, 3549, 3550, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2912256, 0, 3207168, 2465792, 0, 0, 2385, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1989, 2472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2480, 0, 0, 0, 0, 0, 0, 0, 286720, 286720, 0, 286720, 286720, 1, 12290, 3, 0, 0, 0, 0, 0, 2514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2522, 0, 0, 0, 0, 1575, 0, 0, 0, 0, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 172032, 0, 0, 0, 0, 65536, 0, 561, 561, 2596, 561, 561, 561, 561, 561, 2601, 561, 561, 561, 561, 561, 561, 561, 0, 585, 585, 992, 585, 585, 585, 585, 585, 585, 2681, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1956, 585, 2719, 561, 561, 561, 2721, 585, 585, 585, 2723, 2724, 0, 0, 0, 0, 0, 0, 0, 2801, 0, 0, 0, 540, 2805, 540, 540, 540, 2742, 0, 2743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2100, 0, 0, 0, 0, 2758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2128, 0, 0, 540, 2809, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2223, 2224, 540, 2846, 540, 540, 540, 540, 540, 0, 0, 561, 561, 561, 561, 2855, 561, 2856, 561, 2894, 561, 561, 561, 561, 561, 0, 0, 585, 585, 585, 585, 2903, 585, 2904, 585, 2942, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 3374, 0, 0, 3377, 0, 0, 0, 540, 3024, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1771, 540, 540, 540, 540, 561, 561, 585, 3105, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2369, 585, 585, 585, 585, 585, 3145, 540, 585, 561, 540, 540, 561, 561, 585, 585, 0, 0, 0, 0, 0, 0, 2066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 297, 0, 0, 0, 0, 0, 0, 0, 3390, 540, 540, 540, 540, 3394, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2179, 540, 540, 540, 540, 540, 540, 540, 3403, 540, 540, 3405, 561, 561, 561, 561, 3409, 561, 561, 561, 561, 561, 561, 2277, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3082, 561, 3084, 561, 561, 561, 561, 561, 561, 561, 3418, 561, 561, 3420, 585, 585, 585, 585, 3424, 585, 585, 585, 585, 585, 585, 585, 3591, 585, 561, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 3303, 0, 0, 0, 0, 3307, 0, 585, 585, 585, 585, 585, 3433, 585, 585, 561, 540, 561, 585, 0, 0, 0, 0, 0, 0, 2137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1129, 0, 0, 0, 0, 0, 0, 0, 3500, 0, 3502, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 3511, 540, 540, 540, 540, 2812, 540, 2815, 540, 540, 540, 540, 2820, 540, 540, 540, 2823, 540, 540, 540, 540, 3631, 540, 561, 561, 561, 561, 561, 3637, 561, 585, 585, 585, 585, 585, 1079, 0, 0, 0, 1564, 0, 0, 0, 1570, 0, 585, 585, 3643, 585, 561, 3645, 0, 3647, 0, 0, 540, 540, 540, 540, 540, 540, 540, 1286, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3208, 540, 540, 540, 540, 540, 365, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2496, 398, 0, 0, 0, 0, 0, 365, 373, 401, 0, 0, 0, 0, 0, 365, 0, 0, 393, 0, 0, 0, 0, 348, 0, 0, 365, 0, 393, 0, 406, 408, 0, 0, 365, 373, 0, 69632, 73728, 0, 0, 0, 0, 424, 65536, 0, 0, 0, 0, 1596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 0, 0, 0, 424, 424, 0, 424, 0, 408, 424, 447, 455, 0, 0, 0, 0, 0, 0, 0, 777, 0, 0, 0, 0, 0, 0, 0, 644, 0, 406, 0, 496, 496, 0, 496, 496, 496, 496, 496, 496, 496, 496, 522, 522, 522, 522, 455, 455, 455, 530, 455, 531, 455, 455, 522, 536, 522, 522, 522, 522, 538, 555, 578, 555, 578, 555, 555, 578, 555, 602, 578, 578, 578, 608, 608, 608, 578, 602, 602, 602, 555, 602, 602, 602, 602, 602, 578, 578, 618, 623, 602, 623, 629, 1, 12290, 3, 78112, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2769, 0, 0, 0, 694, 0, 0, 0, 0, 0, 362, 362, 362, 0, 0, 0, 0, 0, 0, 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1260, 0, 0, 0, 0, 0, 0, 0, 0, 805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2142, 2143, 0, 540, 540, 540, 878, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1332, 540, 540, 540, 561, 561, 919, 561, 561, 561, 561, 561, 561, 948, 950, 561, 561, 561, 561, 561, 561, 3575, 561, 3577, 561, 561, 561, 585, 585, 585, 585, 0, 0, 1563, 0, 0, 0, 0, 0, 1569, 0, 585, 1021, 1023, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 561, 3496, 0, 3497, 0, 0, 0, 0, 0, 540, 992, 585, 561, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3341, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3579, 561, 585, 585, 585, 585, 0, 0, 0, 1098, 1230, 0, 0, 0, 0, 0, 0, 1237, 0, 0, 0, 0, 0, 0, 2452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1242, 1251, 540, 540, 1280, 540, 540, 540, 1284, 540, 540, 1295, 540, 540, 1299, 540, 540, 540, 540, 540, 2229, 540, 2231, 540, 540, 540, 540, 540, 540, 540, 0, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1840, 561, 561, 1360, 914, 561, 561, 561, 561, 561, 561, 1369, 561, 561, 561, 1373, 561, 561, 1384, 561, 561, 1388, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2324, 0, 0, 561, 561, 1405, 561, 561, 561, 1409, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3612, 3613, 561, 585, 585, 585, 585, 585, 1460, 585, 585, 585, 1464, 585, 585, 1475, 585, 585, 1479, 585, 585, 585, 585, 585, 585, 1032, 585, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 3625, 0, 540, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1636, 0, 0, 0, 0, 1626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2058, 2059, 0, 2061, 2062, 1638, 0, 0, 0, 1642, 0, 0, 0, 1646, 0, 0, 0, 1650, 0, 0, 0, 0, 0, 1257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1145, 362, 362, 0, 0, 1148, 561, 1844, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2635, 561, 561, 561, 561, 1862, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2869, 561, 561, 2872, 2007, 585, 585, 585, 585, 561, 1752, 585, 1938, 1844, 540, 540, 540, 540, 561, 561, 561, 561, 2275, 561, 561, 561, 561, 561, 561, 2281, 561, 2283, 561, 2286, 0, 0, 2056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2154, 0, 0, 0, 0, 0, 2118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2520, 0, 0, 0, 0, 2132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2141, 0, 0, 0, 0, 0, 0, 2463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2158, 0, 0, 2161, 0, 540, 540, 2164, 540, 540, 540, 540, 540, 540, 540, 3053, 540, 3055, 540, 540, 540, 540, 540, 540, 540, 540, 2232, 540, 540, 2235, 2236, 540, 540, 0, 540, 540, 540, 2227, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 2242, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 561, 561, 2246, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 1360, 987, 585, 585, 1455, 585, 1458, 561, 2312, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 0, 0, 0, 0, 585, 2650, 585, 585, 585, 585, 585, 585, 561, 3547, 3548, 0, 0, 0, 0, 0, 0, 3554, 0, 585, 585, 2331, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2381, 2382, 585, 585, 585, 585, 2387, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2397, 540, 540, 2415, 2416, 561, 561, 2419, 2420, 585, 585, 2423, 2424, 0, 1563, 0, 1569, 0, 1575, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2752, 0, 0, 0, 0, 0, 0, 0, 2438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1728, 0, 0, 0, 0, 0, 2513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2519, 0, 0, 0, 0, 0, 0, 2478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1189, 0, 0, 0, 0, 0, 0, 540, 540, 540, 2565, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1333, 540, 540, 540, 585, 585, 2682, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2693, 585, 585, 585, 585, 585, 585, 3590, 585, 585, 561, 0, 3594, 0, 0, 0, 0, 0, 0, 2516, 2466, 0, 0, 0, 0, 0, 2521, 0, 0, 2824, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2239, 561, 561, 561, 561, 2885, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1395, 561, 561, 561, 561, 561, 561, 561, 561, 1430, 561, 561, 561, 561, 561, 561, 561, 561, 2866, 561, 561, 561, 561, 561, 561, 561, 585, 585, 585, 585, 2933, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1985, 585, 585, 585, 585, 0, 3177, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1601, 1602, 0, 0, 0, 0, 0, 0, 0, 0, 3194, 0, 0, 0, 0, 0, 0, 3197, 0, 3199, 540, 540, 540, 540, 880, 540, 885, 540, 891, 540, 894, 540, 540, 908, 540, 540, 540, 540, 540, 3038, 540, 540, 540, 540, 540, 540, 540, 540, 3046, 540, 585, 3289, 3290, 0, 0, 0, 0, 3294, 0, 0, 0, 0, 0, 0, 0, 0, 1099, 0, 0, 0, 0, 0, 0, 0, 540, 540, 3316, 540, 540, 540, 3319, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1819, 540, 540, 540, 540, 1360, 561, 3337, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2646, 561, 3415, 561, 561, 561, 561, 561, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3115, 3428, 585, 3430, 585, 585, 585, 585, 585, 561, 540, 561, 585, 0, 0, 0, 0, 0, 0, 2503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 336, 290, 0, 0, 0, 0, 3555, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3566, 540, 540, 561, 3064, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2617, 561, 561, 561, 561, 561, 3608, 561, 3609, 561, 561, 561, 561, 561, 561, 561, 585, 585, 3615, 585, 585, 585, 585, 585, 2658, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1952, 585, 585, 585, 585, 585, 3616, 585, 585, 585, 585, 585, 585, 585, 561, 0, 0, 0, 0, 0, 0, 540, 585, 585, 561, 540, 540, 540, 1067, 911, 561, 561, 561, 1072, 407, 353, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 1658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 1146, 0, 0, 472, 483, 472, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 523, 523, 527, 527, 527, 527, 472, 472, 472, 472, 472, 477, 472, 472, 527, 523, 527, 527, 527, 527, 539, 556, 579, 556, 579, 556, 556, 579, 556, 603, 579, 579, 579, 579, 579, 579, 579, 603, 603, 603, 556, 603, 603, 603, 603, 603, 579, 579, 619, 624, 603, 624, 630, 1, 12290, 3, 78112, 0, 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2101, 0, 738, 0, 0, 0, 644, 738, 0, 744, 745, 644, 0, 0, 0, 0, 0, 0, 0, 0, 793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 802, 0, 807, 0, 0, 0, 0, 0, 0, 807, 0, 0, 0, 0, 0, 644, 0, 0, 0, 802, 0, 807, 0, 793, 0, 822, 0, 0, 0, 665, 0, 0, 0, 0, 822, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 362, 0, 0, 0, 1134592, 0, 0, 0, 793, 793, 0, 644, 0, 0, 793, 807, 845, 0, 540, 850, 540, 540, 540, 540, 540, 2539, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3324, 540, 540, 540, 540, 540, 869, 873, 879, 883, 540, 540, 540, 540, 540, 899, 540, 540, 540, 540, 540, 540, 540, 3206, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2205, 540, 540, 540, 540, 540, 540, 561, 561, 920, 561, 561, 561, 561, 939, 943, 949, 561, 954, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 0, 0, 2728, 0, 0, 1016, 1022, 585, 1027, 585, 585, 585, 585, 585, 1044, 585, 585, 585, 585, 585, 1058, 0, 0, 0, 540, 993, 585, 561, 540, 540, 899, 540, 540, 561, 561, 971, 561, 561, 561, 561, 561, 0, 585, 585, 993, 585, 585, 585, 585, 1012, 1149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2784, 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1211, 1227, 0, 0, 1099, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1249, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 1674, 0, 0, 0, 0, 0, 0, 743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2753, 2754, 0, 1252, 1200, 0, 1233, 1255, 0, 1258, 0, 0, 0, 0, 0, 1130, 0, 0, 0, 0, 0, 1597, 0, 0, 0, 1600, 0, 0, 1603, 0, 0, 0, 0, 0, 843, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 3320, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1801, 540, 540, 540, 1806, 540, 540, 0, 1267, 0, 0, 0, 0, 0, 1267, 0, 0, 1149, 1267, 0, 1274, 540, 540, 540, 540, 1282, 540, 540, 540, 1291, 540, 540, 540, 540, 540, 540, 540, 540, 2204, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2830, 540, 540, 540, 540, 540, 540, 540, 1279, 540, 540, 540, 540, 1285, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2194, 540, 540, 540, 540, 540, 540, 1306, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1317, 540, 540, 540, 540, 540, 2567, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2545, 540, 540, 540, 540, 1321, 540, 540, 540, 540, 540, 540, 540, 1327, 540, 540, 540, 1334, 1336, 540, 540, 540, 540, 1310, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1335, 540, 540, 540, 1360, 914, 1362, 561, 561, 561, 561, 1368, 561, 561, 561, 561, 1374, 561, 561, 561, 561, 1407, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2293, 561, 561, 561, 561, 561, 561, 1406, 561, 561, 561, 561, 1411, 561, 561, 561, 561, 561, 561, 561, 561, 1852, 561, 561, 561, 561, 561, 561, 561, 561, 1866, 561, 561, 561, 561, 561, 561, 561, 1418, 561, 561, 561, 1425, 1427, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1865, 561, 561, 561, 561, 561, 561, 561, 561, 1883, 561, 561, 561, 561, 561, 561, 561, 1459, 585, 585, 585, 585, 1465, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1533, 585, 585, 585, 585, 585, 1486, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1497, 585, 585, 585, 585, 585, 585, 1034, 585, 585, 585, 585, 1052, 585, 585, 585, 561, 1502, 585, 585, 585, 585, 585, 585, 585, 585, 1509, 585, 585, 585, 1516, 1518, 585, 585, 585, 585, 585, 2685, 585, 585, 585, 585, 2689, 585, 585, 585, 2694, 585, 561, 0, 1290, 1544, 1470, 1379, 540, 540, 540, 540, 540, 561, 561, 561, 561, 561, 3249, 561, 3251, 561, 561, 561, 561, 561, 561, 561, 585, 3534, 585, 3535, 585, 585, 585, 3539, 585, 0, 1575, 0, 0, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, 0, 0, 0, 1592, 1593, 0, 0, 0, 0, 0, 1599, 0, 0, 0, 0, 0, 0, 0, 0, 1172, 0, 0, 0, 0, 0, 0, 0, 0, 1639, 0, 0, 0, 0, 0, 0, 0, 1647, 1648, 0, 0, 0, 0, 0, 0, 0, 2387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2987, 0, 0, 0, 0, 0, 2990, 0, 1655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2482, 0, 0, 0, 1721, 0, 0, 0, 0, 0, 0, 0, 1718, 0, 0, 0, 0, 0, 0, 300, 300, 300, 300, 0, 300, 300, 300, 300, 300, 540, 540, 540, 1747, 540, 540, 540, 540, 1753, 540, 540, 540, 540, 540, 540, 540, 540, 1817, 540, 540, 540, 540, 540, 540, 1360, 540, 540, 540, 1764, 540, 540, 540, 540, 1768, 540, 540, 540, 540, 540, 540, 540, 540, 2178, 540, 540, 540, 540, 540, 540, 540, 540, 1287, 1294, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1779, 540, 540, 1783, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2206, 2207, 540, 540, 540, 540, 1809, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1379, 561, 0, 1074, 585, 585, 1050, 585, 78112, 1079, 0, 0, 0, 0, 0, 0, 0, 1106, 0, 0, 0, 0, 0, 0, 1210, 0, 561, 1845, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1856, 561, 561, 561, 561, 1423, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3253, 561, 561, 561, 561, 585, 561, 1860, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1871, 561, 561, 561, 561, 1424, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 1920, 585, 585, 585, 585, 1876, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3244, 561, 561, 585, 2026, 585, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286720, 0, 0, 0, 0, 2079, 2080, 0, 0, 2082, 2083, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 3306, 0, 0, 0, 0, 0, 0, 2105, 0, 0, 0, 0, 2108, 2109, 0, 0, 0, 0, 0, 0, 301, 301, 301, 301, 0, 301, 301, 301, 301, 301, 2115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2796, 0, 0, 0, 2147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2781, 0, 0, 0, 0, 0, 2157, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 540, 2225, 540, 540, 540, 540, 2230, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2070, 0, 0, 0, 0, 0, 2242, 0, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2618, 561, 561, 561, 561, 561, 2259, 561, 561, 2263, 561, 561, 561, 2267, 561, 561, 561, 561, 561, 561, 3610, 561, 3611, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 2030, 0, 1082, 0, 0, 0, 2032, 585, 2344, 585, 585, 2348, 585, 585, 585, 2352, 585, 585, 585, 585, 585, 585, 585, 1528, 585, 585, 585, 585, 585, 585, 1538, 585, 585, 585, 585, 2361, 585, 585, 2364, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1935, 1936, 585, 585, 585, 585, 1943, 585, 585, 2400, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 585, 561, 540, 2718, 540, 540, 0, 0, 0, 2437, 0, 0, 0, 0, </string> </value>
+        </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAABI=</string> </persistent>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="18" aka="AAAAAAAAABI=">
+    <pickle>
+      <global name="Pdata" module="OFS.Image"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>data</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+0, 0, 0, 0, 0, 0, 0, 0, 2794, 0, 0, 0, 0, 2473, 0, 0, 0, 2477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2511, 0, 540, 540, 2525, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2532, 540, 540, 540, 540, 1324, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1330, 540, 540, 540, 540, 540, 540, 2550, 540, 540, 2552, 540, 2553, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2193, 540, 540, 2196, 540, 540, 540, 540, 2563, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2574, 540, 540, 540, 540, 2827, 2828, 540, 540, 540, 540, 2831, 540, 540, 540, 540, 540, 540, 540, 1751, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1351, 540, 540, 540, 540, 540, 540, 0, 0, 0, 561, 561, 2587, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2264, 561, 561, 561, 561, 2269, 561, 561, 561, 2594, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2871, 561, 561, 2609, 561, 561, 561, 2612, 561, 561, 2614, 561, 2615, 561, 561, 561, 561, 561, 929, 561, 937, 561, 561, 561, 561, 561, 561, 561, 561, 2629, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2623, 561, 561, 2627, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2290, 2291, 561, 561, 561, 561, 561, 561, 561, 0, 2327, 585, 585, 585, 585, 585, 585, 585, 1507, 585, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 3284, 540, 3286, 561, 561, 561, 561, 2638, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3099, 561, 561, 561, 0, 0, 2733, 2734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3002, 0, 0, 0, 2785, 0, 2787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2432, 0, 0, 0, 0, 0, 0, 2800, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 3217, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3042, 540, 3044, 540, 540, 540, 540, 540, 540, 2848, 540, 540, 540, 0, 0, 561, 561, 561, 561, 561, 561, 561, 2318, 561, 561, 561, 561, 561, 0, 0, 0, 561, 561, 2859, 561, 2862, 561, 561, 561, 561, 2867, 561, 561, 561, 2870, 561, 561, 561, 561, 2302, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 940, 561, 561, 561, 561, 561, 561, 561, 561, 1394, 561, 561, 561, 561, 561, 561, 561, 1402, 561, 561, 561, 2896, 561, 561, 561, 0, 0, 585, 585, 585, 585, 585, 585, 585, 1529, 585, 585, 585, 585, 585, 585, 585, 585, 2661, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2907, 585, 2910, 585, 585, 585, 585, 2915, 585, 585, 585, 2918, 585, 585, 585, 585, 585, 1527, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2367, 585, 585, 585, 585, 585, 585, 585, 585, 2944, 585, 585, 585, 561, 540, 585, 585, 561, 540, 540, 561, 561, 585, 585, 3373, 0, 0, 0, 3375, 0, 0, 2980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2979, 2991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3005, 0, 3006, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2989, 0, 561, 561, 561, 561, 3078, 561, 561, 561, 561, 561, 561, 561, 561, 3086, 561, 561, 561, 561, 2315, 561, 561, 561, 561, 561, 561, 561, 561, 0, 0, 2327, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3273, 585, 585, 585, 585, 585, 585, 561, 561, 585, 585, 585, 3107, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1969, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3119, 585, 585, 585, 585, 585, 585, 585, 585, 3127, 585, 585, 585, 585, 585, 1901, 540, 585, 585, 561, 540, 540, 540, 540, 561, 561, 3065, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3479, 585, 585, 585, 585, 585, 0, 3159, 0, 0, 0, 0, 0, 0, 0, 3165, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 3304, 0, 0, 0, 0, 0, 0, 3191, 0, 0, 0, 0, 0, 0, 3195, 3196, 0, 0, 0, 0, 540, 540, 3601, 540, 3602, 540, 540, 540, 540, 540, 540, 540, 540, 1752, 540, 540, 540, 540, 540, 540, 540, 540, 1349, 540, 540, 540, 540, 540, 540, 540, 540, 1288, 540, 540, 540, 540, 540, 540, 540, 540, 1289, 540, 540, 540, 540, 540, 540, 540, 540, 1290, 540, 540, 540, 540, 1300, 540, 540, 3279, 585, 585, 585, 585, 585, 585, 585, 561, 540, 585, 561, 540, 540, 561, 561, 561, 561, 2611, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2304, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1853, 561, 561, 561, 561, 561, 561, 540, 540, 540, 540, 3317, 540, 540, 540, 3321, 540, 540, 540, 540, 540, 540, 540, 540, 2192, 540, 540, 540, 540, 540, 540, 2198, 561, 561, 561, 3339, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2628, 561, 561, 561, 561, 561, 561, 561, 561, 2305, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3348, 561, 561, 561, 585, 585, 585, 585, 585, 3353, 585, 585, 585, 3357, 561, 561, 3572, 561, 561, 561, 561, 561, 561, 561, 561, 3580, 585, 585, 585, 3584, 3597, 0, 3598, 3599, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3605, 3606, 540, 540, 540, 540, 2837, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1803, 540, 540, 540, 540, 585, 585, 585, 585, 585, 3619, 3620, 585, 561, 0, 0, 3623, 0, 0, 0, 540, 585, 585, 561, 540, 540, 895, 540, 540, 561, 561, 967, 561, 561, 3671, 585, 3672, 0, 540, 561, 585, 0, 540, 561, 585, 0, 540, 561, 585, 585, 585, 585, 585, 1079, 1559, 0, 0, 0, 1565, 0, 0, 0, 1571, 2033, 0, 0, 0, 0, 1577, 2035, 0, 0, 0, 0, 0, 0, 0, 1682, 0, 1684, 0, 0, 0, 0, 0, 0, 0, 1712, 0, 0, 1715, 0, 0, 0, 0, 0, 355, 356, 0, 0, 0, 0, 0, 0, 0, 362, 0, 290, 0, 0, 0, 0, 0, 0, 2762, 0, 0, 0, 0, 0, 0, 0, 2768, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3198, 0, 540, 540, 473, 473, 487, 0, 0, 487, 356, 356, 356, 509, 356, 356, 356, 356, 473, 473, 580, 580, 580, 580, 580, 580, 580, 604, 604, 604, 557, 604, 604, 604, 604, 604, 580, 580, 557, 580, 604, 580, 604, 1, 12290, 3, 78112, 540, 870, 540, 540, 540, 540, 540, 540, 540, 540, 540, 904, 540, 540, 540, 540, 540, 540, 2191, 540, 540, 540, 540, 2195, 540, 2197, 540, 540, 561, 561, 976, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 1013, 1197, 0, 0, 0, 0, 0, 0, 0, 1197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 1360, 914, 561, 561, 561, 561, 561, 561, 561, 561, 1371, 561, 561, 561, 1380, 561, 561, 561, 561, 2639, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2644, 561, 561, 561, 561, 585, 585, 585, 1462, 585, 585, 585, 1471, 585, 585, 585, 585, 585, 585, 585, 585, 1472, 585, 1477, 585, 585, 1481, 585, 585, 1541, 561, 0, 1291, 585, 1471, 1380, 540, 540, 540, 540, 540, 561, 561, 561, 561, 585, 585, 585, 585, 0, 0, 0, 0, 2727, 0, 0, 0, 0, 0, 1576, 0, 0, 0, 1582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2737, 0, 0, 0, 0, 0, 2741, 0, 1607, 0, 0, 0, 0, 0, 0, 0, 1615, 1616, 0, 0, 0, 0, 0, 0, 303, 204800, 204800, 0, 205103, 204800, 1, 12290, 3, 0, 1761, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 1774, 1891, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3087, 561, 561, 561, 561, 1911, 561, 561, 561, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 585, 585, 1466, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2928, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1947, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2001, 585, 585, 585, 585, 585, 585, 585, 1960, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1973, 0, 0, 2243, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2634, 561, 561, 2328, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2384, 0, 0, 0, 0, 2425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2085, 2086, 0, 0, 0, 0, 2449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3175, 0, 0, 0, 0, 561, 561, 561, 561, 561, 561, 2590, 561, 561, 561, 561, 561, 561, 2289, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2292, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2861, 561, 2863, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2877, 561, 561, 561, 561, 561, 561, 561, 561, 1899, 561, 561, 561, 561, 561, 1905, 561, 585, 585, 585, 2909, 585, 2911, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1984, 585, 585, 585, 585, 585, 585, 585, 3360, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1056, 585, 561, 0, 3556, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3567, 540, 561, 561, 561, 561, 2876, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 26027, 0, 585, 585, 585, 585, 561, 561, 561, 561, 3656, 561, 585, 585, 585, 585, 3660, 585, 0, 0, 0, 0, 0, 0, 2775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2124, 0, 0, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 362, 0, 290, 0, 0, 0, 0, 0, 0, 2790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1147354, 0, 0, 0, 0, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2509, 0, 0, 357, 0, 367, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2457, 0, 0, 581, 581, 581, 581, 581, 581, 581, 605, 605, 605, 558, 605, 605, 605, 605, 605, 581, 581, 558, 581, 605, 581, 605, 1, 12290, 3, 78112, 865, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2575, 1385, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3243, 561, 1775, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3047, 585, 585, 585, 585, 1961, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2380, 585, 585, 585, 585, 2756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3315, 0, 2981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3188, 0, 3298, 0, 3299, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3388, 0, 0, 0, 0, 358, 359, 360, 361, 0, 0, 362, 0, 290, 0, 0, 0, 0, 0, 0, 2973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 362, 702, 0, 0, 0, 0, 359, 0, 358, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 425, 65536, 0, 0, 0, 0, 1710, 1711, 0, 0, 0, 1714, 0, 0, 0, 0, 0, 1718, 425, 425, 0, 425, 0, 359, 425, 0, 456, 0, 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, 0, 1263, 1264, 0, 0, 0, 0, 0, 497, 497, 0, 504, 504, 504, 504, 510, 511, 504, 504, 524, 524, 524, 524, 456, 456, 456, 456, 456, 456, 456, 456, 524, 524, 524, 524, 524, 524, 524, 559, 582, 559, 582, 559, 559, 582, 559, 606, 582, 582, 582, 582, 582, 582, 582, 606, 606, 606, 559, 606, 606, 606, 606, 606, 582, 582, 620, 625, 606, 625, 631, 1, 12290, 3, 78112, 0, 0, 0, 540, 585, 585, 561, 540, 540, 900, 540, 540, 561, 561, 972, 561, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 1934, 585, 585, 585, 585, 585, 585, 585, 0, 0, 2104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2740, 0, 0, 0, 0, 0, 561, 2245, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3533, 585, 585, 585, 585, 585, 585, 585, 585, 585, 3494, 561, 0, 0, 0, 0, 0, 0, 585, 2330, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1482, 585, 585, 540, 2549, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2237, 0, 540, 540, 2577, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 0, 0, 0, 0, 0, 1611, 0, 0, 1614, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2891776, 0, 0, 0, 0, 0, 2392064, 583, 583, 583, 583, 583, 583, 583, 607, 607, 607, 560, 607, 607, 607, 607, 607, 583, 583, 560, 583, 607, 583, 607, 1, 12290, 3, 78112, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155648, 866, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 3224, 1136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362, 362, 0, 0, 0, 0, 0, 1659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 780, 0, 0, 0, 0, 786, 561, 585, 585, 585, 585, 585, 1079, 1560, 0, 0, 0, 1566, 0, 0, 0, 1572, 0, 0, 0, 1578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3313, 0, 0, 540, 2199, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2547, 540, 2535, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 2822, 540, 561, 561, 561, 2597, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2317, 561, 561, 2320, 2321, 561, 561, 0, 0, 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 743, 540, 540, 540, 540, 540, 540, 540, 3331, 540, 540, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3072, 561, 561, 561, 0, 0, 0, 540, 585, 585, 561, 1064, 540, 540, 905, 540, 1069, 561, 561, 977, 561, 561, 561, 561, 0, 585, 585, 585, 585, 585, 585, 585, 585, 1951, 585, 585, 585, 585, 585, 585, 585, 0, 0, 1594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2767, 0, 0, 561, 561, 1846, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2645, 561, 561, 585, 585, 585, 1977, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2692, 585, 585, 585, 540, 540, 540, 2188, 540, 2190, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 561, 561, 561, 3334, 561, 561, 0, 0, 0, 561, 561, 561, 2247, 561, 561, 561, 561, 561, 561, 561, 561, 561, 2613, 561, 561, 561, 561, 561, 561, 561, 2619, 561, 561, 2273, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 3242, 561, 561, 0, 585, 585, 585, 2332, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2408, 540, 585, 585, 561, 561, 2647, 0, 0, 0, 0, 0, 0, 585, 585, 585, 585, 585, 585, 585, 585, 2687, 585, 585, 2691, 585, 585, 585, 585, 585, 585, 585, 585, 2684, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 2916, 585, 585, 585, 585, 561, 561, 585, 585, 585, 585, 585, 3109, 585, 585, 585, 585, 585, 585, 585, 585, 2702, 585, 585, 585, 585, 585, 585, 585, 0, 1134592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225706, 0, 0, 1134592, 0, 0, 0, 1134592, 1134592, 0, 0, 1134592, 0, 0, 1134592, 0, 1134592, 0, 0, 0, 1134592, 1135005, 1135005, 0, 0, 0, 0, 0, 1135005, 0, 1134592, 1134592, 0, 0, 0, 0, 1135202, 1135202, 1135202, 1135202, 1134592, 1135202, 1135202, 1135202, 1135202, 1135202, 0, 1134592, 1134592, 1134592, 1134592, 1135202, 1134592, 1135202, 1, 12290, 3, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 1138688, 0, 0, 0, 0, 0, 1670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2125824, 2126738, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 987, 2125824, 2125824, 2125824, 2125824, 2424832, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 1147354, 457, 457, 1147354, 457, 457, 457, 457, 457, 457, 457, 457, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 1147405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2792, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 1147354, 1147354, 1147354, 1147405, 1147405, 1147354, 1147405, 1147405, 1, 12290, 3, 0, 0, 0, 0, 2042, 0, 0, 2045, 2046, 0, 0, 0, 2050, 0, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1221, 0, 0, 0, 0, 0, 0, 1142784, 0, 2179072, 2125824, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3137536, 2125824, 2940928, 2940928, 2940928, 0, 0, 0, 0, 0, 0, 305, 440, 448, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 1159168, 0, 0, 1159168, 0, 1159168, 1159168, 0, 1159168, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2802, 0, 540, 540, 540, 540, 540, 1159168, 1159168, 0, 1159168, 1159168, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 0, 1159168, 1159168, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1, 12290, 3, 0, 0, 0, 0, 2053, 0, 2054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 799, 0, 799, 0, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1163264, 0, 0, 0, 0, 0, 155648, 155648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 913, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 1452, 2125824, 2125824, 2125824, 2125824, 2424832, 106496, 0, 106496, 106496, 0, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 0, 0, 106496, 0, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2782, 2783, 0, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163840, 0, 0, 0, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 0, 0, 0, 0, 0, 2953216, 0, 0, 2826240, 2875392, 0, 0, 0, 0, 0, 0, 2834432, 0, 3227648, 2568192, 0, 0, 0, 0, 2564096, 0, 2748416, 2879488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 3137536, 2125824, 2125824, 2498560, 2125824, 2125824, 2125824, 2555904, 2564096, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2654208, 2678784, 2760704, 2764800, 2785280, 2854912, 2969600, 2125824, 3006464, 2125824, 3018752, 2125824, 2125824\n
 ];\n
 \n
 XQueryParser.EXPECTED =\n
@@ -21901,6 +22268,12 @@ define(\'ace/mode/xquery/visitors/SemanticHighlighter\', [\'require\', \'exports
 
 ]]></string> </value>
         </item>
+        <item>
+            <key> <string>next</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
       </dictionary>
     </pickle>
   </record>
diff --git a/bt5/erp5_ace_editor/bt/change_log b/bt5/erp5_ace_editor/bt/change_log
index 1d07322351..ebf01a217c 100644
--- a/bt5/erp5_ace_editor/bt/change_log
+++ b/bt5/erp5_ace_editor/bt/change_log
@@ -1,3 +1,6 @@
+2013-08-22 jerome
+* Update to 45d3068aa7190f08396bcfe134e505fe144c1ccb ( package 10.28.2013 )
+
 2013-08-22 arnaud.fontaine
 * Ace Editor: Import the entire source code.
 
diff --git a/bt5/erp5_ace_editor/bt/description b/bt5/erp5_ace_editor/bt/description
index 03273683b5..774e582322 100644
--- a/bt5/erp5_ace_editor/bt/description
+++ b/bt5/erp5_ace_editor/bt/description
@@ -1 +1 @@
-This Business Template contains static files of Ace Javascript editor version 1.1.01.
\ No newline at end of file
+This Business Template contains static files of Ace Javascript editor from 'src' folder of https://github.com/ajaxorg/ace-builds/
\ No newline at end of file
diff --git a/bt5/erp5_ace_editor/bt/revision b/bt5/erp5_ace_editor/bt/revision
index 19c7bdba7b..25bf17fc5a 100644
--- a/bt5/erp5_ace_editor/bt/revision
+++ b/bt5/erp5_ace_editor/bt/revision
@@ -1 +1 @@
-16
\ No newline at end of file
+18
\ No newline at end of file
-- 
2.30.9